2021.10.12 18:34 [2808221] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "2z4Uxwk9RKkjGCLiR6shC3f6g1E62bWft9d8mgLgsBkm", "fee": 1000000, "feeAssetId": null, "timestamp": 1634052782440, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "5CbG2ETwLt5HDzs7APCz1JyHY1iZai7txQfNX3BSvAFGTm6jBJNp7HtFPpZXxxPYSZ85RQmDHZ5sPu3PG3QjwaDy" ], "script": "base64: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b3JlAgAAAAhhVG9rZW5JZAAAAAAMYXNzZXRJZFN0b3JlAgAAAAdhc3NldElkAAAAABBkaXN0cmlidXRvclN0b3JlAgAAABF2aXJlc19kaXN0cmlidXRvcgAAAAAFYWRtaW4JAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACmFkbWluU3RvcmUAAAAABmNvbmZpZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAALY29uZmlnU3RvcmUAAAAAC3Jlc2VydmVzU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAANcmVzZXJ2ZXNTdG9yZQIAAAAWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAAAAAIcmVzZXJ2ZXMJAAS1AAAAAgUAAAALcmVzZXJ2ZXNTdHICAAAAAXwAAAAAC3ZpcmVzTWludGVyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABmNvbmZpZwIAAAAMdmlyZXNfbWludGVyAgAAAA5ubyB2aXJlc01pbnRlcgIAAAATaW52YWxpZCB2aXJlc01pbnRlcgAAAAAQbWF5YmVWaXJlc1N0YWtlcgkABB0AAAACBQAAAAZjb25maWcCAAAADHZpcmVzX3N0YWtlcgAAAAALdmlyZXNTdGFrZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgUAAAAQbWF5YmVWaXJlc1N0YWtlcgIAAAAPbm8gdmlyZXNfc3Rha2VyAAAAABVtYXliZVZpcmVzRGlzdHJpYnV0b3IEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGY29uZmlnBQAAABBkaXN0cmlidXRvclN0b3JlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWQFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAWQFAAAABHVuaXQAAAAAEW1heWJlVmlyZXNBc3NldElkCQAEHQAAAAIFAAAAC3ZpcmVzTWludGVyAgAAAAdhc3NldElkAAAAAAx2aXJlc0Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIFAAAAEW1heWJlVmlyZXNBc3NldElkAgAAABd2aXJlcyBhc3NldElkIG5vdCBmb3VuZAIAAAAVaW52YWxpZCB2aXJlcyBhc3NldElkAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMYXNzZXRJZFN0b3JlAgAAABVubyBhc3NldElkIGluIHJlc2VydmUBAAAAEGNvbGxhdGVyYWxGYWN0b3IAAAABAAAAB3Jlc2VydmUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgkBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABBQAAAAdyZXNlcnZlAgAAABFfQ29sbGF0ZXJhbEZhY3RvcgIAAAAdbm8gQ29sbGF0ZXJhbEZhY3RvciBpbiBjb25maWcBAAAAFGxpcXVpZGF0aW9uVGhyZXNob2xkAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAAVX0xpcXVpZGF0aW9uVGhyZXNob2xkAgAAACFubyBMaXF1aWRhdGlvblRocmVzaG9sZCBpbiBjb25maWcBAAAAEmxpcXVpZGF0aW9uUGVuYWx0eQAAAAEAAAAHYXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACBQAAAAdhc3NldElkAgAAABNfTGlxdWlkYXRpb25QZW5hbHR5AgAAAB9ubyBMaXF1aWRhdGlvblBlbmFsdHkgaW4gY29uZmlnAAAAABZhY2NvdW50SGVhbHRoVGhyZXNob2xkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABhhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQCAAAAG25vIGFjY291bnRfaGVhbHRoX3RocmVzaG9sZAAAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAFmFjY291bnRfaGVhbHRoX292ZXJsYXACAAAAGW5vIGFjY291bnRfaGVhbHRoX292ZXJsYXAAAAAAD2NvbGxhcHNlUGVuYWx0eQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAQY29sbGFwc2VfcGVuYWx0eQIAAAATbm8gY29sbGFwc2VfcGVuYWx0eQAAAAALbGlxdWlkYXRvcnMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAGY29uZmlnAgAAAAtsaXF1aWRhdG9ycwIAAAAAAQAAAA1maW5kUmVzZXJ2ZUJ5AAAAAgAAAAVzdG9yZQAAAAV2YWx1ZQoBAAAABGZvbGQAAAACAAAAAWEAAAABcgQAAAAHJG1hdGNoMAUAAAABYQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQWRkcmVzcwQAAAAFZm91bmQFAAAAByRtYXRjaDAFAAAABWZvdW5kBAAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAATcmVzZXJ2ZSBiYWQgYWRkcmVzcwMJAAAAAAAAAgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB3Jlc2VydmUFAAAABXN0b3JlCQABLAAAAAICAAAAD3Jlc2VydmUgaGFzIG5vIAUAAAAFc3RvcmUFAAAABXZhbHVlBQAAAAdyZXNlcnZlBQAAAAR1bml0BAAAAAckbWF0Y2gwCgAAAAACJGwFAAAACHJlc2VydmVzCgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAUAAAAEdW5pdAoBAAAAATEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAAEZm9sZAAAAAIFAAAAAiRhCQABkQAAAAIFAAAAAiRsBQAAAAIkaQoBAAAAATIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQAAAAEyAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQWRkcmVzcwQAAAAFZm91bmQFAAAAByRtYXRjaDAFAAAABWZvdW5kCQAAAgAAAAEJAAEsAAAAAgIAAAAIdW5rbm93biAFAAAABXN0b3JlAQAAAA92YWxpZGF0ZVJlc2VydmUAAAABAAAAAXIDCQEAAAAIY29udGFpbnMAAAACBQAAAAtyZXNlcnZlc1N0cgUAAAABcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAAAXICAAAAEW1haW46IGJhZCByZXNlcnZlCQAAAgAAAAEJAAEsAAAAAgIAAAAQdW5rbm93biByZXNlcnZlOgUAAAABcgEAAAALdXNlckJhbGFuY2UAAAACAAAAB3Jlc2VydmUAAAAEdXNlcgkBAAAAEWFzVXNlckJhbGFuY2VEYXRhAAAAAQkAA/wAAAAEBQAAAAdyZXNlcnZlAgAAAAt1c2VyQmFsYW5jZQkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwFAAAAA25pbAEAAAAJdXNlclBvd2VyAAAAAQAAAAR1c2VyCgEAAAAEZm9sZAAAAAIAAAAGdG90YWxzAAAAAXIEAAAACyR0MDQ0MzE0NDYwBQAAAAZ0b3RhbHMEAAAABnRvdGFsRAgFAAAACyR0MDQ0MzE0NDYwAAAAAl8xBAAAAAZ0b3RhbEIIBQAAAAskdDA0NDMxNDQ2MAAAAAJfMgQAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAAAXICAAAAE3Jlc2VydmUgYmFkIGFkZHJlc3MEAAAAAmNmCQEAAAAQY29sbGF0ZXJhbEZhY3RvcgAAAAEFAAAAB3Jlc2VydmUEAAAAAmx0CQEAAAAUbGlxdWlkYXRpb25UaHJlc2hvbGQAAAABBQAAAAdyZXNlcnZlBAAAAAskdDA0NjMxNDcxOQkBAAAAC3VzZXJCYWxhbmNlAAAAAgUAAAAHcmVzZXJ2ZQUAAAAEdXNlcgQAAAAFdG9rZW4IBQAAAAskdDA0NjMxNDcxOQAAAAJfMQQAAAAFYXNzZXQIBQAAAAskdDA0NjMxNDcxOQAAAAJfMgQAAAAKZGVwb3NpdFVzZAgFAAAACyR0MDQ2MzE0NzE5AAAAAl8zBAAAAARkZWJ0CAUAAAALJHQwNDYzMTQ3MTkAAAACXzQEAAAAB2RlYnRVc2QIBQAAAAskdDA0NjMxNDcxOQAAAAJfNQQAAAAMYXNDb2xsYXRlcmFsCAUAAAALJHQwNDYzMTQ3MTkAAAACXzYEAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QDBQAAAAxhc0NvbGxhdGVyYWwFAAAACmRlcG9zaXRVc2QAAAAAAAAAAAAEAAAACm92ZXJsYXBVc2QJAAGXAAAAAQkABEwAAAACBQAAAAdkZWJ0VXNkCQAETAAAAAIFAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QFAAAAA25pbAQAAAANb3ZlcmxhcENoYXJnZQkBAAAADGZyYWN0aW9uQ2VpbAAAAAMFAAAACm92ZXJsYXBVc2QFAAAAFGFjY291bnRIZWFsdGhPdmVybGFwBQAAAAtmYWN0b3JzQmFzZQMJAABmAAAAAgUAAAAHZGVidFVzZAUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAkABRQAAAACBQAAAAZ0b3RhbEQJAABkAAAAAgkAAGQAAAACBQAAAAZ0b3RhbEIJAABrAAAAAwkAAGUAAAACBQAAAAdkZWJ0VXNkBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkBQAAAAtmYWN0b3JzQmFzZQUAAAACbHQFAAAADW92ZXJsYXBDaGFyZ2UJAAUUAAAAAgkAAGQAAAACBQAAAAZ0b3RhbEQJAABrAAAAAwkAAGUAAAACBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkBQAAAAdkZWJ0VXNkBQAAAAJjZgUAAAALZmFjdG9yc0Jhc2UJAABkAAAAAgUAAAAGdG90YWxCBQAAAA1vdmVybGFwQ2hhcmdlCgAAAAACJGwFAAAACHJlc2VydmVzCgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAkABRQAAAACAAAAAAAAAAAAAAAAAAAAAAAACgEAAAABMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAARmb2xkAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAABMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgNwkBAAAAATIAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAQAAAA1nZXRVc2VySGVhbHRoAAAAAQAAAAdhY2NvdW50BAAAAAskdDA1MjY0NTMwNwkBAAAABmFzSW50MgAAAAEJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAdhY2NvdW50BAAAAAJicAgFAAAACyR0MDUyNjQ1MzA3AAAAAl8xBAAAAANicHUIBQAAAAskdDA1MjY0NTMwNwAAAAJfMgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAADYnA6CQABpAAAAAEFAAAAAmJwAgAAAAYsIGJwdToJAAGkAAAAAQUAAAADYnB1AQAAAA12YWxpZGF0ZUFmdGVyAAAAAgAAAAR1c2VyAAAAAm9wBAAAAAskdDA1NDE4NTQ0OQkBAAAACXVzZXJQb3dlcgAAAAEFAAAABHVzZXIEAAAAAmJwCAUAAAALJHQwNTQxODU0NDkAAAACXzEEAAAAA2JwdQgFAAAACyR0MDU0MTg1NDQ5AAAAAl8yBAAAAAlhY2NIZWFsdGgJAABpAAAAAgkAAGgAAAACCQAAZQAAAAIFAAAAAmJwBQAAAANicHUFAAAAC2ZhY3RvcnNCYXNlBQAAAAJicAMDCQAAAAAAAAIFAAAAAmJwAAAAAAAAAAAACQAAAAAAAAIFAAAAA2JwdQAAAAAAAAAAAAcFAAAAA25pbAMDCQAAAAAAAAIFAAAAAmJwAAAAAAAAAAAACQAAZgAAAAIFAAAAA2JwdQAAAAAAAAAAAAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIFAAAAAm9wAgAAADUgdG9vIG11Y2g6IGJyZWFjaGluZyBsaXF1aWRhdGlvbiB0aHJlc2hvbGQoYnA9MCwgYnB1PQkAAaQAAAABBQAAAANicHUDCQAAZgAAAAIFAAAAFmFjY291bnRIZWFsdGhUaHJlc2hvbGQFAAAACWFjY0hlYWx0aAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAAAm9wAgAAAC4gdG9vIG11Y2g6IGJyZWFjaGluZyBsaXF1aWRhdGlvbiB0aHJlc2hvbGQoYnA9CQABpAAAAAEFAAAAAmJwAgAAAAYsIGJwdT0JAAGkAAAAAQUAAAADYnB1AgAAAAksIGhlYWx0aD0JAAGkAAAAAQUAAAAJYWNjSGVhbHRoAgAAAAEpBQAAAANuaWwBAAAADHVwZGF0ZVN0cmVhbQAAAAUAAAAHcmVzZXJ2ZQAAAAZhY3Rpb24AAAAEdXNlcgAAAAp1c2VyQ2hhbmdlAAAADHN0cmVhbUNoYW5nZQQAAAAHJG1hdGNoMAUAAAAVbWF5YmVWaXJlc0Rpc3RyaWJ1dG9yAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdBZGRyZXNzBAAAAAFhBQAAAAckbWF0Y2gwCQAD/AAAAAQFAAAAAWECAAAACG9uQWN0aW9uCQAETAAAAAIFAAAAB3Jlc2VydmUJAARMAAAAAgUAAAAGYWN0aW9uCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAKdXNlckNoYW5nZQkABEwAAAACBQAAAAxzdHJlYW1DaGFuZ2UFAAAAA25pbAUAAAADbmlsBQAAAAR1bml0AQAAAAptb3ZlU3RyZWFtAAAABQAAAAdyZXNlcnZlAAAABmFjdGlvbgAAAARmcm9tAAAABnN0cmluZwAAAAZhbW91bnQEAAAAByRtYXRjaDAFAAAAFW1heWJlVmlyZXNEaXN0cmlidXRvcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQWRkcmVzcwQAAAABYQUAAAAHJG1hdGNoMAkAA/wAAAAEBQAAAAFhAgAAAARtb3ZlCQAETAAAAAIFAAAAB3Jlc2VydmUJAARMAAAAAgUAAAAGYWN0aW9uCQAETAAAAAIFAAAABGZyb20JAARMAAAAAgUAAAAGc3RyaW5nCQAETAAAAAIFAAAABmFtb3VudAUAAAADbmlsBQAAAANuaWwFAAAABHVuaXQBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQAAAAdyZXNlcnZlBAAAAAckbWF0Y2gwBQAAABVtYXliZVZpcmVzRGlzdHJpYnV0b3IDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0FkZHJlc3MEAAAAAWEFAAAAByRtYXRjaDAJAAP8AAAABAUAAAABYQIAAAAKc3luY0hlaWdodAkABEwAAAACBQAAAAdyZXNlcnZlBQAAAANuaWwFAAAAA25pbAUAAAAEdW5pdAEAAAANc3Rha2VPclBheW91dAAAAAMAAAAJcmVjaXBpZW50AAAABmFtb3VudAAAAAVzdGFrZQMJAQAAAAEhAAAAAQUAAAAFc3Rha2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50BQAAAAZhbW91bnQFAAAADHZpcmVzQXNzZXRJZAUAAAADbmlsBAAAAAdkb1N0YWtlCQAD/AAAAAQFAAAAC3ZpcmVzU3Rha2VyAgAAAApzdGFrZVZpcmVzCQAETAAAAAIJAAQlAAAAAQUAAAAJcmVjaXBpZW50BQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAADHZpcmVzQXNzZXRJZAUAAAAGYW1vdW50BQAAAANuaWwDCQAAAAAAAAIFAAAAB2RvU3Rha2UFAAAAB2RvU3Rha2UFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAACWRvRGVwb3NpdAAAAAMAAAABaQAAAAdyZXNlcnZlAAAAD3VzZUFzQ29sbGF0ZXJhbAQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAnNoCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAAJzaAUAAAACc2gEAAAABmFjdGlvbgkAA/wAAAAECQEAAAAPdmFsaWRhdGVSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAAKZGVwb3NpdEZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIFAAAAD3VzZUFzQ29sbGF0ZXJhbAUAAAADbmlsCAUAAAABaQAAAAhwYXltZW50cwMJAAAAAAAAAgUAAAAGYWN0aW9uBQAAAAZhY3Rpb24EAAAAA2FtdAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BAAAABBwcm9wYWdhdGVSZXdhcmRzCQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAEdXNlcgUAAAADYW10BQAAAANhbXQDCQAAAAAAAAIFAAAAEHByb3BhZ2F0ZVJld2FyZHMFAAAAEHByb3BhZ2F0ZVJld2FyZHMDCQEAAAABIQAAAAEFAAAAD3VzZUFzQ29sbGF0ZXJhbAkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAAApkZXBvc2l0aW5nBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAASAAAAAWkBAAAACmluaXRpYWxpemUAAAABAAAADWNvbmZpZ0FkZHJlc3MJAARMAAAAAgkBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACBQAAAAphZG1pblN0b3JlCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABEwAAAACCQEAAAAQd3JpdGVDb25zdFN0cmluZwAAAAIFAAAAC2NvbmZpZ1N0b3JlBQAAAA1jb25maWdBZGRyZXNzBQAAAANuaWwAAAABaQEAAAAQcmVnaXN0ZXJSZXNlcnZlcwAAAAEAAAAJYWRkcmVzc2VzAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAVhZG1pbgkAAAIAAAABAgAAABFvbmx5IGFkbWluIGNhbiBkbwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1yZXNlcnZlc1N0b3JlBQAAAAlhZGRyZXNzZXMFAAAAA25pbAAAAAFpAQAAAAdkZXBvc2l0AAAAAgAAAAdyZXNlcnZlAAAAD3VzZUFzQ29sbGF0ZXJhbAkBAAAACWRvRGVwb3NpdAAAAAMFAAAAAWkFAAAAB3Jlc2VydmUFAAAAD3VzZUFzQ29sbGF0ZXJhbAAAAAFpAQAAAApkZXBvc2l0UmVmAAAAAwAAAAdyZXNlcnZlAAAAD3VzZUFzQ29sbGF0ZXJhbAAAAANyZWYJAQAAAAlkb0RlcG9zaXQAAAADBQAAAAFpBQAAAAdyZXNlcnZlBQAAAA91c2VBc0NvbGxhdGVyYWwAAAABaQEAAAAFcmVwYXkAAAABAAAAB3Jlc2VydmUEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAJzaAkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQUAAAAHcmVzZXJ2ZQMJAAAAAAAAAgUAAAACc2gFAAAAAnNoBAAAAAZyZXBhaWQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAkBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAACHJlcGF5Rm9yCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAABnJlcGFpZAUAAAAGcmVwYWlkBAAAABBwcm9wYWdhdGVSZXdhcmRzCQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAGYm9ycm93BQAAAAR1c2VyCQEAAAABLQAAAAEFAAAABnJlcGFpZAkBAAAAAS0AAAABBQAAAAZyZXBhaWQDCQAAAAAAAAIFAAAAEHByb3BhZ2F0ZVJld2FyZHMFAAAAEHByb3BhZ2F0ZVJld2FyZHMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAptaW50QXRva2VuAAAAAgAAAAhhVG9rZW5JZAAAAAZhbW91bnQEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA50YXJnZXRDb250cmFjdAkBAAAADWZpbmRSZXNlcnZlQnkAAAACBQAAAA1hVG9rZW5JZFN0b3JlBQAAAAhhVG9rZW5JZAQAAAACc2gJAQAAABFzeW5jUmV3YXJkc0hlaWdodAAAAAEJAAQlAAAAAQUAAAAOdGFyZ2V0Q29udHJhY3QDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAARbWludGVkQXNzZXRBbW91bnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOdGFyZ2V0Q29udHJhY3QCAAAADW1pbnRBdG9rZW5Gb3IJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAAZhbW91bnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABFtaW50ZWRBc3NldEFtb3VudAUAAAARbWludGVkQXNzZXRBbW91bnQEAAAAEHByb3BhZ2F0ZVJld2FyZHMJAQAAAAx1cGRhdGVTdHJlYW0AAAAFCQAEJQAAAAEFAAAADnRhcmdldENvbnRyYWN0AgAAAAdkZXBvc2l0BQAAAAR1c2VyCQEAAAABLQAAAAEFAAAAEW1pbnRlZEFzc2V0QW1vdW50AAAAAAAAAAAAAwkAAAAAAAACBQAAABBwcm9wYWdhdGVSZXdhcmRzBQAAABBwcm9wYWdhdGVSZXdhcmRzCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAAB21pbnRpbmcJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAATcmVwbGVuaXNoV2l0aEF0b2tlbgAAAAAEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAhhVG9rZW5JZAQAAAAHJG1hdGNoMAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACYnYFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAACYnYJAAACAAAAAQIAAAAeYmFkIGFzc2V0SWQ6IHdhdmVzIG5vdCBhbGxvd2VkBAAAAA50YXJnZXRDb250cmFjdAkBAAAADWZpbmRSZXNlcnZlQnkAAAACBQAAAA1hVG9rZW5JZFN0b3JlBQAAAAhhVG9rZW5JZAQAAAACc2gJAQAAABFzeW5jUmV3YXJkc0hlaWdodAAAAAEJAAQlAAAAAQUAAAAOdGFyZ2V0Q29udHJhY3QDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAAWcmVwbGVuaXNoZWRBc3NldEFtb3VudAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA50YXJnZXRDb250cmFjdAIAAAAWcmVwbGVuaXNoV2l0aEF0b2tlbkZvcgkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwIBQAAAAFpAAAACHBheW1lbnRzAwkAAAAAAAACBQAAABZyZXBsZW5pc2hlZEFzc2V0QW1vdW50BQAAABZyZXBsZW5pc2hlZEFzc2V0QW1vdW50BAAAABBwcm9wYWdhdGVSZXdhcmRzCQEAAAAMdXBkYXRlU3RyZWFtAAAABQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAIAAAAHZGVwb3NpdAUAAAAEdXNlcgUAAAAWcmVwbGVuaXNoZWRBc3NldEFtb3VudAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAQcHJvcGFnYXRlUmV3YXJkcwUAAAAQcHJvcGFnYXRlUmV3YXJkcwkB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/AAAAAQJAQAAAA92YWxpZGF0ZVJlc2VydmUAAAABBQAAAAdyZXNlcnZlAgAAABlkaXNhYmxlVXNlQXNDb2xsYXRlcmFsRm9yCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA9kb1NldENvbGxhdGVyYWwFAAAAD2RvU2V0Q29sbGF0ZXJhbAkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAABpjaGFuZ2luZyBjb2xsYXRlcmFsIHN0YXR1cwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAMdHJhbnNmZXJEZWJ0AAAABAAAAA1ib3Jyb3dSZXNlcnZlAAAAEWNvbGxhdGVyYWxSZXNlcnZlAAAACGJvcnJvd2VyAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQEAAAAA3NoMQkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQUAAAANYm9ycm93UmVzZXJ2ZQMJAAAAAAAAAgUAAAADc2gxBQAAAANzaDEEAAAAA3NoMgkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQUAAAARY29sbGF0ZXJhbFJlc2VydmUDCQAAAAAAAAIFAAAAA3NoMgUAAAADc2gyAwkAAGcAAAACAAAAAAAAAAAABQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50CQAAAgAAAAECAAAAI2Nhbid0IGxpcXVpZGF0ZSBub24tcG9zaXRpdmUgYW1vdW50AwkAAAAAAAACBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQUAAAANYm9ycm93UmVzZXJ2ZQkAAAIAAAABAgAAACZjb2xsYXRlcmFsUmVzZXJ2ZSBlcXVhbHMgYm9ycm93UmVzZXJ2ZQQAAAAKbGlxdWlkYXRvcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAAAAAAAIFAAAACmxpcXVpZGF0b3IFAAAACGJvcnJvd2VyCQAAAgAAAAECAAAAFGNhbid0IGxpcXVpZGF0ZSBzZWxmBAAAAA0kdDAxMzYzMDEzNjY1CQEAAAAJdXNlclBvd2VyAAAAAQUAAAAIYm9ycm93ZXIEAAAAAmJwCAUAAAANJHQwMTM2MzAxMzY2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ZGF0b3IJAARMAAAAAgUAAAANcGVuYWx0aXplZFVzZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsBAAAABFwcm9wYWdhdGVSZXdhcmRzMQkBAAAACm1vdmVTdHJlYW0AAAAFBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAMJAAAAAAAAAgUAAAARcHJvcGFnYXRlUmV3YXJkczEFAAAAEXByb3BhZ2F0ZVJld2FyZHMxBAAAAA90cmFuc2ZlcnJlZERlYnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAACYnICAAAAD3RyYW5zZmVyRGVidEZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA90cmFuc2ZlcnJlZERlYnQFAAAAD3RyYW5zZmVycmVkRGVidAQAAAARcHJvcGFnYXRlUmV3YXJkczIJAQAAAAptb3ZlU3RyZWFtAAAABQUAAAANYm9ycm93UmVzZXJ2ZQIAAAAGYm9ycm93BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAPdHJhbnNmZXJyZWREZWJ0AwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMgUAAAARcHJvcGFnYXRlUmV3YXJkczIEAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawMJAQAAAAhjb250YWlucwAAAAIFAAAAC2xpcXVpZGF0b3JzBQAAAApsaXF1aWRhdG9yBQAAAANuaWwJAQAAAA12YWxpZGF0ZUFmdGVyAAAAAgUAAAAKbGlxdWlkYXRvcgIAAAARdHJhbnNmZXJyaW5nIGRlYnQDCQAAAAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrCQAFFAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADWZvcmNlQ29sbGFwc2UAAAACAAAAB3Jlc2VydmUAAAAIYm9ycm93ZXIEAAAADnJlc2VydmVBZGRyZXNzCQEAAAAPdmFsaWRhdGVSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQMJAAAAAAAAAgUAAAAOcmVzZXJ2ZUFkZHJlc3MFAAAADnJlc2VydmVBZGRyZXNzBAAAAAJzaAkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQUAAAAHcmVzZXJ2ZQMJAAAAAAAAAgUAAAACc2gFAAAAAnNoBAAAAApsaXF1aWRhdG9yCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAKbGlxdWlkYXRvcgUAAAAIYm9ycm93ZXIJAAACAAAAAQIAAAAkY2FuJ3QgY29sbGFwc2Ugc2VsZiBpbiB0aGlzIGZ1bmN0aW9uBAAAAA0kdDAxNTg2NTE1OTAwCQEAAAAJdXNlclBvd2VyAAAAAQUAAAAIYm9ycm93ZXIEAAAAAmJwCAUAAAANJHQwMTU4NjUxNTkwMAAAAAJfMQQAAAADYnB1CAUAAAANJHQwMTU4NjUxNTkwMAAAAAJfMgMJAABmAAAAAgUAAAACYnAFAAAAA2JwdQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAlY2FuJ3QgZm9yY2UgY29sbGFwc2UgaGVhbHRoeSB1c2VyOiB1PQUAAAAIYm9ycm93ZXICAAAABSwgYnA9CQABpAAAAAEFAAAAAmJwAgAAAAYsIGJwdT0JAAGkAAAAAQUAAAADYnB1BAAAAA0kdDAxNjA0NTE2MTUzCQEAAAALdXNlckJhbGFuY2UAAAACBQAAAA5yZXNlcnZlQWRkcmVzcwUAAAAIYm9ycm93ZXIDCQAAAAAAAAIFAAAADSR0MDE2MDQ1MTYxNTMFAAAADSR0MDE2MDQ1MTYxNTMEAAAAC3VzZXJEZWJ0VXNkCAUAAAANJHQwMTYwNDUxNjE1MwAAAAJfNQQAAAAIdXNlckRlYnQIBQAAAA0kdDAxNjA0NTE2MTUzAAAAAl80BAAAAAx1c2VyQXNzZXRVc2QIBQAAAA0kdDAxNjA0NTE2MTUzAAAAAl8zBAAAAA9ib3Jyb3dlckRlcG9zaXQIBQAAAA0kdDAxNjA0NTE2MTUzAAAAAl8yBAAAAAZpZ25vcmUIBQAAAA0kdDAxNjA0NTE2MTUzAAAAAl8xBAAAAA1wZW5hbHRpemVkVXNkCQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAAAx1c2VyQXNzZXRVc2QJAARMAAAAAgUAAAALdXNlckRlYnRVc2QFAAAAA25pbAUAAAAPY29sbGFwc2VQZW5hbHR5BQAAAAtmYWN0b3JzQmFzZQQAAAARdHJhbnNmZXJyZWRBc3NldHMJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOcmVzZXJ2ZUFkZHJlc3MCAAAAEnRyYW5zZmVyQVRva2Vuc0ZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAADXBlbmFsdGl6ZWRVc2QFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwUAAAARdHJhbnNmZXJyZWRBc3NldHMEAAAAEXByb3BhZ2F0ZVJld2FyZHMxCQEAAAAKbW92ZVN0cmVhbQAAAAUFAAAAB3Jlc2VydmUCAAAAB2RlcG9zaXQFAAAACGJvcnJvd2VyBQAAAApsaXF1aWRhdG9yBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwMJAAAAAAAAAgUAAAARcHJvcGFnYXRlUmV3YXJkczEFAAAAEXByb3BhZ2F0ZVJld2FyZHMxBAAAAAljb2xsYXBzZWQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOcmVzZXJ2ZUFkZHJlc3MCAAAAC2NvbGxhcHNlRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAJY29sbGFwc2VkBQAAAAljb2xsYXBzZWQEAAAAEXByb3BhZ2F0ZVJld2FyZHMyCQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAGYm9ycm93BQAAAAhib3Jyb3dlcgkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQJAQAAAAEtAAAAAQUAAAAJY29sbGFwc2VkAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMgUAAAARcHJvcGFnYXRlUmV3YXJkczIEAAAAEXByb3BhZ2F0ZVJld2FyZHMzCQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIJAQAAAAEtAAAAAQUAAAAJY29sbGFwc2VkCQEAAAABLQAAAAEFAAAACWNvbGxhcHNlZAMJAAAAAAAAAgUAAAARcHJvcGFnYXRlUmV3YXJkczMFAAAAEXByb3BhZ2F0ZVJld2FyZHMzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAA8SWHK", "chainId": 87, "height": 2808221, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H1DvqbGhyaSC1rAaXt18ydZxdYe7Gc9BQTXYtHWpbLzs Next: HNCW2peBCEsamg9S9CQUbohwyGVvHzJ4aB7g4VcCM4Cj Diff:
OldNewDifferences
8888
8989 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(config, "vires_minter"), "no viresMinter")), "invalid viresMinter")
9090
91-let viresStaker = addressFromStringValue(valueOrErrorMessage(getString(config, "vires_staker"), "no vires_staker"))
91+let maybeViresStaker = getString(config, "vires_staker")
92+
93+let viresStaker = addressFromStringValue(valueOrErrorMessage(maybeViresStaker, "no vires_staker"))
9294
9395 let maybeViresDistributor = match getString(config, distributorStore) {
9496 case d: String =>
9799 unit
98100 }
99101
100-let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(getString(viresMinter, "assetId"), "vires assetId not found")), "invalid vires assetId")
102+let maybeViresAssetId = getString(viresMinter, "assetId")
103+
104+let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "vires assetId not found")), "invalid vires assetId")
101105
102106 func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
103107
130134 else unit
131135 }
132136
133- match let $list38623891 = reserves
134- let $size38623891 = size($list38623891)
135- let $acc038623891 = unit
136- if (($size38623891 == 0))
137- then $acc038623891
138- else {
139- let $acc138623891 = fold($acc038623891, $list38623891[0])
140- if (($size38623891 == 1))
141- then $acc138623891
142- else {
143- let $acc238623891 = fold($acc138623891, $list38623891[1])
144- if (($size38623891 == 2))
145- then $acc238623891
146- else {
147- let $acc338623891 = fold($acc238623891, $list38623891[2])
148- if (($size38623891 == 3))
149- then $acc338623891
150- else {
151- let $acc438623891 = fold($acc338623891, $list38623891[3])
152- if (($size38623891 == 4))
153- then $acc438623891
154- else {
155- let $acc538623891 = fold($acc438623891, $list38623891[4])
156- if (($size38623891 == 5))
157- then $acc538623891
158- else {
159- let $acc638623891 = fold($acc538623891, $list38623891[5])
160- if (($size38623891 == 6))
161- then $acc638623891
162- else {
163- let $acc738623891 = fold($acc638623891, $list38623891[6])
164- if (($size38623891 == 7))
165- then $acc738623891
166- else {
167- let $acc838623891 = fold($acc738623891, $list38623891[7])
168- throw("List size exceed 7")
169- }
170- }
171- }
172- }
173- }
174- }
175- }
176- } {
137+ match let $l = reserves
138+ let $s = size($l)
139+ let $acc0 = unit
140+ func 1 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else fold($a, $l[$i])
143+
144+ func 2 ($a,$i) = if (($i >= $s))
145+ then $a
146+ else throw("List size exceeds 7")
147+
148+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
177149 case found: Address =>
178150 found
179151 case _ =>
183155
184156
185157 func validateReserve (r) = if (contains(reservesStr, r))
186- then true
158+ then valueOrErrorMessage(addressFromString(r), "main: bad reserve")
187159 else throw(("unknown reserve:" + r))
188160
189161
192164
193165 func userPower (user) = {
194166 func fold (totals,r) = {
195- let $t042904319 = totals
196- let totalD = $t042904319._1
197- let totalB = $t042904319._2
167+ let $t044314460 = totals
168+ let totalD = $t044314460._1
169+ let totalB = $t044314460._2
198170 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
199171 let cf = collateralFactor(reserve)
200172 let lt = liquidationThreshold(reserve)
201- let $t044904578 = userBalance(reserve, user)
202- let token = $t044904578._1
203- let asset = $t044904578._2
204- let depositUsd = $t044904578._3
205- let debt = $t044904578._4
206- let debtUsd = $t044904578._5
207- let asCollateral = $t044904578._6
173+ let $t046314719 = userBalance(reserve, user)
174+ let token = $t046314719._1
175+ let asset = $t046314719._2
176+ let depositUsd = $t046314719._3
177+ let debt = $t046314719._4
178+ let debtUsd = $t046314719._5
179+ let asCollateral = $t046314719._6
208180 let effectiveDepositUsd = if (asCollateral)
209181 then depositUsd
210182 else 0
215187 else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
216188 }
217189
218- let $list50455075 = reserves
219- let $size50455075 = size($list50455075)
220- let $acc050455075 = $Tuple2(0, 0)
221- if (($size50455075 == 0))
222- then $acc050455075
223- else {
224- let $acc150455075 = fold($acc050455075, $list50455075[0])
225- if (($size50455075 == 1))
226- then $acc150455075
227- else {
228- let $acc250455075 = fold($acc150455075, $list50455075[1])
229- if (($size50455075 == 2))
230- then $acc250455075
231- else {
232- let $acc350455075 = fold($acc250455075, $list50455075[2])
233- if (($size50455075 == 3))
234- then $acc350455075
235- else {
236- let $acc450455075 = fold($acc350455075, $list50455075[3])
237- if (($size50455075 == 4))
238- then $acc450455075
239- else {
240- let $acc550455075 = fold($acc450455075, $list50455075[4])
241- if (($size50455075 == 5))
242- then $acc550455075
243- else {
244- let $acc650455075 = fold($acc550455075, $list50455075[5])
245- if (($size50455075 == 6))
246- then $acc650455075
247- else {
248- let $acc750455075 = fold($acc650455075, $list50455075[6])
249- if (($size50455075 == 7))
250- then $acc750455075
251- else {
252- let $acc850455075 = fold($acc750455075, $list50455075[7])
253- throw("List size exceed 7")
254- }
255- }
256- }
257- }
258- }
259- }
260- }
261- }
190+ let $l = reserves
191+ let $s = size($l)
192+ let $acc0 = $Tuple2(0, 0)
193+ func 1 ($a,$i) = if (($i >= $s))
194+ then $a
195+ else fold($a, $l[$i])
196+
197+ func 2 ($a,$i) = if (($i >= $s))
198+ then $a
199+ else throw("List size exceeds 7")
200+
201+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
262202 }
263203
264204
265205 func getUserHealth (account) = {
266- let $t051235166 = asInt2(userPower(account))
267- let bp = $t051235166._1
268- let bpu = $t051235166._2
206+ let $t052645307 = asInt2(userPower(account))
207+ let bp = $t052645307._1
208+ let bpu = $t052645307._2
269209 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
270210 }
271211
272212
273213 func validateAfter (user,op) = {
274- let $t052775308 = userPower(user)
275- let bp = $t052775308._1
276- let bpu = $t052775308._2
214+ let $t054185449 = userPower(user)
215+ let bp = $t054185449._1
216+ let bpu = $t054185449._2
277217 let accHealth = (((bp - bpu) * factorsBase) / bp)
278218 if (if ((bp == 0))
279219 then (bpu == 0)
297237 }
298238
299239
300-func syncRewardsHeight () = match maybeViresDistributor {
240+func moveStream (reserve,action,from,string,amount) = match maybeViresDistributor {
301241 case a: Address =>
302- invoke(a, "syncHeight", nil, nil)
242+ invoke(a, "move", [reserve, action, from, string, amount], nil)
243+ case _ =>
244+ unit
245+}
246+
247+
248+func syncRewardsHeight (reserve) = match maybeViresDistributor {
249+ case a: Address =>
250+ invoke(a, "syncHeight", [reserve], nil)
303251 case _ =>
304252 unit
305253 }
308256 func stakeOrPayout (recipient,amount,stake) = if (!(stake))
309257 then [ScriptTransfer(recipient, amount, viresAssetId)]
310258 else {
311- let doStake = invoke(viresStaker, "stakeViresFor", [toString(recipient)], [AttachedPayment(viresAssetId, amount)])
259+ let doStake = invoke(viresStaker, "stakeVires", [toString(recipient)], [AttachedPayment(viresAssetId, amount)])
312260 if ((doStake == doStake))
313261 then nil
314262 else throw("Strict value is not equal to itself.")
315263 }
264+
265+
266+func doDeposit (i,reserve,useAsCollateral) = {
267+ let user = toString(i.caller)
268+ let sh = syncRewardsHeight(reserve)
269+ if ((sh == sh))
270+ then {
271+ let action = invoke(validateReserve(reserve), "depositFor", [user, useAsCollateral], i.payments)
272+ if ((action == action))
273+ then {
274+ let amt = i.payments[0].amount
275+ let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
276+ if ((propagateRewards == propagateRewards))
277+ then if (!(useAsCollateral))
278+ then validateAfter(user, "depositing")
279+ else nil
280+ else throw("Strict value is not equal to itself.")
281+ }
282+ else throw("Strict value is not equal to itself.")
283+ }
284+ else throw("Strict value is not equal to itself.")
285+ }
316286
317287
318288 @Callable(i)
328298
329299
330300 @Callable(i)
331-func deposit (reserve,useAsCollateral) = {
332- let v = validateReserve(reserve)
333- if ((v == v))
334- then {
335- let user = toString(i.caller)
336- let sh = syncRewardsHeight()
337- if ((sh == sh))
338- then {
339- let action = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
340- if ((action == action))
341- then {
342- let amt = i.payments[0].amount
343- let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
344- if ((propagateRewards == propagateRewards))
345- then if (!(useAsCollateral))
346- then validateAfter(user, "depositing")
347- else nil
348- else throw("Strict value is not equal to itself.")
349- }
350- else throw("Strict value is not equal to itself.")
351- }
352- else throw("Strict value is not equal to itself.")
353- }
354- else throw("Strict value is not equal to itself.")
355- }
301+func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
356302
357303
358304
359305 @Callable(i)
360-func depositRef (reserve,useAsCollateral,ref) = {
361- let v = validateReserve(reserve)
362- if ((v == v))
363- then {
364- let user = toString(i.caller)
365- let sh = syncRewardsHeight()
366- if ((sh == sh))
367- then {
368- let action = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
369- if ((action == action))
370- then {
371- let amt = i.payments[0].amount
372- let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
373- if ((propagateRewards == propagateRewards))
374- then if (!(useAsCollateral))
375- then validateAfter(user, "depositing")
376- else nil
377- else throw("Strict value is not equal to itself.")
378- }
379- else throw("Strict value is not equal to itself.")
380- }
381- else throw("Strict value is not equal to itself.")
382- }
383- else throw("Strict value is not equal to itself.")
384- }
306+func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
385307
386308
387309
388310 @Callable(i)
389311 func repay (reserve) = {
390- let v = validateReserve(reserve)
391- if ((v == v))
312+ let user = toString(i.caller)
313+ let sh = syncRewardsHeight(reserve)
314+ if ((sh == sh))
392315 then {
393- let user = toString(i.caller)
394- let sh = syncRewardsHeight()
395- if ((sh == sh))
316+ let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
317+ if ((repaid == repaid))
396318 then {
397- let repaid = asInt(invoke(addressFromStringValue(reserve), "repayFor", [user], i.payments))
398- if ((repaid == repaid))
399- then {
400- let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
401- if ((propagateRewards == propagateRewards))
402- then nil
403- else throw("Strict value is not equal to itself.")
404- }
319+ let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
320+ if ((propagateRewards == propagateRewards))
321+ then nil
405322 else throw("Strict value is not equal to itself.")
406323 }
407324 else throw("Strict value is not equal to itself.")
415332 func mintAtoken (aTokenId,amount) = {
416333 let user = toString(i.caller)
417334 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
418- let sh = syncRewardsHeight()
335+ let sh = syncRewardsHeight(toString(targetContract))
419336 if ((sh == sh))
420337 then {
421338 let mintedAssetAmount = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
443360 throw("bad assetId: waves not allowed")
444361 }
445362 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
446- let sh = syncRewardsHeight()
363+ let sh = syncRewardsHeight(toString(targetContract))
447364 if ((sh == sh))
448365 then {
449366 let replenishedAssetAmount = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
465382 func withdraw (assetId,amount) = {
466383 let user = toString(i.caller)
467384 let targetContract = findReserveBy(assetIdStore, assetId)
468- let sh = syncRewardsHeight()
385+ let sh = syncRewardsHeight(toString(targetContract))
469386 if ((sh == sh))
470387 then {
471388 let withdrawnAmount = asInt(invoke(targetContract, "withdrawFor", [user, amount], nil))
485402
486403 @Callable(i)
487404 func withdraw2 (reserve,amount) = {
488- let v = validateReserve(reserve)
489- if ((v == v))
405+ let user = toString(i.caller)
406+ let sh = syncRewardsHeight(reserve)
407+ if ((sh == sh))
490408 then {
491- let user = toString(i.caller)
492- let sh = syncRewardsHeight()
493- if ((sh == sh))
409+ let withdrawnAmount = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
410+ if ((withdrawnAmount == withdrawnAmount))
494411 then {
495- let withdrawnAmount = asInt(invoke(addressFromStringValue(reserve), "withdrawFor", [user, amount], nil))
496- if ((withdrawnAmount == withdrawnAmount))
497- then {
498- let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
499- if ((propagateRewards == propagateRewards))
500- then validateAfter(user, "withdrawing2")
501- else throw("Strict value is not equal to itself.")
502- }
412+ let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
413+ if ((propagateRewards == propagateRewards))
414+ then if (contains(liquidators, user))
415+ then nil
416+ else validateAfter(user, "withdrawing2")
503417 else throw("Strict value is not equal to itself.")
504418 }
505419 else throw("Strict value is not equal to itself.")
513427 func borrow (assetId,amount) = {
514428 let user = toString(i.caller)
515429 let reserve = findReserveBy(assetIdStore, assetId)
516- let sh = syncRewardsHeight()
430+ let sh = syncRewardsHeight(toString(reserve))
517431 if ((sh == sh))
518432 then {
519433 let action = invoke(reserve, "borrowFor", [user, amount], nil)
533447
534448 @Callable(i)
535449 func borrow2 (reserve,amount) = {
536- let v = validateReserve(reserve)
537- if ((v == v))
450+ let user = toString(i.caller)
451+ let sh = syncRewardsHeight(reserve)
452+ if ((sh == sh))
538453 then {
539- let user = toString(i.caller)
540- let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
541- let sh = syncRewardsHeight()
542- if ((sh == sh))
454+ let action = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
455+ if ((action == action))
543456 then {
544- let action = invoke(targetContract, "borrowFor", [user, amount], nil)
545- if ((action == action))
546- then {
547- let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
548- if ((propagateRewards == propagateRewards))
549- then validateAfter(user, "borrowing")
550- else throw("Strict value is not equal to itself.")
551- }
457+ let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
458+ if ((propagateRewards == propagateRewards))
459+ then validateAfter(user, "borrowing")
552460 else throw("Strict value is not equal to itself.")
553461 }
554462 else throw("Strict value is not equal to itself.")
561469 @Callable(i)
562470 func collapse (reserve,amount) = {
563471 let user = toString(i.caller)
564- let v = validateReserve(reserve)
565- if ((v == v))
472+ let sh = syncRewardsHeight(reserve)
473+ if ((sh == sh))
566474 then {
567- let sh = syncRewardsHeight()
568- if ((sh == sh))
475+ let collapse = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
476+ if ((collapse == collapse))
569477 then {
570- let collapse = asInt(invoke(addressFromStringValue(reserve), "collapseForAmount", [user, amount], nil))
571- if ((collapse == collapse))
478+ let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
479+ if ((propagateRewards == propagateRewards))
572480 then {
573- let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
574- if ((propagateRewards == propagateRewards))
575- then {
576- let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
577- if ((propagateRewards2 == propagateRewards2))
578- then nil
579- else throw("Strict value is not equal to itself.")
580- }
481+ let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
482+ if ((propagateRewards2 == propagateRewards2))
483+ then nil
581484 else throw("Strict value is not equal to itself.")
582485 }
583486 else throw("Strict value is not equal to itself.")
607510 if ((v == v))
608511 then {
609512 let user = toString(i.caller)
610- let viresDistributor = addressFromStringValue(valueOrErrorMessage(getString(config, distributorStore), "no vires_distributor"))
611- let claimed = asInt(invoke(viresDistributor, "claimRewardFor", [reserve, user, amount], nil))
513+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, amount], nil))
612514 if ((claimed == claimed))
613515 then stakeOrPayout(i.caller, claimed, stake)
614516 else throw("Strict value is not equal to itself.")
619521
620522
621523 @Callable(i)
524+func claimAllRewards (stake) = {
525+ let user = toString(i.caller)
526+ let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
527+ let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
528+ func fold (acc,reserve) = {
529+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
530+ if ((claimed == claimed))
531+ then (acc + claimed)
532+ else throw("Strict value is not equal to itself.")
533+ }
534+
535+ let claimedTotal = {
536+ let $l = rewardReserves
537+ let $s = size($l)
538+ let $acc0 = 0
539+ func 1 ($a,$i) = if (($i >= $s))
540+ then $a
541+ else fold($a, $l[$i])
542+
543+ func 2 ($a,$i) = if (($i >= $s))
544+ then $a
545+ else throw("List size exceeds 7")
546+
547+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
548+ }
549+ stakeOrPayout(i.caller, claimedTotal, stake)
550+ }
551+
552+
553+
554+@Callable(i)
622555 func disableUseAsCollateral (reserve) = {
623- let v = validateReserve(reserve)
624- if ((v == v))
625- then {
626- let user = toString(i.caller)
627- let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
628- if ((doSetCollateral == doSetCollateral))
629- then validateAfter(user, "changing collateral status")
630- else throw("Strict value is not equal to itself.")
631- }
556+ let user = toString(i.caller)
557+ let doSetCollateral = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
558+ if ((doSetCollateral == doSetCollateral))
559+ then validateAfter(user, "changing collateral status")
632560 else throw("Strict value is not equal to itself.")
633561 }
634562
636564
637565 @Callable(i)
638566 func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
639- let v = if (validateReserve(borrowReserve))
640- then validateReserve(collateralReserve)
641- else false
642- if ((v == v))
567+ let sh1 = syncRewardsHeight(borrowReserve)
568+ if ((sh1 == sh1))
643569 then {
644- let sh = syncRewardsHeight()
645- if ((sh == sh))
570+ let sh2 = syncRewardsHeight(collateralReserve)
571+ if ((sh2 == sh2))
646572 then if ((0 >= liquidateDebtAmount))
647573 then throw("can't liquidate non-positive amount")
648574 else if ((collateralReserve == borrowReserve))
652578 if ((liquidator == borrower))
653579 then throw("can't liquidate self")
654580 else {
655- let $t01323913274 = userPower(borrower)
656- let bp = $t01323913274._1
657- let bpu = $t01323913274._2
581+ let $t01363013665 = userPower(borrower)
582+ let bp = $t01363013665._1
583+ let bpu = $t01363013665._2
658584 if ((bp > bpu))
659585 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
660586 else {
661- let br = addressFromStringValue(borrowReserve)
662- let cr = addressFromStringValue(collateralReserve)
587+ let br = validateReserve(borrowReserve)
588+ let cr = validateReserve(collateralReserve)
663589 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
664590 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
665591 if ((isCollateral == isCollateral))
666592 then if (!(isCollateral))
667593 then throw("can't liquidate deposit not used as collateral")
668594 else {
669- let $t01380613896 = userBalance(br, borrower)
670- if (($t01380613896 == $t01380613896))
595+ let $t01418114271 = userBalance(br, borrower)
596+ if (($t01418114271 == $t01418114271))
671597 then {
672- let userDebtUsd = $t01380613896._5
673- let userDebt = $t01380613896._4
674- let userAssetUsd = $t01380613896._3
675- let userAsset = $t01380613896._2
676- let ignore = $t01380613896._1
598+ let userDebtUsd = $t01418114271._5
599+ let userDebt = $t01418114271._4
600+ let userAssetUsd = $t01418114271._3
601+ let userAsset = $t01418114271._2
602+ let ignore = $t01418114271._1
677603 if ((userAsset >= userDebt))
678604 then throw("can't liquidate debt of asset of positive saldo")
679605 else if ((0 >= liquidateDebtAmount))
686612 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
687613 if ((transferredCollateral == transferredCollateral))
688614 then {
689- let propagateRewards1 = updateStream(collateralReserve, "deposit", borrower, -(transferredCollateral), -(transferredCollateral))
615+ let propagateRewards1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
690616 if ((propagateRewards1 == propagateRewards1))
691617 then {
692- let propagateRewards2 = updateStream(collateralReserve, "deposit", liquidator, transferredCollateral, transferredCollateral)
693- if ((propagateRewards2 == propagateRewards2))
618+ let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
619+ if ((transferredDebt == transferredDebt))
694620 then {
695- let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
696- if ((transferredDebt == transferredDebt))
621+ let propagateRewards2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
622+ if ((propagateRewards2 == propagateRewards2))
697623 then {
698- let propagateRewards3 = updateStream(borrowReserve, "borrow", borrower, -(transferredDebt), -(transferredDebt))
699- if ((propagateRewards3 == propagateRewards3))
700- then {
701- let propagateRewards4 = updateStream(borrowReserve, "borrow", liquidator, transferredDebt, transferredDebt)
702- if ((propagateRewards4 == propagateRewards4))
703- then {
704- let liquidatorHealthCheck = if (contains(liquidators, liquidator))
705- then nil
706- else validateAfter(liquidator, "transferring debt")
707- if ((liquidatorHealthCheck == liquidatorHealthCheck))
708- then $Tuple2(liquidatorHealthCheck, transferredCollateral)
709- else throw("Strict value is not equal to itself.")
710- }
711- else throw("Strict value is not equal to itself.")
712- }
624+ let liquidatorHealthCheck = if (contains(liquidators, liquidator))
625+ then nil
626+ else validateAfter(liquidator, "transferring debt")
627+ if ((liquidatorHealthCheck == liquidatorHealthCheck))
628+ then $Tuple2(liquidatorHealthCheck, transferredCollateral)
713629 else throw("Strict value is not equal to itself.")
714630 }
715631 else throw("Strict value is not equal to itself.")
736652
737653 @Callable(i)
738654 func forceCollapse (reserve,borrower) = {
739- let v = validateReserve(reserve)
740- if ((v == v))
655+ let reserveAddress = validateReserve(reserve)
656+ if ((reserveAddress == reserveAddress))
741657 then {
742- let sh = syncRewardsHeight()
658+ let sh = syncRewardsHeight(reserve)
743659 if ((sh == sh))
744660 then {
745661 let liquidator = toString(i.caller)
746662 if ((liquidator == borrower))
747663 then throw("can't collapse self in this function")
748664 else {
749- let $t01585615891 = userPower(borrower)
750- let bp = $t01585615891._1
751- let bpu = $t01585615891._2
665+ let $t01586515900 = userPower(borrower)
666+ let bp = $t01586515900._1
667+ let bpu = $t01586515900._2
752668 if ((bp > bpu))
753669 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
754670 else {
755- let reserveAddress = addressFromStringValue(reserve)
756- let $t01609416202 = userBalance(reserveAddress, borrower)
757- if (($t01609416202 == $t01609416202))
671+ let $t01604516153 = userBalance(reserveAddress, borrower)
672+ if (($t01604516153 == $t01604516153))
758673 then {
759- let userDebtUsd = $t01609416202._5
760- let userDebt = $t01609416202._4
761- let userAssetUsd = $t01609416202._3
762- let borrowerDeposit = $t01609416202._2
763- let ignore = $t01609416202._1
674+ let userDebtUsd = $t01604516153._5
675+ let userDebt = $t01604516153._4
676+ let userAssetUsd = $t01604516153._3
677+ let borrowerDeposit = $t01604516153._2
678+ let ignore = $t01604516153._1
764679 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
765680 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
766681 if ((transferredAssets == transferredAssets))
767682 then {
768- let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
769- if ((collapsed == collapsed))
683+ let propagateRewards1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
684+ if ((propagateRewards1 == propagateRewards1))
770685 then {
771- let propagateRewards1 = updateStream(reserve, "deposit", borrower, -((transferredAssets + collapsed)), -((transferredAssets + collapsed)))
772- if ((propagateRewards1 == propagateRewards1))
686+ let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
687+ if ((collapsed == collapsed))
773688 then {
774- let propagateRewards4 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
775- if ((propagateRewards4 == propagateRewards4))
689+ let propagateRewards2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
690+ if ((propagateRewards2 == propagateRewards2))
776691 then {
777- let propagateRewards2 = updateStream(reserve, "deposit", liquidator, transferredAssets, transferredAssets)
778- if ((propagateRewards2 == propagateRewards2))
692+ let propagateRewards3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
693+ if ((propagateRewards3 == propagateRewards3))
779694 then nil
780695 else throw("Strict value is not equal to itself.")
781696 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fractionCeil (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
1717 then StringEntry(key, value)
1818 else throw(("already initialized: " + key))
1919
2020
2121 func asInt (value) = match value {
2222 case int: Int =>
2323 int
2424 case _ =>
2525 throw("wrong type, expected: Int")
2626 }
2727
2828
2929 func asInt2 (value) = match value {
3030 case x: (Int, Int) =>
3131 x
3232 case t =>
3333 throw("wrong type, expected: Int2")
3434 }
3535
3636
3737 func asInt3 (value) = match value {
3838 case x: (Int, Int, Int) =>
3939 x
4040 case t =>
4141 throw("wrong type, expected: Int3")
4242 }
4343
4444
4545 func asInt4 (value) = match value {
4646 case x: (Int, Int, Int, Int) =>
4747 x
4848 case t =>
4949 throw("wrong type, expected: Int4")
5050 }
5151
5252
5353 func asInt5 (value) = match value {
5454 case x: (Int, Int, Int, Int, Int) =>
5555 x
5656 case t =>
5757 throw("wrong type, expected: Int5")
5858 }
5959
6060
6161 func asUserBalanceData (value) = match value {
6262 case x: (Int, Int, Int, Int, Int, Boolean) =>
6363 x
6464 case t =>
6565 throw("wrong type, expected: Int5&Boolean")
6666 }
6767
6868
6969 let adminStore = "admin"
7070
7171 let configStore = "config"
7272
7373 let reservesStore = "reserves"
7474
7575 let aTokenIdStore = "aTokenId"
7676
7777 let assetIdStore = "assetId"
7878
7979 let distributorStore = "vires_distributor"
8080
8181 let admin = addressFromStringValue(getStringValue(this, adminStore))
8282
8383 let config = addressFromStringValue(getStringValue(this, configStore))
8484
8585 let reservesStr = valueOrErrorMessage(getString(this, reservesStore), "no reserves registered")
8686
8787 let reserves = split(reservesStr, "|")
8888
8989 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(config, "vires_minter"), "no viresMinter")), "invalid viresMinter")
9090
91-let viresStaker = addressFromStringValue(valueOrErrorMessage(getString(config, "vires_staker"), "no vires_staker"))
91+let maybeViresStaker = getString(config, "vires_staker")
92+
93+let viresStaker = addressFromStringValue(valueOrErrorMessage(maybeViresStaker, "no vires_staker"))
9294
9395 let maybeViresDistributor = match getString(config, distributorStore) {
9496 case d: String =>
9597 addressFromStringValue(d)
9698 case _ =>
9799 unit
98100 }
99101
100-let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(getString(viresMinter, "assetId"), "vires assetId not found")), "invalid vires assetId")
102+let maybeViresAssetId = getString(viresMinter, "assetId")
103+
104+let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "vires assetId not found")), "invalid vires assetId")
101105
102106 func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
103107
104108
105109 func collateralFactor (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
106110
107111
108112 func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
109113
110114
111115 func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(config, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
112116
113117
114118 let accountHealthThreshold = valueOrErrorMessage(getInteger(config, "account_health_threshold"), "no account_health_threshold")
115119
116120 let accountHealthOverlap = valueOrErrorMessage(getInteger(config, "account_health_overlap"), "no account_health_overlap")
117121
118122 let collapsePenalty = valueOrErrorMessage(getInteger(config, "collapse_penalty"), "no collapse_penalty")
119123
120124 let liquidators = valueOrElse(getString(config, "liquidators"), "")
121125
122126 func findReserveBy (store,value) = {
123127 func fold (a,r) = match a {
124128 case found: Address =>
125129 found
126130 case _ =>
127131 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
128132 if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
129133 then reserve
130134 else unit
131135 }
132136
133- match let $list38623891 = reserves
134- let $size38623891 = size($list38623891)
135- let $acc038623891 = unit
136- if (($size38623891 == 0))
137- then $acc038623891
138- else {
139- let $acc138623891 = fold($acc038623891, $list38623891[0])
140- if (($size38623891 == 1))
141- then $acc138623891
142- else {
143- let $acc238623891 = fold($acc138623891, $list38623891[1])
144- if (($size38623891 == 2))
145- then $acc238623891
146- else {
147- let $acc338623891 = fold($acc238623891, $list38623891[2])
148- if (($size38623891 == 3))
149- then $acc338623891
150- else {
151- let $acc438623891 = fold($acc338623891, $list38623891[3])
152- if (($size38623891 == 4))
153- then $acc438623891
154- else {
155- let $acc538623891 = fold($acc438623891, $list38623891[4])
156- if (($size38623891 == 5))
157- then $acc538623891
158- else {
159- let $acc638623891 = fold($acc538623891, $list38623891[5])
160- if (($size38623891 == 6))
161- then $acc638623891
162- else {
163- let $acc738623891 = fold($acc638623891, $list38623891[6])
164- if (($size38623891 == 7))
165- then $acc738623891
166- else {
167- let $acc838623891 = fold($acc738623891, $list38623891[7])
168- throw("List size exceed 7")
169- }
170- }
171- }
172- }
173- }
174- }
175- }
176- } {
137+ match let $l = reserves
138+ let $s = size($l)
139+ let $acc0 = unit
140+ func 1 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else fold($a, $l[$i])
143+
144+ func 2 ($a,$i) = if (($i >= $s))
145+ then $a
146+ else throw("List size exceeds 7")
147+
148+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
177149 case found: Address =>
178150 found
179151 case _ =>
180152 throw(("unknown " + store))
181153 }
182154 }
183155
184156
185157 func validateReserve (r) = if (contains(reservesStr, r))
186- then true
158+ then valueOrErrorMessage(addressFromString(r), "main: bad reserve")
187159 else throw(("unknown reserve:" + r))
188160
189161
190162 func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
191163
192164
193165 func userPower (user) = {
194166 func fold (totals,r) = {
195- let $t042904319 = totals
196- let totalD = $t042904319._1
197- let totalB = $t042904319._2
167+ let $t044314460 = totals
168+ let totalD = $t044314460._1
169+ let totalB = $t044314460._2
198170 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
199171 let cf = collateralFactor(reserve)
200172 let lt = liquidationThreshold(reserve)
201- let $t044904578 = userBalance(reserve, user)
202- let token = $t044904578._1
203- let asset = $t044904578._2
204- let depositUsd = $t044904578._3
205- let debt = $t044904578._4
206- let debtUsd = $t044904578._5
207- let asCollateral = $t044904578._6
173+ let $t046314719 = userBalance(reserve, user)
174+ let token = $t046314719._1
175+ let asset = $t046314719._2
176+ let depositUsd = $t046314719._3
177+ let debt = $t046314719._4
178+ let debtUsd = $t046314719._5
179+ let asCollateral = $t046314719._6
208180 let effectiveDepositUsd = if (asCollateral)
209181 then depositUsd
210182 else 0
211183 let overlapUsd = min([debtUsd, effectiveDepositUsd])
212184 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
213185 if ((debtUsd > effectiveDepositUsd))
214186 then $Tuple2(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge))
215187 else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
216188 }
217189
218- let $list50455075 = reserves
219- let $size50455075 = size($list50455075)
220- let $acc050455075 = $Tuple2(0, 0)
221- if (($size50455075 == 0))
222- then $acc050455075
223- else {
224- let $acc150455075 = fold($acc050455075, $list50455075[0])
225- if (($size50455075 == 1))
226- then $acc150455075
227- else {
228- let $acc250455075 = fold($acc150455075, $list50455075[1])
229- if (($size50455075 == 2))
230- then $acc250455075
231- else {
232- let $acc350455075 = fold($acc250455075, $list50455075[2])
233- if (($size50455075 == 3))
234- then $acc350455075
235- else {
236- let $acc450455075 = fold($acc350455075, $list50455075[3])
237- if (($size50455075 == 4))
238- then $acc450455075
239- else {
240- let $acc550455075 = fold($acc450455075, $list50455075[4])
241- if (($size50455075 == 5))
242- then $acc550455075
243- else {
244- let $acc650455075 = fold($acc550455075, $list50455075[5])
245- if (($size50455075 == 6))
246- then $acc650455075
247- else {
248- let $acc750455075 = fold($acc650455075, $list50455075[6])
249- if (($size50455075 == 7))
250- then $acc750455075
251- else {
252- let $acc850455075 = fold($acc750455075, $list50455075[7])
253- throw("List size exceed 7")
254- }
255- }
256- }
257- }
258- }
259- }
260- }
261- }
190+ let $l = reserves
191+ let $s = size($l)
192+ let $acc0 = $Tuple2(0, 0)
193+ func 1 ($a,$i) = if (($i >= $s))
194+ then $a
195+ else fold($a, $l[$i])
196+
197+ func 2 ($a,$i) = if (($i >= $s))
198+ then $a
199+ else throw("List size exceeds 7")
200+
201+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
262202 }
263203
264204
265205 func getUserHealth (account) = {
266- let $t051235166 = asInt2(userPower(account))
267- let bp = $t051235166._1
268- let bpu = $t051235166._2
206+ let $t052645307 = asInt2(userPower(account))
207+ let bp = $t052645307._1
208+ let bpu = $t052645307._2
269209 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
270210 }
271211
272212
273213 func validateAfter (user,op) = {
274- let $t052775308 = userPower(user)
275- let bp = $t052775308._1
276- let bpu = $t052775308._2
214+ let $t054185449 = userPower(user)
215+ let bp = $t054185449._1
216+ let bpu = $t054185449._2
277217 let accHealth = (((bp - bpu) * factorsBase) / bp)
278218 if (if ((bp == 0))
279219 then (bpu == 0)
280220 else false)
281221 then nil
282222 else if (if ((bp == 0))
283223 then (bpu > 0)
284224 else false)
285225 then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
286226 else if ((accountHealthThreshold > accHealth))
287227 then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
288228 else nil
289229 }
290230
291231
292232 func updateStream (reserve,action,user,userChange,streamChange) = match maybeViresDistributor {
293233 case a: Address =>
294234 invoke(a, "onAction", [reserve, action, user, userChange, streamChange], nil)
295235 case _ =>
296236 unit
297237 }
298238
299239
300-func syncRewardsHeight () = match maybeViresDistributor {
240+func moveStream (reserve,action,from,string,amount) = match maybeViresDistributor {
301241 case a: Address =>
302- invoke(a, "syncHeight", nil, nil)
242+ invoke(a, "move", [reserve, action, from, string, amount], nil)
243+ case _ =>
244+ unit
245+}
246+
247+
248+func syncRewardsHeight (reserve) = match maybeViresDistributor {
249+ case a: Address =>
250+ invoke(a, "syncHeight", [reserve], nil)
303251 case _ =>
304252 unit
305253 }
306254
307255
308256 func stakeOrPayout (recipient,amount,stake) = if (!(stake))
309257 then [ScriptTransfer(recipient, amount, viresAssetId)]
310258 else {
311- let doStake = invoke(viresStaker, "stakeViresFor", [toString(recipient)], [AttachedPayment(viresAssetId, amount)])
259+ let doStake = invoke(viresStaker, "stakeVires", [toString(recipient)], [AttachedPayment(viresAssetId, amount)])
312260 if ((doStake == doStake))
313261 then nil
314262 else throw("Strict value is not equal to itself.")
315263 }
264+
265+
266+func doDeposit (i,reserve,useAsCollateral) = {
267+ let user = toString(i.caller)
268+ let sh = syncRewardsHeight(reserve)
269+ if ((sh == sh))
270+ then {
271+ let action = invoke(validateReserve(reserve), "depositFor", [user, useAsCollateral], i.payments)
272+ if ((action == action))
273+ then {
274+ let amt = i.payments[0].amount
275+ let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
276+ if ((propagateRewards == propagateRewards))
277+ then if (!(useAsCollateral))
278+ then validateAfter(user, "depositing")
279+ else nil
280+ else throw("Strict value is not equal to itself.")
281+ }
282+ else throw("Strict value is not equal to itself.")
283+ }
284+ else throw("Strict value is not equal to itself.")
285+ }
316286
317287
318288 @Callable(i)
319289 func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
320290
321291
322292
323293 @Callable(i)
324294 func registerReserves (addresses) = if ((i.caller != admin))
325295 then throw("only admin can do")
326296 else [StringEntry(reservesStore, addresses)]
327297
328298
329299
330300 @Callable(i)
331-func deposit (reserve,useAsCollateral) = {
332- let v = validateReserve(reserve)
333- if ((v == v))
334- then {
335- let user = toString(i.caller)
336- let sh = syncRewardsHeight()
337- if ((sh == sh))
338- then {
339- let action = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
340- if ((action == action))
341- then {
342- let amt = i.payments[0].amount
343- let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
344- if ((propagateRewards == propagateRewards))
345- then if (!(useAsCollateral))
346- then validateAfter(user, "depositing")
347- else nil
348- else throw("Strict value is not equal to itself.")
349- }
350- else throw("Strict value is not equal to itself.")
351- }
352- else throw("Strict value is not equal to itself.")
353- }
354- else throw("Strict value is not equal to itself.")
355- }
301+func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
356302
357303
358304
359305 @Callable(i)
360-func depositRef (reserve,useAsCollateral,ref) = {
361- let v = validateReserve(reserve)
362- if ((v == v))
363- then {
364- let user = toString(i.caller)
365- let sh = syncRewardsHeight()
366- if ((sh == sh))
367- then {
368- let action = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
369- if ((action == action))
370- then {
371- let amt = i.payments[0].amount
372- let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
373- if ((propagateRewards == propagateRewards))
374- then if (!(useAsCollateral))
375- then validateAfter(user, "depositing")
376- else nil
377- else throw("Strict value is not equal to itself.")
378- }
379- else throw("Strict value is not equal to itself.")
380- }
381- else throw("Strict value is not equal to itself.")
382- }
383- else throw("Strict value is not equal to itself.")
384- }
306+func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
385307
386308
387309
388310 @Callable(i)
389311 func repay (reserve) = {
390- let v = validateReserve(reserve)
391- if ((v == v))
312+ let user = toString(i.caller)
313+ let sh = syncRewardsHeight(reserve)
314+ if ((sh == sh))
392315 then {
393- let user = toString(i.caller)
394- let sh = syncRewardsHeight()
395- if ((sh == sh))
316+ let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
317+ if ((repaid == repaid))
396318 then {
397- let repaid = asInt(invoke(addressFromStringValue(reserve), "repayFor", [user], i.payments))
398- if ((repaid == repaid))
399- then {
400- let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
401- if ((propagateRewards == propagateRewards))
402- then nil
403- else throw("Strict value is not equal to itself.")
404- }
319+ let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
320+ if ((propagateRewards == propagateRewards))
321+ then nil
405322 else throw("Strict value is not equal to itself.")
406323 }
407324 else throw("Strict value is not equal to itself.")
408325 }
409326 else throw("Strict value is not equal to itself.")
410327 }
411328
412329
413330
414331 @Callable(i)
415332 func mintAtoken (aTokenId,amount) = {
416333 let user = toString(i.caller)
417334 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
418- let sh = syncRewardsHeight()
335+ let sh = syncRewardsHeight(toString(targetContract))
419336 if ((sh == sh))
420337 then {
421338 let mintedAssetAmount = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
422339 if ((mintedAssetAmount == mintedAssetAmount))
423340 then {
424341 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(mintedAssetAmount), 0)
425342 if ((propagateRewards == propagateRewards))
426343 then validateAfter(user, "minting")
427344 else throw("Strict value is not equal to itself.")
428345 }
429346 else throw("Strict value is not equal to itself.")
430347 }
431348 else throw("Strict value is not equal to itself.")
432349 }
433350
434351
435352
436353 @Callable(i)
437354 func replenishWithAtoken () = {
438355 let user = toString(i.caller)
439356 let aTokenId = match i.payments[0].assetId {
440357 case bv: ByteVector =>
441358 toBase58String(bv)
442359 case _ =>
443360 throw("bad assetId: waves not allowed")
444361 }
445362 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
446- let sh = syncRewardsHeight()
363+ let sh = syncRewardsHeight(toString(targetContract))
447364 if ((sh == sh))
448365 then {
449366 let replenishedAssetAmount = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
450367 if ((replenishedAssetAmount == replenishedAssetAmount))
451368 then {
452369 let propagateRewards = updateStream(toString(targetContract), "deposit", user, replenishedAssetAmount, 0)
453370 if ((propagateRewards == propagateRewards))
454371 then validateAfter(user, "replenishing")
455372 else throw("Strict value is not equal to itself.")
456373 }
457374 else throw("Strict value is not equal to itself.")
458375 }
459376 else throw("Strict value is not equal to itself.")
460377 }
461378
462379
463380
464381 @Callable(i)
465382 func withdraw (assetId,amount) = {
466383 let user = toString(i.caller)
467384 let targetContract = findReserveBy(assetIdStore, assetId)
468- let sh = syncRewardsHeight()
385+ let sh = syncRewardsHeight(toString(targetContract))
469386 if ((sh == sh))
470387 then {
471388 let withdrawnAmount = asInt(invoke(targetContract, "withdrawFor", [user, amount], nil))
472389 if ((withdrawnAmount == withdrawnAmount))
473390 then {
474391 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
475392 if ((propagateRewards == propagateRewards))
476393 then validateAfter(user, "withdrawing")
477394 else throw("Strict value is not equal to itself.")
478395 }
479396 else throw("Strict value is not equal to itself.")
480397 }
481398 else throw("Strict value is not equal to itself.")
482399 }
483400
484401
485402
486403 @Callable(i)
487404 func withdraw2 (reserve,amount) = {
488- let v = validateReserve(reserve)
489- if ((v == v))
405+ let user = toString(i.caller)
406+ let sh = syncRewardsHeight(reserve)
407+ if ((sh == sh))
490408 then {
491- let user = toString(i.caller)
492- let sh = syncRewardsHeight()
493- if ((sh == sh))
409+ let withdrawnAmount = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
410+ if ((withdrawnAmount == withdrawnAmount))
494411 then {
495- let withdrawnAmount = asInt(invoke(addressFromStringValue(reserve), "withdrawFor", [user, amount], nil))
496- if ((withdrawnAmount == withdrawnAmount))
497- then {
498- let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
499- if ((propagateRewards == propagateRewards))
500- then validateAfter(user, "withdrawing2")
501- else throw("Strict value is not equal to itself.")
502- }
412+ let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
413+ if ((propagateRewards == propagateRewards))
414+ then if (contains(liquidators, user))
415+ then nil
416+ else validateAfter(user, "withdrawing2")
503417 else throw("Strict value is not equal to itself.")
504418 }
505419 else throw("Strict value is not equal to itself.")
506420 }
507421 else throw("Strict value is not equal to itself.")
508422 }
509423
510424
511425
512426 @Callable(i)
513427 func borrow (assetId,amount) = {
514428 let user = toString(i.caller)
515429 let reserve = findReserveBy(assetIdStore, assetId)
516- let sh = syncRewardsHeight()
430+ let sh = syncRewardsHeight(toString(reserve))
517431 if ((sh == sh))
518432 then {
519433 let action = invoke(reserve, "borrowFor", [user, amount], nil)
520434 if ((action == action))
521435 then {
522436 let propagateRewards = updateStream(toString(reserve), "borrow", user, amount, amount)
523437 if ((propagateRewards == propagateRewards))
524438 then validateAfter(user, "borrowing")
525439 else throw("Strict value is not equal to itself.")
526440 }
527441 else throw("Strict value is not equal to itself.")
528442 }
529443 else throw("Strict value is not equal to itself.")
530444 }
531445
532446
533447
534448 @Callable(i)
535449 func borrow2 (reserve,amount) = {
536- let v = validateReserve(reserve)
537- if ((v == v))
450+ let user = toString(i.caller)
451+ let sh = syncRewardsHeight(reserve)
452+ if ((sh == sh))
538453 then {
539- let user = toString(i.caller)
540- let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
541- let sh = syncRewardsHeight()
542- if ((sh == sh))
454+ let action = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
455+ if ((action == action))
543456 then {
544- let action = invoke(targetContract, "borrowFor", [user, amount], nil)
545- if ((action == action))
546- then {
547- let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
548- if ((propagateRewards == propagateRewards))
549- then validateAfter(user, "borrowing")
550- else throw("Strict value is not equal to itself.")
551- }
457+ let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
458+ if ((propagateRewards == propagateRewards))
459+ then validateAfter(user, "borrowing")
552460 else throw("Strict value is not equal to itself.")
553461 }
554462 else throw("Strict value is not equal to itself.")
555463 }
556464 else throw("Strict value is not equal to itself.")
557465 }
558466
559467
560468
561469 @Callable(i)
562470 func collapse (reserve,amount) = {
563471 let user = toString(i.caller)
564- let v = validateReserve(reserve)
565- if ((v == v))
472+ let sh = syncRewardsHeight(reserve)
473+ if ((sh == sh))
566474 then {
567- let sh = syncRewardsHeight()
568- if ((sh == sh))
475+ let collapse = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
476+ if ((collapse == collapse))
569477 then {
570- let collapse = asInt(invoke(addressFromStringValue(reserve), "collapseForAmount", [user, amount], nil))
571- if ((collapse == collapse))
478+ let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
479+ if ((propagateRewards == propagateRewards))
572480 then {
573- let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
574- if ((propagateRewards == propagateRewards))
575- then {
576- let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
577- if ((propagateRewards2 == propagateRewards2))
578- then nil
579- else throw("Strict value is not equal to itself.")
580- }
481+ let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
482+ if ((propagateRewards2 == propagateRewards2))
483+ then nil
581484 else throw("Strict value is not equal to itself.")
582485 }
583486 else throw("Strict value is not equal to itself.")
584487 }
585488 else throw("Strict value is not equal to itself.")
586489 }
587490 else throw("Strict value is not equal to itself.")
588491 }
589492
590493
591494
592495 @Callable(i)
593496 func claimEbReward (amount,stake) = {
594497 let user = toString(i.caller)
595498 let r = addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config"))
596499 let claimed = asInt(invoke(r, "claimEbRewardFor", [user, amount], nil))
597500 if ((claimed == claimed))
598501 then stakeOrPayout(i.caller, claimed, stake)
599502 else throw("Strict value is not equal to itself.")
600503 }
601504
602505
603506
604507 @Callable(i)
605508 func claimReward (reserve,amount,stake) = {
606509 let v = validateReserve(reserve)
607510 if ((v == v))
608511 then {
609512 let user = toString(i.caller)
610- let viresDistributor = addressFromStringValue(valueOrErrorMessage(getString(config, distributorStore), "no vires_distributor"))
611- let claimed = asInt(invoke(viresDistributor, "claimRewardFor", [reserve, user, amount], nil))
513+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, amount], nil))
612514 if ((claimed == claimed))
613515 then stakeOrPayout(i.caller, claimed, stake)
614516 else throw("Strict value is not equal to itself.")
615517 }
616518 else throw("Strict value is not equal to itself.")
617519 }
618520
619521
620522
621523 @Callable(i)
524+func claimAllRewards (stake) = {
525+ let user = toString(i.caller)
526+ let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
527+ let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
528+ func fold (acc,reserve) = {
529+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
530+ if ((claimed == claimed))
531+ then (acc + claimed)
532+ else throw("Strict value is not equal to itself.")
533+ }
534+
535+ let claimedTotal = {
536+ let $l = rewardReserves
537+ let $s = size($l)
538+ let $acc0 = 0
539+ func 1 ($a,$i) = if (($i >= $s))
540+ then $a
541+ else fold($a, $l[$i])
542+
543+ func 2 ($a,$i) = if (($i >= $s))
544+ then $a
545+ else throw("List size exceeds 7")
546+
547+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
548+ }
549+ stakeOrPayout(i.caller, claimedTotal, stake)
550+ }
551+
552+
553+
554+@Callable(i)
622555 func disableUseAsCollateral (reserve) = {
623- let v = validateReserve(reserve)
624- if ((v == v))
625- then {
626- let user = toString(i.caller)
627- let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
628- if ((doSetCollateral == doSetCollateral))
629- then validateAfter(user, "changing collateral status")
630- else throw("Strict value is not equal to itself.")
631- }
556+ let user = toString(i.caller)
557+ let doSetCollateral = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
558+ if ((doSetCollateral == doSetCollateral))
559+ then validateAfter(user, "changing collateral status")
632560 else throw("Strict value is not equal to itself.")
633561 }
634562
635563
636564
637565 @Callable(i)
638566 func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
639- let v = if (validateReserve(borrowReserve))
640- then validateReserve(collateralReserve)
641- else false
642- if ((v == v))
567+ let sh1 = syncRewardsHeight(borrowReserve)
568+ if ((sh1 == sh1))
643569 then {
644- let sh = syncRewardsHeight()
645- if ((sh == sh))
570+ let sh2 = syncRewardsHeight(collateralReserve)
571+ if ((sh2 == sh2))
646572 then if ((0 >= liquidateDebtAmount))
647573 then throw("can't liquidate non-positive amount")
648574 else if ((collateralReserve == borrowReserve))
649575 then throw("collateralReserve equals borrowReserve")
650576 else {
651577 let liquidator = toString(i.caller)
652578 if ((liquidator == borrower))
653579 then throw("can't liquidate self")
654580 else {
655- let $t01323913274 = userPower(borrower)
656- let bp = $t01323913274._1
657- let bpu = $t01323913274._2
581+ let $t01363013665 = userPower(borrower)
582+ let bp = $t01363013665._1
583+ let bpu = $t01363013665._2
658584 if ((bp > bpu))
659585 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
660586 else {
661- let br = addressFromStringValue(borrowReserve)
662- let cr = addressFromStringValue(collateralReserve)
587+ let br = validateReserve(borrowReserve)
588+ let cr = validateReserve(collateralReserve)
663589 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
664590 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
665591 if ((isCollateral == isCollateral))
666592 then if (!(isCollateral))
667593 then throw("can't liquidate deposit not used as collateral")
668594 else {
669- let $t01380613896 = userBalance(br, borrower)
670- if (($t01380613896 == $t01380613896))
595+ let $t01418114271 = userBalance(br, borrower)
596+ if (($t01418114271 == $t01418114271))
671597 then {
672- let userDebtUsd = $t01380613896._5
673- let userDebt = $t01380613896._4
674- let userAssetUsd = $t01380613896._3
675- let userAsset = $t01380613896._2
676- let ignore = $t01380613896._1
598+ let userDebtUsd = $t01418114271._5
599+ let userDebt = $t01418114271._4
600+ let userAssetUsd = $t01418114271._3
601+ let userAsset = $t01418114271._2
602+ let ignore = $t01418114271._1
677603 if ((userAsset >= userDebt))
678604 then throw("can't liquidate debt of asset of positive saldo")
679605 else if ((0 >= liquidateDebtAmount))
680606 then throw("can't liquidate zero or negative amount")
681607 else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
682608 then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
683609 else {
684610 let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
685611 let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
686612 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
687613 if ((transferredCollateral == transferredCollateral))
688614 then {
689- let propagateRewards1 = updateStream(collateralReserve, "deposit", borrower, -(transferredCollateral), -(transferredCollateral))
615+ let propagateRewards1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
690616 if ((propagateRewards1 == propagateRewards1))
691617 then {
692- let propagateRewards2 = updateStream(collateralReserve, "deposit", liquidator, transferredCollateral, transferredCollateral)
693- if ((propagateRewards2 == propagateRewards2))
618+ let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
619+ if ((transferredDebt == transferredDebt))
694620 then {
695- let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
696- if ((transferredDebt == transferredDebt))
621+ let propagateRewards2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
622+ if ((propagateRewards2 == propagateRewards2))
697623 then {
698- let propagateRewards3 = updateStream(borrowReserve, "borrow", borrower, -(transferredDebt), -(transferredDebt))
699- if ((propagateRewards3 == propagateRewards3))
700- then {
701- let propagateRewards4 = updateStream(borrowReserve, "borrow", liquidator, transferredDebt, transferredDebt)
702- if ((propagateRewards4 == propagateRewards4))
703- then {
704- let liquidatorHealthCheck = if (contains(liquidators, liquidator))
705- then nil
706- else validateAfter(liquidator, "transferring debt")
707- if ((liquidatorHealthCheck == liquidatorHealthCheck))
708- then $Tuple2(liquidatorHealthCheck, transferredCollateral)
709- else throw("Strict value is not equal to itself.")
710- }
711- else throw("Strict value is not equal to itself.")
712- }
624+ let liquidatorHealthCheck = if (contains(liquidators, liquidator))
625+ then nil
626+ else validateAfter(liquidator, "transferring debt")
627+ if ((liquidatorHealthCheck == liquidatorHealthCheck))
628+ then $Tuple2(liquidatorHealthCheck, transferredCollateral)
713629 else throw("Strict value is not equal to itself.")
714630 }
715631 else throw("Strict value is not equal to itself.")
716632 }
717633 else throw("Strict value is not equal to itself.")
718634 }
719635 else throw("Strict value is not equal to itself.")
720636 }
721637 else throw("Strict value is not equal to itself.")
722638 }
723639 }
724640 else throw("Strict value is not equal to itself.")
725641 }
726642 else throw("Strict value is not equal to itself.")
727643 }
728644 }
729645 }
730646 else throw("Strict value is not equal to itself.")
731647 }
732648 else throw("Strict value is not equal to itself.")
733649 }
734650
735651
736652
737653 @Callable(i)
738654 func forceCollapse (reserve,borrower) = {
739- let v = validateReserve(reserve)
740- if ((v == v))
655+ let reserveAddress = validateReserve(reserve)
656+ if ((reserveAddress == reserveAddress))
741657 then {
742- let sh = syncRewardsHeight()
658+ let sh = syncRewardsHeight(reserve)
743659 if ((sh == sh))
744660 then {
745661 let liquidator = toString(i.caller)
746662 if ((liquidator == borrower))
747663 then throw("can't collapse self in this function")
748664 else {
749- let $t01585615891 = userPower(borrower)
750- let bp = $t01585615891._1
751- let bpu = $t01585615891._2
665+ let $t01586515900 = userPower(borrower)
666+ let bp = $t01586515900._1
667+ let bpu = $t01586515900._2
752668 if ((bp > bpu))
753669 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
754670 else {
755- let reserveAddress = addressFromStringValue(reserve)
756- let $t01609416202 = userBalance(reserveAddress, borrower)
757- if (($t01609416202 == $t01609416202))
671+ let $t01604516153 = userBalance(reserveAddress, borrower)
672+ if (($t01604516153 == $t01604516153))
758673 then {
759- let userDebtUsd = $t01609416202._5
760- let userDebt = $t01609416202._4
761- let userAssetUsd = $t01609416202._3
762- let borrowerDeposit = $t01609416202._2
763- let ignore = $t01609416202._1
674+ let userDebtUsd = $t01604516153._5
675+ let userDebt = $t01604516153._4
676+ let userAssetUsd = $t01604516153._3
677+ let borrowerDeposit = $t01604516153._2
678+ let ignore = $t01604516153._1
764679 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
765680 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
766681 if ((transferredAssets == transferredAssets))
767682 then {
768- let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
769- if ((collapsed == collapsed))
683+ let propagateRewards1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
684+ if ((propagateRewards1 == propagateRewards1))
770685 then {
771- let propagateRewards1 = updateStream(reserve, "deposit", borrower, -((transferredAssets + collapsed)), -((transferredAssets + collapsed)))
772- if ((propagateRewards1 == propagateRewards1))
686+ let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
687+ if ((collapsed == collapsed))
773688 then {
774- let propagateRewards4 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
775- if ((propagateRewards4 == propagateRewards4))
689+ let propagateRewards2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
690+ if ((propagateRewards2 == propagateRewards2))
776691 then {
777- let propagateRewards2 = updateStream(reserve, "deposit", liquidator, transferredAssets, transferredAssets)
778- if ((propagateRewards2 == propagateRewards2))
692+ let propagateRewards3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
693+ if ((propagateRewards3 == propagateRewards3))
779694 then nil
780695 else throw("Strict value is not equal to itself.")
781696 }
782697 else throw("Strict value is not equal to itself.")
783698 }
784699 else throw("Strict value is not equal to itself.")
785700 }
786701 else throw("Strict value is not equal to itself.")
787702 }
788703 else throw("Strict value is not equal to itself.")
789704 }
790705 else throw("Strict value is not equal to itself.")
791706 }
792707 }
793708 }
794709 else throw("Strict value is not equal to itself.")
795710 }
796711 else throw("Strict value is not equal to itself.")
797712 }
798713
799714

github/deemru/w8io/786bc32 
142.54 ms