tx · EYeW6TkApB6iaaXk5bULn5CHRrCE7TWo6mWccymkd1a4

3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk:  -0.01600000 Waves

2023.10.09 23:32 [3857430] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves

{ "type": 13, "id": "EYeW6TkApB6iaaXk5bULn5CHRrCE7TWo6mWccymkd1a4", "fee": 1600000, "feeAssetId": null, "timestamp": 1696883570713, "version": 1, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "5775vZ1xX9M4yGcUY5Sx6fqDK2EQD6xAY7HjwR6ciWXBnC9YvzCgk2BKdms5BXZwDeCXJcQp5dwnN2G1Atp8jRJq" ], "script": "base64:BwICCAIxAAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cADW9yYWNsZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVdJZtDL84r1V3qt/CFvccVbiYgr0IGzsX8BDGdldFJhdGVDdXJ2ZQEKYXNzZXRJZFN0cgQHJG1hdGNoMAUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMAkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDAJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gwCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gwCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMAkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgEDc3VtAgRzaXplBGRhdGEKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFBHNpemUFBWFjY3VtCQBkAgUFYWNjdW0FBG5leHQKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAQ5nZXRTZXR1cFRva2VucwENbWFya2V0QWRkcmVzcwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgxzZXR1cF90b2tlbnMCASwBDWdldFRva2VuUHJpY2UBCmFzc2V0SWRTdHIDAwkAAAIFCmFzc2V0SWRTdHIFCXVzZHRJZFN0cgYJAAACBQphc3NldElkU3RyBQl1c2RjSWRTdHIAwIQ9BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNb3JhY2xlQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQVwcmljZQENZ2V0QXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgERZ2V0TGFzdFJhdGVIZWlnaHQBDW1hcmtldEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwIObGFzdFJhdGVIZWlnaHQAAAEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyAAABFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAAARBnZXRPdXRkYXRlZFNSYXRlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICBQphc3NldElkU3RyAgZfc1JhdGUAAAEQZ2V0T3V0ZGF0ZWRCUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlAAABDWdldE91dGRhdGVkVXIEE291dGRhdGVkVG90YWxTdXBwbHkTb3V0ZGF0ZWRUb3RhbEJvcnJvdw1vdXRkYXRlZFNSYXRlDW91dGRhdGVkQlJhdGUEBGRvd24JAGsDBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQ1vdXRkYXRlZFNSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRCUmF0ZQUHU2NhbGUxNgUEZG93bgEHZ2V0UmF0ZQIFY3VydmUKb3V0ZGF0ZWRVcgkAZAIIBQVjdXJ2ZQJfMQMJAGcCCAUFY3VydmUCXzMFCm91dGRhdGVkVXIJAGsDBQpvdXRkYXRlZFVyCAUFY3VydmUCXzIIBQVjdXJ2ZQJfMwkAZAIIBQVjdXJ2ZQJfMgkAawMJAGUCBQpvdXRkYXRlZFVyCAUFY3VydmUCXzMIBQVjdXJ2ZQJfNAkAZQIAgMLXLwgFBWN1cnZlAl8zAQtnZXRJbnRlcmVzdAEEcmF0ZQkAlgMBCQDMCAIJAGsDBQRyYXRlBQZTY2FsZTgFCnllYXJCbG9ja3MJAMwIAgABBQNuaWwBDWdldEFzc2V0SW5kZXgCC3NldHVwVG9rZW5zCmFzc2V0SWRTdHIJAQV2YWx1ZQEJAM8IAgULc2V0dXBUb2tlbnMFCmFzc2V0SWRTdHIBEWdldEFzc2V0UGFyYW10ZXJzAhBtYXJrZXRQYXJhbWV0ZXJzCmFzc2V0SW5kZXgJAJUKAwkAkQMCCAUQbWFya2V0UGFyYW1ldGVycwJfMQUKYXNzZXRJbmRleAkAkQMCCAUQbWFya2V0UGFyYW1ldGVycwJfMgUKYXNzZXRJbmRleAkAkQMCCAUQbWFya2V0UGFyYW1ldGVycwJfMwUKYXNzZXRJbmRleAETZ2V0TWFya2V0UGFyYW1ldGVycwINbWFya2V0QWRkcmVzcwtzZXR1cFRva2VucwQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQMc2V0dXBQZW5hbHR5CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCD3NldHVwX3BlbmFsdGllcwIBLAQKdG9rZW5zU2l6ZQkAkAMBBQtzZXR1cFRva2VucwoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUKdG9rZW5zU2l6ZQUFYWNjdW0JAJUKAwkAzQgCCAUFYWNjdW0CXzEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0CQDNCAIIBQVhY2N1bQJfMgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQJAM0IAggFBWFjY3VtAl8zCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMc2V0dXBQZW5hbHR5BQRuZXh0CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAEMZ2V0TWF4U3VwcGx5Ag1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQ1wYXJzZUludFZhbHVlAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1tYXJrZXRBZGRyZXNzCQCsAgICEHNldHVwX21heFN1cHBseV8FCmFzc2V0SWRTdHICATABDmdldEFjdHVhbFNSYXRlBA5sYXN0UmF0ZUhlaWdodAhpbnRlcmVzdApvdXRkYXRlZFVyDW91dGRhdGVkU1JhdGUECWxhc3RTUmF0ZQkAlgMBCQDMCAIFDW91dGRhdGVkU1JhdGUJAMwIAgUHU2NhbGUxNgUDbmlsBAhuZXdTUmF0ZQkAZAIFCWxhc3RTUmF0ZQkAaQIJAGgCCQBoAgkAZQIFBmhlaWdodAUObGFzdFJhdGVIZWlnaHQJAGsDBQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUGU2NhbGU4CQBlAgBkBQtyZXNlcnZlRnVuZABkBQhuZXdTUmF0ZQEOZ2V0QWN0dWFsQlJhdGUDDmxhc3RSYXRlSGVpZ2h0CGludGVyZXN0DW91dGRhdGVkQlJhdGUECWxhc3RCUmF0ZQkAlgMBCQDMCAIFDW91dGRhdGVkQlJhdGUJAMwIAgUHU2NhbGUxNgUDbmlsBAhuZXdCUmF0ZQkAZAIFCWxhc3RCUmF0ZQkAaAIJAGUCBQZoZWlnaHQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUIbmV3QlJhdGUBC2dldEFjdHVhbFVyAgxhY3R1YWxTdXBwbHkMYWN0dWFsQm9ycm93CQBrAwUMYWN0dWFsQm9ycm93BQZTY2FsZTgFDGFjdHVhbFN1cHBseQEPZ2V0QWN0dWFsQW1vdW50Ag5vdXRkYXRlZEFtb3VudAphY3R1YWxSYXRlCQBrAwUOb3V0ZGF0ZWRBbW91bnQFCmFjdHVhbFJhdGUFB1NjYWxlMTYBCGdldEluVXNkAwxhY3R1YWxBbW91bnQKYXNzZXRTY2FsZQVwcmljZQkAawMFDGFjdHVhbEFtb3VudAUFcHJpY2UFCmFzc2V0U2NhbGUBDGdldFN1cHBseUFweQIEcmF0ZQhhY3R1YWxVcgQKc3VwcGx5UmF0ZQkAawMJAGsDBQRyYXRlAFAAZAUIYWN0dWFsVXIFBlNjYWxlOAkAZQIJAGwGCQBkAgUGU2NhbGU4CQBpAgUKc3VwcGx5UmF0ZQUKeWVhckJsb2NrcwAIBQp5ZWFyQmxvY2tzAAAACAUERE9XTgUGU2NhbGU4AQxnZXRCb3Jyb3dBcHkBBHJhdGUJAGUCCQBsBgkAZAIFBlNjYWxlOAkAaQIFBHJhdGUFCnllYXJCbG9ja3MACAUKeWVhckJsb2NrcwAAAAgFBERPV04FBlNjYWxlOAEPZ2V0V2FsbGV0U3VwcGx5BA1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIGd2FsbGV0C2FjdHVhbFNSYXRlBBRvdXRkYXRlZFdhbGxldFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgUGd2FsbGV0Agpfc3VwcGxpZWRfBQphc3NldElkU3RyAAAJAQ9nZXRBY3R1YWxBbW91bnQCBRRvdXRkYXRlZFdhbGxldFN1cHBseQULYWN0dWFsU1JhdGUBD2dldFdhbGxldEJvcnJvdwQNbWFya2V0QWRkcmVzcwphc3NldElkU3RyBndhbGxldAthY3R1YWxCUmF0ZQQUb3V0ZGF0ZWRXYWxsZXRCb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFBndhbGxldAIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAACQEPZ2V0QWN0dWFsQW1vdW50AgUUb3V0ZGF0ZWRXYWxsZXRCb3Jyb3cFC2FjdHVhbEJSYXRlARBnZXREYWlseVBlcmNlbnRzAgNhcHkIcXVhbnRpdHkJAGsDCQBrAwkAZQIJAKADAQkAdgYJALcCAgUJU2NhbGU4QmlnCQC2AgEFA2FweQAICQC6AgIFClNjYWxlMTZCaWcFDXllYXJCbG9ja3NCaWcAEAAQBQRET1dOBQdTY2FsZTE2BQlkYXlCbG9ja3MFBlNjYWxlOAUIcXVhbnRpdHkFBlNjYWxlOAEQZ2V0QWNjb3VudEhlYWx0aAIbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAMJAAACBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QAAAUGU2NhbGU4CQBlAgUGU2NhbGU4CQBrAwUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBQZTY2FsZTgFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAEJZ2V0TmV0QXB5AxZ0b3RhbFdhbGxldFN1cHBseUluVXNkFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QRdG90YWxXYWxsZXRNYXJnaW4DCQAAAgURdG90YWxXYWxsZXRNYXJnaW4AAAAAAwkAZgIFEXRvdGFsV2FsbGV0TWFyZ2luAAAJAGsDBRF0b3RhbFdhbGxldE1hcmdpbgUGU2NhbGU2BRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBrAwURdG90YWxXYWxsZXRNYXJnaW4FBlNjYWxlNgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAELYXNzZXRUb0pzb24CCmFzc2V0SWRTdHIIcXVhbnRpdHkECyR0MDg1NTI4NzY3AwkAAAIFCmFzc2V0SWRTdHIFBVdhdmVzCQCUCgIACAIFV0FWRVMEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cgkAlAoCCAUFYXNzZXQIZGVjaW1hbHMIBQVhc3NldARuYW1lBAhkZWNpbWFscwgFCyR0MDg1NTI4NzY3Al8xBARuYW1lCAULJHQwODU1Mjg3NjcCXzIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx7InF1YW50aXR5IjoJAKQDAQUIcXVhbnRpdHkCDCwiZGVjaW1hbHMiOgkApAMBBQhkZWNpbWFscwIJLCJuYW1lIjoiBQRuYW1lAggiLCJpZCI6IgUKYXNzZXRJZFN0cgICIn0BD2Ftb3VudFRvRGVjaW1hbAIGYW1vdW50CmFzc2V0U2NhbGUEB2ludFBhcnQJAGkCBQZhbW91bnQFCmFzc2V0U2NhbGUECWZsb2F0UGFydAkAagIFBmFtb3VudAUKYXNzZXRTY2FsZQkArAICCQCsAgIJAKQDAQUHaW50UGFydAIBLgkApAMBBQlmbG9hdFBhcnQBDWdldE1hcmtldERhdGEBDW1hcmtldEFkZHJlc3MECW1hcmtldFN0cgkApQgBBQ1tYXJrZXRBZGRyZXNzBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBA9tYXJrZXRTaG9ydE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIRbWFya2V0X3Nob3J0bmFtZV8FCW1hcmtldFN0cgQLc2V0dXBUb2tlbnMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfdG9rZW5zAgEsBAdzZXR1cENmCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBAxzZXR1cFBlbmFsdHkJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIPc2V0dXBfcGVuYWx0aWVzAgEsBA5sYXN0UmF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzAg5sYXN0UmF0ZUhlaWdodAAABAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQHcGVuYWx0eQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBAltYXhTdXBwbHkJAQxnZXRNYXhTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEBWN1cnZlCQEMZ2V0UmF0ZUN1cnZlAQUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQIFBWN1cnZlBQpvdXRkYXRlZFVyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQkApAoSCQDNCAIIBQVhY2N1bQJfMQUKYXNzZXRJZFN0cgkAzQgCCAUFYWNjdW0CXzIFAmNmCQDNCAIIBQVhY2N1bQJfMwUCbHQJAM0IAggFBWFjY3VtAl80BQdwZW5hbHR5CQDNCAIIBQVhY2N1bQJfNQUFcHJpY2UJAM0IAggFBWFjY3VtAl82BQphc3NldFNjYWxlCQDNCAIIBQVhY2N1bQJfNwUJbWF4U3VwcGx5CQDNCAIIBQVhY2N1bQJfOAUFc1JhdGUJAM0IAggFBWFjY3VtAl85BQViUmF0ZQkAzQgCCAUFYWNjdW0DXzEwBQZzdXBwbHkJAM0IAggFBWFjY3VtA18xMQULc3VwcGx5SW5Vc2QJAM0IAggFBWFjY3VtA18xMgUGYm9ycm93CQDNCAIIBQVhY2N1bQNfMTMFC2JvcnJvd0luVXNkCQDNCAIIBQVhY2N1bQNfMTQFCHJlc2VydmVzCQDNCAIIBQVhY2N1bQNfMTUFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtA18xNgUCdXIJAM0IAggFBWFjY3VtA18xNwUJc3VwcGx5QXB5CQDNCAIIBQVhY2N1bQNfMTgFCWJvcnJvd0FweQQGYXNzZXRzCgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkApAoSBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQQdG90YWxTdXBwbHlJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzA18xMQQQdG90YWxCb3Jyb3dJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzA18xMwQSdG90YWxSZXNlcnZlc0luVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMDXzE1CQCZCgcFBmFzc2V0cwULYXNzZXRzQ291bnQFCm1hcmtldE5hbWUFD21hcmtldFNob3J0TmFtZQUQdG90YWxTdXBwbHlJblVzZAUQdG90YWxCb3Jyb3dJblVzZAUSdG90YWxSZXNlcnZlc0luVXNkAQ1nZXRXYWxsZXREYXRhDA1tYXJrZXRBZGRyZXNzBndhbGxldAthc3NldHNDb3VudAphc3NldHNMaXN0BmNmTGlzdAZsdExpc3QJcHJpY2VMaXN0DmFzc2V0U2NhbGVMaXN0CXNSYXRlTGlzdAliUmF0ZUxpc3QNc3VwcGx5QXB5TGlzdA1ib3Jyb3dBcHlMaXN0CgEEZm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUKYXNzZXRzTGlzdAUEbmV4dAQCY2YJAJEDAgUGY2ZMaXN0BQRuZXh0BAJsdAkAkQMCBQZsdExpc3QFBG5leHQEBXByaWNlCQCRAwIFCXByaWNlTGlzdAUEbmV4dAQKYXNzZXRTY2FsZQkAkQMCBQ5hc3NldFNjYWxlTGlzdAUEbmV4dAQFc1JhdGUJAJEDAgUJc1JhdGVMaXN0BQRuZXh0BAViUmF0ZQkAkQMCBQliUmF0ZUxpc3QFBG5leHQECXN1cHBseUFweQkAkQMCBQ1zdXBwbHlBcHlMaXN0BQRuZXh0BAlib3Jyb3dBcHkJAJEDAgUNYm9ycm93QXB5TGlzdAUEbmV4dAQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuUGVyY2VudHMFCmFzc2V0U2NhbGUFBXByaWNlBBZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFAmNmBQZTY2FsZTgEFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGsDBRF3YWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQJsdAQMd2FsbGV0TWFyZ2luCQBlAgkAawMFEXdhbGxldFN1cHBseUluVXNkBQlzdXBwbHlBcHkFBlNjYWxlOAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQlib3Jyb3dBcHkFBlNjYWxlOAkAnQoLCQDNCAIIBQVhY2N1bQJfMQUMd2FsbGV0U3VwcGx5CQDNCAIIBQVhY2N1bQJfMgURd2FsbGV0U3VwcGx5SW5Vc2QJAM0IAggFBWFjY3VtAl8zBRF3YWxsZXREYWlseUluY29tZQkAzQgCCAUFYWNjdW0CXzQFFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAM0IAggFBWFjY3VtAl81BQx3YWxsZXRCb3Jyb3cJAM0IAggFBWFjY3VtAl82BRF3YWxsZXRCb3Jyb3dJblVzZAkAzQgCCAUFYWNjdW0CXzcFF3dhbGxldERhaWx5TG9hblBlcmNlbnRzCQDNCAIIBQVhY2N1bQJfOAUcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkAzQgCCAUFYWNjdW0CXzkFFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAM0IAggFBWFjY3VtA18xMAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAzQgCCAUFYWNjdW0DXzExBQx3YWxsZXRNYXJnaW4EBmFzc2V0cwoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJ0KCwUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMCXzIEG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzAl80BBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMCXzYEIXRvdGFsV2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzAl84BBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAQNzdW0CBQthc3NldHNDb3VudAgFBmFzc2V0cwJfOQQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCQEDc3VtAgULYXNzZXRzQ291bnQIBQZhc3NldHMDXzEwBBF0b3RhbFdhbGxldE1hcmdpbgkBA3N1bQIFC2Fzc2V0c0NvdW50CAUGYXNzZXRzA18xMQQNYWNjb3VudEhlYWx0aAkBEGdldEFjY291bnRIZWFsdGgCBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQGbmV0QXB5CQEJZ2V0TmV0QXB5AwUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAURdG90YWxXYWxsZXRNYXJnaW4JAJkKBwUGYXNzZXRzBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFIXRvdGFsV2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAUNYWNjb3VudEhlYWx0aAUGbmV0QXB5ARdnZXRXYWxsZXRPcGVyYXRpb25zSnNvbgMGbWFya2V0CmFzc2V0SWRTdHIGd2FsbGV0BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQZtYXJrZXQECm1hcmtldERhdGEJAQ1nZXRNYXJrZXREYXRhAQUNbWFya2V0QWRkcmVzcwQKd2FsbGV0RGF0YQkBDWdldFdhbGxldERhdGEMBQ1tYXJrZXRBZGRyZXNzBQZ3YWxsZXQIBQptYXJrZXREYXRhAl8yCAgFCm1hcmtldERhdGECXzECXzEICAUKbWFya2V0RGF0YQJfMQJfMggIBQptYXJrZXREYXRhAl8xAl8zCAgFCm1hcmtldERhdGECXzECXzUICAUKbWFya2V0RGF0YQJfMQJfNggIBQptYXJrZXREYXRhAl8xAl84CAgFCm1hcmtldERhdGECXzECXzkICAUKbWFya2V0RGF0YQJfMQNfMTcICAUKbWFya2V0RGF0YQJfMQNfMTgECmFzc2V0SW5kZXgJAQ1nZXRBc3NldEluZGV4AggIBQptYXJrZXREYXRhAl8xAl8xBQphc3NldElkU3RyCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCiJtYXJrZXQiOiIIBQptYXJrZXREYXRhAl8zAgEiAg4sImFzc2V0UHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKbWFya2V0RGF0YQJfMQJfNQUKYXNzZXRJbmRleAIKLCJzdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzEwBQphc3NldEluZGV4Ag8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzExBQphc3NldEluZGV4Ag0sInN1cHBseUFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzE3BQphc3NldEluZGV4BQZTY2FsZTgCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIJAJEDAggIBQptYXJrZXREYXRhAl8xA18xMgUKYXNzZXRJbmRleAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQptYXJrZXREYXRhAl8xA18xMwUKYXNzZXRJbmRleAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIJAJEDAggIBQptYXJrZXREYXRhAl8xA18xOAUKYXNzZXRJbmRleAUGU2NhbGU4AgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIJAJEDAggIBQptYXJrZXREYXRhAl8xA18xNAUKYXNzZXRJbmRleAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCm1hcmtldERhdGECXzEDXzE1BQphc3NldEluZGV4AhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIJAJEDAggIBQptYXJrZXREYXRhAl8xA18xNgUKYXNzZXRJbmRleAUGU2NhbGU4AhQsImNvbGxhdGVyYWxGYWN0b3IiOgkBD2Ftb3VudFRvRGVjaW1hbAIJAJEDAggIBQptYXJrZXREYXRhAl8xAl8yBQphc3NldEluZGV4BQZTY2FsZTgCGCwibGlxdWlkYXRpb25UaHJlc2hvbGQiOgkBD2Ftb3VudFRvRGVjaW1hbAIJAJEDAggIBQptYXJrZXREYXRhAl8xAl8zBQphc3NldEluZGV4BQZTY2FsZTgCFiwibGlxdWlkYXRpb25QZW5hbHR5IjoJAQ9hbW91bnRUb0RlY2ltYWwCCQCRAwIICAUKbWFya2V0RGF0YQJfMQJfNAUKYXNzZXRJbmRleAUGU2NhbGU4Ag0sIm1heFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQptYXJrZXREYXRhAl8xAl83BQphc3NldEluZGV4AhAsIndhbGxldFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfMQUKYXNzZXRJbmRleAIVLCJ3YWxsZXRTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl8yBQphc3NldEluZGV4AhUsIndhbGxldERhaWx5SW5jb21lIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIJAJEDAggIBQp3YWxsZXREYXRhAl8xAl8zBQphc3NldEluZGV4AhosIndhbGxldERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfNAUKYXNzZXRJbmRleAIQLCJ3YWxsZXRCb3Jyb3ciOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgkAkQMCCAgFCndhbGxldERhdGECXzECXzUFCmFzc2V0SW5kZXgCFSwid2FsbGV0Qm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfNgUKYXNzZXRJbmRleAIbLCJ3YWxsZXREYWlseUxvYW5QZXJjZW50cyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyCQCRAwIICAUKd2FsbGV0RGF0YQJfMQJfNwUKYXNzZXRJbmRleAIgLCJ3YWxsZXREYWlseUxvYW5QZXJjZW50c0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgkAkQMCCAgFCndhbGxldERhdGECXzECXzgFCmFzc2V0SW5kZXgCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAggFCndhbGxldERhdGECXzYFBlNjYWxlOAIKLCJuZXRBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIIBQp3YWxsZXREYXRhAl83BQZTY2FsZTgCAX0AAKWnVpk=", "chainId": 87, "height": 3857430, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6vKQViownSLSTof7otM78WaZYLjiwsRs9ChDrXhHdTC5 Next: 6YNwht9CXxLZAKBQLmALxTXowq5sSMK3v8EgV5neNBFd Diff:
OldNewDifferences
7575 }
7676
7777
78+func sum (size,data) = {
79+ func fold (accum,next) = if ((next >= size))
80+ then accum
81+ else (accum + next)
82+
83+ let $l = arr12
84+ let $s = size($l)
85+ let $acc0 = 0
86+ func $f0_1 ($a,$i) = if (($i >= $s))
87+ then $a
88+ else fold($a, $l[$i])
89+
90+ func $f0_2 ($a,$i) = if (($i >= $s))
91+ then $a
92+ else throw("List size exceeds 12")
93+
94+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
95+ }
96+
97+
98+func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
99+
100+
78101 func getTokenPrice (assetIdStr) = if (if ((assetIdStr == usdtIdStr))
79102 then true
80103 else (assetIdStr == usdcIdStr))
124147 func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1])
125148
126149
127-func getAssetParamters (marketParameters,assetIdStr) = {
128- let index = value(indexOf(marketParameters._1, assetIdStr))
129- $Tuple3(marketParameters._2[index], marketParameters._3[index], marketParameters._4[index])
130- }
150+func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr))
131151
132152
133-func getMarketParameters (marketAddress) = {
134- let setupTokens = split(getStringValue(marketAddress, "setup_tokens"), ",")
153+func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex])
154+
155+
156+func getMarketParameters (marketAddress,setupTokens) = {
135157 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
136158 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
137159 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
138160 let tokensSize = size(setupTokens)
139161 func fold (accum,next) = if ((next >= tokensSize))
140162 then accum
141- else $Tuple4((accum._1 :+ setupTokens[next]), (accum._2 :+ parseIntValue(setupCf[next])), (accum._3 :+ parseIntValue(setupLt[next])), (accum._4 :+ parseIntValue(setupPenalty[next])))
163+ else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next])))
142164
143165 let $l = arr12
144166 let $s = size($l)
145- let $acc0 = $Tuple4(nil, nil, nil, nil)
167+ let $acc0 = $Tuple3(nil, nil, nil)
146168 func $f0_1 ($a,$i) = if (($i >= $s))
147169 then $a
148170 else fold($a, $l[$i])
205227 func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8)
206228
207229
208-func getAccountHealth (marketAddress,assetIdStr,wallet,marketParameters) = 0
230+func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0))
231+ then Scale8
232+ else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd))
233+
234+
235+func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMargin) = if ((totalWalletMargin == 0))
236+ then 0
237+ else if ((totalWalletMargin > 0))
238+ then fraction(totalWalletMargin, Scale6, totalWalletSupplyInUsd)
239+ else fraction(totalWalletMargin, Scale6, totalWalletBorrowInUsd)
209240
210241
211242 func assetToJson (assetIdStr,quantity) = {
212- let $t089689183 = if ((assetIdStr == Waves))
243+ let $t085528767 = if ((assetIdStr == Waves))
213244 then $Tuple2(8, "WAVES")
214245 else {
215246 let asset = value(assetInfo(fromBase58String(assetIdStr)))
216247 $Tuple2(asset.decimals, asset.name)
217248 }
218- let decimals = $t089689183._1
219- let name = $t089689183._2
249+ let decimals = $t085528767._1
250+ let name = $t085528767._2
220251 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
221252 }
222253
229260
230261
231262 func getMarketData (marketAddress) = {
263+ let marketStr = toString(marketAddress)
264+ let marketName = getStringValue(("market_name_" + marketStr))
265+ let marketShortName = getStringValue(("market_shortname_" + marketStr))
232266 let setupTokens = split(getStringValue(marketAddress, "setup_tokens"), ",")
233267 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
234268 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
235269 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
236270 let lastRateHeight = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
237- let tokensSize = size(setupTokens)
238- func fold (accum,next) = if ((next >= tokensSize))
271+ let assetsCount = size(setupTokens)
272+ func fold (accum,next) = if ((next >= assetsCount))
239273 then accum
240274 else {
241275 let assetIdStr = setupTokens[next]
253287 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
254288 let rate = getRate(curve, outdatedUr)
255289 let interest = getInterest(rate)
256- let actualSRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
257- let actualBRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
258- let actualSupply = getActualAmount(outdatedTotalSupply, actualSRate)
259- let actualBorrow = getActualAmount(outdatedTotalBorrow, actualBRate)
260- let supplyInUsd = getInUsd(actualSupply, assetScale, price)
261- let borrowInUsd = getInUsd(actualBorrow, assetScale, price)
262- let reserves = (actualSupply - actualBorrow)
290+ let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
291+ let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
292+ let supply = getActualAmount(outdatedTotalSupply, sRate)
293+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
294+ let supplyInUsd = getInUsd(supply, assetScale, price)
295+ let borrowInUsd = getInUsd(borrow, assetScale, price)
296+ let reserves = (supply - borrow)
263297 let reservesInUsd = getInUsd(reserves, assetScale, price)
264- let actualUr = getActualUr(actualSupply, actualBorrow)
265- let supplyApy = getSupplyApy(rate, actualUr)
298+ let ur = getActualUr(supply, borrow)
299+ let supplyApy = getSupplyApy(rate, ur)
266300 let borrowApy = getBorrowApy(rate)
267- $Tuple18((accum._1 :+ assetIdStr), (accum._2 :+ cf), (accum._3 :+ lt), (accum._4 :+ penalty), (accum._5 :+ price), (accum._6 :+ assetScale), (accum._7 :+ maxSupply), (accum._8 :+ actualSRate), (accum._9 :+ actualBRate), (accum._10 :+ actualSupply), (accum._11 :+ supplyInUsd), (accum._12 :+ actualBorrow), (accum._13 :+ borrowInUsd), (accum._14 :+ reserves), (accum._15 :+ reservesInUsd), (accum._16 :+ actualUr), (accum._17 :+ supplyApy), (accum._18 :+ borrowApy))
301+ $Tuple18((accum._1 :+ assetIdStr), (accum._2 :+ cf), (accum._3 :+ lt), (accum._4 :+ penalty), (accum._5 :+ price), (accum._6 :+ assetScale), (accum._7 :+ maxSupply), (accum._8 :+ sRate), (accum._9 :+ bRate), (accum._10 :+ supply), (accum._11 :+ supplyInUsd), (accum._12 :+ borrow), (accum._13 :+ borrowInUsd), (accum._14 :+ reserves), (accum._15 :+ reservesInUsd), (accum._16 :+ ur), (accum._17 :+ supplyApy), (accum._18 :+ borrowApy))
268302 }
269303
270- let $l = arr12
271- let $s = size($l)
272- let $acc0 = $Tuple18(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
273- func $f0_1 ($a,$i) = if (($i >= $s))
274- then $a
275- else fold($a, $l[$i])
304+ let assets = {
305+ let $l = arr12
306+ let $s = size($l)
307+ let $acc0 = $Tuple18(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
308+ func $f0_1 ($a,$i) = if (($i >= $s))
309+ then $a
310+ else fold($a, $l[$i])
276311
277- func $f0_2 ($a,$i) = if (($i >= $s))
278- then $a
279- else throw("List size exceeds 12")
312+ func $f0_2 ($a,$i) = if (($i >= $s))
313+ then $a
314+ else throw("List size exceeds 12")
280315
281- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
316+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
317+ }
318+ let totalSupplyInUsd = sum(assetsCount, assets._11)
319+ let totalBorrowInUsd = sum(assetsCount, assets._13)
320+ let totalReservesInUsd = sum(assetsCount, assets._15)
321+ $Tuple7(assets, assetsCount, marketName, marketShortName, totalSupplyInUsd, totalBorrowInUsd, totalReservesInUsd)
282322 }
283323
284324
285-func walletOperationView (market,assetIdStr,wallet) = {
325+func getWalletData (marketAddress,wallet,assetsCount,assetsList,cfList,ltList,priceList,assetScaleList,sRateList,bRateList,supplyApyList,borrowApyList) = {
326+ func fold (accum,next) = if ((next >= assetsCount))
327+ then accum
328+ else {
329+ let assetIdStr = assetsList[next]
330+ let cf = cfList[next]
331+ let lt = ltList[next]
332+ let price = priceList[next]
333+ let assetScale = assetScaleList[next]
334+ let sRate = sRateList[next]
335+ let bRate = bRateList[next]
336+ let supplyApy = supplyApyList[next]
337+ let borrowApy = borrowApyList[next]
338+ let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate)
339+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
340+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
341+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
342+ let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate)
343+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
344+ let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
345+ let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price)
346+ let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
347+ let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
348+ let walletMargin = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
349+ $Tuple11((accum._1 :+ walletSupply), (accum._2 :+ walletSupplyInUsd), (accum._3 :+ walletDailyIncome), (accum._4 :+ walletDailyIncomeInUsd), (accum._5 :+ walletBorrow), (accum._6 :+ walletBorrowInUsd), (accum._7 :+ walletDailyLoanPercents), (accum._8 :+ walletDailyLoanPercentsInUsd), (accum._9 :+ walletBorrowLimitInUsd), (accum._10 :+ walletBorrowUsageInUsd), (accum._11 :+ walletMargin))
350+ }
351+
352+ let assets = {
353+ let $l = arr12
354+ let $s = size($l)
355+ let $acc0 = $Tuple11(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
356+ func $f0_1 ($a,$i) = if (($i >= $s))
357+ then $a
358+ else fold($a, $l[$i])
359+
360+ func $f0_2 ($a,$i) = if (($i >= $s))
361+ then $a
362+ else throw("List size exceeds 12")
363+
364+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
365+ }
366+ let totalWalletSupplyInUsd = sum(assetsCount, assets._2)
367+ let totalWalletDailyIncomeInUsd = sum(assetsCount, assets._4)
368+ let totalWalletBorrowInUsd = sum(assetsCount, assets._6)
369+ let totalWalletDailyLoanPercentsInUsd = sum(assetsCount, assets._8)
370+ let totalWalletBorrowLimitInUsd = sum(assetsCount, assets._9)
371+ let totalWalletBorrowUsageInUsd = sum(assetsCount, assets._10)
372+ let totalWalletMargin = sum(assetsCount, assets._11)
373+ let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
374+ let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMargin)
375+ $Tuple7(assets, totalWalletSupplyInUsd, totalWalletDailyIncomeInUsd, totalWalletBorrowInUsd, totalWalletDailyLoanPercentsInUsd, accountHealth, netApy)
376+ }
377+
378+
379+func getWalletOperationsJson (market,assetIdStr,wallet) = {
286380 let marketAddress = addressFromStringValue(market)
287- let marketName = getStringValue(("market_name_" + market))
288- let curve = getRateCurve(assetIdStr)
289- let lastRateHeight = getLastRateHeight(marketAddress)
290- let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
291- let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
292- let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
293- let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
294- let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
295- let rate = getRate(curve, outdatedUr)
296- let interest = getInterest(rate)
297- let actualSRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
298- let actualBRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
299- let assetScale = getAssetScale(assetIdStr)
300- let actualSupply = getActualAmount(outdatedTotalSupply, actualSRate)
301- let actualBorrow = getActualAmount(outdatedTotalBorrow, actualBRate)
302- let actualUr = getActualUr(actualSupply, actualBorrow)
303- let price = getTokenPrice(assetIdStr)
304- let supplyInUsd = getInUsd(actualSupply, assetScale, price)
305- let borrowInUsd = getInUsd(actualBorrow, assetScale, price)
306- let supplyApy = getSupplyApy(rate, actualUr)
307- let borrowApy = getBorrowApy(rate)
308- let reserves = (actualSupply - actualBorrow)
309- let reservesInUsd = getInUsd(reserves, assetScale, price)
310- let marketParameters = getMarketParameters(marketAddress)
311- let $t01433814406 = marketParameters
312- let setupTokens = $t01433814406._1
313- let setupCf = $t01433814406._2
314- let setupLt = $t01433814406._3
315- let setupPenalty = $t01433814406._4
316- let $t01441114482 = getAssetParamters(marketParameters, assetIdStr)
317- let cf = $t01441114482._1
318- let lt = $t01441114482._2
319- let penalty = $t01441114482._3
320- let maxSupply = getMaxSupply(marketAddress, assetIdStr)
321- let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, actualSRate)
322- let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
323- let dailyIncome = getDailyPercents(supplyApy, walletSupply)
324- let dailyIncomeInUsd = getInUsd(dailyIncome, assetScale, price)
325- let walletBorrow = getWalletSupply(marketAddress, assetIdStr, wallet, actualSRate)
326- let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
327- let dailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
328- let dailyLoanPercentsInUsd = getInUsd(dailyLoanPercents, assetScale, price)
329- (((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"market\":\"") + marketName) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, actualSupply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, actualBorrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(actualUr, Scale8)) + ",\"collateralFactor\":") + amountToDecimal(cf, Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"mySupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"mySupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"dailyIncome\":") + assetToJson(assetIdStr, dailyIncome)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, dailyIncomeInUsd)) + ",\"myBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"myBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"dailyLoanPercents\":") + assetToJson(assetIdStr, dailyLoanPercents)) + ",\"dailyLoanPercentsInUsd\":") + assetToJson(usdtIdStr, dailyLoanPercentsInUsd)) + "}")
381+ let marketData = getMarketData(marketAddress)
382+ let walletData = getWalletData(marketAddress, wallet, marketData._2, marketData._1._1, marketData._1._2, marketData._1._3, marketData._1._5, marketData._1._6, marketData._1._8, marketData._1._9, marketData._1._17, marketData._1._18)
383+ let assetIndex = getAssetIndex(marketData._1._1, assetIdStr)
384+ (((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"market\":\"") + marketData._3) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, marketData._1._5[assetIndex])) + ",\"supply\":") + assetToJson(assetIdStr, marketData._1._10[assetIndex])) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, marketData._1._11[assetIndex])) + ",\"supplyApy\":") + amountToDecimal(marketData._1._17[assetIndex], Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, marketData._1._12[assetIndex])) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, marketData._1._13[assetIndex])) + ",\"borrowApy\":") + amountToDecimal(marketData._1._18[assetIndex], Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, marketData._1._14[assetIndex])) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, marketData._1._15[assetIndex])) + ",\"utilizationRatio\":") + amountToDecimal(marketData._1._16[assetIndex], Scale8)) + ",\"collateralFactor\":") + amountToDecimal(marketData._1._2[assetIndex], Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(marketData._1._3[assetIndex], Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(marketData._1._4[assetIndex], Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, marketData._1._7[assetIndex])) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletData._1._1[assetIndex])) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletData._1._2[assetIndex])) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletData._1._3[assetIndex])) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletData._1._4[assetIndex])) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletData._1._5[assetIndex])) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletData._1._6[assetIndex])) + ",\"walletDailyLoanPercents\":") + assetToJson(assetIdStr, walletData._1._7[assetIndex])) + ",\"walletDailyLoanPercentsInUsd\":") + assetToJson(usdtIdStr, walletData._1._8[assetIndex])) + ",\"accountHealth\":") + amountToDecimal(walletData._6, Scale8)) + ",\"netApy\":") + amountToDecimal(walletData._7, Scale8)) + "}")
330385 }
331386
332387
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Waves = "WAVES"
55
66 let Scale6 = 1000000
77
88 let Scale8 = 100000000
99
1010 let Scale8Big = toBigInt(100000000)
1111
1212 let Scale10 = 10000000000
1313
1414 let Scale16 = 10000000000000000
1515
1616 let Scale16Big = toBigInt(10000000000000000)
1717
1818 let dayBlocks = 1440
1919
2020 let yearBlocks = 525600
2121
2222 let yearBlocksBig = toBigInt(525600)
2323
2424 let reserveFund = 20
2525
2626 let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
2727
2828 let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
2929
3030 let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"
3131
3232 let oracleAddress = Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t')
3333
3434 func getRateCurve (assetIdStr) = match assetIdStr {
3535 case _ =>
3636 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0))
3737 then $Tuple4(2000000, 25000000, 80000000, 100000000)
3838 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match0))
3939 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4040 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0))
4141 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4242 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0))
4343 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4444 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match0))
4545 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4646 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match0))
4747 then $Tuple4(2000000, 40000000, 80000000, 150000000)
4848 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match0))
4949 then $Tuple4(0, 100000000, 80000000, 400000000)
5050 else if (("WAVES" == $match0))
5151 then $Tuple4(2000000, 30000000, 80000000, 90000000)
5252 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0))
5353 then $Tuple4(0, 20000000, 80000000, 40000000)
5454 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match0))
5555 then $Tuple4(0, 20000000, 80000000, 100000000)
5656 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match0))
5757 then $Tuple4(0, 30000000, 80000000, 40000000)
5858 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match0))
5959 then $Tuple4(0, 25000000, 80000000, 40000000)
6060 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match0))
6161 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6262 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match0))
6363 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6464 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match0))
6565 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6666 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0))
6767 then $Tuple4(2000000, 40000000, 80000000, 100000000)
6868 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match0))
6969 then $Tuple4(2000000, 30000000, 80000000, 80000000)
7070 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0))
7171 then $Tuple4(0, 50000000, 80000000, 200000000)
7272 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match0))
7373 then $Tuple4(0, 100000000, 80000000, 400000000)
7474 else $Tuple4(0, 20000000, 80000000, 80000000)
7575 }
7676
7777
78+func sum (size,data) = {
79+ func fold (accum,next) = if ((next >= size))
80+ then accum
81+ else (accum + next)
82+
83+ let $l = arr12
84+ let $s = size($l)
85+ let $acc0 = 0
86+ func $f0_1 ($a,$i) = if (($i >= $s))
87+ then $a
88+ else fold($a, $l[$i])
89+
90+ func $f0_2 ($a,$i) = if (($i >= $s))
91+ then $a
92+ else throw("List size exceeds 12")
93+
94+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
95+ }
96+
97+
98+func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
99+
100+
78101 func getTokenPrice (assetIdStr) = if (if ((assetIdStr == usdtIdStr))
79102 then true
80103 else (assetIdStr == usdcIdStr))
81104 then 1000000
82105 else {
83106 let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
84107 price
85108 }
86109
87110
88111 func getAssetScale (assetIdStr) = {
89112 let decimals = if ((assetIdStr == "WAVES"))
90113 then 8
91114 else value(assetInfo(fromBase58String(assetIdStr))).decimals
92115 pow(10, 0, decimals, 0, 0, DOWN)
93116 }
94117
95118
96119 func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
97120
98121
99122 func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0)
100123
101124
102125 func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0)
103126
104127
105128 func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0)
106129
107130
108131 func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0)
109132
110133
111134 func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = {
112135 let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16)
113136 if ((down == 0))
114137 then 0
115138 else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down)
116139 }
117140
118141
119142 func getRate (curve,outdatedUr) = (curve._1 + (if ((curve._3 >= outdatedUr))
120143 then fraction(outdatedUr, curve._2, curve._3)
121144 else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3)))))
122145
123146
124147 func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1])
125148
126149
127-func getAssetParamters (marketParameters,assetIdStr) = {
128- let index = value(indexOf(marketParameters._1, assetIdStr))
129- $Tuple3(marketParameters._2[index], marketParameters._3[index], marketParameters._4[index])
130- }
150+func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr))
131151
132152
133-func getMarketParameters (marketAddress) = {
134- let setupTokens = split(getStringValue(marketAddress, "setup_tokens"), ",")
153+func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex])
154+
155+
156+func getMarketParameters (marketAddress,setupTokens) = {
135157 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
136158 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
137159 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
138160 let tokensSize = size(setupTokens)
139161 func fold (accum,next) = if ((next >= tokensSize))
140162 then accum
141- else $Tuple4((accum._1 :+ setupTokens[next]), (accum._2 :+ parseIntValue(setupCf[next])), (accum._3 :+ parseIntValue(setupLt[next])), (accum._4 :+ parseIntValue(setupPenalty[next])))
163+ else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next])))
142164
143165 let $l = arr12
144166 let $s = size($l)
145- let $acc0 = $Tuple4(nil, nil, nil, nil)
167+ let $acc0 = $Tuple3(nil, nil, nil)
146168 func $f0_1 ($a,$i) = if (($i >= $s))
147169 then $a
148170 else fold($a, $l[$i])
149171
150172 func $f0_2 ($a,$i) = if (($i >= $s))
151173 then $a
152174 else throw("List size exceeds 12")
153175
154176 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
155177 }
156178
157179
158180 func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0"))
159181
160182
161183 func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = {
162184 let lastSRate = max([outdatedSRate, Scale16])
163185 let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100))
164186 newSRate
165187 }
166188
167189
168190 func getActualBRate (lastRateHeight,interest,outdatedBRate) = {
169191 let lastBRate = max([outdatedBRate, Scale16])
170192 let newBRate = (lastBRate + ((height - lastRateHeight) * interest))
171193 newBRate
172194 }
173195
174196
175197 func getActualUr (actualSupply,actualBorrow) = fraction(actualBorrow, Scale8, actualSupply)
176198
177199
178200 func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16)
179201
180202
181203 func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale)
182204
183205
184206 func getSupplyApy (rate,actualUr) = {
185207 let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8)
186208 (pow((Scale8 + (supplyRate / yearBlocks)), 8, yearBlocks, 0, 8, DOWN) - Scale8)
187209 }
188210
189211
190212 func getBorrowApy (rate) = (pow((Scale8 + (rate / yearBlocks)), 8, yearBlocks, 0, 8, DOWN) - Scale8)
191213
192214
193215 func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = {
194216 let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0)
195217 getActualAmount(outdatedWalletSupply, actualSRate)
196218 }
197219
198220
199221 func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = {
200222 let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0)
201223 getActualAmount(outdatedWalletBorrow, actualBRate)
202224 }
203225
204226
205227 func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8)
206228
207229
208-func getAccountHealth (marketAddress,assetIdStr,wallet,marketParameters) = 0
230+func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0))
231+ then Scale8
232+ else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd))
233+
234+
235+func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMargin) = if ((totalWalletMargin == 0))
236+ then 0
237+ else if ((totalWalletMargin > 0))
238+ then fraction(totalWalletMargin, Scale6, totalWalletSupplyInUsd)
239+ else fraction(totalWalletMargin, Scale6, totalWalletBorrowInUsd)
209240
210241
211242 func assetToJson (assetIdStr,quantity) = {
212- let $t089689183 = if ((assetIdStr == Waves))
243+ let $t085528767 = if ((assetIdStr == Waves))
213244 then $Tuple2(8, "WAVES")
214245 else {
215246 let asset = value(assetInfo(fromBase58String(assetIdStr)))
216247 $Tuple2(asset.decimals, asset.name)
217248 }
218- let decimals = $t089689183._1
219- let name = $t089689183._2
249+ let decimals = $t085528767._1
250+ let name = $t085528767._2
220251 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
221252 }
222253
223254
224255 func amountToDecimal (amount,assetScale) = {
225256 let intPart = (amount / assetScale)
226257 let floatPart = (amount % assetScale)
227258 ((toString(intPart) + ".") + toString(floatPart))
228259 }
229260
230261
231262 func getMarketData (marketAddress) = {
263+ let marketStr = toString(marketAddress)
264+ let marketName = getStringValue(("market_name_" + marketStr))
265+ let marketShortName = getStringValue(("market_shortname_" + marketStr))
232266 let setupTokens = split(getStringValue(marketAddress, "setup_tokens"), ",")
233267 let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
234268 let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
235269 let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
236270 let lastRateHeight = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
237- let tokensSize = size(setupTokens)
238- func fold (accum,next) = if ((next >= tokensSize))
271+ let assetsCount = size(setupTokens)
272+ func fold (accum,next) = if ((next >= assetsCount))
239273 then accum
240274 else {
241275 let assetIdStr = setupTokens[next]
242276 let cf = parseIntValue(setupCf[next])
243277 let lt = parseIntValue(setupLt[next])
244278 let penalty = parseIntValue(setupPenalty[next])
245279 let price = getTokenPrice(assetIdStr)
246280 let assetScale = getAssetScale(assetIdStr)
247281 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
248282 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
249283 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
250284 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
251285 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
252286 let curve = getRateCurve(assetIdStr)
253287 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
254288 let rate = getRate(curve, outdatedUr)
255289 let interest = getInterest(rate)
256- let actualSRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
257- let actualBRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
258- let actualSupply = getActualAmount(outdatedTotalSupply, actualSRate)
259- let actualBorrow = getActualAmount(outdatedTotalBorrow, actualBRate)
260- let supplyInUsd = getInUsd(actualSupply, assetScale, price)
261- let borrowInUsd = getInUsd(actualBorrow, assetScale, price)
262- let reserves = (actualSupply - actualBorrow)
290+ let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
291+ let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
292+ let supply = getActualAmount(outdatedTotalSupply, sRate)
293+ let borrow = getActualAmount(outdatedTotalBorrow, bRate)
294+ let supplyInUsd = getInUsd(supply, assetScale, price)
295+ let borrowInUsd = getInUsd(borrow, assetScale, price)
296+ let reserves = (supply - borrow)
263297 let reservesInUsd = getInUsd(reserves, assetScale, price)
264- let actualUr = getActualUr(actualSupply, actualBorrow)
265- let supplyApy = getSupplyApy(rate, actualUr)
298+ let ur = getActualUr(supply, borrow)
299+ let supplyApy = getSupplyApy(rate, ur)
266300 let borrowApy = getBorrowApy(rate)
267- $Tuple18((accum._1 :+ assetIdStr), (accum._2 :+ cf), (accum._3 :+ lt), (accum._4 :+ penalty), (accum._5 :+ price), (accum._6 :+ assetScale), (accum._7 :+ maxSupply), (accum._8 :+ actualSRate), (accum._9 :+ actualBRate), (accum._10 :+ actualSupply), (accum._11 :+ supplyInUsd), (accum._12 :+ actualBorrow), (accum._13 :+ borrowInUsd), (accum._14 :+ reserves), (accum._15 :+ reservesInUsd), (accum._16 :+ actualUr), (accum._17 :+ supplyApy), (accum._18 :+ borrowApy))
301+ $Tuple18((accum._1 :+ assetIdStr), (accum._2 :+ cf), (accum._3 :+ lt), (accum._4 :+ penalty), (accum._5 :+ price), (accum._6 :+ assetScale), (accum._7 :+ maxSupply), (accum._8 :+ sRate), (accum._9 :+ bRate), (accum._10 :+ supply), (accum._11 :+ supplyInUsd), (accum._12 :+ borrow), (accum._13 :+ borrowInUsd), (accum._14 :+ reserves), (accum._15 :+ reservesInUsd), (accum._16 :+ ur), (accum._17 :+ supplyApy), (accum._18 :+ borrowApy))
268302 }
269303
270- let $l = arr12
271- let $s = size($l)
272- let $acc0 = $Tuple18(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
273- func $f0_1 ($a,$i) = if (($i >= $s))
274- then $a
275- else fold($a, $l[$i])
304+ let assets = {
305+ let $l = arr12
306+ let $s = size($l)
307+ let $acc0 = $Tuple18(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
308+ func $f0_1 ($a,$i) = if (($i >= $s))
309+ then $a
310+ else fold($a, $l[$i])
276311
277- func $f0_2 ($a,$i) = if (($i >= $s))
278- then $a
279- else throw("List size exceeds 12")
312+ func $f0_2 ($a,$i) = if (($i >= $s))
313+ then $a
314+ else throw("List size exceeds 12")
280315
281- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
316+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
317+ }
318+ let totalSupplyInUsd = sum(assetsCount, assets._11)
319+ let totalBorrowInUsd = sum(assetsCount, assets._13)
320+ let totalReservesInUsd = sum(assetsCount, assets._15)
321+ $Tuple7(assets, assetsCount, marketName, marketShortName, totalSupplyInUsd, totalBorrowInUsd, totalReservesInUsd)
282322 }
283323
284324
285-func walletOperationView (market,assetIdStr,wallet) = {
325+func getWalletData (marketAddress,wallet,assetsCount,assetsList,cfList,ltList,priceList,assetScaleList,sRateList,bRateList,supplyApyList,borrowApyList) = {
326+ func fold (accum,next) = if ((next >= assetsCount))
327+ then accum
328+ else {
329+ let assetIdStr = assetsList[next]
330+ let cf = cfList[next]
331+ let lt = ltList[next]
332+ let price = priceList[next]
333+ let assetScale = assetScaleList[next]
334+ let sRate = sRateList[next]
335+ let bRate = bRateList[next]
336+ let supplyApy = supplyApyList[next]
337+ let borrowApy = borrowApyList[next]
338+ let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate)
339+ let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
340+ let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
341+ let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
342+ let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate)
343+ let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
344+ let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
345+ let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price)
346+ let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
347+ let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
348+ let walletMargin = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
349+ $Tuple11((accum._1 :+ walletSupply), (accum._2 :+ walletSupplyInUsd), (accum._3 :+ walletDailyIncome), (accum._4 :+ walletDailyIncomeInUsd), (accum._5 :+ walletBorrow), (accum._6 :+ walletBorrowInUsd), (accum._7 :+ walletDailyLoanPercents), (accum._8 :+ walletDailyLoanPercentsInUsd), (accum._9 :+ walletBorrowLimitInUsd), (accum._10 :+ walletBorrowUsageInUsd), (accum._11 :+ walletMargin))
350+ }
351+
352+ let assets = {
353+ let $l = arr12
354+ let $s = size($l)
355+ let $acc0 = $Tuple11(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
356+ func $f0_1 ($a,$i) = if (($i >= $s))
357+ then $a
358+ else fold($a, $l[$i])
359+
360+ func $f0_2 ($a,$i) = if (($i >= $s))
361+ then $a
362+ else throw("List size exceeds 12")
363+
364+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
365+ }
366+ let totalWalletSupplyInUsd = sum(assetsCount, assets._2)
367+ let totalWalletDailyIncomeInUsd = sum(assetsCount, assets._4)
368+ let totalWalletBorrowInUsd = sum(assetsCount, assets._6)
369+ let totalWalletDailyLoanPercentsInUsd = sum(assetsCount, assets._8)
370+ let totalWalletBorrowLimitInUsd = sum(assetsCount, assets._9)
371+ let totalWalletBorrowUsageInUsd = sum(assetsCount, assets._10)
372+ let totalWalletMargin = sum(assetsCount, assets._11)
373+ let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
374+ let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMargin)
375+ $Tuple7(assets, totalWalletSupplyInUsd, totalWalletDailyIncomeInUsd, totalWalletBorrowInUsd, totalWalletDailyLoanPercentsInUsd, accountHealth, netApy)
376+ }
377+
378+
379+func getWalletOperationsJson (market,assetIdStr,wallet) = {
286380 let marketAddress = addressFromStringValue(market)
287- let marketName = getStringValue(("market_name_" + market))
288- let curve = getRateCurve(assetIdStr)
289- let lastRateHeight = getLastRateHeight(marketAddress)
290- let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
291- let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
292- let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
293- let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
294- let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
295- let rate = getRate(curve, outdatedUr)
296- let interest = getInterest(rate)
297- let actualSRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
298- let actualBRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
299- let assetScale = getAssetScale(assetIdStr)
300- let actualSupply = getActualAmount(outdatedTotalSupply, actualSRate)
301- let actualBorrow = getActualAmount(outdatedTotalBorrow, actualBRate)
302- let actualUr = getActualUr(actualSupply, actualBorrow)
303- let price = getTokenPrice(assetIdStr)
304- let supplyInUsd = getInUsd(actualSupply, assetScale, price)
305- let borrowInUsd = getInUsd(actualBorrow, assetScale, price)
306- let supplyApy = getSupplyApy(rate, actualUr)
307- let borrowApy = getBorrowApy(rate)
308- let reserves = (actualSupply - actualBorrow)
309- let reservesInUsd = getInUsd(reserves, assetScale, price)
310- let marketParameters = getMarketParameters(marketAddress)
311- let $t01433814406 = marketParameters
312- let setupTokens = $t01433814406._1
313- let setupCf = $t01433814406._2
314- let setupLt = $t01433814406._3
315- let setupPenalty = $t01433814406._4
316- let $t01441114482 = getAssetParamters(marketParameters, assetIdStr)
317- let cf = $t01441114482._1
318- let lt = $t01441114482._2
319- let penalty = $t01441114482._3
320- let maxSupply = getMaxSupply(marketAddress, assetIdStr)
321- let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, actualSRate)
322- let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
323- let dailyIncome = getDailyPercents(supplyApy, walletSupply)
324- let dailyIncomeInUsd = getInUsd(dailyIncome, assetScale, price)
325- let walletBorrow = getWalletSupply(marketAddress, assetIdStr, wallet, actualSRate)
326- let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
327- let dailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
328- let dailyLoanPercentsInUsd = getInUsd(dailyLoanPercents, assetScale, price)
329- (((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"market\":\"") + marketName) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, actualSupply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, actualBorrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(actualUr, Scale8)) + ",\"collateralFactor\":") + amountToDecimal(cf, Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"mySupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"mySupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"dailyIncome\":") + assetToJson(assetIdStr, dailyIncome)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, dailyIncomeInUsd)) + ",\"myBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"myBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"dailyLoanPercents\":") + assetToJson(assetIdStr, dailyLoanPercents)) + ",\"dailyLoanPercentsInUsd\":") + assetToJson(usdtIdStr, dailyLoanPercentsInUsd)) + "}")
381+ let marketData = getMarketData(marketAddress)
382+ let walletData = getWalletData(marketAddress, wallet, marketData._2, marketData._1._1, marketData._1._2, marketData._1._3, marketData._1._5, marketData._1._6, marketData._1._8, marketData._1._9, marketData._1._17, marketData._1._18)
383+ let assetIndex = getAssetIndex(marketData._1._1, assetIdStr)
384+ (((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"market\":\"") + marketData._3) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, marketData._1._5[assetIndex])) + ",\"supply\":") + assetToJson(assetIdStr, marketData._1._10[assetIndex])) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, marketData._1._11[assetIndex])) + ",\"supplyApy\":") + amountToDecimal(marketData._1._17[assetIndex], Scale8)) + ",\"borrow\":") + assetToJson(assetIdStr, marketData._1._12[assetIndex])) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, marketData._1._13[assetIndex])) + ",\"borrowApy\":") + amountToDecimal(marketData._1._18[assetIndex], Scale8)) + ",\"reserves\":") + assetToJson(assetIdStr, marketData._1._14[assetIndex])) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, marketData._1._15[assetIndex])) + ",\"utilizationRatio\":") + amountToDecimal(marketData._1._16[assetIndex], Scale8)) + ",\"collateralFactor\":") + amountToDecimal(marketData._1._2[assetIndex], Scale8)) + ",\"liquidationThreshold\":") + amountToDecimal(marketData._1._3[assetIndex], Scale8)) + ",\"liquidationPenalty\":") + amountToDecimal(marketData._1._4[assetIndex], Scale8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, marketData._1._7[assetIndex])) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletData._1._1[assetIndex])) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletData._1._2[assetIndex])) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletData._1._3[assetIndex])) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletData._1._4[assetIndex])) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletData._1._5[assetIndex])) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletData._1._6[assetIndex])) + ",\"walletDailyLoanPercents\":") + assetToJson(assetIdStr, walletData._1._7[assetIndex])) + ",\"walletDailyLoanPercentsInUsd\":") + assetToJson(usdtIdStr, walletData._1._8[assetIndex])) + ",\"accountHealth\":") + amountToDecimal(walletData._6, Scale8)) + ",\"netApy\":") + amountToDecimal(walletData._7, Scale8)) + "}")
330385 }
331386
332387
333388

github/deemru/w8io/3ef1775 
111.18 ms