tx · DAe3Ki5q1Lvd6aA7fg1u9Kcpzzf2F8936MpQ5Ckg72zA

3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G:  -0.03400000 Waves

2023.05.24 17:20 [2592175] smart account 3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G > SELF 0.00000000 Waves

{ "type": 13, "id": "DAe3Ki5q1Lvd6aA7fg1u9Kcpzzf2F8936MpQ5Ckg72zA", "fee": 3400000, "feeAssetId": null, "timestamp": 1684938059567, "version": 2, "chainId": 84, "sender": "3N9Fi37D7EoAveMhpdBFPB8NEUn4bwXEV4G", "senderPublicKey": "7SdMpYYBFTqnnyr31oEmHeJfFTa3aGnwocRuvfEhpyoh", "proofs": [ "bXUHfJbjvQRgUogLiAikE5K3duhYv2rEQqm8iagxFYuxmX14dTAamY4J7Jj4qAfokQgt4Xo6xmcXGCpzc2a7QXZ" ], "script": "base64:BgI5CAISABIAEgQKAgEBEgYKBAgICAgSAwoBCBIFCgMIAQESBAoCCAESBAoCCAESBAoCCAESBQoDAQgILwANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAVrX2ZlZQIFa19mZWUACGtfcmViYXRlAghrX3JlYmF0ZQAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzAA9rX2V4Y2Vzc0JhbGFuY2UCD2tfZXhjZXNzQmFsYW5jZQANa19mcmVlQmFsYW5jZQINa19mcmVlQmFsYW5jZQAUa19tYXhTcG90VXRpbGl6YXRpb24CFGtfbWF4U3BvdFV0aWxpemF0aW9uABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABNrX3RvdGFsUG9zaXRpb25TaXplAhNrX3RvdGFsUG9zaXRpb25TaXplAAVrX2FtbQIFa19hbW0AB2tfdmF1bHQCB2tfdmF1bHQACmtfYW1tX2RhdGECCmtfYW1tX2RhdGEADWtfYXNzZXRfdmF1bHQCDWtfYXNzZXRfdmF1bHQAC2tfYXNzZXRfYW1tAgtrX2Fzc2V0X2FtbQAPa19hZG1pbl9hZGRyZXNzAg9rX2FkbWluX2FkZHJlc3MBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwERZ2V0QWRkcmVzc0lmVmFsaWQBB2FkZHJlc3MJAKUIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFB2FkZHJlc3MJAKwCAgkArAICAg1DYW4ndCBwYXJzZSAiBQdhZGRyZXNzAgwiIGFzIGFkZHJlc3MAD0RFQ0lNQUxfTlVNQkVSUwAGAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgEBcwECX3gJAKwCAgkApAMBBQJfeAIBLAEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQR2bWF4AgJfeAJfeQMJAGcCBQJfeAUCX3kFAl94BQJfeQEEdm1pbgICX3gCX3kDCQBnAgUCX3kFAl94BQJfeAUCX3kBA2ludAEBawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAWsJAKwCAgINbm8gdmFsdWUgZm9yIAUBawEDZmVlAAkBA2ludAEFBWtfZmVlAQlmZWVSZWJhdGUACQEDaW50AQUIa19yZWJhdGUBDmdldE1hcmtldE1heWJlAQhfYXNzZXRJZAQKYWRkcmVzc1N0cgkAnQgCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQtrX2Fzc2V0X2FtbQUIX2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQV2YWx1ZQEFCmFkZHJlc3NTdHIJAKwCAgIbSW52YWxpZCB2YXVsdCBhZGRyZXNzIGZvcjogBQhfYXNzZXRJZAUEdW5pdAENZ2V0VmF1bHRNYXliZQEIX2Fzc2V0SWQECmFkZHJlc3NTdHIJAJ0IAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUNa19hc3NldF92YXVsdAUIX2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQUKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQV2YWx1ZQEFCmFkZHJlc3NTdHIJAKwCAgIcSW52YWxpZCBtYXJrZXQgYWRkcmVzcyBmb3I6IAUIX2Fzc2V0SWQFBHVuaXQBCWdldE1hcmtldAEIX2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldE1hcmtldE1heWJlAQUIX2Fzc2V0SWQJAKwCAgIPTm8gbWFya2V0IGZvcjogBQhfYXNzZXRJZAEIZ2V0VmF1bHQBCF9hc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ1nZXRWYXVsdE1heWJlAQUIX2Fzc2V0SWQJAKwCAgIOTm8gdmF1bHQgZm9yOiAFCF9hc3NldElkARBnZXRFeGNlc3NCYWxhbmNlAQZfdmF1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUGX3ZhdWx0BQ9rX2V4Y2Vzc0JhbGFuY2UAAAEOZ2V0RnJlZUJhbGFuY2UBBl92YXVsdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQZfdmF1bHQFDWtfZnJlZUJhbGFuY2UAAAERZ2V0TWF4VXRpbGl6YXRpb24BBl92YXVsdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBl92YXVsdAUUa19tYXhTcG90VXRpbGl6YXRpb24JAKwCAgIiTWF4IHNwb3QgdXRpbGl6YXRpb24gbm90IHNldCBmb3I6IAkApQgBBQZfdmF1bHQBEWdldE1heFByaWNlU3ByZWFkAQRfYW1tCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEX2FtbQUQa19tYXhQcmljZVNwcmVhZAkArAICAh5NYXggcHJpY2Ugc3ByZWFkIG5vdCBzZXQgZm9yOiAJAKUIAQUEX2FtbQEoZ2V0T2xkUHJvamVjdGVkTGlxdWlkaXR5QW5kVGVybWluYWxQcmljZQEEX2FtbQQEc3luYwkA/AcEBQRfYW1tAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAZwcmljZVIJAPwHBAUEX2FtbQIXY29tcHV0ZVRlcm1pbmFsQW1tUHJpY2UFA25pbAUDbmlsAwkAAAIFBnByaWNlUgUGcHJpY2VSBAVwcmljZQQHJG1hdGNoMAUGcHJpY2VSAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgEJAKwCAgIrSW52YWxpZCBjb21wdXRlVGVybWluYWxBbW1QcmljZSByZXN1bHQgZm9yIAkApQgBBQRfYW1tBBZjdXJyZW50QmFzZUFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEX2FtbQUSa19iYXNlQXNzZXRSZXNlcnZlCQCsAgIJAKwCAgkArAICAgRLZXkgBRJrX2Jhc2VBc3NldFJlc2VydmUCDSBub3Qgc2V0IGZvciAJAKUIAQUEX2FtbQMJAAACBRZjdXJyZW50QmFzZUFzc2V0QW1vdW50BRZjdXJyZW50QmFzZUFzc2V0QW1vdW50BBRiYXNlQXNzZXRBbW91bnREZWx0YQkBC3ZhbHVlT3JFbHNlAgkAmggCBQRfYW1tBRNrX3RvdGFsUG9zaXRpb25TaXplAAADCQAAAgUUYmFzZUFzc2V0QW1vdW50RGVsdGEFFGJhc2VBc3NldEFtb3VudERlbHRhBBBxdW90ZUFzc2V0V2VpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBF9hbW0FEmtfcXVvdGVBc3NldFdlaWdodAUMREVDSU1BTF9VTklUAwkAAAIFEHF1b3RlQXNzZXRXZWlnaHQFEHF1b3RlQXNzZXRXZWlnaHQJAJUKAwkAZAIFFmN1cnJlbnRCYXNlQXNzZXRBbW91bnQFFGJhc2VBc3NldEFtb3VudERlbHRhBQVwcmljZQUQcXVvdGVBc3NldFdlaWdodAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0SW1iYWxhbmNlQ29zdFVTRAQGX3ZhdWx0BF9hbW0JX2RlY2ltYWxzB19hbW91bnQEBmFtb3VudAMJAAACBQlfZGVjaW1hbHMACAUHX2Ftb3VudAMJAAACBQlfZGVjaW1hbHMABgkAaAIFB19hbW91bnQAZAkAAgECEEludmFsaWQgZGVjaW1hbHMEDG9sZEltYmFsYW5jZQkBEGdldEV4Y2Vzc0JhbGFuY2UBBQZfdmF1bHQEDG5ld0ltYmFsYW5jZQkAZAIFDG9sZEltYmFsYW5jZQUGYW1vdW50BBtpbWJhbGFuY2VEZWx0YUluQW1tRGVjaW1hbHMJAGkCCQBlAgkBA2FicwEFDG5ld0ltYmFsYW5jZQkBA2FicwEFDG9sZEltYmFsYW5jZQBkBAZwcmljZVIJAPwHBAUEX2FtbQIQY29tcHV0ZVNwb3RQcmljZQUDbmlsBQNuaWwDCQAAAgUGcHJpY2VSBQZwcmljZVIEBXByaWNlBAckbWF0Y2gwBQZwcmljZVIDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQkArAICAiRJbnZhbGlkIGNvbXB1dGVTcG90UHJpY2UgcmVzdWx0IGZvciAJAKUIAQUEX2FtbQQTaW1iYWxhbmNlRGVsdGFJblVTRAkBBG11bGQCBRtpbWJhbGFuY2VEZWx0YUluQW1tRGVjaW1hbHMFBXByaWNlBBdmcmVlQmFsYW5jZUluQW1tRGVjaW1hbAkAaQIJAQ5nZXRGcmVlQmFsYW5jZQEFBl92YXVsdABkBBF2YXVsdEJhbGFuY2VJblVTRAkBBG11bGQCBRdmcmVlQmFsYW5jZUluQW1tRGVjaW1hbAUFcHJpY2UJAJQKAgUTaW1iYWxhbmNlRGVsdGFJblVTRAURdmF1bHRCYWxhbmNlSW5VU0QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGVzdGltYXRlU3dhcAMHX2Ftb3VudAhfYXNzZXRJZAxfdGFyZ2V0QXNzZXQEDnNvdXJjZURlY2ltYWxzAwkAAAIFCF9hc3NldElkAgVXQVZFUwAICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUIX2Fzc2V0SWQJAKwCAgIPSW52YWxpZCBhc3NldDogBQhfYXNzZXRJZAhkZWNpbWFscwQOdGFyZ2V0RGVjaW1hbHMDCQAAAgUMX3RhcmdldEFzc2V0AgVXQVZFUwAICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUMX3RhcmdldEFzc2V0CQCsAgICD0ludmFsaWQgYXNzZXQ6IAUMX3RhcmdldEFzc2V0CGRlY2ltYWxzBBlzb3VyY2VBbW91bnRJbkFtbURlY2ltYWxzAwkAAAIFDnNvdXJjZURlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUOc291cmNlRGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGUludmFsaWQgZGVjaW1hbHMgKHNvdXJjZSkECnNlbGxNYXJrZXQJAQlnZXRNYXJrZXQBBQhfYXNzZXRJZAQCczEJAPwHBAUKc2VsbE1hcmtldAILc3dhcFRvUXVvdGUJAMwIAgUZc291cmNlQW1vdW50SW5BbW1EZWNpbWFscwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFAnMxBQJzMQQJdXNkQW1vdW50BAckbWF0Y2gwBQJzMQMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhpJbnZhbGlkIHN3YXBUb1F1b3RlIHJlc3VsdAQJYnV5TWFya2V0CQEJZ2V0TWFya2V0AQUMX3RhcmdldEFzc2V0BAJzMgkA/AcEBQlidXlNYXJrZXQCCnN3YXBUb0Jhc2UJAMwIAgUJdXNkQW1vdW50CQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCczIFAnMyBAx0YXJnZXRBbW91bnQEByRtYXRjaDAFAnMyAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAMJAAACBQ50YXJnZXREZWNpbWFscwAICQBoAgUBdABkAwkAAAIFDnRhcmdldERlY2ltYWxzAAYFAXQJAAIBAhlJbnZhbGlkIGRlY2ltYWxzICh0YXJnZXQpCQACAQIZSW52YWxpZCBzd2FwVG9CYXNlIHJlc3VsdAQKdmF1bHRUb0FkZAkBCGdldFZhdWx0AQUIX2Fzc2V0SWQECyR0MDcwOTY3MjYxCQETZ2V0SW1iYWxhbmNlQ29zdFVTRAQFCnZhdWx0VG9BZGQFCnNlbGxNYXJrZXQFDnNvdXJjZURlY2ltYWxzBQdfYW1vdW50BA9hZGRJbWJhbGFuY2VVU0QIBQskdDA3MDk2NzI2MQJfMQQSYWRkVmF1bHRCYWxhbmNlVVNECAULJHQwNzA5NjcyNjECXzIEDXZhdWx0VG9SZW1vdmUJAQhnZXRWYXVsdAEFDF90YXJnZXRBc3NldAQLJHQwNzMwOTc1NDUJARNnZXRJbWJhbGFuY2VDb3N0VVNEBAUNdmF1bHRUb1JlbW92ZQUJYnV5TWFya2V0BQ50YXJnZXREZWNpbWFscwkBAS0BBQx0YXJnZXRBbW91bnQEEnJlbW92ZUltYmFsYW5jZVVTRAgFCyR0MDczMDk3NTQ1Al8xBBVyZW1vdmVWYXVsdEJhbGFuY2VVU0QIBQskdDA3MzA5NzU0NQJfMgQUcmVzdWx0SW1iYWxhbmNlSW5VU0QJAGQCBQ9hZGRJbWJhbGFuY2VVU0QFEnJlbW92ZUltYmFsYW5jZVVTRAQHYmFzZUZlZQkBA2ZlZQAEC3RvdGFsTGlxdWlkCQBkAgUSYWRkVmF1bHRCYWxhbmNlVVNEBRVyZW1vdmVWYXVsdEJhbGFuY2VVU0QECyR0MDc2OTk4MTgyAwkAZgIAAAUUcmVzdWx0SW1iYWxhbmNlSW5VU0QECnJlYmF0ZVJhdGUJAQRkaXZkAgkBA2FicwEFFHJlc3VsdEltYmFsYW5jZUluVVNEBQt0b3RhbExpcXVpZAQGcmViYXRlCQEEbXVsZAIJAQlmZWVSZWJhdGUABQpyZWJhdGVSYXRlBAlhY3R1YWxGZWUDCQBmAgUGcmViYXRlBQdiYXNlRmVlAAAJAGUCBQdiYXNlRmVlBQZyZWJhdGUJAJUKAwUJYWN0dWFsRmVlBQZyZWJhdGUAAAQHdGF4UmF0ZQkBBGRpdmQCCQEDYWJzAQUUcmVzdWx0SW1iYWxhbmNlSW5VU0QFC3RvdGFsTGlxdWlkBAN0YXgJAQRtdWxkAgkBCWZlZVJlYmF0ZQAFB3RheFJhdGUECWFjdHVhbEZlZQkAZAIFB2Jhc2VGZWUFA3RheAkAlQoDBQlhY3R1YWxGZWUAAAUDdGF4BAlhY3R1YWxGZWUIBQskdDA3Njk5ODE4MgJfMQQGcmViYXRlCAULJHQwNzY5OTgxODICXzIEA3RheAgFCyR0MDc2OTk4MTgyAl8zBBBmZWVJblRhcmdldFRva2VuCQEEbXVsZAIFDHRhcmdldEFtb3VudAUJYWN0dWFsRmVlBBdyZXN1bHRUYXJnZXRBc3NldEFtb3VudAkAZQIFDHRhcmdldEFtb3VudAUQZmVlSW5UYXJnZXRUb2tlbgkAnwoNBQx0YXJnZXRBbW91bnQFEGZlZUluVGFyZ2V0VG9rZW4FF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50BQdiYXNlRmVlBQlhY3R1YWxGZWUFBnJlYmF0ZQUDdGF4BQ12YXVsdFRvUmVtb3ZlBQp2YXVsdFRvQWRkBQ9hZGRJbWJhbGFuY2VVU0QFEmFkZFZhdWx0QmFsYW5jZVVTRAUScmVtb3ZlSW1iYWxhbmNlVVNEBRVyZW1vdmVWYXVsdEJhbGFuY2VVU0QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGmVzdGltYXRlUHJvamVjdGVkTGlxdWlkaXR5AwZfdmF1bHQEX2FtbQdfY2hhbmdlBAx2YXVsdFJlc2VydmUJAGQCCQBpAgkBDmdldEZyZWVCYWxhbmNlAQUGX3ZhdWx0AGQJAGkCBQdfY2hhbmdlAGQEEHZhdWx0VXRpbGl6YXRpb24JAGkCCQERZ2V0TWF4VXRpbGl6YXRpb24BBQZfdmF1bHQAZAQObWF4UHJpY2VTcHJlYWQJARFnZXRNYXhQcmljZVNwcmVhZAEFBF9hbW0EGmFjdHVhbExpcXVpZGl0eUluQmFzZUFzc2V0CQEEbXVsZAIFDHZhdWx0UmVzZXJ2ZQUQdmF1bHRVdGlsaXphdGlvbgQSbmV3QmFzZUFzc2V0QW1vdW50CQEEZGl2ZAIJAGUCBRphY3R1YWxMaXF1aWRpdHlJbkJhc2VBc3NldAkBBG11bGQCBQ5tYXhQcmljZVNwcmVhZAUaYWN0dWFsTGlxdWlkaXR5SW5CYXNlQXNzZXQFDm1heFByaWNlU3ByZWFkBAskdDA5MDY3OTE1MwkBKGdldE9sZFByb2plY3RlZExpcXVpZGl0eUFuZFRlcm1pbmFsUHJpY2UBBQRfYW1tAwkAAAIFCyR0MDkwNjc5MTUzBQskdDA5MDY3OTE1MwQBcQgFCyR0MDkwNjc5MTUzAl8zBAVwcmljZQgFCyR0MDkwNjc5MTUzAl8yBBJvbGRCYXNlQXNzZXRBbW91bnQIBQskdDA5MDY3OTE1MwJfMQQUYmFzZUFzc2V0QW1vdW50RGVsdGEJAGUCBRJuZXdCYXNlQXNzZXRBbW91bnQFEm9sZEJhc2VBc3NldEFtb3VudAQQcXVvdGVBc3NldENoYW5nZQkBBGRpdmQCCQEEbXVsZAIFFGJhc2VBc3NldEFtb3VudERlbHRhBQVwcmljZQUBcQkAlAoCBRRiYXNlQXNzZXRBbW91bnREZWx0YQUQcXVvdGVBc3NldENoYW5nZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQ51cGRhdGVTZXR0aW5ncwIEX2ZlZQdfcmViYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrX2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUIa19yZWJhdGUFB19yZWJhdGUFA25pbAoBaQEFcGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFEludmFsaWQgcGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHVucGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQ5jaGFuZ2VTZXR0aW5ncwIEX2ZlZQdfcmViYXRlAwMDAwkAZwIAAAUEX2ZlZQYJAGcCAAAFB19yZWJhdGUGCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwIFBF9mZWUFB19yZWJhdGUBaQEGYWRkQW1tBAtfYW1tQWRkcmVzcw1fdmF1bHRBZGRyZXNzC192YXVsdEFzc2V0BV9kYXRhAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFUludmFsaWQgYWRkQW1tIHBhcmFtcwQKYW1tQWRkcmVzcwkBEWdldEFkZHJlc3NJZlZhbGlkAQULX2FtbUFkZHJlc3MDCQAAAgUKYW1tQWRkcmVzcwUKYW1tQWRkcmVzcwQMdmF1bHRBZGRyZXNzCQERZ2V0QWRkcmVzc0lmVmFsaWQBBQ1fdmF1bHRBZGRyZXNzAwkAAAIFDHZhdWx0QWRkcmVzcwUMdmF1bHRBZGRyZXNzCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQVrX2FtbQULX2FtbUFkZHJlc3MGCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQdrX3ZhdWx0BQ1fdmF1bHRBZGRyZXNzBgkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ1rX2Fzc2V0X3ZhdWx0BQtfdmF1bHRBc3NldAUNX3ZhdWx0QWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQtrX2Fzc2V0X2FtbQULX3ZhdWx0QXNzZXQFC19hbW1BZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFCmtfYW1tX2RhdGEFC19hbW1BZGRyZXNzBQVfZGF0YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXJlbW92ZUFtbQELX2FtbUFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIYSW52YWxpZCByZW1vdmVBbW0gcGFyYW1zCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFBWtfYW1tBQtfYW1tQWRkcmVzcwUDbmlsAWkBCmluaXRpYWxpemUDDF9jb29yZGluYXRvcgRfZmVlB19yZWJhdGUDAwMDCQBnAgAABQRfZmVlBgkAZwIAAAUHX3JlYmF0ZQYJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAh1JbnZhbGlkIGluaXRpYWxpemUgcGFyYW1ldGVycwkAzggCCQEOdXBkYXRlU2V0dGluZ3MCBQRfZmVlBQdfcmViYXRlCQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwkApQgBCQERQGV4dHJOYXRpdmUoMTA2MikBBQxfY29vcmRpbmF0b3IFA25pbAFpAQRzd2FwAgxfdGFyZ2V0QXNzZXQQX21pblRhcmdldEFtb3VudAQRY2hlY2tQYXltZW50Q291bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJJbnZhbGlkIHN3YXAgcGFyYW1zOiBwYXltZW50IGNvdW50BgMJAAACBRFjaGVja1BheW1lbnRDb3VudAURY2hlY2tQYXltZW50Q291bnQEB19hbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAhfYXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAdhc3NldElkAwkBCWlzRGVmaW5lZAEFCF9hc3NldElkCQDYBAEJAQV2YWx1ZQEFCF9hc3NldElkAgVXQVZFUwQRY2hlY2tOb3RTYW1lQXNzZXQDCQAAAgUMX3RhcmdldEFzc2V0BQdhc3NldElkCQACAQIfSW52YWxpZCBzd2FwIHBhcmFtczogc2FtZSBhc3NldAYDCQAAAgURY2hlY2tOb3RTYW1lQXNzZXQFEWNoZWNrTm90U2FtZUFzc2V0BA0kdDAxMjQ5NDEyODEzCQEMZXN0aW1hdGVTd2FwAwUHX2Ftb3VudAUHYXNzZXRJZAUMX3RhcmdldEFzc2V0AwkAAAIFDSR0MDEyNDk0MTI4MTMFDSR0MDEyNDk0MTI4MTMECnZhdWx0VG9BZGQIBQ0kdDAxMjQ5NDEyODEzAl85BA12YXVsdFRvUmVtb3ZlCAUNJHQwMTI0OTQxMjgxMwJfOAQDdGF4CAUNJHQwMTI0OTQxMjgxMwJfNwQGcmViYXRlCAUNJHQwMTI0OTQxMjgxMwJfNgQJYWN0dWFsRmVlCAUNJHQwMTI0OTQxMjgxMwJfNQQHYmFzZUZlZQgFDSR0MDEyNDk0MTI4MTMCXzQEF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50CAUNJHQwMTI0OTQxMjgxMwJfMwQQZmVlSW5UYXJnZXRUb2tlbggFDSR0MDEyNDk0MTI4MTMCXzIEDHRhcmdldEFtb3VudAgFDSR0MDEyNDk0MTI4MTMCXzEECWRvRGVwb3NpdAkA/AcEBQp2YXVsdFRvQWRkAgVyZXBheQUDbmlsCQDMCAIJAJEDAggFAWkIcGF5bWVudHMAAAUDbmlsAwkAAAIFCWRvRGVwb3NpdAUJZG9EZXBvc2l0BApkb1dpdGhkcmF3CQD8BwQFDXZhdWx0VG9SZW1vdmUCBmJvcnJvdwkAzAgCBQx0YXJnZXRBbW91bnQFA25pbAUDbmlsAwkAAAIFCmRvV2l0aGRyYXcFCmRvV2l0aGRyYXcEC3RhcmdldEFzc2V0AwkAAAIFDF90YXJnZXRBc3NldAIFV0FWRVMFBHVuaXQJANkEAQUMX3RhcmdldEFzc2V0BAxkb0NvbGxlY3RGZWUJAPwHBAUNdmF1bHRUb1JlbW92ZQIHYWRkRnJlZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0YXJnZXRBc3NldAUQZmVlSW5UYXJnZXRUb2tlbgUDbmlsAwkAAAIFDGRvQ29sbGVjdEZlZQUMZG9Db2xsZWN0RmVlAwkAZgIFEF9taW5UYXJnZXRBbW91bnQFF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIeQ2FuIG5vdCBzd2FwIGR1ZSB0byBzbGlwcGFnZTogCQCkAwEFF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50AgMgPCAJAKQDAQUQX21pblRhcmdldEFtb3VudAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQFC3RhcmdldEFzc2V0BQNuaWwJAJgKBgUHX2Ftb3VudAUXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQFB2Jhc2VGZWUFCWFjdHVhbEZlZQUGcmViYXRlBQN0YXgJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEYbm90aWZ5VmF1bHRCYWxhbmNlQ2hhbmdlAgZfYXNzZXQHX2NoYW5nZQQGbWFya2V0CQEOZ2V0TWFya2V0TWF5YmUBBQZfYXNzZXQEBXZhdWx0CQENZ2V0VmF1bHRNYXliZQEFBl9hc3NldAMDCQEJaXNEZWZpbmVkAQUGbWFya2V0CQEJaXNEZWZpbmVkAQUFdmF1bHQHAwkBAiE9AggFAWkGY2FsbGVyBQV2YXVsdAkAAgECJ0ludmFsaWQgbm90aWZ5VmF1bHRCYWxhbmNlQ2hhbmdlIHBhcmFtcwQNJHQwMTQwMzQxNDE1MAkBGmVzdGltYXRlUHJvamVjdGVkTGlxdWlkaXR5AwkBBXZhbHVlAQUFdmF1bHQJAQV2YWx1ZQEFBm1hcmtldAUHX2NoYW5nZQMJAAACBQ0kdDAxNDAzNDE0MTUwBQ0kdDAxNDAzNDE0MTUwBBBxdW90ZUFzc2V0Q2hhbmdlCAUNJHQwMTQwMzQxNDE1MAJfMgQUYmFzZUFzc2V0QW1vdW50RGVsdGEIBQ0kdDAxNDAzNDE0MTUwAl8xBAZyZXN1bHQJAPwHBAkBBXZhbHVlAQUGbWFya2V0Ag9jaGFuZ2VMaXF1aWRpdHkJAMwIAgUQcXVvdGVBc3NldENoYW5nZQUDbmlsBQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAWkBH3ZpZXdfZXN0aW1hdGVQcm9qZWN0ZWRMaXF1aWRpdHkCBl9hc3NldAdfY2hhbmdlBAZtYXJrZXQJAQlnZXRNYXJrZXQBBQZfYXNzZXQEBXZhdWx0CQEIZ2V0VmF1bHQBBQZfYXNzZXQEDSR0MDE0NDM4MTQ1MzgJARplc3RpbWF0ZVByb2plY3RlZExpcXVpZGl0eQMFBXZhdWx0BQZtYXJrZXQFB19jaGFuZ2UDCQAAAgUNJHQwMTQ0MzgxNDUzOAUNJHQwMTQ0MzgxNDUzOAQQcXVvdGVBc3NldENoYW5nZQgFDSR0MDE0NDM4MTQ1MzgCXzIEFGJhc2VBc3NldEFtb3VudERlbHRhCAUNJHQwMTQ0MzgxNDUzOAJfMQQEZGF0YQkAuQkCCQDMCAIJAKQDAQUUYmFzZUFzc2V0QW1vdW50RGVsdGEJAMwIAgkApAMBBRBxdW90ZUFzc2V0Q2hhbmdlBQNuaWwCASwJAAIBBQRkYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXZpZXdfZXN0aW1hdGVTd2FwAw1fc291cmNlQW1vdW50DF9zb3VyY2VBc3NldAxfdGFyZ2V0QXNzZXQEDSR0MDE0NzgxMTUxMDYJAQxlc3RpbWF0ZVN3YXADBQ1fc291cmNlQW1vdW50BQxfc291cmNlQXNzZXQFDF90YXJnZXRBc3NldAMJAAACBQ0kdDAxNDc4MTE1MTA2BQ0kdDAxNDc4MTE1MTA2BBVyZW1vdmVWYXVsdEJhbGFuY2VVU0QIBQ0kdDAxNDc4MTE1MTA2A18xMwQScmVtb3ZlSW1iYWxhbmNlVVNECAUNJHQwMTQ3ODExNTEwNgNfMTIEEmFkZFZhdWx0QmFsYW5jZVVTRAgFDSR0MDE0NzgxMTUxMDYDXzExBA9hZGRJbWJhbGFuY2VVU0QIBQ0kdDAxNDc4MTE1MTA2A18xMAQKdmF1bHRUb0FkZAgFDSR0MDE0NzgxMTUxMDYCXzkEDXZhdWx0VG9SZW1vdmUIBQ0kdDAxNDc4MTE1MTA2Al84BAN0YXgIBQ0kdDAxNDc4MTE1MTA2Al83BAZyZWJhdGUIBQ0kdDAxNDc4MTE1MTA2Al82BAlhY3R1YWxGZWUIBQ0kdDAxNDc4MTE1MTA2Al81BAdiYXNlRmVlCAUNJHQwMTQ3ODExNTEwNgJfNAQXcmVzdWx0VGFyZ2V0QXNzZXRBbW91bnQIBQ0kdDAxNDc4MTE1MTA2Al8zBBBmZWVJblRhcmdldFRva2VuCAUNJHQwMTQ3ODExNTEwNgJfMgQMdGFyZ2V0QW1vdW50CAUNJHQwMTQ3ODExNTEwNgJfMQQEZGF0YQkAuQkCCQDMCAIJAKQDAQUMdGFyZ2V0QW1vdW50CQDMCAIJAKQDAQUQZmVlSW5UYXJnZXRUb2tlbgkAzAgCCQCkAwEFF3Jlc3VsdFRhcmdldEFzc2V0QW1vdW50CQDMCAIJAKQDAQUHYmFzZUZlZQkAzAgCCQCkAwEFCWFjdHVhbEZlZQkAzAgCCQCkAwEFBnJlYmF0ZQkAzAgCCQCkAwEFA3RheAkAzAgCCQCkAwEFD2FkZEltYmFsYW5jZVVTRAkAzAgCCQCkAwEFEmFkZFZhdWx0QmFsYW5jZVVTRAkAzAgCCQCkAwEFEnJlbW92ZUltYmFsYW5jZVVTRAkAzAgCCQCkAwEFFXJlbW92ZVZhdWx0QmFsYW5jZVVTRAUDbmlsAgEsCQACAQUEZGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEDmNvb3JkaW5hdG9yU3RyCQCdCAIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAwkBCWlzRGVmaW5lZAEFDmNvb3JkaW5hdG9yU3RyBAVhZG1pbgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQ5jb29yZGluYXRvclN0cgUPa19hZG1pbl9hZGRyZXNzAwkBCWlzRGVmaW5lZAEFBWFkbWluCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFBWFkbWluCQCsAgIJAKwCAgkArAICAgdzdGF0dXNfCQClCAEFBHRoaXMCAV8JANgEAQgFAnR4AmlkBwkAAgECLnVuYWJsZSB0byB2ZXJpZnk6IGFkbWluIG5vdCBzZXQgaW4gY29vcmRpbmF0b3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkxAETB", "height": 2592175, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: CmwuR2kWyenmUFDs9cwBVzwkYLEAT532bZ5Rir33Ro38 Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let k_initialized = "k_initialized"
5+
6+let k_paused = "k_paused"
7+
8+let k_fee = "k_fee"
9+
10+let k_rebate = "k_rebate"
11+
12+let k_coordinatorAddress = "k_coordinatorAddress"
13+
14+let k_excessBalance = "k_excessBalance"
15+
16+let k_freeBalance = "k_freeBalance"
17+
18+let k_maxSpotUtilization = "k_maxSpotUtilization"
19+
20+let k_maxPriceSpread = "k_maxPriceSpread"
21+
22+let k_baseAssetReserve = "k_bsAstR"
23+
24+let k_quoteAssetWeight = "k_qtAstW"
25+
26+let k_totalPositionSize = "k_totalPositionSize"
27+
28+let k_amm = "k_amm"
29+
30+let k_vault = "k_vault"
31+
32+let k_amm_data = "k_amm_data"
33+
34+let k_asset_vault = "k_asset_vault"
35+
36+let k_asset_amm = "k_asset_amm"
37+
38+let k_admin_address = "k_admin_address"
39+
40+func toCompositeKey (_key,_address) = ((_key + "_") + _address)
41+
42+
43+func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
44+
45+
46+func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
47+
48+
49+func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse \"" + address) + "\" as address")))
50+
51+
52+let DECIMAL_NUMBERS = 6
53+
54+let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
55+
56+func s (_x) = (toString(_x) + ",")
57+
58+
59+func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
60+
61+
62+func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
63+
64+
65+func abs (_x) = if ((_x > 0))
66+ then _x
67+ else -(_x)
68+
69+
70+func vmax (_x,_y) = if ((_x >= _y))
71+ then _x
72+ else _y
73+
74+
75+func vmin (_x,_y) = if ((_y >= _x))
76+ then _x
77+ else _y
78+
79+
80+func int (k) = valueOrErrorMessage(getInteger(this, k), ("no value for " + k))
81+
82+
83+func fee () = int(k_fee)
84+
85+
86+func feeRebate () = int(k_rebate)
87+
88+
89+func getMarketMaybe (_assetId) = {
90+ let addressStr = getString(this, toCompositeKey(k_asset_amm, _assetId))
91+ if (isDefined(addressStr))
92+ then valueOrErrorMessage(addressFromString(value(addressStr)), ("Invalid vault address for: " + _assetId))
93+ else unit
94+ }
95+
96+
97+func getVaultMaybe (_assetId) = {
98+ let addressStr = getString(this, toCompositeKey(k_asset_vault, _assetId))
99+ if (isDefined(addressStr))
100+ then valueOrErrorMessage(addressFromString(value(addressStr)), ("Invalid market address for: " + _assetId))
101+ else unit
102+ }
103+
104+
105+func getMarket (_assetId) = valueOrErrorMessage(getMarketMaybe(_assetId), ("No market for: " + _assetId))
106+
107+
108+func getVault (_assetId) = valueOrErrorMessage(getVaultMaybe(_assetId), ("No vault for: " + _assetId))
109+
110+
111+func getExcessBalance (_vault) = valueOrElse(getInteger(_vault, k_excessBalance), 0)
112+
113+
114+func getFreeBalance (_vault) = valueOrElse(getInteger(_vault, k_freeBalance), 0)
115+
116+
117+func getMaxUtilization (_vault) = valueOrErrorMessage(getInteger(_vault, k_maxSpotUtilization), ("Max spot utilization not set for: " + toString(_vault)))
118+
119+
120+func getMaxPriceSpread (_amm) = valueOrErrorMessage(getInteger(_amm, k_maxPriceSpread), ("Max price spread not set for: " + toString(_amm)))
121+
122+
123+func getOldProjectedLiquidityAndTerminalPrice (_amm) = {
124+ let sync = invoke(_amm, "syncTerminalPriceToOracle", nil, nil)
125+ if ((sync == sync))
126+ then {
127+ let priceR = invoke(_amm, "computeTerminalAmmPrice", nil, nil)
128+ if ((priceR == priceR))
129+ then {
130+ let price = match priceR {
131+ case t: Int =>
132+ t
133+ case _ =>
134+ throw(("Invalid computeTerminalAmmPrice result for " + toString(_amm)))
135+ }
136+ let currentBaseAssetAmount = valueOrErrorMessage(getInteger(_amm, k_baseAssetReserve), ((("Key " + k_baseAssetReserve) + " not set for ") + toString(_amm)))
137+ if ((currentBaseAssetAmount == currentBaseAssetAmount))
138+ then {
139+ let baseAssetAmountDelta = valueOrElse(getInteger(_amm, k_totalPositionSize), 0)
140+ if ((baseAssetAmountDelta == baseAssetAmountDelta))
141+ then {
142+ let quoteAssetWeight = valueOrElse(getInteger(_amm, k_quoteAssetWeight), DECIMAL_UNIT)
143+ if ((quoteAssetWeight == quoteAssetWeight))
144+ then $Tuple3((currentBaseAssetAmount + baseAssetAmountDelta), price, quoteAssetWeight)
145+ else throw("Strict value is not equal to itself.")
146+ }
147+ else throw("Strict value is not equal to itself.")
148+ }
149+ else throw("Strict value is not equal to itself.")
150+ }
151+ else throw("Strict value is not equal to itself.")
152+ }
153+ else throw("Strict value is not equal to itself.")
154+ }
155+
156+
157+func getImbalanceCostUSD (_vault,_amm,_decimals,_amount) = {
158+ let amount = if ((_decimals == 8))
159+ then _amount
160+ else if ((_decimals == 6))
161+ then (_amount * 100)
162+ else throw("Invalid decimals")
163+ let oldImbalance = getExcessBalance(_vault)
164+ let newImbalance = (oldImbalance + amount)
165+ let imbalanceDeltaInAmmDecimals = ((abs(newImbalance) - abs(oldImbalance)) / 100)
166+ let priceR = invoke(_amm, "computeSpotPrice", nil, nil)
167+ if ((priceR == priceR))
168+ then {
169+ let price = match priceR {
170+ case t: Int =>
171+ t
172+ case _ =>
173+ throw(("Invalid computeSpotPrice result for " + toString(_amm)))
174+ }
175+ let imbalanceDeltaInUSD = muld(imbalanceDeltaInAmmDecimals, price)
176+ let freeBalanceInAmmDecimal = (getFreeBalance(_vault) / 100)
177+ let vaultBalanceInUSD = muld(freeBalanceInAmmDecimal, price)
178+ $Tuple2(imbalanceDeltaInUSD, vaultBalanceInUSD)
179+ }
180+ else throw("Strict value is not equal to itself.")
181+ }
182+
183+
184+func estimateSwap (_amount,_assetId,_targetAsset) = {
185+ let sourceDecimals = if ((_assetId == "WAVES"))
186+ then 8
187+ else valueOrErrorMessage(assetInfo(fromBase58String(_assetId)), ("Invalid asset: " + _assetId)).decimals
188+ let targetDecimals = if ((_targetAsset == "WAVES"))
189+ then 8
190+ else valueOrErrorMessage(assetInfo(fromBase58String(_targetAsset)), ("Invalid asset: " + _targetAsset)).decimals
191+ let sourceAmountInAmmDecimals = if ((sourceDecimals == 8))
192+ then (_amount / 100)
193+ else if ((sourceDecimals == 6))
194+ then _amount
195+ else throw("Invalid decimals (source)")
196+ let sellMarket = getMarket(_assetId)
197+ let s1 = invoke(sellMarket, "swapToQuote", [sourceAmountInAmmDecimals, 0], nil)
198+ if ((s1 == s1))
199+ then {
200+ let usdAmount = match s1 {
201+ case t: Int =>
202+ t
203+ case _ =>
204+ throw("Invalid swapToQuote result")
205+ }
206+ let buyMarket = getMarket(_targetAsset)
207+ let s2 = invoke(buyMarket, "swapToBase", [usdAmount, 0], nil)
208+ if ((s2 == s2))
209+ then {
210+ let targetAmount = match s2 {
211+ case t: Int =>
212+ if ((targetDecimals == 8))
213+ then (t * 100)
214+ else if ((targetDecimals == 6))
215+ then t
216+ else throw("Invalid decimals (target)")
217+ case _ =>
218+ throw("Invalid swapToBase result")
219+ }
220+ let vaultToAdd = getVault(_assetId)
221+ let $t070967261 = getImbalanceCostUSD(vaultToAdd, sellMarket, sourceDecimals, _amount)
222+ let addImbalanceUSD = $t070967261._1
223+ let addVaultBalanceUSD = $t070967261._2
224+ let vaultToRemove = getVault(_targetAsset)
225+ let $t073097545 = getImbalanceCostUSD(vaultToRemove, buyMarket, targetDecimals, -(targetAmount))
226+ let removeImbalanceUSD = $t073097545._1
227+ let removeVaultBalanceUSD = $t073097545._2
228+ let resultImbalanceInUSD = (addImbalanceUSD + removeImbalanceUSD)
229+ let baseFee = fee()
230+ let totalLiquid = (addVaultBalanceUSD + removeVaultBalanceUSD)
231+ let $t076998182 = if ((0 > resultImbalanceInUSD))
232+ then {
233+ let rebateRate = divd(abs(resultImbalanceInUSD), totalLiquid)
234+ let rebate = muld(feeRebate(), rebateRate)
235+ let actualFee = if ((rebate > baseFee))
236+ then 0
237+ else (baseFee - rebate)
238+ $Tuple3(actualFee, rebate, 0)
239+ }
240+ else {
241+ let taxRate = divd(abs(resultImbalanceInUSD), totalLiquid)
242+ let tax = muld(feeRebate(), taxRate)
243+ let actualFee = (baseFee + tax)
244+ $Tuple3(actualFee, 0, tax)
245+ }
246+ let actualFee = $t076998182._1
247+ let rebate = $t076998182._2
248+ let tax = $t076998182._3
249+ let feeInTargetToken = muld(targetAmount, actualFee)
250+ let resultTargetAssetAmount = (targetAmount - feeInTargetToken)
251+ $Tuple13(targetAmount, feeInTargetToken, resultTargetAssetAmount, baseFee, actualFee, rebate, tax, vaultToRemove, vaultToAdd, addImbalanceUSD, addVaultBalanceUSD, removeImbalanceUSD, removeVaultBalanceUSD)
252+ }
253+ else throw("Strict value is not equal to itself.")
254+ }
255+ else throw("Strict value is not equal to itself.")
256+ }
257+
258+
259+func estimateProjectedLiquidity (_vault,_amm,_change) = {
260+ let vaultReserve = ((getFreeBalance(_vault) / 100) + (_change / 100))
261+ let vaultUtilization = (getMaxUtilization(_vault) / 100)
262+ let maxPriceSpread = getMaxPriceSpread(_amm)
263+ let actualLiquidityInBaseAsset = muld(vaultReserve, vaultUtilization)
264+ let newBaseAssetAmount = divd((actualLiquidityInBaseAsset - muld(maxPriceSpread, actualLiquidityInBaseAsset)), maxPriceSpread)
265+ let $t090679153 = getOldProjectedLiquidityAndTerminalPrice(_amm)
266+ if (($t090679153 == $t090679153))
267+ then {
268+ let q = $t090679153._3
269+ let price = $t090679153._2
270+ let oldBaseAssetAmount = $t090679153._1
271+ let baseAssetAmountDelta = (newBaseAssetAmount - oldBaseAssetAmount)
272+ let quoteAssetChange = divd(muld(baseAssetAmountDelta, price), q)
273+ $Tuple2(baseAssetAmountDelta, quoteAssetChange)
274+ }
275+ else throw("Strict value is not equal to itself.")
276+ }
277+
278+
279+func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
280+
281+
282+func updateSettings (_fee,_rebate) = [IntegerEntry(k_fee, _fee), IntegerEntry(k_rebate, _rebate)]
283+
284+
285+@Callable(i)
286+func pause () = if ((i.caller != adminAddress()))
287+ then throw("Invalid pause params")
288+ else [BooleanEntry(k_paused, true)]
289+
290+
291+
292+@Callable(i)
293+func unpause () = if ((i.caller != adminAddress()))
294+ then throw("Invalid unpause params")
295+ else [BooleanEntry(k_paused, false)]
296+
297+
298+
299+@Callable(i)
300+func changeSettings (_fee,_rebate) = if (if (if (if ((0 >= _fee))
301+ then true
302+ else (0 >= _rebate))
303+ then true
304+ else !(initialized()))
305+ then true
306+ else (i.caller != adminAddress()))
307+ then throw("Invalid changeSettings params")
308+ else updateSettings(_fee, _rebate)
309+
310+
311+
312+@Callable(i)
313+func addAmm (_ammAddress,_vaultAddress,_vaultAsset,_data) = if ((i.caller != adminAddress()))
314+ then throw("Invalid addAmm params")
315+ else {
316+ let ammAddress = getAddressIfValid(_ammAddress)
317+ if ((ammAddress == ammAddress))
318+ then {
319+ let vaultAddress = getAddressIfValid(_vaultAddress)
320+ if ((vaultAddress == vaultAddress))
321+ 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)]
322+ else throw("Strict value is not equal to itself.")
323+ }
324+ else throw("Strict value is not equal to itself.")
325+ }
326+
327+
328+
329+@Callable(i)
330+func removeAmm (_ammAddress) = if ((i.caller != adminAddress()))
331+ then throw("Invalid removeAmm params")
332+ else [DeleteEntry(toCompositeKey(k_amm, _ammAddress))]
333+
334+
335+
336+@Callable(i)
337+func initialize (_coordinator,_fee,_rebate) = if (if (if (if ((0 >= _fee))
338+ then true
339+ else (0 >= _rebate))
340+ then true
341+ else initialized())
342+ then true
343+ else (i.caller != this))
344+ then throw("Invalid initialize parameters")
345+ else (updateSettings(_fee, _rebate) ++ [BooleanEntry(k_initialized, true), StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator)))])
346+
347+
348+
349+@Callable(i)
350+func swap (_targetAsset,_minTargetAmount) = {
351+ let checkPaymentCount = if ((size(i.payments) != 1))
352+ then throw("Invalid swap params: payment count")
353+ else true
354+ if ((checkPaymentCount == checkPaymentCount))
355+ then {
356+ let _amount = i.payments[0].amount
357+ let _assetId = i.payments[0].assetId
358+ let assetId = if (isDefined(_assetId))
359+ then toBase58String(value(_assetId))
360+ else "WAVES"
361+ let checkNotSameAsset = if ((_targetAsset == assetId))
362+ then throw("Invalid swap params: same asset")
363+ else true
364+ if ((checkNotSameAsset == checkNotSameAsset))
365+ then {
366+ let $t01249412813 = estimateSwap(_amount, assetId, _targetAsset)
367+ if (($t01249412813 == $t01249412813))
368+ 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
378+ let doDeposit = invoke(vaultToAdd, "repay", nil, [i.payments[0]])
379+ if ((doDeposit == doDeposit))
380+ then {
381+ let doWithdraw = invoke(vaultToRemove, "borrow", [targetAmount], nil)
382+ if ((doWithdraw == doWithdraw))
383+ then {
384+ let targetAsset = if ((_targetAsset == "WAVES"))
385+ then unit
386+ else fromBase58String(_targetAsset)
387+ let doCollectFee = invoke(vaultToRemove, "addFree", nil, [AttachedPayment(targetAsset, feeInTargetToken)])
388+ 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))
392+ else throw("Strict value is not equal to itself.")
393+ }
394+ else throw("Strict value is not equal to itself.")
395+ }
396+ else throw("Strict value is not equal to itself.")
397+ }
398+ else throw("Strict value is not equal to itself.")
399+ }
400+ else throw("Strict value is not equal to itself.")
401+ }
402+ else throw("Strict value is not equal to itself.")
403+ }
404+
405+
406+
407+@Callable(i)
408+func notifyVaultBalanceChange (_asset,_change) = {
409+ let market = getMarketMaybe(_asset)
410+ let vault = getVaultMaybe(_asset)
411+ if (if (isDefined(market))
412+ then isDefined(vault)
413+ else false)
414+ then if ((i.caller != vault))
415+ then throw("Invalid notifyVaultBalanceChange params")
416+ else {
417+ let $t01403414150 = estimateProjectedLiquidity(value(vault), value(market), _change)
418+ if (($t01403414150 == $t01403414150))
419+ then {
420+ let quoteAssetChange = $t01403414150._2
421+ let baseAssetAmountDelta = $t01403414150._1
422+ let result = invoke(value(market), "changeLiquidity", [quoteAssetChange], nil)
423+ if ((result == result))
424+ then nil
425+ else throw("Strict value is not equal to itself.")
426+ }
427+ else throw("Strict value is not equal to itself.")
428+ }
429+ else nil
430+ }
431+
432+
433+
434+@Callable(i)
435+func view_estimateProjectedLiquidity (_asset,_change) = {
436+ let market = getMarket(_asset)
437+ let vault = getVault(_asset)
438+ let $t01443814538 = estimateProjectedLiquidity(vault, market, _change)
439+ if (($t01443814538 == $t01443814538))
440+ then {
441+ let quoteAssetChange = $t01443814538._2
442+ let baseAssetAmountDelta = $t01443814538._1
443+ let data = makeString([toString(baseAssetAmountDelta), toString(quoteAssetChange)], ",")
444+ throw(data)
445+ }
446+ else throw("Strict value is not equal to itself.")
447+ }
448+
449+
450+
451+@Callable(i)
452+func view_estimateSwap (_sourceAmount,_sourceAsset,_targetAsset) = {
453+ let $t01478115106 = estimateSwap(_sourceAmount, _sourceAsset, _targetAsset)
454+ if (($t01478115106 == $t01478115106))
455+ 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
469+ 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)], ",")
470+ throw(data)
471+ }
472+ else throw("Strict value is not equal to itself.")
473+ }
474+
475+
476+@Verifier(tx)
477+func verify () = {
478+ let coordinatorStr = getString(this, k_coordinatorAddress)
479+ if (isDefined(coordinatorStr))
480+ then {
481+ let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
482+ if (isDefined(admin))
483+ then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
484+ else throw("unable to verify: admin not set in coordinator")
485+ }
486+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
487+ }
488+

github/deemru/w8io/873ac7e 
28.90 ms