2022.07.28 14:20 [3225101] smart account 3PEiD1zJWTMZNWSCyzhvBw9pxxAWeEwaghR > SELF 0.00000000 Waves

{ "type": 13, "id": "j7v96kjzErm7LbhGetoN491b22zeNQuDuc5uhEGHv8A", "fee": 2300000, "feeAssetId": null, "timestamp": 1659007111458, "version": 1, "sender": "3PEiD1zJWTMZNWSCyzhvBw9pxxAWeEwaghR", "senderPublicKey": "41uiA5UF2zu2zsaRWQJU9G9dt3n9imXQLui4s78uBZK3", "proofs": [ "3kiiCug1s9uEyawTzC3fSeZa4fiSD4dKT7WjFm3P2G3U55m8nikeUAJbaBJPwbp6MRJ6XMzrx6SBYv4eWtMKEYQA" ], "script": "base64:BgKjAQgCEgASAwoBCBIECgIICBIAEgMKAQgSABIAEgMKAQESABIHCgUICAgIARIAEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBARIDCgEIEgQKAggEEgQKAggBEgQKAggBEgMKAQgSAwoBCBIECgIIARIECgIIARIFCgMIAQgSAwoBCBIFCgMICAESBQoDCAgBEgMKAQgSABIDCgEIEgQKAggBEgMKAQFfAQRnZXRJAQNrZXkJAJoIAgUEdGhpcwUDa2V5AQRnZXRTAQNrZXkJAJ0IAgUEdGhpcwUDa2V5AQVnZXRTVgEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgkArAICAhhubyBzdHJpbmcgdmFsdWUgZm9yIGtleSAFA2tleQIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMBB3Rocm93SWYCCWNvbmRpdGlvbgVlcnJvcgMFCWNvbmRpdGlvbgkAAgEFBWVycm9yBgEId3JpdGVJbnQCA2tleQV2YWx1ZQMJAGYCAAAFBXZhbHVlCQACAQkArAICCQCsAgIJAKwCAgIXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAKQDAQUFdmFsdWUCCSBmb3Iga2V5IAUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIDcjoxAQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQEEZ2V0SQEFA2tleQAABQV2YWx1ZQELd3JpdGVTdHJpbmcCA2tleQV2YWx1ZQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQEMZnJhY3Rpb25DZWlsAwV2YWx1ZQludW1lcmF0b3ILZGVub21pbmF0b3IEBGNhbmQJAGsDBQV2YWx1ZQUJbnVtZXJhdG9yBQtkZW5vbWluYXRvcgQBRACz5pOoCwQFZXhhY3QJAAACCQBqAgkAaAIJAGoCBQRjYW5kBQFECQBqAgULZGVub21pbmF0b3IFAUQFAUQJAGoCCQBoAgkAagIFBXZhbHVlBQFECQBqAgUJbnVtZXJhdG9yBQFEBQFEAwUFZXhhY3QFBGNhbmQJAGQCBQRjYW5kAAEADUJsb2Nrc1BlclllYXIAoIogAAVSQmFzZQCAgIT+pt7hEQALZmFjdG9yc0Jhc2UA6AcADGFzc2V0SWRTdG9yZQIHYXNzZXRJZAAKYXNzZXRJZFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEEZ2V0UwEFDGFzc2V0SWRTdG9yZQIKbm8gYXNzZXRJZAAHYXNzZXRJZAMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyABJyZXNlcnZlRmFjdG9yU3RvcmUJAKwCAgUKYXNzZXRJZFN0cgIOX1Jlc2VydmVGYWN0b3IAFWNvbGxhdGVyYWxGYWN0b3JTdG9yZQkArAICBQphc3NldElkU3RyAhFfQ29sbGF0ZXJhbEZhY3RvcgAZbGlxdWlkYXRpb25UaHJlc2hvbGRTdG9yZQkArAICBQphc3NldElkU3RyAhVfTGlxdWlkYXRpb25UaHJlc2hvbGQAEm92ZXJsYXBDaGFyZ2VTdG9yZQIWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAAXbGlxdWlkYXRpb25QZW5hbHR5U3RvcmUJAKwCAgUKYXNzZXRJZFN0cgITX0xpcXVpZGF0aW9uUGVuYWx0eQASY29uZmlnQWRkcmVzc1N0b3JlAg1jb25maWdBZGRyZXNzAA1hVG9rZW5JZFN0b3JlAghhVG9rZW5JZAAPYVRva2VuTmFtZVN0b3JlAgphVG9rZW5OYW1lABZhVG9rZW5DaXJjdWxhdGlvblN0b3JlAhFhVG9rZW5DaXJjdWxhdGlvbgAVbGFzdFVwZGF0ZUhlaWdodFN0b3JlAhBsYXN0VXBkYXRlSGVpZ2h0AA50b3RhbERlYnRTdG9yZQILdG90YWxCb3Jyb3cAEXRvdGFsRGVwb3NpdFN0b3JlAgx0b3RhbERlcG9zaXQAEXRvdGFsUmVzZXJ2ZVN0b3JlAgx0b3RhbFJlc2VydmUACmluZGV4U3RvcmUCC3N0b3JlZEluZGV4ABNhVG9rZW5EZWNpbWFsc1N0b3JlAg5hVG9rZW5EZWNpbWFscwESYVRva2VuQmFsYW5jZVN0b3JlAQt1c2VyQWRkcmVzcwkArAICBQt1c2VyQWRkcmVzcwIOX2FUb2tlbkJhbGFuY2UBCWRlYnRTdG9yZQELdXNlckFkZHJlc3MJAKwCAgULdXNlckFkZHJlc3MCBV9kZWJ0AQ5kZWJ0SW5kZXhTdG9yZQELdXNlckFkZHJlc3MJAKwCAgULdXNlckFkZHJlc3MCBl9pbmRleAEUdXNlQXNDb2xsYXRlcmFsU3RvcmUBC3VzZXJBZGRyZXNzCQCsAgIFC3VzZXJBZGRyZXNzAhBfdXNlQXNDb2xsYXRlcmFsAQpnZXRCYWxhbmNlAg5hZGRyZXNzT3JBbGlhcwdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmJ2BQckbWF0Y2gwCQDwBwIFDmFkZHJlc3NPckFsaWFzBQJidgMJAAECBQckbWF0Y2gwAgRVbml0BAF1BQckbWF0Y2gwCAkA7wcBBQ5hZGRyZXNzT3JBbGlhcwlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgANYXNzZXREZWNpbWFscwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEEZ2V0SQEFE2FUb2tlbkRlY2ltYWxzU3RvcmUCEG5vIGFzc2V0RGVjaW1hbHMADWNvbmZpZ0FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUSY29uZmlnQWRkcmVzc1N0b3JlAhlyZXNlcnZlOiBubyBjb25maWdBZGRyZXNzAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAQlvcEFsbG93ZWQBAm9wBAckbWF0Y2gwCQD8BwQFDWNvbmZpZ0FkZHJlc3MCCW9wQWxsb3dlZAkAzAgCBQphc3NldElkU3RyCQDMCAIFAm9wBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwAwUBYgYJAAIBAgtub3QgYWxsb3dlZAkAAgECIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQAMbWFpbkNvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgRtYWluAhFubyBtYWluIGluIGNvbmZpZwIBfAAAAhRpbnZhbGlkIG1haW4gYWRkcmVzcwEIbWFpbk9ubHkBAWkDCQEIY29udGFpbnMCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzAgRtYWluCQClCAEIBQFpBmNhbGxlcgYJAAIBAhBvbmx5IG1haW4gY2FuIGRvAQxkaXZBZG1pbk9ubHkBAWkECWRpdkFkbWlucwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCCWRpdkFkbWlucwINbm8gZGl2IGFkbWlucwMJAQEhAQkBCGNvbnRhaW5zAgUJZGl2QWRtaW5zCQClCAEIBQFpBmNhbGxlcgkAAgECFW9ubHkgZGl2IGFkbWluIGNhbiBkbwYBEGlzQXNzZXRJZE9yV2F2ZXMBBXZhbHVlAwMJAQIhPQIFBXZhbHVlAgVXQVZFUwkAAAIJANkEAQUFdmFsdWUJANkEAQIABwkAAgECD2ludmFsaWQgYXNzZXRJZAYADm5vdEluaXRpYWxpemVkCQEHdGhyb3dJZgIJAQlpc0RlZmluZWQBCQEEZ2V0UwEFDGFzc2V0SWRTdG9yZQITYWxyZWFkeSBpbml0aWFsaXplZAASbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDm9yYWNsZV9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0AAtvcmFjbGVQcmljZQQHJG1hdGNoMAkA/AcECQETdmFsdWVPckVycm9yTWVzc2FnZQIFEm1heWJlT3JhY2xlQWRkcmVzcwIJbm8gb3JhY2xlAgVwcmljZQkAzAgCBQphc3NldElkU3RyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkJAAIBAg9iYWQgb3JhY2xlIGRhdGEABkhFSUdIVAUGaGVpZ2h0ABBsYXN0VXBkYXRlSGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQRnZXRJAQUVbGFzdFVwZGF0ZUhlaWdodFN0b3JlAhNubyBsYXN0VXBkYXRlSGVpZ2h0AAhhVG9rZW5JZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQRnZXRTAQUNYVRva2VuSWRTdG9yZQILbm8gYVRva2VuSWQAEWFUb2tlbkNpcmN1bGF0aW9uCQELdmFsdWVPckVsc2UCCQEEZ2V0SQEFFmFUb2tlbkNpcmN1bGF0aW9uU3RvcmUAAAANcmVzZXJ2ZUZhY3RvcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MFEnJlc2VydmVGYWN0b3JTdG9yZQIQbm8gcmVzZXJ2ZUZhY3RvcgAQY29sbGF0ZXJhbEZhY3RvcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MFFWNvbGxhdGVyYWxGYWN0b3JTdG9yZQITbm8gY29sbGF0ZXJhbEZhY3RvcgAUbGlxdWlkYXRpb25UaHJlc2hvbGQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzBRlsaXF1aWRhdGlvblRocmVzaG9sZFN0b3JlAhdubyBsaXF1aWRhdGlvblRocmVzaG9sZAAUYWNjb3VudEhlYWx0aE92ZXJsYXAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzBRJvdmVybGFwQ2hhcmdlU3RvcmUCEG5vIG92ZXJsYXBDaGFyZ2UAEmxpcXVpZGF0aW9uUGVuYWx0eQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MFF2xpcXVpZGF0aW9uUGVuYWx0eVN0b3JlAhVubyBsaXF1aWRhdGlvblBlbmFsdHkAEnN0b3JlZFRvdGFsRGVwb3NpdAkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBBRF0b3RhbERlcG9zaXRTdG9yZQAAABJzdG9yZWRUb3RhbFJlc2VydmUJAQt2YWx1ZU9yRWxzZQIJAQRnZXRJAQURdG90YWxSZXNlcnZlU3RvcmUAAAAPc3RvcmVkVG90YWxEZWJ0CQELdmFsdWVPckVsc2UCCQEEZ2V0SQEFDnRvdGFsRGVidFN0b3JlAAAAC3N0b3JlZEluZGV4CQELdmFsdWVPckVsc2UCCQEEZ2V0SQEFCmluZGV4U3RvcmUFBVJCYXNlAAt1dGlsaXphdGlvbgMJAGYCBRJzdG9yZWRUb3RhbERlcG9zaXQAAAkAlwMBCQDMCAIFC2ZhY3RvcnNCYXNlCQDMCAIJAGsDBQ9zdG9yZWRUb3RhbERlYnQFC2ZhY3RvcnNCYXNlBRJzdG9yZWRUb3RhbERlcG9zaXQFA25pbAAAAANhcHIEAWEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0FQb2ludAQBYgkBEUBleHRyTmF0aXZlKDEwNTApAgUNY29uZmlnQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfQlBvaW50BAFjCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19DUG9pbnQEAWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0RQb2ludAQGbGluZUFDCQBkAgkAawMJAGUCBQFhBQFjBQt1dGlsaXphdGlvbgkBAS0BBQFiBQFhBAZsaW5lQ0QJAGQCCQBrAwkAZQIFAWMFAWQJAGUCBQt1dGlsaXphdGlvbgUBYgkAZQIFAWIFC2ZhY3RvcnNCYXNlBQFjAwkAAAIFC3V0aWxpemF0aW9uAAAFAWEDCQAAAgULdXRpbGl6YXRpb24FAWIFAWMDAwkAZgIFAWIFC3V0aWxpemF0aW9uBgkAAAIFAWIFC2ZhY3RvcnNCYXNlBQZsaW5lQUMFBmxpbmVDRAADYXB5AwkAAAIFEnN0b3JlZFRvdGFsRGVwb3NpdAAAAAAJAGsDCQBrAwUPc3RvcmVkVG90YWxEZWJ0BQNhcHIFEnN0b3JlZFRvdGFsRGVwb3NpdAkAZQIFC2ZhY3RvcnNCYXNlBQ1yZXNlcnZlRmFjdG9yBQtmYWN0b3JzQmFzZQAMY3VycmVudEluZGV4AwkAAAIFBkhFSUdIVAUQbGFzdFVwZGF0ZUhlaWdodAULc3RvcmVkSW5kZXgEA2JwcgkBDGZyYWN0aW9uQ2VpbAMFA2FwcgUFUkJhc2UJAGgCBQ1CbG9ja3NQZXJZZWFyBQtmYWN0b3JzQmFzZQkBDGZyYWN0aW9uQ2VpbAMFC3N0b3JlZEluZGV4CQBkAgUFUkJhc2UJAGgCBQNicHIJAGUCBQZIRUlHSFQFEGxhc3RVcGRhdGVIZWlnaHQFBVJCYXNlAA5zdGFraW5nRW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzCQCsAgICEHN0YWtpbmdfZW5hYmxlZF8FCmFzc2V0SWRTdHIHAA1hY3R1YWxCYWxhbmNlBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA2FpZAUHJG1hdGNoMAkA8AcCBQR0aGlzBQNhaWQICQDvBwEFBHRoaXMJYXZhaWxhYmxlAQ5saXF1aWRpdHlDaGVjawMGYW1vdW50A21heANlcnIDCQBmAgUGYW1vdW50BQNtYXgJAAIBCQCsAgICFm5vdCBlbm91Z2ggbGlxdWlkaXR5OiAFA2VycgYBDnN0b3JlZFVzZXJEZWJ0AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkBBGdldEkBCQEJZGVidFN0b3JlAQULdXNlckFkZHJlc3MAAAEPY3VycmVudFVzZXJEZWJ0AQt1c2VyQWRkcmVzcwQBdgkBDnN0b3JlZFVzZXJEZWJ0AQULdXNlckFkZHJlc3MDCQAAAgUBdgAAAAAED3N0b3JlZFVzZXJJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEEZ2V0SQEJAQ5kZWJ0SW5kZXhTdG9yZQEFC3VzZXJBZGRyZXNzAiBoYXMgZGVidCBidXQgZG9lcyBub3QgaGF2ZSBpbmRleAkAawMFAXYFDGN1cnJlbnRJbmRleAUPc3RvcmVkVXNlckluZGV4ABBjdXJyZW50VG90YWxEZWJ0CQBrAwUPc3RvcmVkVG90YWxEZWJ0BQxjdXJyZW50SW5kZXgFC3N0b3JlZEluZGV4AAlhZGRlZERlYnQJAGUCBRBjdXJyZW50VG90YWxEZWJ0BQ9zdG9yZWRUb3RhbERlYnQADGFkZGVkRGVwb3NpdAkAawMFCWFkZGVkRGVidAkAZQIFC2ZhY3RvcnNCYXNlBQ1yZXNlcnZlRmFjdG9yBQtmYWN0b3JzQmFzZQATY3VycmVudFRvdGFsRGVwb3NpdAkAZAIFEnN0b3JlZFRvdGFsRGVwb3NpdAUMYWRkZWREZXBvc2l0ABNjdXJyZW50VG90YWxSZXNlcnZlCQBlAgkAZAIFEnN0b3JlZFRvdGFsUmVzZXJ2ZQUJYWRkZWREZWJ0BQxhZGRlZERlcG9zaXQADnN0YWtpbmdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgIPc3Rha2luZ19jb25maWdfBQphc3NldElkU3RyCQCsAgICF25vIHN0YWtpbmcgYWRkcmVzcyBmb3IgBQphc3NldElkU3RyCQCsAgICGGJhZCBzdGFraW5nIGFkZHJlc3MgZm9yIAUKYXNzZXRJZFN0cgASY2xhaW1hYmxlRGl2aWRlbmRzCQCXAwEJAMwIAgUTY3VycmVudFRvdGFsUmVzZXJ2ZQkAzAgCAwUOc3Rha2luZ0VuYWJsZWQJAQVhc0ludAEJAPwHBAUOc3Rha2luZ0FkZHJlc3MCBGluZm8FA25pbAUDbmlsBQ1hY3R1YWxCYWxhbmNlBQNuaWwBDXBheW1lbnRBbW91bnQCAWkHYXNzZXRJZAQBcAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQBnAgAABQFwCQACAQkArAICAilQYXltZW50IGlzIGxlc3MgdGhhbiBtaW4gYWxsb3dlZCBhbW91bnQ6IAkApAMBBQFwAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdhc3NldElkCQACAQkArAICAh4gYmFkIGFzc2V0IGF0dGFjaGVkOiByZXF1aXJlZCAFCmFzc2V0SWRTdHIFAXABCnN5bmNUb3RhbHMEEWFkZGl0aW9uYWxEZXBvc2l0DmFkZGl0aW9uYWxEZWJ0EWFkZGl0aW9uYWxSZXNlcnZlDWtlZXBBdEJhbGFuY2UEDXN0YWtpbmdBY3Rpb24DCQAAAgUNYWN0dWFsQmFsYW5jZQUNa2VlcEF0QmFsYW5jZQUEdW5pdAMJAQEhAQUOc3Rha2luZ0VuYWJsZWQFBHVuaXQDCQBmAgUNYWN0dWFsQmFsYW5jZQUNa2VlcEF0QmFsYW5jZQkA/AcEBQ5zdGFraW5nQWRkcmVzcwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQJAGUCBQ1hY3R1YWxCYWxhbmNlBQ1rZWVwQXRCYWxhbmNlBQNuaWwJAPwHBAUOc3Rha2luZ0FkZHJlc3MCA2dldAkAzAgCCQBlAgUNa2VlcEF0QmFsYW5jZQUNYWN0dWFsQmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUNc3Rha2luZ0FjdGlvbgUNc3Rha2luZ0FjdGlvbgkAzAgCCQEId3JpdGVJbnQCBQppbmRleFN0b3JlBQxjdXJyZW50SW5kZXgJAMwIAgkBCHdyaXRlSW50AgUVbGFzdFVwZGF0ZUhlaWdodFN0b3JlBQZIRUlHSFQJAMwIAgkBCHdyaXRlSW50AgURdG90YWxEZXBvc2l0U3RvcmUJAGQCBRNjdXJyZW50VG90YWxEZXBvc2l0BRFhZGRpdGlvbmFsRGVwb3NpdAkAzAgCCQEId3JpdGVJbnQCBQ50b3RhbERlYnRTdG9yZQkAZAIFEGN1cnJlbnRUb3RhbERlYnQFDmFkZGl0aW9uYWxEZWJ0CQDMCAIJAQh3cml0ZUludAIFEXRvdGFsUmVzZXJ2ZVN0b3JlCQBkAgUTY3VycmVudFRvdGFsUmVzZXJ2ZQURYWRkaXRpb25hbFJlc2VydmUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEFcG93MTABAW4DCQAAAgUBbgAGAMCEPQMJAAACBQFuAAgAgMLXLwkAAgEJAKwCAgIOYmFkIGRlY2ltYWxzOiAJAKQDAQUBbgEKYXNzZXRUb1VzZAEGYW1vdW50CQBrAwUGYW1vdW50BQtvcmFjbGVQcmljZQkBBXBvdzEwAQUNYXNzZXREZWNpbWFscwEKdXNkVG9Bc3NldAEGYW1vdW50CQBrAwUGYW1vdW50CQEFcG93MTABBQ1hc3NldERlY2ltYWxzBQtvcmFjbGVQcmljZQENYVRva2VuVG9Bc3NldAEMYVRva2VuQW1vdW50AwkAAAIFDGFUb2tlbkFtb3VudAAAAAADCQBmAgURYVRva2VuQ2lyY3VsYXRpb24AAAkAawMFDGFUb2tlbkFtb3VudAUTY3VycmVudFRvdGFsRGVwb3NpdAURYVRva2VuQ2lyY3VsYXRpb24FDGFUb2tlbkFtb3VudAENYXNzZXRUb0FUb2tlbgELYXNzZXRBbW91bnQDCQAAAgULYXNzZXRBbW91bnQAAAAAAwkAZgIFEWFUb2tlbkNpcmN1bGF0aW9uAAAJAGsDBQthc3NldEFtb3VudAURYVRva2VuQ2lyY3VsYXRpb24FE2N1cnJlbnRUb3RhbERlcG9zaXQFC2Fzc2V0QW1vdW50ARFhc3NldFRvQVRva2VuQ2VpbAELYXNzZXRBbW91bnQDCQAAAgULYXNzZXRBbW91bnQAAAAAAwkAZgIFEWFUb2tlbkNpcmN1bGF0aW9uAAAJAQxmcmFjdGlvbkNlaWwDBQthc3NldEFtb3VudAURYVRva2VuQ2lyY3VsYXRpb24FE2N1cnJlbnRUb3RhbERlcG9zaXQFC2Fzc2V0QW1vdW50AQ1hVG9rZW5CYWxhbmNlAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEEZ2V0SQEJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQdhZGRyZXNzAAABCWVuYWJsZUNvbAEEdXNlcgkBDEJvb2xlYW5FbnRyeQIJARR1c2VBc0NvbGxhdGVyYWxTdG9yZQEFBHVzZXIGARFlbmFibGVDb2xJZk5lZWRlZAEEdXNlcgMJAGYCCQEPY3VycmVudFVzZXJEZWJ0AQUEdXNlcgAACQDMCAIJAQllbmFibGVDb2wBBQR1c2VyBQNuaWwFA25pbAEMY29sbGFwc2VVc2VyAgdhZGRyZXNzBmFtb3VudAQEZGVidAkBD2N1cnJlbnRVc2VyRGVidAEFB2FkZHJlc3MEB2RlcG9zaXQJAQ1hVG9rZW5Ub0Fzc2V0AQkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzBAttYXhQb3NzaWJsZQkAlwMBCQDMCAIFBGRlYnQJAMwIAgUHZGVwb3NpdAUDbmlsBANhbXQDCQBmAgD///////////8BBQZhbW91bnQJAAIBAhdpbnZhbGlkIGNvbGxhcHNlIGFtb3VudAMDCQAAAgULbWF4UG9zc2libGUAAAYJAAACBQZhbW91bnQAAAkAAgECE25vdGhpbmcgdG8gY29sbGFwc2UDAwkAAAIFBmFtb3VudAD///////////8BBgkAZgIFBmFtb3VudAULbWF4UG9zc2libGUFC21heFBvc3NpYmxlBQZhbW91bnQEDnJlbW92ZWRBdG9rZW5zCQERYXNzZXRUb0FUb2tlbkNlaWwBBQNhbXQJAJQKAgkAzggCCQEKc3luY1RvdGFscwQJAQEtAQUDYW10CQEBLQEFA2FtdAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgkBEmFUb2tlbkJhbGFuY2VTdG9yZQEFB2FkZHJlc3MJAQEtAQUOcmVtb3ZlZEF0b2tlbnMJAMwIAgkBCGNoYW5nZUJ5AgUWYVRva2VuQ2lyY3VsYXRpb25TdG9yZQkBAS0BBQ5yZW1vdmVkQXRva2VucwkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQUHYWRkcmVzcwkAZQIFBGRlYnQFA2FtdAkAzAgCCQEId3JpdGVJbnQCCQEOZGVidEluZGV4U3RvcmUBBQdhZGRyZXNzBQxjdXJyZW50SW5kZXgFA25pbAUDYW10AQlyZXBheVVzZXICC3VzZXJBZGRyZXNzBmFtb3VudAQGY2hlY2tzCQEJb3BBbGxvd2VkAQIFcmVwYXkDCQAAAgUGY2hlY2tzBQZjaGVja3MEC2N1cnJlbnREZWJ0CQEPY3VycmVudFVzZXJEZWJ0AQULdXNlckFkZHJlc3MDCQAAAgULY3VycmVudERlYnQFC2N1cnJlbnREZWJ0BA0kdDAxMTI1NzExNTYwAwkAZgIFBmFtb3VudAULY3VycmVudERlYnQJAJYKBAAACQEBLQEFC2N1cnJlbnREZWJ0CQBlAgUGYW1vdW50BQtjdXJyZW50RGVidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQt1c2VyQWRkcmVzcwkAZQIFBmFtb3VudAULY3VycmVudERlYnQFB2Fzc2V0SWQFA25pbAkAlgoECQBlAgULY3VycmVudERlYnQFBmFtb3VudAkBAS0BBQZhbW91bnQAAAUDbmlsBAduZXdEZWJ0CAUNJHQwMTEyNTcxMTU2MAJfMQQPdG90YWxEZWJ0VXBkYXRlCAUNJHQwMTEyNTcxMTU2MAJfMgQGcGF5b3V0CAUNJHQwMTEyNTcxMTU2MAJfMwQHYWN0aW9ucwgFDSR0MDExMjU3MTE1NjACXzQEBnJlcGFpZAkAZQIFBmFtb3VudAUGcGF5b3V0CQCUCgIJAM4IAgkAzggCCQEKc3luY1RvdGFscwQAAAUPdG90YWxEZWJ0VXBkYXRlAAAFBnBheW91dAUHYWN0aW9ucwkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQULdXNlckFkZHJlc3MFB25ld0RlYnQJAMwIAgkBCHdyaXRlSW50AgkBDmRlYnRJbmRleFN0b3JlAQULdXNlckFkZHJlc3MFDGN1cnJlbnRJbmRleAUDbmlsBQZyZXBhaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCWdldENvbmZpZwAEAWEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0FQb2ludAQBYgkBEUBleHRyTmF0aXZlKDEwNTApAgUNY29uZmlnQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfQlBvaW50BAFjCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1jb25maWdBZGRyZXNzCQCsAgIFCmFzc2V0SWRTdHICB19DUG9pbnQEAWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDWNvbmZpZ0FkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX0RQb2ludAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIGQUJDRDogCQCkAwEFAWECATsJAKQDAQUBYgIBOwkApAMBBQFjAgE7CQCkAwEFAWQCESwgcmVzZXJ2ZUZhY3RvcjogCQCkAwEFDXJlc2VydmVGYWN0b3ICFCwgY29sbGF0ZXJhbEZhY3RvcjogCQCkAwEFEGNvbGxhdGVyYWxGYWN0b3ICGCwgbGlxdWlkYXRpb25UaHJlc2hvbGQ6IAkApAMBBRRsaXF1aWRhdGlvblRocmVzaG9sZAIWLCBsaXF1aWRhdGlvblBlbmFsdHk6IAkApAMBBRJsaXF1aWRhdGlvblBlbmFsdHkBCGdldFN0YXRlAAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIVY3VycmVudFRvdGFsRGVwb3NpdDogCQCkAwEFE2N1cnJlbnRUb3RhbERlcG9zaXQCFiwgc3RvcmVkVG90YWxEZXBvc2l0OiAJAKQDAQUSc3RvcmVkVG90YWxEZXBvc2l0AhQsIGN1cnJlbnRUb3RhbERlYnQ6IAkApAMBBRBjdXJyZW50VG90YWxEZWJ0AhMsIHN0b3JlZFRvdGFsRGVidDogCQCkAwEFD3N0b3JlZFRvdGFsRGVidAIXLCBjdXJyZW50VG90YWxSZXNlcnZlOiAJAKQDAQUTY3VycmVudFRvdGFsUmVzZXJ2ZQIWLCBzdG9yZWRUb3RhbFJlc2VydmU6IAkApAMBBRJzdG9yZWRUb3RhbFJlc2VydmUCDywgY3VycmVudEluZGV4OgkApAMBBQxjdXJyZW50SW5kZXgCDywgc3RvcmVkSW5kZXg6IAkApAMBBQtzdG9yZWRJbmRleAIULCBsYXN0VXBkYXRlSGVpZ2h0OiAJAKQDAQUQbGFzdFVwZGF0ZUhlaWdodAIPLCB1dGlsaXphdGlvbjogCQCkAwEFC3V0aWxpemF0aW9uAhUsIGFUb2tlbkNpcmN1bGF0aW9uOiAJAKQDAQURYVRva2VuQ2lyY3VsYXRpb24CDywgYVRva2VuUHJpY2U6IAkApAMBCQENYVRva2VuVG9Bc3NldAEJAGwGAAoAAAUNYXNzZXREZWNpbWFscwAAAAAFBUZMT09SAgcsIEFQUjogCQCkAwEFA2FwcgIHLCBBUFk6IAkApAMBBQNhcHkBDGdldFVzZXJTdGF0ZQEEdXNlcgQIYUJhbGFuY2UJAQ1hVG9rZW5CYWxhbmNlAQUEdXNlcgQOYUJhbGFuY2VXYWxsZXQJAQpnZXRCYWxhbmNlAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEdXNlcgUIYVRva2VuSWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1jdXJyZW50RGVidDogCQCkAwEJAQ9jdXJyZW50VXNlckRlYnQBBQR1c2VyAg4sIHN0b3JlZERlYnQ6IAkApAMBCQELdmFsdWVPckVsc2UCCQEEZ2V0SQEJAQlkZWJ0U3RvcmUBBQR1c2VyAAACEiwgY3VycmVudERlcG9zaXQ6IAkApAMBCQENYVRva2VuVG9Bc3NldAEFCGFCYWxhbmNlAhksIGFUb2tlbkNvbnRyYWN0QmFsYW5jZTogCQCkAwEFCGFCYWxhbmNlAhcsIGFUb2tlbldhbGxldEJhbGFuY2U6IAkApAMBBQ5hQmFsYW5jZVdhbGxldAIPLCB3YWxsZXRTdGFrZTogCQCkAwEJAQ1hVG9rZW5Ub0Fzc2V0AQUOYUJhbGFuY2VXYWxsZXQCFiwgYXNzZXRXYWxsZXRCYWxhbmNlOiAJAKQDAQkBCmdldEJhbGFuY2UCCQERQGV4dHJOYXRpdmUoMTA2MikBBQR1c2VyBQdhc3NldElkAhMsIHVzZUFzQ29sbGF0ZXJhbDogCQClAwEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkBFHVzZUFzQ29sbGF0ZXJhbFN0b3JlAQUEdXNlcgYCDywgc3RvcmVkSW5kZXg6IAkApAMBCQELdmFsdWVPckVsc2UCCQEEZ2V0SQEJAQ5kZWJ0SW5kZXhTdG9yZQEFBHVzZXIAAAELZGVidWdUb3RhbHMACQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIUc3RvcmVkVG90YWxEZXBvc2l0OiAJAKQDAQUSc3RvcmVkVG90YWxEZXBvc2l0AhMsIHN0b3JlZFRvdGFsRGVidDogCQCkAwEFD3N0b3JlZFRvdGFsRGVidAIWLCBzdG9yZWRUb3RhbFJlc2VydmU6IAkApAMBBRJzdG9yZWRUb3RhbFJlc2VydmUCDywgc3RvcmVkSW5kZXg6IAkApAMBBQtzdG9yZWRJbmRleAIULCBsYXN0VXBkYXRlSGVpZ2h0OiAJAKQDAQUQbGFzdFVwZGF0ZUhlaWdodAIXLCBjdXJyZW50VG90YWxEZXBvc2l0OiAJAKQDAQUTY3VycmVudFRvdGFsRGVwb3NpdAIULCBjdXJyZW50VG90YWxEZWJ0OiAJAKQDAQUQY3VycmVudFRvdGFsRGVidAIXLCBjdXJyZW50VG90YWxSZXNlcnZlOiAJAKQDAQUTY3VycmVudFRvdGFsUmVzZXJ2ZQIQLCBjdXJyZW50SW5kZXg6IAkApAMBBQxjdXJyZW50SW5kZXgCESwgY3VycmVudEhlaWdodDogCQCkAwEFBkhFSUdIVAIVLCBhVG9rZW5DaXJjdWxhdGlvbjogCQCkAwEFEWFUb2tlbkNpcmN1bGF0aW9uAg8sIGFUb2tlblByaWNlOiAJAKQDAQkBDWFUb2tlblRvQXNzZXQBCQBsBgAKAAAFDWFzc2V0RGVjaW1hbHMAAAAABQVGTE9PUgEKdXNlclRvdGFscwEEdXNlcgQHYXRva2VucwkBDWFUb2tlbkJhbGFuY2UBBQR1c2VyBAVhc3NldAkBDWFUb2tlblRvQXNzZXQBBQdhdG9rZW5zBARkZWJ0CQEPY3VycmVudFVzZXJEZWJ0AQUEdXNlcgMJAAACBQZIRUlHSFQFEGxhc3RVcGRhdGVIZWlnaHQJAJYKBAUSc3RvcmVkVG90YWxEZXBvc2l0BQ9zdG9yZWRUb3RhbERlYnQFBWFzc2V0BQRkZWJ0CQCWCgQFE2N1cnJlbnRUb3RhbERlcG9zaXQFEGN1cnJlbnRUb3RhbERlYnQFBWFzc2V0BQRkZWJ0ARB3aXRoZHJhd0ludGVybmFsBAFpBHVzZXIGYW1vdW50BnRvTWFpbgQLbWF4V2l0aGRyYXcJAGUCCQBkAgUSc3RvcmVkVG90YWxEZXBvc2l0BRJzdG9yZWRUb3RhbFJlc2VydmUFD3N0b3JlZFRvdGFsRGVidAQGY2hlY2tzAwMDCQEIbWFpbk9ubHkBBQFpCQEObGlxdWlkaXR5Q2hlY2sDBQZhbW91bnQFC21heFdpdGhkcmF3CQCsAgICEmZ1bmRzIGluIHVzZTogbWF4PQkApAMBBQttYXhXaXRoZHJhdwcJAQd0aHJvd0lmAgkAZgIA////////////AQUGYW1vdW50Ag5pbnZhbGlkIGFtb3VudAcJAQlvcEFsbG93ZWQBAgh3aXRoZHJhdwcDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDE1NDQyMTU2MzMDCQAAAgUGYW1vdW50AP///////////wEEB2F0b2tlbnMJAQ1hVG9rZW5CYWxhbmNlAQUEdXNlcgkAlAoCBQdhdG9rZW5zCQENYVRva2VuVG9Bc3NldAEFB2F0b2tlbnMJAJQKAgkBEWFzc2V0VG9BVG9rZW5DZWlsAQUGYW1vdW50BQZhbW91bnQEDnJlbW92ZWRBdG9rZW5zCAUNJHQwMTU0NDIxNTYzMwJfMQQOd2l0aGRyYXdBbW91bnQIBQ0kdDAxNTQ0MjE1NjMzAl8yCQCUCgIJAM4IAgkBCnN5bmNUb3RhbHMECQEBLQEFDndpdGhkcmF3QW1vdW50AAAAAAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwMFBnRvTWFpbgUMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBQR1c2VyBQ53aXRoZHJhd0Ftb3VudAUHYXNzZXRJZAkAzAgCCQEIY2hhbmdlQnkCCQESYVRva2VuQmFsYW5jZVN0b3JlAQUEdXNlcgkBAS0BBQ5yZW1vdmVkQXRva2VucwkAzAgCCQEIY2hhbmdlQnkCBRZhVG9rZW5DaXJjdWxhdGlvblN0b3JlCQEBLQEFDnJlbW92ZWRBdG9rZW5zBQNuaWwFDndpdGhkcmF3QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFyZXBsZW5pc2hJbnRlcm5hbAMCb3AEdXNlcgFpBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQUCb3AHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAxhVG9rZW5BbW91bnQJAQ1wYXltZW50QW1vdW50AgUBaQUIYVRva2VuSWQJAJQKAgkAzggCCQDOCAIJAQpzeW5jVG90YWxzBAAAAAAAAAAACQDMCAIJAQhjaGFuZ2VCeQIJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQR1c2VyBQxhVG9rZW5BbW91bnQJAMwIAgkBBEJ1cm4CBQhhVG9rZW5JZAUMYVRva2VuQW1vdW50BQNuaWwJARFlbmFibGVDb2xJZk5lZWRlZAEFBHVzZXIJAQ1hVG9rZW5Ub0Fzc2V0AQUMYVRva2VuQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxtaW50SW50ZXJuYWwFAWkHYWRkcmVzcwxhbW91bnRUb01pbnQCdG8GYWN0aW9uBBF1c2VyQVRva2VuQmFsYW5jZQkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzBAZhbW91bnQDCQAAAgUMYW1vdW50VG9NaW50AP///////////wEFEXVzZXJBVG9rZW5CYWxhbmNlBQxhbW91bnRUb01pbnQEBmNoZWNrcwMDAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAEFBmFjdGlvbgcJAQd0aHJvd0lmAgkAZgIA////////////AQUMYW1vdW50VG9NaW50AhRpbnZhbGlkIGFtb3VudFRvTWludAcJAQd0aHJvd0lmAgkAZgIFBmFtb3VudAURdXNlckFUb2tlbkJhbGFuY2UJAKwCAgIpVHJ5aW5nIHRvIG1pbnQgbW9yZSB0aGFuIGF2YWlsYWJsZSwgbWF4OiAJAKQDAQURdXNlckFUb2tlbkJhbGFuY2UHAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAM4IAgkBCnN5bmNUb3RhbHMEAAAAAAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgkBEmFUb2tlbkJhbGFuY2VTdG9yZQEFB2FkZHJlc3MJAQEtAQUGYW1vdW50CQDMCAIJAQdSZWlzc3VlAwUIYVRva2VuSWQFBmFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCdG8FBmFtb3VudAUIYVRva2VuSWQFA25pbAkBDWFUb2tlblRvQXNzZXQBBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4hAWkBEmdldFJlc2VydmVEaXZzSW5mbwAJAJQKAgUDbmlsCQCVCgMFEmNsYWltYWJsZURpdmlkZW5kcwUKYXNzZXRJZFN0cgkAZQIFE2N1cnJlbnRUb3RhbFJlc2VydmUFEmNsYWltYWJsZURpdmlkZW5kcwFpARBnZXRDdXJyZW50VG90YWxzAQR1c2VyCQCUCgIFA25pbAkBCnVzZXJUb3RhbHMBBQR1c2VyAWkBEWdldEN1cnJlbnRUb3RhbHMyAgV1c2VyMQV1c2VyMgQNJHQwMTcyMjcxNzI2NAkBCnVzZXJUb3RhbHMBBQV1c2VyMQQCZDEIBQ0kdDAxNzIyNzE3MjY0Al8xBAJkMggFDSR0MDE3MjI3MTcyNjQCXzIEAmQzCAUNJHQwMTcyMjcxNzI2NAJfMwQCZDQIBQ0kdDAxNzIyNzE3MjY0Al80BA0kdDAxNzI2OTE3MzA2CQEKdXNlclRvdGFscwEFBXVzZXIyBAJlMQgFDSR0MDE3MjY5MTczMDYCXzEEAmUyCAUNJHQwMTcyNjkxNzMwNgJfMgQCZTMIBQ0kdDAxNzI2OTE3MzA2Al8zBAJlNAgFDSR0MDE3MjY5MTczMDYCXzQJAJQKAgUDbmlsCQCYCgYFAmQxBQJkMgUCZDMFAmQ0BQJlMwUCZTQBaQEGYWR2aXNlAAkAlAoCBQNuaWwJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhByZXNlcnZlQWRkcmVzczogCQClCAEFBHRoaXMCAiwgCQEJZ2V0Q29uZmlnAAICLCAJAQhnZXRTdGF0ZQABaQEKYWR2aXNlVXNlcgEEdXNlcgQOY3VycmVudERlYnRVc2QJAQphc3NldFRvVXNkAQUQY3VycmVudFRvdGFsRGVidAQRY3VycmVudERlcG9zaXRVc2QJAQphc3NldFRvVXNkAQUTY3VycmVudFRvdGFsRGVwb3NpdAQMYXNDb2xsYXRlcmFsCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARR1c2VBc0NvbGxhdGVyYWxTdG9yZQEFBHVzZXIGBBNlZmZlY3RpdmVEZXBvc2l0VXNkAwUMYXNDb2xsYXRlcmFsBRFjdXJyZW50RGVwb3NpdFVzZAAABApvdmVybGFwVXNkCQCXAwEJAMwIAgUOY3VycmVudERlYnRVc2QJAMwIAgUTZWZmZWN0aXZlRGVwb3NpdFVzZAUDbmlsBA1vdmVybGFwQ2hhcmdlCQEMZnJhY3Rpb25DZWlsAwUKb3ZlcmxhcFVzZAUUYWNjb3VudEhlYWx0aE92ZXJsYXAFC2ZhY3RvcnNCYXNlBAJicAMJAGYCBQ5jdXJyZW50RGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAAACQBrAwkAZQIFE2VmZmVjdGl2ZURlcG9zaXRVc2QFDmN1cnJlbnREZWJ0VXNkBRBjb2xsYXRlcmFsRmFjdG9yBQtmYWN0b3JzQmFzZQQDYnB1AwkAZgIFDmN1cnJlbnREZWJ0VXNkBRNlZmZlY3RpdmVEZXBvc2l0VXNkCQBkAgkAawMJAGUCBQ5jdXJyZW50RGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAULZmFjdG9yc0Jhc2UFFGxpcXVpZGF0aW9uVGhyZXNob2xkBQ1vdmVybGFwQ2hhcmdlBQ1vdmVybGFwQ2hhcmdlBAhlbnJpY2hlZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQcmVzZXJ2ZUFkZHJlc3M6IAkApQgBBQR0aGlzAhIsIGN1cnJlbnREZWJ0VXNkOiAJAKQDAQUOY3VycmVudERlYnRVc2QCFSwgY3VycmVudERlcG9zaXRVc2Q6IAkApAMBBRFjdXJyZW50RGVwb3NpdFVzZAIGLCBicDogCQCkAwEFAmJwAgcsIGJwdTogCQCkAwEFA2JwdQkAlAoCBQNuaWwJAKwCAgkArAICBQhlbnJpY2hlZAICLCAJAQxnZXRVc2VyU3RhdGUBBQR1c2VyAWkBC2FkZEludGVyZXN0AAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYXNzZXRJZAkAAgECJ2Nhbid0IGFkZCBpbnRlcmVzdCB3aXRoIHVucmVsYXRlZCB0b2tlbgkBCnN5bmNUb3RhbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAAAAAAAAFpAQxhZGRUb1Jlc2VydmUAAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdhc3NldElkCQACAQInY2FuJ3QgYWRkIGludGVyZXN0IHdpdGggdW5yZWxhdGVkIHRva2VuCQEKc3luY1RvdGFscwQAAAAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAAAWkBE3dpdGhkcmF3RnJvbVJlc2VydmUBA2FtdAQGY2hlY2tzCQEMZGl2QWRtaW5Pbmx5AQUBaQMJAAACBQZjaGVja3MFBmNoZWNrcwQEZGlmZgMJAAACBQNhbXQA////////////AQUSY2xhaW1hYmxlRGl2aWRlbmRzBQNhbXQJAJQKAgkAzggCCQEKc3luY1RvdGFscwQAAAAACQEBLQEFBGRpZmYFBGRpZmYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQRkaWZmBQdhc3NldElkBQNuaWwFBGRpZmYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZm9yY2VVcGRhdGUABAVhZG1pbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCBWFkbWluAhpyZXNlcnZlOm5vIGFkbWluIGluIGNvbmZpZwMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyBQVhZG1pbgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvCQEKc3luY1RvdGFscwQAAAAAAAAAAAFpAQppbml0aWFsaXplBQpjZmdBZGRyZXNzDmFzc2V0SWRPcldhdmVzCmFUb2tlbk5hbWURYVRva2VuRGVzY3JpcHRpb24OYVRva2VuRGVjaW1hbHMEBmNoZWNrcwMFDm5vdEluaXRpYWxpemVkCQEQaXNBc3NldElkT3JXYXZlcwEFDmFzc2V0SWRPcldhdmVzBwMJAAACBQZjaGVja3MFBmNoZWNrcwQGYVRva2VuCQDCCAUFCmFUb2tlbk5hbWUFEWFUb2tlbkRlc2NyaXB0aW9uAAAFDmFUb2tlbkRlY2ltYWxzBgkAzAgCBQZhVG9rZW4JAMwIAgkBCHdyaXRlSW50AgUTYVRva2VuRGVjaW1hbHNTdG9yZQUOYVRva2VuRGVjaW1hbHMJAMwIAgkBC3dyaXRlU3RyaW5nAgUPYVRva2VuTmFtZVN0b3JlBQphVG9rZW5OYW1lCQDMCAIJAQt3cml0ZVN0cmluZwIFDGFzc2V0SWRTdG9yZQUOYXNzZXRJZE9yV2F2ZXMJAMwIAgkBC3dyaXRlU3RyaW5nAgUSY29uZmlnQWRkcmVzc1N0b3JlBQpjZmdBZGRyZXNzCQDMCAIJAQt3cml0ZVN0cmluZwIFDWFUb2tlbklkU3RvcmUJANgEAQkAuAgBBQZhVG9rZW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtpbml0aWFsaXplMgADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhZvbmx5IHNlbGYgY2FuIGNvbnRpbnVlCQDMCAIJAQh3cml0ZUludAIFFWxhc3RVcGRhdGVIZWlnaHRTdG9yZQUGSEVJR0hUBQNuaWwBaQEOdXNlckRlcG9zaXRVU0QBB2FkZHJlc3MJAJQKAgUDbmlsCQEKYXNzZXRUb1VzZAEJAQ1hVG9rZW5Ub0Fzc2V0AQkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzAWkBC3VzZXJEZWJ0VVNEAQdhZGRyZXNzCQCUCgIFA25pbAkBCmFzc2V0VG9Vc2QBCQEPY3VycmVudFVzZXJEZWJ0AQUHYWRkcmVzcwFpAQt1c2VyQmFsYW5jZQEHYWRkcmVzcwQHYXRva2VucwkBDWFUb2tlbkJhbGFuY2UBBQdhZGRyZXNzBAVhc3NldAkBDWFUb2tlblRvQXNzZXQBBQdhdG9rZW5zBARkZWJ0CQEPY3VycmVudFVzZXJEZWJ0AQUHYWRkcmVzcwkAlAoCBQNuaWwJAJgKBgUHYXRva2VucwUFYXNzZXQJAQphc3NldFRvVXNkAQUFYXNzZXQFBGRlYnQJAQphc3NldFRvVXNkAQUEZGVidAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEUdXNlQXNDb2xsYXRlcmFsU3RvcmUBBQdhZGRyZXNzBgFpAQh1c2VyRGVidAEHYWRkcmVzcwQEZGVidAkBD2N1cnJlbnRVc2VyRGVidAEFB2FkZHJlc3MEB2RlYnRVc2QJAQphc3NldFRvVXNkAQUEZGVidAkAlAoCBQNuaWwJAJQKAgUEZGVidAUHZGVidFVzZAFpAQ1hc3NldFVzZFZhbHVlAQthc3NldEFtb3VudAkAlAoCBQNuaWwJAQphc3NldFRvVXNkAQULYXNzZXRBbW91bnQBaQEIcmVwYXlGb3IBC3VzZXJBZGRyZXNzBAZjaGVja3MJAQhtYWluT25seQEFAWkDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQlyZXBheVVzZXICBQt1c2VyQWRkcmVzcwkBDXBheW1lbnRBbW91bnQCBQFpBQdhc3NldElkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRGb3ICCWRlcG9zaXRvcg91c2VBc0NvbGxhdGVyYWwEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBAgdkZXBvc2l0BwMJAAACBQZjaGVja3MFBmNoZWNrcwMDCQBmAgkBD2N1cnJlbnRVc2VyRGVidAEFCWRlcG9zaXRvcgAACQEBIQEFD3VzZUFzQ29sbGF0ZXJhbAcJAAIBAjhjYW4ndCBkaXNhYmxlIHVzZSBhcyBjb2xsYXRlcmFsIGZvciBhc3NldCB3aXRoIG9wZW4gZGVidAQGYW1vdW50CQENcGF5bWVudEFtb3VudAIFAWkFB2Fzc2V0SWQEDGFUb2tlbkFtb3VudAkBDWFzc2V0VG9BVG9rZW4BBQZhbW91bnQJAM4IAgkBCnN5bmNUb3RhbHMEBQZhbW91bnQAAAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgUWYVRva2VuQ2lyY3VsYXRpb25TdG9yZQUMYVRva2VuQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJARJhVG9rZW5CYWxhbmNlU3RvcmUBBQlkZXBvc2l0b3IFDGFUb2tlbkFtb3VudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBFHVzZUFzQ29sbGF0ZXJhbFN0b3JlAQUJZGVwb3NpdG9yBQ91c2VBc0NvbGxhdGVyYWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0ZvcgIHYWRkcmVzcwZhbW91bnQJARB3aXRoZHJhd0ludGVybmFsBAUBaQUHYWRkcmVzcwUGYW1vdW50BwFpAQ53aXRoZHJhd1RvTWFpbgIEdXNlcgZhbW91bnQDCQECIT0CBQZhbW91bnQA////////////AQkAAgECJnJlc2VydmU6IHdpdGhkcmF3VG9NYWluIGFtb3VudCAtMSBvbmx5CQEQd2l0aGRyYXdJbnRlcm5hbAQFAWkFBHVzZXIFBmFtb3VudAYBaQEWcmVwbGVuaXNoV2l0aEF0b2tlbkZvcgEEdXNlcgkBEXJlcGxlbmlzaEludGVybmFsAwIRcmVwbGVuaXNoX2F0b2tlbnMFBHVzZXIFAWkBaQEecmVwbGVuaXNoRm9yUmVwYXlXaXRoQXRva2VuRm9yAQR1c2VyCQERcmVwbGVuaXNoSW50ZXJuYWwDAg1yZXBheV9hdG9rZW5zBQR1c2VyBQFpAWkBCWJvcnJvd0ZvcgIHYWRkcmVzcw5hbW91bnRUb0JvcnJvdwQGY2hlY2tzAwMJAQhtYWluT25seQEFAWkJAQ5saXF1aWRpdHlDaGVjawMFDmFtb3VudFRvQm9ycm93CQBlAgUSc3RvcmVkVG90YWxEZXBvc2l0BQ9zdG9yZWRUb3RhbERlYnQCGXRvbyBtdWNoIGJvcnJvdyByZXF1ZXN0ZWQHCQEJb3BBbGxvd2VkAQIGYm9ycm93BwMJAAACBQZjaGVja3MFBmNoZWNrcwQLY3VycmVudERlYnQJAQ9jdXJyZW50VXNlckRlYnQBBQdhZGRyZXNzBAduZXdEZWJ0CQBkAgULY3VycmVudERlYnQFDmFtb3VudFRvQm9ycm93CQDOCAIJAQpzeW5jVG90YWxzBAAABQ5hbW91bnRUb0JvcnJvdwAABQ5hbW91bnRUb0JvcnJvdwkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQUHYWRkcmVzcwUHbmV3RGVidAkAzAgCCQEJZW5hYmxlQ29sAQUHYWRkcmVzcwkAzAgCCQEId3JpdGVJbnQCCQEOZGVidEluZGV4U3RvcmUBBQdhZGRyZXNzBQxjdXJyZW50SW5kZXgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwUOYW1vdW50VG9Cb3Jyb3cFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1taW50QXRva2VuRm9yAgdhZGRyZXNzDGFtb3VudFRvTWludAkBDG1pbnRJbnRlcm5hbAUFAWkFB2FkZHJlc3MFDGFtb3VudFRvTWludAUHYWRkcmVzcwIMbWludF9hdG9rZW5zAWkBD21pbnRBdG9rZW5Gb3JUbwMEZnJvbQxhbW91bnRUb01pbnQCdG8JAQxtaW50SW50ZXJuYWwFBQFpBQRmcm9tBQxhbW91bnRUb01pbnQFAnRvAhFsb2NrX21pbnRfYXRva2VucwFpARByZWRlZW1BdG9rZW5zRm9yAQR1c2VyBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIOcmVkZWVtX2F0b2tlbnMHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAxhVG9rZW5BbW91bnQJAQ1wYXltZW50QW1vdW50AgUBaQUIYVRva2VuSWQECW91dEFtb3VudAkBDWFUb2tlblRvQXNzZXQBBQxhVG9rZW5BbW91bnQJAJQKAgkAzggCCQEKc3luY1RvdGFscwQJAQEtAQUJb3V0QW1vdW50AAAAAAUJb3V0QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIFCW91dEFtb3VudAUHYXNzZXRJZAkAzAgCCQEIY2hhbmdlQnkCBRZhVG9rZW5DaXJjdWxhdGlvblN0b3JlCQEBLQEFDGFUb2tlbkFtb3VudAkAzAgCCQEEQnVybgIFCGFUb2tlbklkBQxhVG9rZW5BbW91bnQFA25pbAUJb3V0QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnRyYW5zZmVyQVRva2Vuc0ZvcgMEZnJvbQJ0bwh2YWx1ZVVzZAQGY2hlY2tzAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECDXRyYW5zZmVyX2RlYnQHAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAZhc3NldHMJAQp1c2RUb0Fzc2V0AQUIdmFsdWVVc2QEB2F0b2tlbnMJAQ1hc3NldFRvQVRva2VuAQUGYXNzZXRzBAthVG9rZW5zRnJvbQkBDWFUb2tlbkJhbGFuY2UBBQRmcm9tAwkAZgIFB2F0b2tlbnMFC2FUb2tlbnNGcm9tCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhl0cmFuc2ZlckF0b2tlbnNGb3IgZXJyb3I6AhQgdHJhbnNmZXIudmFsdWVVc2Q6IAkApAMBBQh2YWx1ZVVzZAISIHRyYW5zZmVyLmFzc2V0czogCQCkAwEFBmFzc2V0cwITIHRyYW5zZmVyLmF0b2tlbnM6IAkApAMBBQdhdG9rZW5zAg8gZnJvbS5hdG9rZW5zOiAJAKQDAQULYVRva2Vuc0Zyb20CBCBhdCAJAKUIAQUEdGhpcwkAlAoCCQDOCAIJAM4IAgkBCnN5bmNUb3RhbHMEAAAAAAAAAAAJAMwIAgkBCGNoYW5nZUJ5AgkBEmFUb2tlbkJhbGFuY2VTdG9yZQEFBGZyb20JAQEtAQUHYXRva2VucwkAzAgCCQEIY2hhbmdlQnkCCQESYVRva2VuQmFsYW5jZVN0b3JlAQUCdG8FB2F0b2tlbnMFA25pbAkBEWVuYWJsZUNvbElmTmVlZGVkAQUCdG8JAQ1hVG9rZW5Ub0Fzc2V0AQUHYXRva2VucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ90cmFuc2ZlckRlYnRGb3IDBGZyb20CdG8GYW1vdW50BAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQINdHJhbnNmZXJfZGVidAcDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgkAzggCCQEKc3luY1RvdGFscwQAAAAAAAAAAAkAzAgCCQEId3JpdGVJbnQCCQEJZGVidFN0b3JlAQUEZnJvbQkAZQIJAQ9jdXJyZW50VXNlckRlYnQBBQRmcm9tBQZhbW91bnQJAMwIAgkBCHdyaXRlSW50AgkBCWRlYnRTdG9yZQEFAnRvCQBkAgkBD2N1cnJlbnRVc2VyRGVidAEFAnRvBQZhbW91bnQJAMwIAgkBCHdyaXRlSW50AgkBDmRlYnRJbmRleFN0b3JlAQUEZnJvbQUMY3VycmVudEluZGV4CQDMCAIJAQh3cml0ZUludAIJAQ5kZWJ0SW5kZXhTdG9yZQEFAnRvBQxjdXJyZW50SW5kZXgJAMwIAgkBCWVuYWJsZUNvbAEFAnRvBQNuaWwFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlkaXNhYmxlVXNlQXNDb2xsYXRlcmFsRm9yAQdhZGRyZXNzBAZjaGVja3MDCQEIbWFpbk9ubHkBBQFpCQEJb3BBbGxvd2VkAQIKdXNlX2FzX2NvbAcDCQAAAgUGY2hlY2tzBQZjaGVja3MDCQBmAgkBD2N1cnJlbnRVc2VyRGVidAEFB2FkZHJlc3MAAAkAAgECMWNhbid0IGRpc2FibGUgY29sbGF0ZXJhbCBmb3IgYXNzZXQgd2l0aCBvcGVuIGRlYnQJAM4IAgkBCnN5bmNUb3RhbHMEAAAAAAAAAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARR1c2VBc0NvbGxhdGVyYWxTdG9yZQEFB2FkZHJlc3MHBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZW5hYmxlVXNlQXNDb2xsYXRlcmFsAAQGY2hlY2tzCQEJb3BBbGxvd2VkAQIKdXNlX2FzX2NvbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAzggCCQEKc3luY1RvdGFscwQAAAAAAAAAAAkAzAgCCQEJZW5hYmxlQ29sAQkApQgBCAUBaQZjYWxsZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjb2xsYXBzZUZvcgEEdXNlcgQGY2hlY2tzAwkBCG1haW5Pbmx5AQUBaQkBCW9wQWxsb3dlZAECDmZvcmNlX2NvbGxhcHNlBwMJAAACBQZjaGVja3MFBmNoZWNrcwkBDGNvbGxhcHNlVXNlcgIFBHVzZXIA////////////AQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFjb2xsYXBzZUZvckFtb3VudAIEdXNlcgZhbW91bnQEBmNoZWNrcwMJAQhtYWluT25seQEFAWkJAQlvcEFsbG93ZWQBAghjb2xsYXBzZQcDCQAAAgUGY2hlY2tzBQZjaGVja3MJAQxjb2xsYXBzZVVzZXICBQR1c2VyBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHbHBWYWx1ZQEMYVRva2VuQW1vdW50CQCUCgIFA25pbAkBDWFUb2tlblRvQXNzZXQBBQxhVG9rZW5BbW91bnQAPtkuog==", "chainId": 87, "height": 3225101, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4iWAGERDRe1mM6yu22XpwcdNpiw4tG5tgCzfkpts1J5a Next: 9oCAoKwLKM4cqJosEtk5iPsqG1UNne1DXVNu11z7eRmk Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getI (key) = getInteger(this, key)
790790 }
791791
792792
793+
794+@Callable(i)
795+func lpValue (aTokenAmount) = $Tuple2(nil, aTokenToAsset(aTokenAmount))
796+
797+
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getI (key) = getInteger(this, key)
55
66
77 func getS (key) = getString(this, key)
88
99
1010 func getSV (key) = valueOrErrorMessage(getString(this, key), ((("no string value for key " + key) + " at address ") + toString(this)))
1111
1212
1313 func throwIf (condition,error) = if (condition)
1414 then throw(error)
1515 else true
1616
1717
1818 func writeInt (key,value) = if ((0 > value))
1919 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
2020 else IntegerEntry(key, value)
2121
2222
2323 func asInt (value) = match value {
2424 case int: Int =>
2525 int
2626 case _ =>
2727 throw("r:1")
2828 }
2929
3030
3131 func changeBy (key,value) = writeInt(key, (valueOrElse(getI(key), 0) + value))
3232
3333
3434 func writeString (key,value) = StringEntry(key, value)
3535
3636
3737 func fractionCeil (value,numerator,denominator) = {
3838 let cand = fraction(value, numerator, denominator)
3939 let D = 3037000499
4040 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
4141 if (exact)
4242 then cand
4343 else (cand + 1)
4444 }
4545
4646
4747 let BlocksPerYear = 525600
4848
4949 let RBase = 10000000000000000
5050
5151 let factorsBase = 1000
5252
5353 let assetIdStore = "assetId"
5454
5555 let assetIdStr = valueOrErrorMessage(getS(assetIdStore), "no assetId")
5656
5757 let assetId = if ((assetIdStr == "WAVES"))
5858 then unit
5959 else fromBase58String(assetIdStr)
6060
6161 let reserveFactorStore = (assetIdStr + "_ReserveFactor")
6262
6363 let collateralFactorStore = (assetIdStr + "_CollateralFactor")
6464
6565 let liquidationThresholdStore = (assetIdStr + "_LiquidationThreshold")
6666
6767 let overlapChargeStore = "account_health_overlap"
6868
6969 let liquidationPenaltyStore = (assetIdStr + "_LiquidationPenalty")
7070
7171 let configAddressStore = "configAddress"
7272
7373 let aTokenIdStore = "aTokenId"
7474
7575 let aTokenNameStore = "aTokenName"
7676
7777 let aTokenCirculationStore = "aTokenCirculation"
7878
7979 let lastUpdateHeightStore = "lastUpdateHeight"
8080
8181 let totalDebtStore = "totalBorrow"
8282
8383 let totalDepositStore = "totalDeposit"
8484
8585 let totalReserveStore = "totalReserve"
8686
8787 let indexStore = "storedIndex"
8888
8989 let aTokenDecimalsStore = "aTokenDecimals"
9090
9191 func aTokenBalanceStore (userAddress) = (userAddress + "_aTokenBalance")
9292
9393
9494 func debtStore (userAddress) = (userAddress + "_debt")
9595
9696
9797 func debtIndexStore (userAddress) = (userAddress + "_index")
9898
9999
100100 func useAsCollateralStore (userAddress) = (userAddress + "_useAsCollateral")
101101
102102
103103 func getBalance (addressOrAlias,assetId) = match assetId {
104104 case bv: ByteVector =>
105105 assetBalance(addressOrAlias, bv)
106106 case u: Unit =>
107107 wavesBalance(addressOrAlias).available
108108 case _ =>
109109 throw("Match error")
110110 }
111111
112112
113113 let assetDecimals = valueOrErrorMessage(getI(aTokenDecimalsStore), "no assetDecimals")
114114
115115 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "reserve: no configAddress")), "invalid config address")
116116
117117 func opAllowed (op) = match invoke(configAddress, "opAllowed", [assetIdStr, op], nil) {
118118 case b: Boolean =>
119119 if (b)
120120 then true
121121 else throw("not allowed")
122122 case _ =>
123123 throw("opAllowed: unexpected result type")
124124 }
125125
126126
127127 let mainContract = valueOrErrorMessage(addressFromString(split(valueOrErrorMessage(getString(configAddress, "main"), "no main in config"), "|")[0]), "invalid main address")
128128
129129 func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
130130 then true
131131 else throw("only main can do")
132132
133133
134134 func divAdminOnly (i) = {
135135 let divAdmins = valueOrErrorMessage(getString(configAddress, "divAdmins"), "no div admins")
136136 if (!(contains(divAdmins, toString(i.caller))))
137137 then throw("only div admin can do")
138138 else true
139139 }
140140
141141
142142 func isAssetIdOrWaves (value) = if (if ((value != "WAVES"))
143143 then (fromBase58String(value) == fromBase58String(""))
144144 else false)
145145 then throw("invalid assetId")
146146 else true
147147
148148
149149 let notInitialized = throwIf(isDefined(getS(assetIdStore)), "already initialized")
150150
151151 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
152152 case s: String =>
153153 addressFromString(s)
154154 case _ =>
155155 unit
156156 }
157157
158158 let oraclePrice = match invoke(valueOrErrorMessage(maybeOracleAddress, "no oracle"), "price", [assetIdStr], nil) {
159159 case i: Int =>
160160 i
161161 case _ =>
162162 throw("bad oracle data")
163163 }
164164
165165 let HEIGHT = height
166166
167167 let lastUpdateHeight = valueOrErrorMessage(getI(lastUpdateHeightStore), "no lastUpdateHeight")
168168
169169 let aTokenId = fromBase58String(valueOrErrorMessage(getS(aTokenIdStore), "no aTokenId"))
170170
171171 let aTokenCirculation = valueOrElse(getI(aTokenCirculationStore), 0)
172172
173173 let reserveFactor = valueOrErrorMessage(getInteger(configAddress, reserveFactorStore), "no reserveFactor")
174174
175175 let collateralFactor = valueOrErrorMessage(getInteger(configAddress, collateralFactorStore), "no collateralFactor")
176176
177177 let liquidationThreshold = valueOrErrorMessage(getInteger(configAddress, liquidationThresholdStore), "no liquidationThreshold")
178178
179179 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, overlapChargeStore), "no overlapCharge")
180180
181181 let liquidationPenalty = valueOrErrorMessage(getInteger(configAddress, liquidationPenaltyStore), "no liquidationPenalty")
182182
183183 let storedTotalDeposit = valueOrElse(getI(totalDepositStore), 0)
184184
185185 let storedTotalReserve = valueOrElse(getI(totalReserveStore), 0)
186186
187187 let storedTotalDebt = valueOrElse(getI(totalDebtStore), 0)
188188
189189 let storedIndex = valueOrElse(getI(indexStore), RBase)
190190
191191 let utilization = if ((storedTotalDeposit > 0))
192192 then min([factorsBase, fraction(storedTotalDebt, factorsBase, storedTotalDeposit)])
193193 else 0
194194
195195 let apr = {
196196 let a = getIntegerValue(configAddress, (assetIdStr + "_APoint"))
197197 let b = getIntegerValue(configAddress, (assetIdStr + "_BPoint"))
198198 let c = getIntegerValue(configAddress, (assetIdStr + "_CPoint"))
199199 let d = getIntegerValue(configAddress, (assetIdStr + "_DPoint"))
200200 let lineAC = (fraction((a - c), utilization, -(b)) + a)
201201 let lineCD = (fraction((c - d), (utilization - b), (b - factorsBase)) + c)
202202 if ((utilization == 0))
203203 then a
204204 else if ((utilization == b))
205205 then c
206206 else if (if ((b > utilization))
207207 then true
208208 else (b == factorsBase))
209209 then lineAC
210210 else lineCD
211211 }
212212
213213 let apy = if ((storedTotalDeposit == 0))
214214 then 0
215215 else fraction(fraction(storedTotalDebt, apr, storedTotalDeposit), (factorsBase - reserveFactor), factorsBase)
216216
217217 let currentIndex = if ((HEIGHT == lastUpdateHeight))
218218 then storedIndex
219219 else {
220220 let bpr = fractionCeil(apr, RBase, (BlocksPerYear * factorsBase))
221221 fractionCeil(storedIndex, (RBase + (bpr * (HEIGHT - lastUpdateHeight))), RBase)
222222 }
223223
224224 let stakingEnabled = valueOrElse(getBoolean(configAddress, ("staking_enabled_" + assetIdStr)), false)
225225
226226 let actualBalance = match assetId {
227227 case aid: ByteVector =>
228228 assetBalance(this, aid)
229229 case _ =>
230230 wavesBalance(this).available
231231 }
232232
233233 func liquidityCheck (amount,max,err) = if ((amount > max))
234234 then throw(("not enough liquidity: " + err))
235235 else true
236236
237237
238238 func storedUserDebt (userAddress) = valueOrElse(getI(debtStore(userAddress)), 0)
239239
240240
241241 func currentUserDebt (userAddress) = {
242242 let v = storedUserDebt(userAddress)
243243 if ((v == 0))
244244 then 0
245245 else {
246246 let storedUserIndex = valueOrErrorMessage(getI(debtIndexStore(userAddress)), "has debt but does not have index")
247247 fraction(v, currentIndex, storedUserIndex)
248248 }
249249 }
250250
251251
252252 let currentTotalDebt = fraction(storedTotalDebt, currentIndex, storedIndex)
253253
254254 let addedDebt = (currentTotalDebt - storedTotalDebt)
255255
256256 let addedDeposit = fraction(addedDebt, (factorsBase - reserveFactor), factorsBase)
257257
258258 let currentTotalDeposit = (storedTotalDeposit + addedDeposit)
259259
260260 let currentTotalReserve = ((storedTotalReserve + addedDebt) - addedDeposit)
261261
262262 let stakingAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, ("staking_config_" + assetIdStr)), ("no staking address for " + assetIdStr))), ("bad staking address for " + assetIdStr))
263263
264264 let claimableDividends = min([currentTotalReserve, if (stakingEnabled)
265265 then asInt(invoke(stakingAddress, "info", nil, nil))
266266 else actualBalance])
267267
268268 func paymentAmount (i,assetId) = {
269269 let p = i.payments[0].amount
270270 if ((0 >= p))
271271 then throw(("Payment is less than min allowed amount: " + toString(p)))
272272 else if ((i.payments[0].assetId != assetId))
273273 then throw((" bad asset attached: required " + assetIdStr))
274274 else p
275275 }
276276
277277
278278 func syncTotals (additionalDeposit,additionalDebt,additionalReserve,keepAtBalance) = {
279279 let stakingAction = if ((actualBalance == keepAtBalance))
280280 then unit
281281 else if (!(stakingEnabled))
282282 then unit
283283 else if ((actualBalance > keepAtBalance))
284284 then invoke(stakingAddress, "put", nil, [AttachedPayment(assetId, (actualBalance - keepAtBalance))])
285285 else invoke(stakingAddress, "get", [(keepAtBalance - actualBalance)], nil)
286286 if ((stakingAction == stakingAction))
287287 then [writeInt(indexStore, currentIndex), writeInt(lastUpdateHeightStore, HEIGHT), writeInt(totalDepositStore, (currentTotalDeposit + additionalDeposit)), writeInt(totalDebtStore, (currentTotalDebt + additionalDebt)), writeInt(totalReserveStore, (currentTotalReserve + additionalReserve))]
288288 else throw("Strict value is not equal to itself.")
289289 }
290290
291291
292292 func pow10 (n) = if ((n == 6))
293293 then 1000000
294294 else if ((n == 8))
295295 then 100000000
296296 else throw(("bad decimals: " + toString(n)))
297297
298298
299299 func assetToUsd (amount) = fraction(amount, oraclePrice, pow10(assetDecimals))
300300
301301
302302 func usdToAsset (amount) = fraction(amount, pow10(assetDecimals), oraclePrice)
303303
304304
305305 func aTokenToAsset (aTokenAmount) = if ((aTokenAmount == 0))
306306 then 0
307307 else if ((aTokenCirculation > 0))
308308 then fraction(aTokenAmount, currentTotalDeposit, aTokenCirculation)
309309 else aTokenAmount
310310
311311
312312 func assetToAToken (assetAmount) = if ((assetAmount == 0))
313313 then 0
314314 else if ((aTokenCirculation > 0))
315315 then fraction(assetAmount, aTokenCirculation, currentTotalDeposit)
316316 else assetAmount
317317
318318
319319 func assetToATokenCeil (assetAmount) = if ((assetAmount == 0))
320320 then 0
321321 else if ((aTokenCirculation > 0))
322322 then fractionCeil(assetAmount, aTokenCirculation, currentTotalDeposit)
323323 else assetAmount
324324
325325
326326 func aTokenBalance (address) = valueOrElse(getI(aTokenBalanceStore(address)), 0)
327327
328328
329329 func enableCol (user) = BooleanEntry(useAsCollateralStore(user), true)
330330
331331
332332 func enableColIfNeeded (user) = if ((currentUserDebt(user) > 0))
333333 then [enableCol(user)]
334334 else nil
335335
336336
337337 func collapseUser (address,amount) = {
338338 let debt = currentUserDebt(address)
339339 let deposit = aTokenToAsset(aTokenBalance(address))
340340 let maxPossible = min([debt, deposit])
341341 let amt = if ((-1 > amount))
342342 then throw("invalid collapse amount")
343343 else if (if ((maxPossible == 0))
344344 then true
345345 else (amount == 0))
346346 then throw("nothing to collapse")
347347 else if (if ((amount == -1))
348348 then true
349349 else (amount > maxPossible))
350350 then maxPossible
351351 else amount
352352 let removedAtokens = assetToATokenCeil(amt)
353353 $Tuple2((syncTotals(-(amt), -(amt), 0, 0) ++ [changeBy(aTokenBalanceStore(address), -(removedAtokens)), changeBy(aTokenCirculationStore, -(removedAtokens)), writeInt(debtStore(address), (debt - amt)), writeInt(debtIndexStore(address), currentIndex)]), amt)
354354 }
355355
356356
357357 func repayUser (userAddress,amount) = {
358358 let checks = opAllowed("repay")
359359 if ((checks == checks))
360360 then {
361361 let currentDebt = currentUserDebt(userAddress)
362362 if ((currentDebt == currentDebt))
363363 then {
364364 let $t01125711560 = if ((amount > currentDebt))
365365 then $Tuple4(0, -(currentDebt), (amount - currentDebt), [ScriptTransfer(addressFromStringValue(userAddress), (amount - currentDebt), assetId)])
366366 else $Tuple4((currentDebt - amount), -(amount), 0, nil)
367367 let newDebt = $t01125711560._1
368368 let totalDebtUpdate = $t01125711560._2
369369 let payout = $t01125711560._3
370370 let actions = $t01125711560._4
371371 let repaid = (amount - payout)
372372 $Tuple2(((syncTotals(0, totalDebtUpdate, 0, payout) ++ actions) ++ [writeInt(debtStore(userAddress), newDebt), writeInt(debtIndexStore(userAddress), currentIndex)]), repaid)
373373 }
374374 else throw("Strict value is not equal to itself.")
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378
379379
380380 func getConfig () = {
381381 let a = getIntegerValue(configAddress, (assetIdStr + "_APoint"))
382382 let b = getIntegerValue(configAddress, (assetIdStr + "_BPoint"))
383383 let c = getIntegerValue(configAddress, (assetIdStr + "_CPoint"))
384384 let d = getIntegerValue(configAddress, (assetIdStr + "_DPoint"))
385385 ((((((((((((((("ABCD: " + toString(a)) + ";") + toString(b)) + ";") + toString(c)) + ";") + toString(d)) + ", reserveFactor: ") + toString(reserveFactor)) + ", collateralFactor: ") + toString(collateralFactor)) + ", liquidationThreshold: ") + toString(liquidationThreshold)) + ", liquidationPenalty: ") + toString(liquidationPenalty))
386386 }
387387
388388
389389 func getState () = ((((((((((((((((((((((((((("currentTotalDeposit: " + toString(currentTotalDeposit)) + ", storedTotalDeposit: ") + toString(storedTotalDeposit)) + ", currentTotalDebt: ") + toString(currentTotalDebt)) + ", storedTotalDebt: ") + toString(storedTotalDebt)) + ", currentTotalReserve: ") + toString(currentTotalReserve)) + ", storedTotalReserve: ") + toString(storedTotalReserve)) + ", currentIndex:") + toString(currentIndex)) + ", storedIndex: ") + toString(storedIndex)) + ", lastUpdateHeight: ") + toString(lastUpdateHeight)) + ", utilization: ") + toString(utilization)) + ", aTokenCirculation: ") + toString(aTokenCirculation)) + ", aTokenPrice: ") + toString(aTokenToAsset(pow(10, 0, assetDecimals, 0, 0, FLOOR)))) + ", APR: ") + toString(apr)) + ", APY: ") + toString(apy))
390390
391391
392392 func getUserState (user) = {
393393 let aBalance = aTokenBalance(user)
394394 let aBalanceWallet = getBalance(addressFromStringValue(user), aTokenId)
395395 ((((((((((((((((("currentDebt: " + toString(currentUserDebt(user))) + ", storedDebt: ") + toString(valueOrElse(getI(debtStore(user)), 0))) + ", currentDeposit: ") + toString(aTokenToAsset(aBalance))) + ", aTokenContractBalance: ") + toString(aBalance)) + ", aTokenWalletBalance: ") + toString(aBalanceWallet)) + ", walletStake: ") + toString(aTokenToAsset(aBalanceWallet))) + ", assetWalletBalance: ") + toString(getBalance(addressFromStringValue(user), assetId))) + ", useAsCollateral: ") + toString(valueOrElse(getBoolean(this, useAsCollateralStore(user)), true))) + ", storedIndex: ") + toString(valueOrElse(getI(debtIndexStore(user)), 0)))
396396 }
397397
398398
399399 func debugTotals () = ((((((((((((((((((((((("storedTotalDeposit: " + toString(storedTotalDeposit)) + ", storedTotalDebt: ") + toString(storedTotalDebt)) + ", storedTotalReserve: ") + toString(storedTotalReserve)) + ", storedIndex: ") + toString(storedIndex)) + ", lastUpdateHeight: ") + toString(lastUpdateHeight)) + ", currentTotalDeposit: ") + toString(currentTotalDeposit)) + ", currentTotalDebt: ") + toString(currentTotalDebt)) + ", currentTotalReserve: ") + toString(currentTotalReserve)) + ", currentIndex: ") + toString(currentIndex)) + ", currentHeight: ") + toString(HEIGHT)) + ", aTokenCirculation: ") + toString(aTokenCirculation)) + ", aTokenPrice: ") + toString(aTokenToAsset(pow(10, 0, assetDecimals, 0, 0, FLOOR))))
400400
401401
402402 func userTotals (user) = {
403403 let atokens = aTokenBalance(user)
404404 let asset = aTokenToAsset(atokens)
405405 let debt = currentUserDebt(user)
406406 if ((HEIGHT == lastUpdateHeight))
407407 then $Tuple4(storedTotalDeposit, storedTotalDebt, asset, debt)
408408 else $Tuple4(currentTotalDeposit, currentTotalDebt, asset, debt)
409409 }
410410
411411
412412 func withdrawInternal (i,user,amount,toMain) = {
413413 let maxWithdraw = ((storedTotalDeposit + storedTotalReserve) - storedTotalDebt)
414414 let checks = if (if (if (mainOnly(i))
415415 then liquidityCheck(amount, maxWithdraw, ("funds in use: max=" + toString(maxWithdraw)))
416416 else false)
417417 then throwIf((-1 > amount), "invalid amount")
418418 else false)
419419 then opAllowed("withdraw")
420420 else false
421421 if ((checks == checks))
422422 then {
423423 let $t01544215633 = if ((amount == -1))
424424 then {
425425 let atokens = aTokenBalance(user)
426426 $Tuple2(atokens, aTokenToAsset(atokens))
427427 }
428428 else $Tuple2(assetToATokenCeil(amount), amount)
429429 let removedAtokens = $t01544215633._1
430430 let withdrawAmount = $t01544215633._2
431431 $Tuple2((syncTotals(-(withdrawAmount), 0, 0, withdrawAmount) ++ [ScriptTransfer(if (toMain)
432432 then mainContract
433433 else addressFromStringValue(user), withdrawAmount, assetId), changeBy(aTokenBalanceStore(user), -(removedAtokens)), changeBy(aTokenCirculationStore, -(removedAtokens))]), withdrawAmount)
434434 }
435435 else throw("Strict value is not equal to itself.")
436436 }
437437
438438
439439 func replenishInternal (op,user,i) = {
440440 let checks = if (mainOnly(i))
441441 then opAllowed(op)
442442 else false
443443 if ((checks == checks))
444444 then {
445445 let aTokenAmount = paymentAmount(i, aTokenId)
446446 $Tuple2(((syncTotals(0, 0, 0, 0) ++ [changeBy(aTokenBalanceStore(user), aTokenAmount), Burn(aTokenId, aTokenAmount)]) ++ enableColIfNeeded(user)), aTokenToAsset(aTokenAmount))
447447 }
448448 else throw("Strict value is not equal to itself.")
449449 }
450450
451451
452452 func mintInternal (i,address,amountToMint,to,action) = {
453453 let userATokenBalance = aTokenBalance(address)
454454 let amount = if ((amountToMint == -1))
455455 then userATokenBalance
456456 else amountToMint
457457 let checks = if (if (if (mainOnly(i))
458458 then opAllowed(action)
459459 else false)
460460 then throwIf((-1 > amountToMint), "invalid amountToMint")
461461 else false)
462462 then throwIf((amount > userATokenBalance), ("Trying to mint more than available, max: " + toString(userATokenBalance)))
463463 else false
464464 if ((checks == checks))
465465 then $Tuple2((syncTotals(0, 0, 0, 0) ++ [changeBy(aTokenBalanceStore(address), -(amount)), Reissue(aTokenId, amount, true), ScriptTransfer(addressFromStringValue(to), amount, aTokenId)]), aTokenToAsset(amount))
466466 else throw("Strict value is not equal to itself.")
467467 }
468468
469469
470470 @Callable(i)
471471 func getReserveDivsInfo () = $Tuple2(nil, $Tuple3(claimableDividends, assetIdStr, (currentTotalReserve - claimableDividends)))
472472
473473
474474
475475 @Callable(i)
476476 func getCurrentTotals (user) = $Tuple2(nil, userTotals(user))
477477
478478
479479
480480 @Callable(i)
481481 func getCurrentTotals2 (user1,user2) = {
482482 let $t01722717264 = userTotals(user1)
483483 let d1 = $t01722717264._1
484484 let d2 = $t01722717264._2
485485 let d3 = $t01722717264._3
486486 let d4 = $t01722717264._4
487487 let $t01726917306 = userTotals(user2)
488488 let e1 = $t01726917306._1
489489 let e2 = $t01726917306._2
490490 let e3 = $t01726917306._3
491491 let e4 = $t01726917306._4
492492 $Tuple2(nil, $Tuple6(d1, d2, d3, d4, e3, e4))
493493 }
494494
495495
496496
497497 @Callable(i)
498498 func advise () = $Tuple2(nil, ((((("reserveAddress: " + toString(this)) + ", ") + getConfig()) + ", ") + getState()))
499499
500500
501501
502502 @Callable(i)
503503 func adviseUser (user) = {
504504 let currentDebtUsd = assetToUsd(currentTotalDebt)
505505 let currentDepositUsd = assetToUsd(currentTotalDeposit)
506506 let asCollateral = valueOrElse(getBoolean(this, useAsCollateralStore(user)), true)
507507 let effectiveDepositUsd = if (asCollateral)
508508 then currentDepositUsd
509509 else 0
510510 let overlapUsd = min([currentDebtUsd, effectiveDepositUsd])
511511 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
512512 let bp = if ((currentDebtUsd > effectiveDepositUsd))
513513 then 0
514514 else fraction((effectiveDepositUsd - currentDebtUsd), collateralFactor, factorsBase)
515515 let bpu = if ((currentDebtUsd > effectiveDepositUsd))
516516 then (fraction((currentDebtUsd - effectiveDepositUsd), factorsBase, liquidationThreshold) + overlapCharge)
517517 else overlapCharge
518518 let enriched = ((((((((("reserveAddress: " + toString(this)) + ", currentDebtUsd: ") + toString(currentDebtUsd)) + ", currentDepositUsd: ") + toString(currentDepositUsd)) + ", bp: ") + toString(bp)) + ", bpu: ") + toString(bpu))
519519 $Tuple2(nil, ((enriched + ", ") + getUserState(user)))
520520 }
521521
522522
523523
524524 @Callable(i)
525525 func addInterest () = if ((i.payments[0].assetId != assetId))
526526 then throw("can't add interest with unrelated token")
527527 else syncTotals(i.payments[0].amount, 0, 0, 0)
528528
529529
530530
531531 @Callable(i)
532532 func addToReserve () = if ((i.payments[0].assetId != assetId))
533533 then throw("can't add interest with unrelated token")
534534 else syncTotals(0, 0, i.payments[0].amount, 0)
535535
536536
537537
538538 @Callable(i)
539539 func withdrawFromReserve (amt) = {
540540 let checks = divAdminOnly(i)
541541 if ((checks == checks))
542542 then {
543543 let diff = if ((amt == -1))
544544 then claimableDividends
545545 else amt
546546 $Tuple2((syncTotals(0, 0, -(diff), diff) ++ [ScriptTransfer(i.caller, diff, assetId)]), diff)
547547 }
548548 else throw("Strict value is not equal to itself.")
549549 }
550550
551551
552552
553553 @Callable(i)
554554 func forceUpdate () = {
555555 let admin = valueOrErrorMessage(getString(configAddress, "admin"), "reserve:no admin in config")
556556 if ((toString(i.caller) != admin))
557557 then throw("only admin can do")
558558 else syncTotals(0, 0, 0, 0)
559559 }
560560
561561
562562
563563 @Callable(i)
564564 func initialize (cfgAddress,assetIdOrWaves,aTokenName,aTokenDescription,aTokenDecimals) = {
565565 let checks = if (notInitialized)
566566 then isAssetIdOrWaves(assetIdOrWaves)
567567 else false
568568 if ((checks == checks))
569569 then {
570570 let aToken = Issue(aTokenName, aTokenDescription, 0, aTokenDecimals, true)
571571 [aToken, writeInt(aTokenDecimalsStore, aTokenDecimals), writeString(aTokenNameStore, aTokenName), writeString(assetIdStore, assetIdOrWaves), writeString(configAddressStore, cfgAddress), writeString(aTokenIdStore, toBase58String(calculateAssetId(aToken)))]
572572 }
573573 else throw("Strict value is not equal to itself.")
574574 }
575575
576576
577577
578578 @Callable(i)
579579 func initialize2 () = if ((i.caller != this))
580580 then throw("only self can continue")
581581 else [writeInt(lastUpdateHeightStore, HEIGHT)]
582582
583583
584584
585585 @Callable(i)
586586 func userDepositUSD (address) = $Tuple2(nil, assetToUsd(aTokenToAsset(aTokenBalance(address))))
587587
588588
589589
590590 @Callable(i)
591591 func userDebtUSD (address) = $Tuple2(nil, assetToUsd(currentUserDebt(address)))
592592
593593
594594
595595 @Callable(i)
596596 func userBalance (address) = {
597597 let atokens = aTokenBalance(address)
598598 let asset = aTokenToAsset(atokens)
599599 let debt = currentUserDebt(address)
600600 $Tuple2(nil, $Tuple6(atokens, asset, assetToUsd(asset), debt, assetToUsd(debt), valueOrElse(getBoolean(this, useAsCollateralStore(address)), true)))
601601 }
602602
603603
604604
605605 @Callable(i)
606606 func userDebt (address) = {
607607 let debt = currentUserDebt(address)
608608 let debtUsd = assetToUsd(debt)
609609 $Tuple2(nil, $Tuple2(debt, debtUsd))
610610 }
611611
612612
613613
614614 @Callable(i)
615615 func assetUsdValue (assetAmount) = $Tuple2(nil, assetToUsd(assetAmount))
616616
617617
618618
619619 @Callable(i)
620620 func repayFor (userAddress) = {
621621 let checks = mainOnly(i)
622622 if ((checks == checks))
623623 then repayUser(userAddress, paymentAmount(i, assetId))
624624 else throw("Strict value is not equal to itself.")
625625 }
626626
627627
628628
629629 @Callable(i)
630630 func depositFor (depositor,useAsCollateral) = {
631631 let checks = if (mainOnly(i))
632632 then opAllowed("deposit")
633633 else false
634634 if ((checks == checks))
635635 then if (if ((currentUserDebt(depositor) > 0))
636636 then !(useAsCollateral)
637637 else false)
638638 then throw("can't disable use as collateral for asset with open debt")
639639 else {
640640 let amount = paymentAmount(i, assetId)
641641 let aTokenAmount = assetToAToken(amount)
642642 (syncTotals(amount, 0, 0, 0) ++ [changeBy(aTokenCirculationStore, aTokenAmount), changeBy(aTokenBalanceStore(depositor), aTokenAmount), BooleanEntry(useAsCollateralStore(depositor), useAsCollateral)])
643643 }
644644 else throw("Strict value is not equal to itself.")
645645 }
646646
647647
648648
649649 @Callable(i)
650650 func withdrawFor (address,amount) = withdrawInternal(i, address, amount, false)
651651
652652
653653
654654 @Callable(i)
655655 func withdrawToMain (user,amount) = if ((amount != -1))
656656 then throw("reserve: withdrawToMain amount -1 only")
657657 else withdrawInternal(i, user, amount, true)
658658
659659
660660
661661 @Callable(i)
662662 func replenishWithAtokenFor (user) = replenishInternal("replenish_atokens", user, i)
663663
664664
665665
666666 @Callable(i)
667667 func replenishForRepayWithAtokenFor (user) = replenishInternal("repay_atokens", user, i)
668668
669669
670670
671671 @Callable(i)
672672 func borrowFor (address,amountToBorrow) = {
673673 let checks = if (if (mainOnly(i))
674674 then liquidityCheck(amountToBorrow, (storedTotalDeposit - storedTotalDebt), "too much borrow requested")
675675 else false)
676676 then opAllowed("borrow")
677677 else false
678678 if ((checks == checks))
679679 then {
680680 let currentDebt = currentUserDebt(address)
681681 let newDebt = (currentDebt + amountToBorrow)
682682 (syncTotals(0, amountToBorrow, 0, amountToBorrow) ++ [writeInt(debtStore(address), newDebt), enableCol(address), writeInt(debtIndexStore(address), currentIndex), ScriptTransfer(addressFromStringValue(address), amountToBorrow, assetId)])
683683 }
684684 else throw("Strict value is not equal to itself.")
685685 }
686686
687687
688688
689689 @Callable(i)
690690 func mintAtokenFor (address,amountToMint) = mintInternal(i, address, amountToMint, address, "mint_atokens")
691691
692692
693693
694694 @Callable(i)
695695 func mintAtokenForTo (from,amountToMint,to) = mintInternal(i, from, amountToMint, to, "lock_mint_atokens")
696696
697697
698698
699699 @Callable(i)
700700 func redeemAtokensFor (user) = {
701701 let checks = if (mainOnly(i))
702702 then opAllowed("redeem_atokens")
703703 else false
704704 if ((checks == checks))
705705 then {
706706 let aTokenAmount = paymentAmount(i, aTokenId)
707707 let outAmount = aTokenToAsset(aTokenAmount)
708708 $Tuple2((syncTotals(-(outAmount), 0, 0, outAmount) ++ [ScriptTransfer(addressFromStringValue(user), outAmount, assetId), changeBy(aTokenCirculationStore, -(aTokenAmount)), Burn(aTokenId, aTokenAmount)]), outAmount)
709709 }
710710 else throw("Strict value is not equal to itself.")
711711 }
712712
713713
714714
715715 @Callable(i)
716716 func transferATokensFor (from,to,valueUsd) = {
717717 let checks = if (mainOnly(i))
718718 then opAllowed("transfer_debt")
719719 else false
720720 if ((checks == checks))
721721 then {
722722 let assets = usdToAsset(valueUsd)
723723 let atokens = assetToAToken(assets)
724724 let aTokensFrom = aTokenBalance(from)
725725 if ((atokens > aTokensFrom))
726726 then throw((((((((((("transferAtokensFor error:" + " transfer.valueUsd: ") + toString(valueUsd)) + " transfer.assets: ") + toString(assets)) + " transfer.atokens: ") + toString(atokens)) + " from.atokens: ") + toString(aTokensFrom)) + " at ") + toString(this)))
727727 else $Tuple2(((syncTotals(0, 0, 0, 0) ++ [changeBy(aTokenBalanceStore(from), -(atokens)), changeBy(aTokenBalanceStore(to), atokens)]) ++ enableColIfNeeded(to)), aTokenToAsset(atokens))
728728 }
729729 else throw("Strict value is not equal to itself.")
730730 }
731731
732732
733733
734734 @Callable(i)
735735 func transferDebtFor (from,to,amount) = {
736736 let checks = if (mainOnly(i))
737737 then opAllowed("transfer_debt")
738738 else false
739739 if ((checks == checks))
740740 then $Tuple2((syncTotals(0, 0, 0, 0) ++ [writeInt(debtStore(from), (currentUserDebt(from) - amount)), writeInt(debtStore(to), (currentUserDebt(to) + amount)), writeInt(debtIndexStore(from), currentIndex), writeInt(debtIndexStore(to), currentIndex), enableCol(to)]), amount)
741741 else throw("Strict value is not equal to itself.")
742742 }
743743
744744
745745
746746 @Callable(i)
747747 func disableUseAsCollateralFor (address) = {
748748 let checks = if (mainOnly(i))
749749 then opAllowed("use_as_col")
750750 else false
751751 if ((checks == checks))
752752 then if ((currentUserDebt(address) > 0))
753753 then throw("can't disable collateral for asset with open debt")
754754 else (syncTotals(0, 0, 0, 0) ++ [BooleanEntry(useAsCollateralStore(address), false)])
755755 else throw("Strict value is not equal to itself.")
756756 }
757757
758758
759759
760760 @Callable(i)
761761 func enableUseAsCollateral () = {
762762 let checks = opAllowed("use_as_col")
763763 if ((checks == checks))
764764 then (syncTotals(0, 0, 0, 0) ++ [enableCol(toString(i.caller))])
765765 else throw("Strict value is not equal to itself.")
766766 }
767767
768768
769769
770770 @Callable(i)
771771 func collapseFor (user) = {
772772 let checks = if (mainOnly(i))
773773 then opAllowed("force_collapse")
774774 else false
775775 if ((checks == checks))
776776 then collapseUser(user, -1)
777777 else throw("Strict value is not equal to itself.")
778778 }
779779
780780
781781
782782 @Callable(i)
783783 func collapseForAmount (user,amount) = {
784784 let checks = if (mainOnly(i))
785785 then opAllowed("collapse")
786786 else false
787787 if ((checks == checks))
788788 then collapseUser(user, amount)
789789 else throw("Strict value is not equal to itself.")
790790 }
791791
792792
793+
794+@Callable(i)
795+func lpValue (aTokenAmount) = $Tuple2(nil, aTokenToAsset(aTokenAmount))
796+
797+

github/deemru/w8io/786bc32 
88.90 ms