2022.04.11 13:24 [3069107] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "FYugRjNsDRPdozY7MMr1DqLPC4fLem6onpqJANtykDY6", "fee": 1000000, "feeAssetId": null, "timestamp": 1649672564207, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "4mGKEAXtgiSc5sYthZSPePBrCbKnWN9FnqDrD7qUprg7bafRG98cVGQXmZExov3u4REUYD4DsLswJ9M7fm3Ltq4j" ], "script": "base64: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ZXNzYWdlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAAplYl9yZXdhcmRzAgAAACBubyBlYl9yZXdhcmRzIGNvbnRyYWN0IGluIGNvbmZpZwAAAAALdmlyZXNNaW50ZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAMdmlyZXNfbWludGVyAgAAABRtYWluOiBubyB2aXJlc01pbnRlcgIAAAATaW52YWxpZCB2aXJlc01pbnRlcgAAAAAHbWF5YmV2UwkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAAx2aXJlc19zdGFrZXIAAAAAAnZTCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIFAAAAB21heWJldlMCAAAAD25vIHZpcmVzX3N0YWtlcgAAAAACZEMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAASZGl2aWRlbmRzX2NvbnRyYWN0AgAAABVubyBkaXZpZGVuZHNfY29udHJhY3QCAAAAGmludmFsaWQgZGl2aWRlbmRzX2NvbnRyYWN0AAAAAANtVkQEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwUAAAAQZGlzdHJpYnV0b3JTdG9yZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFkBQAAAAckbWF0Y2gwCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAFkBQAAAAR1bml0AAAAAAJWRAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAAANtVkQCAAAAH25vIGRpc3RyaWJ1dG9yIHRvIGNsYWltIHJld2FyZHMAAAAAEW1heWJlVmlyZXNBc3NldElkCQAEHQAAAAIFAAAAC3ZpcmVzTWludGVyAgAAAAdhc3NldElkAAAAAAx2aXJlc0Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIFAAAAEW1heWJlVmlyZXNBc3NldElkAgAAABd2aXJlcyBhc3NldElkIG5vdCBmb3VuZAIAAAAVaW52YWxpZCB2aXJlcyBhc3NldElkAQAAAAx2aXJlc1BheW1lbnQAAAABAAAAAWkDCQAAAAAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAAAAAAAAADCQEAAAACIT0AAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBQAAAAx2aXJlc0Fzc2V0SWQJAAACAAAAAQIAAAAJbm90IHZpcmVzCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABAAAAA3JzcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAA3JzcgUAAAAMYXNzZXRJZFN0b3JlAgAAABFubyBhc3NldElkIGluIHJzcgEAAAAQY29sbGF0ZXJhbEZhY3RvcgAAAAEAAAADcnNyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAA3JzcgIAAAARX0NvbGxhdGVyYWxGYWN0b3ICAAAAE25vIENvbGxhdGVyYWxGYWN0b3IBAAAAFGxpcXVpZGF0aW9uVGhyZXNob2xkAAAAAQAAAANyc3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAADcnNyAgAAABVfTGlxdWlkYXRpb25UaHJlc2hvbGQCAAAAF25vIExpcXVpZGF0aW9uVGhyZXNob2xkAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAE19MaXF1aWRhdGlvblBlbmFsdHkCAAAAFW5vIExpcXVpZGF0aW9uUGVuYWx0eQAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAGGFjY291bnRfaGVhbHRoX3RocmVzaG9sZAIAAAAbbm8gYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAAAAABRhY2NvdW50SGVhbHRoT3ZlcmxhcAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAFmFjY291bnRfaGVhbHRoX292ZXJsYXACAAAAGW5vIGFjY291bnRfaGVhbHRoX292ZXJsYXAAAAAAD2NvbGxhcHNlUGVuYWx0eQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAEGNvbGxhcHNlX3BlbmFsdHkCAAAAE25vIGNvbGxhcHNlX3BlbmFsdHkAAAAAC2xpcXVpZGF0b3JzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAC2xpcXVpZGF0b3JzAgAAAAABAAAACXJlc2VydmVCeQAAAAIAAAAFc3RvcmUAAAAFdmFsdWUKAQAAAARmb2xkAAAAAgAAAAFhAAAAAXIEAAAAByRtYXRjaDAFAAAAAWEDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0FkZHJlc3MEAAAABWZvdW5kBQAAAAckbWF0Y2gwBQAAAAVmb3VuZAQAAAADcnNyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAAPcnNyIGJhZCBhZGRyZXNzAwkAAAAAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAADcnNyBQAAAAVzdG9yZQkAASwAAAACAgAAAAtyc3IgaGFzIG5v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cHJvcAkBAAAADHVwZGF0ZVN0cmVhbQAAAAUFAAAACnJlc2VydmVTdHICAAAAB2RlcG9zaXQFAAAABGFkZHIFAAAAA2FtdAUAAAADYW10AwkAAAAAAAACBQAAAARwcm9wBQAAAARwcm9wBQAAAAR1bml0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQAAABR0cmFuc2ZlckRlYnRJbnRlcm5hbAAAAAYAAAAKbGlxdWlkYXRvcgAAAA1ib3Jyb3dSZXNlcnZlAAAAEWNvbGxhdGVyYWxSZXNlcnZlAAAACGJvcnJvd2VyAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQAAAANZnJvbVByb3RlY3RlZAQAAAADc2gxCQEAAAALc3luY1Jld2FyZHMAAAABBQAAAA1ib3Jyb3dSZXNlcnZlAwkAAAAAAAACBQAAAANzaDEFAAAAA3NoMQQAAAADc2gyCQEAAAALc3luY1Jld2FyZHMAAAABBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQMJAAAAAAAAAgUAAAADc2gyBQAAAANzaDIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQJAAACAAAAAQIAAAAjY2FuJ3QgbGlxdWlkYXRlIG5vbi1wb3NpdGl2ZSBhbW91bnQDCQAAAAAAAAIFAAAAEWNvbGxhdGVyYWxSZXNlcnZlBQAAAA1ib3Jyb3dSZXNlcnZlCQAAAgAAAAECAAAAJmNvbGxhdGVyYWxSZXNlcnZlIGVxdWFscyBib3Jyb3dSZXNlcnZlAwkAAAAAAAACBQAAAApsaXF1aWRhdG9yBQAAAAhib3Jyb3dlcgkAAAIAAAABAgAAABRjYW4ndCBsaXF1aWRhdGUgc2VsZgQAAAALJHQwOTgyMTk4NTYJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAAskdDA5ODIxOTg1NgAAAAJfMQQAAAADYnB1CAUAAAALJHQwOTgyMTk4NTYAAAACXzIDCQAAZgAAAAIFAAAAAmJwBQAAAANicHUJAAACAAAAAQkAASwAAAACAgAAACBjYW4ndCBsaXF1aWRhdGUgaGVhbHRoeSB1c2VyOiB1PQUAAAAIYm9ycm93ZXIEAAAAAmJyCQEAAAADdmxSAAAAAQUAAAANYm9ycm93UmVzZXJ2ZQQAAAACY3IJAQAAAAN2bFIAAAABBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQQAAAALYm9ycm93QXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAJicgIAAAAHYXNzZXRJZAIAAAAWbm8gYXNzZXRJZCBmaWVsZCBpbiBicgQAAAAPY29sbGF0ZXJhbEFzc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAACY3ICAAAAB2Fzc2V0SWQCAAAAFm5vIGFzc2V0SWQgZmllbGQgaW4gY3IEAAAADGlzQ29sbGF0ZXJhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAJjcgkAASwAAAACBQAAAAhib3Jyb3dlcgIAAAAQX3VzZUFzQ29sbGF0ZXJhbAcDCQAAAAAAAAIFAAAADGlzQ29sbGF0ZXJhbAUAAAAMaXNDb2xsYXRlcmFsAwMJAQAAAAEhAAAAAQUAAAANZnJvbVByb3RlY3RlZAkBAAAAASEAAAABBQAAAAxpc0NvbGxhdGVyYWwHCQAAAgAAAAECAAAALmNhbid0IGxpcXVpZGF0ZSBkZXBvc2l0IG5vdCB1c2VkIGFzIGNvbGxhdGVyYWwEAAAADSR0MDEwMzc5MTA0NjkJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAAAmJyBQAAAAhib3Jyb3dlcgMJAAAAAAAAAgUAAAANJHQwMTAzNzkxMDQ2OQUAAAANJHQwMTAzNzkxMDQ2OQQAAAALdXNlckRlYnRVc2QIBQAAAA0kdDAxMDM3OTEwNDY5AAAAAl81BAAAAAh1c2VyRGVidAgFAAAADSR0MDEwMzc5MTA0NjkAAAACXzQEAAAADHVzZXJBc3NldFVzZAgFAAAADSR0MDEwMzc5MTA0NjkAAAACXzMEAAAACXVzZXJBc3NldAgFAAAADSR0MDEwMzc5MTA0NjkAAAACXzIEAAAABmlnbm9yZQgFAAAADSR0MDEwMzc5MTA0NjkAAAACXzEDCQAAZwAAAAIFAAAACXVzZXJBc3NldAUAAAAIdXNlckRlYnQJAAACAAAAAQIAAAAvY2FuJ3QgbGlxdWlkYXRlIGRlYnQgb2YgYXNzZXQgb2YgcG9zaXRpdmUgc2FsZG8DCQAAZwAAAAIAAAAAAAAAAAAFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQJAAACAAAAAQIAAAAnY2FuJ3QgbGlxdWlkYXRlIHplcm8gb3IgbmVnYXRpdmUgYW1vdW50AwkAAGYAAAACCQAAaAAAAAIFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQAAAAAAAAAAAIJAABlAAAAAgUAAAAIdXNlckRlYnQFAAAACXVzZXJBc3NldAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAuY2FuJ3QgbGlxdWlkYXRlIG1vcmUgdGhhbiBoYWxmIG9mIHNhbGRvOiBkZWJ0PQkAAaQAAAABBQAAAAh1c2VyRGVidAIAAAAKLCBkZXBvc2l0PQkAAaQAAAABBQAAAAl1c2VyQXNzZXQCAAAAGCwgbGlxdWlkYXRlRGVidEFtb3VudCA9IAkAAaQAAAABBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BAAAAA1jb2xsYXRlcmFsVXNkCQAAawAAAAMFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAAC3VzZXJEZWJ0VXNkBQAAAAh1c2VyRGVidAQAAAANcGVuYWx0aXplZFVzZAkAAGsAAAADBQAAAA1jb2xsYXRlcmFsVXNkCQAAZAAAAAIFAAAAC2ZhY3RvcnNCYXNlCQEAAAASbGlxdWlkYXRpb25QZW5hbHR5AAAAAQUAAAALYm9ycm93QXNzZXQFAAAAC2ZhY3RvcnNCYXNlBAAAAAJtYwMFAAAADWZyb21Qcm90ZWN0ZWQJAQAAAA5tb3ZlQ29sbGF0ZXJhbAAAAAQFAAAACGJvcnJvd2VyBQAAAA9jb2xsYXRlcmFsQXNzZXQFAAAAAmNyBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQUAAAAEdW5pdAMJAAAAAAAAAgUAAAACbWMFAAAAAm1jBAAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAACY3ICAAAAEnRyYW5zZmVyQVRva2Vuc0ZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAADXBlbmFsdGl6ZWRVc2QFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAQAAAAEcFJ3MQkBAAAACm1vdmVTdHJlYW0AAAAFBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAMJAAAAAAAAAgUAAAAEcFJ3MQUAAAAEcFJ3MQQAAAAPdHJhbnNmZXJyZWREZWJ0CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAmJyAgAAAA90cmFuc2ZlckRlYnRGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAPdHJhbnNmZXJyZWREZWJ0BQAAAA90cmFuc2ZlcnJlZERlYnQEAAAABHBSdzIJAQAAAAptb3ZlU3RyZWFtAAAABQUAAAANYm9ycm93UmVzZXJ2ZQIAAAAGYm9ycm93BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAPdHJhbnNmZXJyZWREZWJ0AwkAAAAAAAACBQAAAARwUncyBQAAAARwUncyBAAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sDCQEAAAAIY29udGFpbnMAAAACBQAAAAtsaXF1aWRhdG9ycwUAAAAKbGlxdWlkYXRvcgUAAAADbmlsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAACmxpcXVpZGF0b3ICAAAAEXRyYW5zZmVycmluZyBkZWJ0AwkAAAAAAAACBQAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawkABRQAAAACBQAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAFWZvcmNlQ29sbGFwc2VJbnRlcm5hbAAAAAQAAAAKbGlxdWlkYXRvcgAAAANyc3IAAAAIYm9ycm93ZXIAAAANZnJvbVByb3RlY3RlZAQAAAAOcmVzZXJ2ZUFkZHJlc3MJAQAAAAN2bFIAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAADnJlc2VydmVBZGRyZXNzBQAAAA5yZXNlcnZlQWRkcmVzcwQAAAACc2gJAQAAAAtzeW5jUmV3YXJkcwAAAAEFAAAAA3JzcgMJAAAAAAAAAgUAAAACc2gFAAAAAnNoAwkAAAAAAAACBQAAAApsaXF1aWRhdG9yBQAAAAhib3Jyb3dlcgkAAAIAAAABAgAAACRjYW4ndCBjb2xsYXBzZSBzZWxmIGluIHRoaXMgZnVuY3Rpb24EAAAADSR0MDEyMTI2MTIxNjEJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAA0kdDAxMjEyNjEyMTYxAAAAAl8xBAAAAANicHUIBQAAAA0kdDAxMjEyNjEyMTYxAAAAAl8yAwkAAGYAAAACBQAAAAJicAUAAAADYnB1CQAAAgAAAAEJAAEsAAAAAgIAAAAiY2FuJ3QgZm9yY2UgY29sbGFwc2UgaGVhbHRoeSB1c2VyIAUAAAAIYm9ycm93ZXIEAAAABWFzc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOcmVzZXJ2ZUFkZHJlc3MCAAAAB2Fzc2V0SWQJAAEsAAAAAgIAAAAYbm8gYXNzZXRJZCBmaWVsZCBpbiByc3IgBQAAAANyc3IEAAAAAm1jAwUAAAANZnJvbVByb3RlY3RlZAkBAAAADm1vdmVDb2xsYXRlcmFsAAAABAUAAAAIYm9ycm93ZXIFAAAABWFzc2V0BQAAAA5yZXNlcnZlQWRkcmVzcwUAAAADcnNyBQAAAAR1bml0AwkAAAAAAAACBQAAAAJtYwUAAAACbWMEAAAADSR0MDEyNDY4MTI1NzYJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAADnJlc2VydmVBZGRyZXNzBQAAAAhib3Jyb3dlcgMJAAAAAAAAAgUAAAANJHQwMTI0NjgxMjU3NgUAAAANJHQwMTI0NjgxMjU3NgQAAAALdXNlckRlYnRVc2QIBQAAAA0kdDAxMjQ2ODEyNTc2AAAAAl81BAAAAAh1c2VyRGVidAgFAAAADSR0MDEyNDY4MTI1NzYAAAACXzQEAAAADHVzZXJBc3NldFVzZAgFAAAADSR0MDEyNDY4MTI1NzYAAAACXzMEAAAAD2JvcnJvd2VyRGVwb3NpdAgFAAAADSR0MDEyNDY4MTI1NzYAAAACXzIEAAAABmlnbm9yZQgFAAAADSR0MDEyNDY4MTI1NzYAAAACXzEEAAAADXBlbmFsdGl6ZWRVc2QJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAADHVzZXJBc3NldFVzZAkABEwAAAACBQAAAAt1c2VyRGVidFVzZAUAAAADbmlsBQAAAA9jb2xsYXBzZVBlbmFsdHkFAAAAC2ZhY3RvcnNCYXNlBAAAABF0cmFuc2ZlcnJlZEFzc2V0cwkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAASdHJhbnNmZXJBVG9rZW5zRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAANcGVuYWx0aXplZFVzZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAEXRyYW5zZmVycmVkQXNzZXRzBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwQAAAAEcFJ3MQkBAAAACm1vdmVTdHJlYW0AAAAFBQAAAANyc3ICAAAAB2RlcG9zaXQFAAAACGJvcnJvd2VyBQAAAApsaXF1aWRhdG9yBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwMJAAAAAAAAAgUAAAAEcFJ3MQUAAAAEcFJ3MQQAAAAJY29sbGFwc2VkCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADnJlc2VydmVBZGRyZXNzAgAAAAtjb2xsYXBzZUZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACWNvbGxhcHNlZAUAAAAJY29sbGFwc2VkBAAAAARwUncyCQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAADcnNyAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyCQEAAAABLQAAAAEFAAAACWNvbGxhcHNlZAkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQDCQAAAAAAAAIFAAAABHBSdzIFAAAABHBSdzIEAAAABHBSdzMJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAANyc3ICAAAAB2RlcG9zaXQFAAAACGJvcnJvd2VyCQEAAAABLQAAAAEFAAAACWNvbGxhcHNlZAkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQDCQAAAAAAAAIFAAAABHBSdzMFAAAABHBSdzMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAEc3BmcgAAAAAJAAP8AAAABAUAAAACZEMCAAAAF3NoYXJlUHJvZml0RnJvbVJlc2VydmVzBQAAAANuaWwFAAAAA25pbAEAAAAKd2RJbnRlcm5hbAAAAAQAAAAEdXNlcgAAAANyc3IAAAADYW10AAAAAm9wBAAAAAJzaAkBAAAAC3N5bmNSZXdhcmRzAAAAAQkABCUAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAA3JzcgUAAAACb3AJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAANhbXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA93aXRoZHJhd25BbW91bnQFAAAAD3dpdGhkcmF3bkFtb3VudAQAAAADcFJ3CQEAAAAMdXBkYXRlU3RyZWFtAAAABQkABCUAAAABBQAAAANyc3ICAAAAB2RlcG9zaXQFAAAABHVzZXIJAQAAAAEtAAAAAQUAAAAPd2l0aGRyYXduQW1vdW50CQEAAAABLQAAAAEFAAAAD3dpdGhkcmF3bkFtb3VudAMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncFAAAAD3dpdGhkcmF3bkFtb3VudAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAABwAAAABaQEAAAAKaW5pdGlhbGl6ZQAAAAEAAAACY2EJAARMAAAAAgkBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACBQAAAAtjb25maWdTdG9yZQUAAAACY2EFAAAAA25pbAAAAAFpAQAAAAdkZXBvc2l0AAAAAgAAAANyc3IAAAAFYXNDb2wJAQAAAAlkb0RlcG9zaXQAAAADBQAAAAFpBQAAAANyc3IFAAAABWFzQ29sAAAAAWkBAAAACmRlcG9zaXRSZWYAAAADAAAAA3JzcgAAAAVhc0NvbAAAAANyZWYJAQAAAAlkb0RlcG9zaXQAAAADBQAAAAFpBQAAAANyc3IFAAAABWFzQ29sAAAAAWkBAAAABXJlcGF5AAAAAQAAAANyc3IEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAJzaAkBAAAAC3N5bmNSZXdhcmRzAAAAAQUAAAADcnNyAwkAAAAAAAACBQAAAAJzaAUAAAACc2gEAAAABnJlcGFpZAkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAADdmxSAAAAAQUAAAADcnNyAgAAAAhyZXBheUZvcgkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwIBQAAAAFpAAAACHBheW1lbnRzAwkAAAAAAAACBQAAAAZyZXBhaWQFAAAABnJlcGFpZAQAAAADcFJ3CQEAAAAMdXBkYXRlU3RyZWFtAAAABQUAAAADcnNyAgAAAAZib3Jyb3cFAAAABHVzZXIJAQAAAAEtAAAAAQUAAAAGcmVwYWlkCQEAAAABLQAAAAEFAAAABnJlcGFpZAMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAptaW50QXRva2VuAAAAAgAAAAhhVG9rZW5JZAAAAANhbXQEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA50YXJnZXRDb250cmFjdAkBAAAACXJlc2VydmVCeQAAAAIFAAAADWFUb2tlbklkU3RvcmUFAAAACGFUb2tlbklkBAAAAAJzaAkBAAAAC3N5bmNSZXdhcmRzAAAAAQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAMJAAAAAAAAAgUAAAACc2gFAAAAAnNoBAAAAAZhY3R1YWwJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOdGFyZ2V0Q29udHJhY3QCAAAADW1pbnRBdG9rZW5Gb3IJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAANhbXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAZhY3R1YWwFAAAABmFjdHVhbAQAAAADcFJ3CQEAAAAMdXBkYXRlU3RyZWFtAAAABQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAIAAAAHZGVwb3NpdAUAAAAEdXNlcgkBAAAAAS0AAAABBQAAAAZhY3R1YWwAAAAAAAAAAAADCQAAAAAAAAIFAAAAA3BSdwUAAAADcFJ3CQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAAB21pbnRpbmcJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAATcmVwbGVuaXNoV2l0aEF0b2tlbgAAAAAEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAZjaGVja3MJAQAAABFlbnN1cmVOb1Byb3RlY3RlZAAAAAEFAAAABHVzZXIDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAAhhVG9rZW5JZAkAAlgAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQCAAAAHmJhZCBhc3NldElkOiB3YXZlcyBub3QgYWxsb3dlZAQAAAAOdGFyZ2V0Q29udHJhY3QJAQAAAAlyZXNlcnZlQnkAAAACBQAAAA1hVG9rZW5JZFN0b3JlBQAAAAhhVG9rZW5JZAQAAAACc2gJAQAAAAtzeW5jUmV3YXJkcwAAAAEJAAQlAAAAAQUAAAAOdGFyZ2V0Q29udHJhY3QDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAADYW10CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADnRhcmdldENvbnRyYWN0AgAAABZyZXBsZW5pc2hXaXRoQXRva2VuRm9yCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAA2FtdAUAAAADYW10BAAAAANwUncJAQAAAAx1cGRhdGVTdHJlYW0AAAAFCQAEJQAAAAEFAAAADnRhcmdldENvbnRyYWN0AgAAAAdkZXBvc2l0BQAAAAR1c2VyBQAAAANhbXQAAAAAAAAAAAADCQAAAAAAAAIFAAAAA3BSdwUAAAADcFJ3BQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAD3JlcGF5V2l0aEF0b2tlbgAAAAAEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAZjaGVja3MJAQAAABFlbnN1cmVOb1Byb3RlY3RlZAAAAAEFAAAABHVzZXIDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzBAAAAAhhVG9rZW5JZAkAAlgAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQCAAAAHmJhZCBhc3NldElkOiB3YXZlcyBub3QgYWxsb3dlZAQAAAAOdGFyZ2V0Q29udHJhY3QJAQAAAAlyZXNlcnZlQnkAAAACBQAAAA1hVG9rZW5JZFN0b3JlBQAAAAhhVG9rZW5JZAQAAAACc2gJAQAAAAtzeW5jUmV3YXJkcwAAAAEJAAQlAAAAAQUAAAAOdGFyZ2V0Q29udHJhY3QDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAADYW10CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADnRhcmdldENvbnRyYWN0AgAAAB5yZXBsZW5pc2hGb3JSZXBheVdpdGhBdG9rZW5Gb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsCAUAAAABaQAAAAhwYXltZW50cwMJAAAAAAAAAgUAAAADYW10BQAAAANhbXQEAAAAAWMJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOdGFyZ2V0Q29udHJhY3QCAAAAEWNvbGxhcHNlRm9yQW1vdW50CQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAADYW10BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABYwUAAAABYwQAAAADcFJ3CQEAAAAMdXBkYXRlU3RyZWFtAAAABQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAIAAAAGYm9ycm93BQAAAAR1c2VyCQEAAAABLQAAAAEFAAAAAWMJAQAAAAEtAAAAAQUAAAABYwMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncEAAAABHBSdzIJAQAAAAx1cGRhdGVTdHJlYW0AAAAFCQAEJQAAAAEFAAAADnRhcmdldENvbnRyYWN0AgAAAAdkZXBvc2l0BQAAAAR1c2VyCQAAZQAAAAIFAAAAA2FtdAUAAAABYwkBAAAAAS0AAAABBQAAAAFjAwkAAAAAAAACBQAAAARwUncyBQAAAARwUncyBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAANcmVkZWVtQXRva2VucwAAAAAEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAhhVG9rZW5JZAkAAlgAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQCAAAAHmJhZCBhc3NldElkOiB3YXZlcyBub3QgYWxsb3dlZAQAAAAOdGFyZ2V0Q29udHJhY3QJAQAAAAlyZXNlcnZlQnkAAAACBQAAAA1hVG9rZW5JZFN0b3JlBQAAAAhhVG9rZW5JZAQAAAACc2gJAQAAAAtzeW5jUmV3YXJkcwAAAAEJAAQlAAAAAQUAAAAOdGFyZ2V0Q29udHJhY3QDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAADYW10CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADnRhcmdldENvbnRyYWN0AgAAABByZWRlZW1BdG9rZW5zRm9yCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAA2FtdAUAAAADYW10BAAAAANwUncJAQAAAAx1cGRhdGVTdHJlYW0AAAAFCQAEJQAAAAEFAAAADnRhcmdldENvbnRyYWN0AgAAAAdkZXBvc2l0BQAAAAR1c2VyAAAAAAAAAAAACQEAAAABLQAAAAEFAAAAA2FtdAMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAHYXNzZXRJZAAAAANhbXQEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAZyZXN1bHQJAQAAAAVhc0ludAAAAAEJAQAAAAp3ZEludGVybmFsAAAABAUAAAAEdXNlcgkBAAAACXJlc2VydmVCeQAAAAIFAAAADGFzc2V0SWRTdG9yZQUAAAAHYXNzZXRJZAUAAAADYW10AgAAAAt3aXRoZHJhd0ZvcgMJAAAAAAAAAgUAAAAGcmVzdWx0BQAAAAZyZXN1bHQJAAUUAAAAAgkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAAAt3aXRoZHJhd2luZwUAAAAGcmVzdWx0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAl3aXRoZHJhdzIAAAACAAAAA3JzcgAAAANhbXQEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAJzaAkBAAAAC3N5bmNSZXdhcmRzAAAAAQUAAAADcnNyAwkAAAAAAAACBQAAAAJzaAUAAAACc2gEAAAABmFjdHVhbAkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAADdmxSAAAAAQUAAAADcnNyAgAAAAt3aXRoZHJhd0ZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIFAAAAA2FtdAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAABmFjdHVhbAUAAAAGYWN0dWFsBAAAAANwUncJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAANyc3ICAAAAB2RlcG9zaXQFAAAABHVzZXIJAQAAAAEtAAAAAQUAAAAGYWN0dWFsCQEAAAABLQAAAAEFAAAABmFjdHVhbAMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncDCQEAAAAIY29udGFpbnMAAAACBQAAAAtsaXF1aWRhdG9ycwUAAAAEdXNlcgUAAAADbmlsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAADHdpdGhkcmF3aW5nMgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABFwcm90ZWN0Q29sbGF0ZXJhbAAAAAEAAAADcnNyBAAAAAR1c2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAABcgkBAAAAA3ZsUgAAAAEFAAAAA3JzcgQAAAADYW10CQEAAAAFYXNJbnQAAAABCQEAAAAKd2RJbnRlcm5hbAAAAAQFAAAABHVzZXIFAAAAAXIA//////////8CAAAADndpdGhkcmF3VG9NYWluAwkAAAAAAAACBQAAAANhbXQFAAAAA2FtdAQAAAAHYXNzZXRJZAkBAAAADGFzc2V0U3RyVG9JZAAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAAXIFAAAADGFzc2V0SWRTdG9yZQQAAAABcAkAA/wAAAAEBQAAABBwcm90ZWN0ZWRSZXNlcnZlAgAAAAlzdXBwbHlGb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAdhc3NldElkBQAAAANhbXQFAAAAA25pbAMJAAAAAAAAAgUAAAABcAUAAAABcAkABRQAAAACCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAACnByb3RlY3RpbmcFAAAAA2FtdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAG3dpdGhkcmF3UHJvdGVjdGVkQ29sbGF0ZXJhbAAAAAIAAAAHYXNzZXRJZAAAAANhbXQEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAFhCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgUAAAAQcHJvdGVjdGVkUmVzZXJ2ZQIAAAATbm8gcHJvdGVjdGVkUmVzZXJ2ZQIAAAALd2l0aGRyYXdGb3IJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAAA2FtdAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAAWEFAAAAAWEJAQAAAA12YWxpZGF0ZUFmdGVyAAAAAgUAAAAEdXNlcgIAAAAgd2l0aGRyYXdpbmcgcHJvdGVjdGVkIGNvbGxhdGVyYWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAE25vcm1hbGl6ZUNvbGxhdGVyYWwAAAABAAAAA3JzcgQAAAAEYWRkcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAnJBCQEAAAADdmxSAAAAAQUAAAADcnNyAwkAAAAAAAACBQAAAAJyQQUAAAACckEEAAAAAnNoCQEAAAALc3luY1Jld2FyZHMAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAAKYXNzZXRJZFN0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAAnJBAgAAAAdhc3NldElkCQABLAAAAAICAAAAI25vIGFzc2V0SWQgZmllbGQgaW4gcmVzZXJ2ZUFkZHJlc3MgBQAAAANyc3IEAAAAAm1jCQEAAAAObW92ZUNvbGxhdGVyYWwAAAAEBQAAAARhZGRyBQAAAAphc3NldElkU3RyBQAAAAJyQQUAAAADcnNyAwkAAAAAAAACBQAAAAJtYwUAAAACbWMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAZib3Jyb3cAAAACAAAAB2Fzc2V0SWQAAAADYW10BAAAAAR1c2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAADcnNyCQEAAAAJcmVzZXJ2ZUJ5AAAAAgUAAAAMYXNzZXRJZFN0b3JlBQAAAAdhc3NldElkBAAAAAJzaAkBAAAAC3N5bmNSZXdhcmRzAAAAAQkABCUAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAABYQkAA/wAAAAEBQAAAANyc3ICAAAACWJvcnJvd0ZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIFAAAAA2FtdAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAAWEFAAAAAWEEAAAAA3BSdwkBAAAADHVwZGF0ZVN0cmVhbQAAAAUJAAQlAAAAAQUAAAADcnNyAgAAAAZib3Jyb3cFAAAABHVzZXIFAAAAA2FtdAUAAAADYW10AwkAAAAAAAACBQAAAANwUncFAAAAA3BSdwkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAAAlib3Jyb3dpbmcJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAHYm9ycm93MgAAAAIAAAADcnNyAAAAA2FtdAQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAnNoCQEAAAALc3luY1Jld2FyZHMAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAABYQkAA/wAAAAECQEAAAADdmxSAAAAAQUAAAADcnNyAgAAAAlib3Jyb3dGb3IJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAANhbXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAFhBQAAAAFhBAAAAANwUncJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAANyc3ICAAAABmJvcnJvdwUAAAAEdXNlcgUAAAADYW10BQAAAANhbXQDCQAAAAAAAAIFAAAAA3BSdwUAAAADcFJ3CQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAACWJvcnJvd2luZwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhjb2xsYXBzZQAAAAIAAAADcnNyAAAAA2FtdAQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAnNoCQEAAAALc3luY1Jld2FyZHMAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAnNoBQAAAAJzaAQAAAABYwkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAADdmxSAAAAAQUAAAADcnNyAgAAABFjb2xsYXBzZUZvckFtb3VudAkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIFAAAAA2FtdAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAAWMFAAAAAWMEAAAAA3BSdwkBAAAADHVwZGF0ZVN0cmVhbQAAAAUFAAAAA3JzcgIAAAAGYm9ycm93BQAAAAR1c2VyCQEAAAABLQAAAAEFAAAAAWMJAQAAAAEtAAAAAQUAAAABYwMJAAAAAAAAAgUAAAADcFJ3BQAAAANwUncEAAAABHBSdzIJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAANyc3ICAAAAB2RlcG9zaXQFAAAABHVzZXIJAQAAAAEtAAAAAQUAAAABYwkBAAAAAS0AAAABBQAAAAFjAwkAAAAAAAACBQAAAARwUncyBQAAAARwUncyBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNsYWltRWJSZXdhcmQyAAAAAgAAAANhbXQAAAAEbG9jawQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAWMJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAADZWJSAgAAABBjbGFpbUViUmV3YXJkRm9yCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAADYW10BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABYwUAAAABYwkBAAAADGxvY2tPclBheW91dAAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAABYwUAAAAEbG9jawkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAMY2xhaW1SZXdhcmQyAAAAAwAAAANyc3IAAAADYW10AAAABGxvY2sEAAAAAXYJAQAAAAN2bFIAAAABBQAAAANyc3IDCQAAAAAAAAIFAAAAAXYFAAAAAXYEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAFjCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAlZEAgAAAA5jbGFpbVJld2FyZEZvcgkABEwAAAACBQAAAANyc3IJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAANhbXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAFjBQAAAAFjCQEAAAAMbG9ja09yUGF5b3V0AAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAFjBQAAAARsb2NrCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAhY2xhaW1BbGxSZXdhcmRzQW5kQWxsRWJBdmFpbGFibGUyAAAAAgAAAARsb2NrAAAADXVuc3Rha2VMZWdhY3kEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAJjcgkBAAAAFmNsYWltQWxsUmV3YXJkc0ZvclVzZXIAAAABBQAAAAR1c2VyAwkAAAAAAAACBQAAAAJjcgUAAAACY3IEAAAAAmxBAwUAAAANdW5zdGFrZUxlZ2FjeQkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAJ2UwIAAAATdW5zdGFrZUFsbFZpcmVzRnJvbQkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAACbEEFAAAAAmxBCQEAAAAMbG9ja09yUGF5b3V0AAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAZAAAAAIFAAAAAmNyBQAAAAJsQQUAAAAEbG9jawkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFmRpc2FibGVVc2VBc0NvbGxhdGVyYWwAAAABAAAAA3JzcgQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAAWQJAAP8AAAABAkBAAAAA3ZsUgAAAAEFAAAAA3JzcgIAAAAZZGlzYWJsZVVzZUFzQ29sbGF0ZXJhbEZvcgkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABZAUAAAABZAkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAABpjaGFuZ2luZyBjb2xsYXRlcmFsIHN0YXR1cwkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAMdHJhbnNmZXJEZWJ0AAAABAAAAAJicgAAAAJjcgAAAAFiAAAAAmxhCQEAAAAUdHJhbnNmZXJEZWJ0SW50ZXJuYWwAAAAGCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAACYnIFAAAAAmNyBQAAAAFiBQAAAAJsYQcAAAABaQEAAAANdHJhbnNmZXJEZWJ0MgAAAAQAAAACYnIAAAACY3IAAAABYgAAAAJsYQkBAAAAFHRyYW5zZmVyRGVidEludGVybmFsAAAABgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAAmJyBQAAAAJjcgUAAAABYgUAAAACbGEGAAAAAWkBAAAADWZvcmNlQ29sbGFwc2UAAAACAAAAAXIAAAABYgkBAAAAFWZvcmNlQ29sbGFwc2VJbnRlcm5hbAAAAAQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAAFyBQAAAAFiBwAAAAFpAQAAAA5mb3JjZUNvbGxhcHNlMgAAAAIAAAABcgAAAAFiCQEAAAAVZm9yY2VDb2xsYXBzZUludGVybmFsAAAABAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAAXIFAAAAAWIGAAAAAWkBAAAACWxvY2tWaXJlcwAAAAIAAAAGZmFjdG9yAAAAB21pZ3JhdGUEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAFhCQEAAAAEc3BmcgAAAAADCQAAAAAAAAIFAAAAAWEFAAAAAWEEAAAADW1pZ3JhdGVBbW91bnQDBQAAAAdtaWdyYXRlCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAnZTAgAAABN1bnN0YWtlQWxsVmlyZXNGcm9tCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAABAAAAAV0b3RhbAkAAGQAAAACBQAAAA1taWdyYXRlQW1vdW50CQEAAAAMdmlyZXNQYXltZW50AAAAAQUAAAABaQQAAAABbAkAA/wAAAAEBQAAAAJkQwIAAAAHbG9ja0ZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIFAAAABmZhY3RvcgUAAAADbmlsAwkAAAAAAAACBQAAAAV0b3RhbAAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAx2aXJlc0Fzc2V0SWQFAAAABXRvdGFsBQAAAANuaWwDCQAAAAAAAAIFAAAAAWwFAAAAAWwFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAGHdpdGhkcmF3QWxsUG9zc2libGVWaXJlcwAAAAAEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAFhCQEAAAAEc3BmcgAAAAADCQAAAAAAAAIFAAAAAWEFAAAAAWEEAAAAEXN0YWtlclZpcmVzQW1vdW50CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAnZTAgAAABN1bnN0YWtlQWxsVmlyZXNGcm9tCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABFzdGFrZXJWaXJlc0Ftb3VudAUAAAARc3Rha2VyVmlyZXNBbW91bnQEAAAAAXUJAAP8AAAABAUAAAACZEMCAAAAE3dpdGhkcmF3VW5sb2NrZWRGb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAAXUFAAAAAXUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABFzdGFrZXJWaXJlc0Ftb3VudAUAAAAMdmlyZXNBc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAXY2xhaW1Qcm90b2NvbFByb2ZpdEZyb20AAAACAAAABGZyb20AAAAGcmVsb2NrBAAAAAR1c2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAABYQkBAAAABHNwZnIAAAAAAwkAAAAAAAACBQAAAAFhBQAAAAFhBAAAAAF1CQAD/AAAAAQFAAAAAmRDAgAAAAtjbGFpbVByb2ZpdAkABEwAAAACBQAAAARmcm9tCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAGcmVsb2NrBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABdQUAAAABdQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAVd2l0aGRyYXdVbmxvY2tlZFZpcmVzAAAAAAQAAAABYQkBAAAABHNwZnIAAAAAAwkAAAAAAAACBQAAAAFhBQAAAAFhBAAAAAF1CQAD/AAAAAQFAAAAAmRDAgAAABN3aXRoZHJhd1VubG9ja2VkRm9yCQAETAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABdQUAAAABdQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAAXri8og==", "chainId": 87, "height": 3069107, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GPqPcWqYHNssKezTg34GapBCp2YKXCSBdqKAssMxg6xp Next: 9uhLgXtPV47zYsBZZSyDw7oLPgXmY63pH8gxnXwbe8qA Diff:
OldNewDifferences
9696 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, assetIdStore), "no assetId in rsr")
9797
9898
99-func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor in config")
99+func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor")
100100
101101
102-func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
102+func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold")
103103
104104
105-func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
105+func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty")
106106
107107
108108 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no account_health_threshold")
113113
114114 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
115115
116-func findReserveBy (store,value) = {
116+func reserveBy (store,value) = {
117117 func fold (a,r) = match a {
118118 case found: Address =>
119119 found
152152 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
153153
154154
155-let maybeProtectedReserve = match getString(configAddress, "protected_reserve") {
155+let maybeProtected = match getString(configAddress, "protected_reserve") {
156156 case pds: String =>
157- valueOrErrorMessage(addressFromString(pds), "bad protected_reserve")
157+ valueOrErrorMessage(addressFromString(pds), "bad protected")
158158 case _ =>
159159 unit
160160 }
161161
162-let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected rsr")
162+let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
163163
164164 func ensureNoProtected (user) = {
165- let has = match maybeProtectedReserve {
165+ let has = match maybeProtected {
166166 case pa: Address =>
167167 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
168168 case _ =>
175175
176176
177177 func userPower (user) = {
178- let protectedDeposit = match maybeProtectedReserve {
178+ let protectedDeposit = match maybeProtected {
179179 case pa: Address =>
180180 asInt(invoke(pa, "borrowPower", [user], nil))
181181 case _ =>
182182 0
183183 }
184184 func fold (totals,r) = {
185- let $t053745420 = totals
186- let totalD = $t053745420._1
187- let totalB = $t053745420._2
188- let numberOfBorrows = $t053745420._3
185+ let $t053045350 = totals
186+ let totalD = $t053045350._1
187+ let totalB = $t053045350._2
188+ let numberOfBorrows = $t053045350._3
189189 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
190190 let cf = collateralFactor(rsr)
191191 let lt = liquidationThreshold(rsr)
192- let $t055745658 = userBalance(rsr, user)
193- let token = $t055745658._1
194- let asset = $t055745658._2
195- let depositUsd = $t055745658._3
196- let debt = $t055745658._4
197- let debtUsd = $t055745658._5
198- let asCollateral = $t055745658._6
192+ let $t055045588 = userBalance(rsr, user)
193+ let token = $t055045588._1
194+ let asset = $t055045588._2
195+ let depositUsd = $t055045588._3
196+ let debt = $t055045588._4
197+ let debtUsd = $t055045588._5
198+ let asCollateral = $t055045588._6
199199 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
200200 then 1
201201 else 0))
232232
233233
234234 func getUserHealth (account) = {
235- let $t064476498 = asInt3(userPower(account))
236- let bp = $t064476498._1
237- let bpu = $t064476498._2
238- let ignore = $t064476498._3
235+ let $t063776428 = asInt3(userPower(account))
236+ let bp = $t063776428._1
237+ let bpu = $t063776428._2
238+ let ignore = $t063776428._3
239239 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
240240 }
241241
242242
243243 func validateAfter (user,op) = {
244- let $t066096640 = userPower(user)
245- let bp = $t066096640._1
246- let bpu = $t066096640._2
244+ let $t065396570 = userPower(user)
245+ let bp = $t065396570._1
246+ let bpu = $t065396570._2
247247 let accHealth = (((bp - bpu) * factorsBase) / bp)
248248 if (if ((bp == 0))
249249 then (bpu == 0)
267267 }
268268
269269
270-func moveStream (rsr,action,from,string,amount) = match mVD {
270+func moveStream (rsr,action,from,string,amt) = match mVD {
271271 case a: Address =>
272- invoke(a, "move", [rsr, action, from, string, amount], nil)
272+ invoke(a, "move", [rsr, action, from, string, amt], nil)
273273 case _ =>
274274 unit
275275 }
276276
277277
278-func syncRewardsHeight (rsr) = match mVD {
278+func syncRewards (rsr) = match mVD {
279279 case a: Address =>
280280 invoke(a, "syncHeight", [rsr], nil)
281281 case _ =>
283283 }
284284
285285
286-func lockOrPayout (recipient,amount,lock) = if (!(lock))
287- then [ScriptTransfer(recipient, amount, viresAssetId)]
286+func lockOrPayout (recipient,amt,lock) = if (!(lock))
287+ then [ScriptTransfer(recipient, amt, viresAssetId)]
288288 else {
289- let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amount)])
289+ let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
290290 if ((doLock == doLock))
291291 then nil
292292 else throw("Strict value is not equal to itself.")
293293 }
294294
295295
296-func doDeposit (i,rsr,useAsCollateral) = {
296+func doDeposit (i,rsr,asCol) = {
297297 let user = toString(i.caller)
298298 let checks = ensureNoProtected(user)
299299 if ((checks == checks))
300300 then {
301- let sh = syncRewardsHeight(rsr)
301+ let sh = syncRewards(rsr)
302302 if ((sh == sh))
303303 then {
304- let action = invoke(vlR(rsr), "depositFor", [user, useAsCollateral], i.payments)
304+ let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
305305 if ((action == action))
306306 then {
307307 let amt = i.payments[0].amount
308308 let pRw = updateStream(rsr, "deposit", user, amt, amt)
309309 if ((pRw == pRw))
310- then if (!(useAsCollateral))
310+ then if (!(asCol))
311311 then validateAfter(user, "depositing")
312312 else nil
313313 else throw("Strict value is not equal to itself.")
374374
375375
376376 func transferDebtInternal (liquidator,borrowReserve,collateralReserve,borrower,liquidateDebtAmount,fromProtected) = {
377- let sh1 = syncRewardsHeight(borrowReserve)
377+ let sh1 = syncRewards(borrowReserve)
378378 if ((sh1 == sh1))
379379 then {
380- let sh2 = syncRewardsHeight(collateralReserve)
380+ let sh2 = syncRewards(collateralReserve)
381381 if ((sh2 == sh2))
382382 then if ((0 >= liquidateDebtAmount))
383383 then throw("can't liquidate non-positive amount")
386386 else if ((liquidator == borrower))
387387 then throw("can't liquidate self")
388388 else {
389- let $t099609995 = userPower(borrower)
390- let bp = $t099609995._1
391- let bpu = $t099609995._2
389+ let $t098219856 = userPower(borrower)
390+ let bp = $t098219856._1
391+ let bpu = $t098219856._2
392392 if ((bp > bpu))
393- then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
393+ then throw(("can't liquidate healthy user: u=" + borrower))
394394 else {
395395 let br = vlR(borrowReserve)
396396 let cr = vlR(collateralReserve)
397- let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
398- let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), ("no assetId field in collateralReserve " + collateralReserve))
397+ let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), "no assetId field in br")
398+ let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), "no assetId field in cr")
399399 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
400400 if ((isCollateral == isCollateral))
401401 then if (if (!(fromProtected))
403403 else false)
404404 then throw("can't liquidate deposit not used as collateral")
405405 else {
406- let $t01063610726 = userBalance(br, borrower)
407- if (($t01063610726 == $t01063610726))
406+ let $t01037910469 = userBalance(br, borrower)
407+ if (($t01037910469 == $t01037910469))
408408 then {
409- let userDebtUsd = $t01063610726._5
410- let userDebt = $t01063610726._4
411- let userAssetUsd = $t01063610726._3
412- let userAsset = $t01063610726._2
413- let ignore = $t01063610726._1
409+ let userDebtUsd = $t01037910469._5
410+ let userDebt = $t01037910469._4
411+ let userAssetUsd = $t01037910469._3
412+ let userAsset = $t01037910469._2
413+ let ignore = $t01037910469._1
414414 if ((userAsset >= userDebt))
415415 then throw("can't liquidate debt of asset of positive saldo")
416416 else if ((0 >= liquidateDebtAmount))
470470 let reserveAddress = vlR(rsr)
471471 if ((reserveAddress == reserveAddress))
472472 then {
473- let sh = syncRewardsHeight(rsr)
473+ let sh = syncRewards(rsr)
474474 if ((sh == sh))
475475 then if ((liquidator == borrower))
476476 then throw("can't collapse self in this function")
477477 else {
478- let $t01238912424 = userPower(borrower)
479- let bp = $t01238912424._1
480- let bpu = $t01238912424._2
478+ let $t01212612161 = userPower(borrower)
479+ let bp = $t01212612161._1
480+ let bpu = $t01212612161._2
481481 if ((bp > bpu))
482- then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
482+ then throw(("can't force collapse healthy user " + borrower))
483483 else {
484484 let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in rsr " + rsr))
485485 let mc = if (fromProtected)
487487 else unit
488488 if ((mc == mc))
489489 then {
490- let $t01278812896 = userBalance(reserveAddress, borrower)
491- if (($t01278812896 == $t01278812896))
490+ let $t01246812576 = userBalance(reserveAddress, borrower)
491+ if (($t01246812576 == $t01246812576))
492492 then {
493- let userDebtUsd = $t01278812896._5
494- let userDebt = $t01278812896._4
495- let userAssetUsd = $t01278812896._3
496- let borrowerDeposit = $t01278812896._2
497- let ignore = $t01278812896._1
493+ let userDebtUsd = $t01246812576._5
494+ let userDebt = $t01246812576._4
495+ let userAssetUsd = $t01246812576._3
496+ let borrowerDeposit = $t01246812576._2
497+ let ignore = $t01246812576._1
498498 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
499499 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
500500 if ((transferredAssets == transferredAssets))
535535 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
536536
537537
538-func wdInternal (user,rsr,amount,op) = {
539- let sh = syncRewardsHeight(toString(rsr))
538+func wdInternal (user,rsr,amt,op) = {
539+ let sh = syncRewards(toString(rsr))
540540 if ((sh == sh))
541541 then {
542- let withdrawnAmount = asInt(invoke(rsr, op, [user, amount], nil))
542+ let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
543543 if ((withdrawnAmount == withdrawnAmount))
544544 then {
545545 let pRw = updateStream(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
559559
560560
561561 @Callable(i)
562-func deposit (rsr,useAsCollateral) = doDeposit(i, rsr, useAsCollateral)
562+func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
563563
564564
565565
566566 @Callable(i)
567-func depositRef (rsr,useAsCollateral,ref) = doDeposit(i, rsr, useAsCollateral)
567+func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
568568
569569
570570
571571 @Callable(i)
572572 func repay (rsr) = {
573573 let user = toString(i.caller)
574- let sh = syncRewardsHeight(rsr)
574+ let sh = syncRewards(rsr)
575575 if ((sh == sh))
576576 then {
577577 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
590590
591591
592592 @Callable(i)
593-func mintAtoken (aTokenId,amount) = {
593+func mintAtoken (aTokenId,amt) = {
594594 let user = toString(i.caller)
595- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
596- let sh = syncRewardsHeight(toString(targetContract))
595+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
596+ let sh = syncRewards(toString(targetContract))
597597 if ((sh == sh))
598598 then {
599- let amt = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
600- if ((amt == amt))
599+ let actual = asInt(invoke(targetContract, "mintAtokenFor", [user, amt], nil))
600+ if ((actual == actual))
601601 then {
602- let pRw = updateStream(toString(targetContract), "deposit", user, -(amt), 0)
602+ let pRw = updateStream(toString(targetContract), "deposit", user, -(actual), 0)
603603 if ((pRw == pRw))
604604 then validateAfter(user, "minting")
605605 else throw("Strict value is not equal to itself.")
618618 if ((checks == checks))
619619 then {
620620 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
621- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
622- let sh = syncRewardsHeight(toString(targetContract))
621+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
622+ let sh = syncRewards(toString(targetContract))
623623 if ((sh == sh))
624624 then {
625625 let amt = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
640640
641641
642642 @Callable(i)
643+func repayWithAtoken () = {
644+ let user = toString(i.caller)
645+ let checks = ensureNoProtected(user)
646+ if ((checks == checks))
647+ then {
648+ let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
649+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
650+ let sh = syncRewards(toString(targetContract))
651+ if ((sh == sh))
652+ then {
653+ let amt = asInt(invoke(targetContract, "replenishForRepayWithAtokenFor", [user], i.payments))
654+ if ((amt == amt))
655+ then {
656+ let c = asInt(invoke(targetContract, "collapseForAmount", [user, amt], nil))
657+ if ((c == c))
658+ then {
659+ let pRw = updateStream(toString(targetContract), "borrow", user, -(c), -(c))
660+ if ((pRw == pRw))
661+ then {
662+ let pRw2 = updateStream(toString(targetContract), "deposit", user, (amt - c), -(c))
663+ if ((pRw2 == pRw2))
664+ then nil
665+ else throw("Strict value is not equal to itself.")
666+ }
667+ else throw("Strict value is not equal to itself.")
668+ }
669+ else throw("Strict value is not equal to itself.")
670+ }
671+ else throw("Strict value is not equal to itself.")
672+ }
673+ else throw("Strict value is not equal to itself.")
674+ }
675+ else throw("Strict value is not equal to itself.")
676+ }
677+
678+
679+
680+@Callable(i)
643681 func redeemAtokens () = {
644682 let user = toString(i.caller)
645683 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
646- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
647- let sh = syncRewardsHeight(toString(targetContract))
684+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
685+ let sh = syncRewards(toString(targetContract))
648686 if ((sh == sh))
649687 then {
650688 let amt = asInt(invoke(targetContract, "redeemAtokensFor", [user], i.payments))
663701
664702
665703 @Callable(i)
666-func withdraw (assetId,amount) = {
704+func withdraw (assetId,amt) = {
667705 let user = toString(i.caller)
668- let result = asInt(wdInternal(user, findReserveBy(assetIdStore, assetId), amount, "withdrawFor"))
706+ let result = asInt(wdInternal(user, reserveBy(assetIdStore, assetId), amt, "withdrawFor"))
669707 if ((result == result))
670708 then $Tuple2(validateAfter(user, "withdrawing"), result)
671709 else throw("Strict value is not equal to itself.")
674712
675713
676714 @Callable(i)
677-func withdraw2 (rsr,amount) = {
715+func withdraw2 (rsr,amt) = {
678716 let user = toString(i.caller)
679- let sh = syncRewardsHeight(rsr)
717+ let sh = syncRewards(rsr)
680718 if ((sh == sh))
681719 then {
682- let amt = asInt(invoke(vlR(rsr), "withdrawFor", [user, amount], nil))
683- if ((amt == amt))
720+ let actual = asInt(invoke(vlR(rsr), "withdrawFor", [user, amt], nil))
721+ if ((actual == actual))
684722 then {
685- let pRw = updateStream(rsr, "deposit", user, -(amt), -(amt))
723+ let pRw = updateStream(rsr, "deposit", user, -(actual), -(actual))
686724 if ((pRw == pRw))
687725 then if (contains(liquidators, user))
688726 then nil
715753
716754
717755 @Callable(i)
718-func withdrawProtectedCollateral (assetId,amount) = {
756+func withdrawProtectedCollateral (assetId,amt) = {
719757 let user = toString(i.caller)
720- let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amount], nil))
758+ let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
721759 if ((a == a))
722760 then validateAfter(user, "withdrawing protected collateral")
723761 else throw("Strict value is not equal to itself.")
731769 let rA = vlR(rsr)
732770 if ((rA == rA))
733771 then {
734- let sh = syncRewardsHeight(rsr)
772+ let sh = syncRewards(rsr)
735773 if ((sh == sh))
736774 then {
737775 let assetIdStr = valueOrErrorMessage(getString(rA, "assetId"), ("no assetId field in reserveAddress " + rsr))
748786
749787
750788 @Callable(i)
751-func borrow (assetId,amount) = {
789+func borrow (assetId,amt) = {
752790 let user = toString(i.caller)
753- let rsr = findReserveBy(assetIdStore, assetId)
754- let sh = syncRewardsHeight(toString(rsr))
791+ let rsr = reserveBy(assetIdStore, assetId)
792+ let sh = syncRewards(toString(rsr))
755793 if ((sh == sh))
756794 then {
757- let a = invoke(rsr, "borrowFor", [user, amount], nil)
795+ let a = invoke(rsr, "borrowFor", [user, amt], nil)
758796 if ((a == a))
759797 then {
760- let pRw = updateStream(toString(rsr), "borrow", user, amount, amount)
798+ let pRw = updateStream(toString(rsr), "borrow", user, amt, amt)
761799 if ((pRw == pRw))
762800 then validateAfter(user, "borrowing")
763801 else throw("Strict value is not equal to itself.")
770808
771809
772810 @Callable(i)
773-func borrow2 (rsr,amount) = {
811+func borrow2 (rsr,amt) = {
774812 let user = toString(i.caller)
775- let sh = syncRewardsHeight(rsr)
813+ let sh = syncRewards(rsr)
776814 if ((sh == sh))
777815 then {
778- let a = invoke(vlR(rsr), "borrowFor", [user, amount], nil)
816+ let a = invoke(vlR(rsr), "borrowFor", [user, amt], nil)
779817 if ((a == a))
780818 then {
781- let pRw = updateStream(rsr, "borrow", user, amount, amount)
819+ let pRw = updateStream(rsr, "borrow", user, amt, amt)
782820 if ((pRw == pRw))
783821 then validateAfter(user, "borrowing")
784822 else throw("Strict value is not equal to itself.")
791829
792830
793831 @Callable(i)
794-func collapse (rsr,amount) = {
832+func collapse (rsr,amt) = {
795833 let user = toString(i.caller)
796- let sh = syncRewardsHeight(rsr)
834+ let sh = syncRewards(rsr)
797835 if ((sh == sh))
798836 then {
799- let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amount], nil))
837+ let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
800838 if ((c == c))
801839 then {
802840 let pRw = updateStream(rsr, "borrow", user, -(c), -(c))
817855
818856
819857 @Callable(i)
820-func claimEbReward2 (amount,lock) = {
858+func claimEbReward2 (amt,lock) = {
821859 let user = toString(i.caller)
822- let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amount], nil))
860+ let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
823861 if ((c == c))
824862 then lockOrPayout(i.caller, c, lock)
825863 else throw("Strict value is not equal to itself.")
828866
829867
830868 @Callable(i)
831-func claimReward2 (rsr,amount,lock) = {
869+func claimReward2 (rsr,amt,lock) = {
832870 let v = vlR(rsr)
833871 if ((v == v))
834872 then {
835873 let user = toString(i.caller)
836- let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amount], nil))
874+ let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
837875 if ((c == c))
838876 then lockOrPayout(i.caller, c, lock)
839877 else throw("Strict value is not equal to itself.")
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 assetStrToId (assetId) = if ((assetId == "WAVES"))
1717 then unit
1818 else fromBase58String(assetId)
1919
2020
2121 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2222 then StringEntry(key, value)
2323 else throw(("already initialized: " + key))
2424
2525
2626 func asInt (value) = match value {
2727 case int: Int =>
2828 int
2929 case _ =>
3030 throw("wrong type, expected: Int")
3131 }
3232
3333
3434 func asInt3 (value) = match value {
3535 case x: (Int, Int, Int) =>
3636 x
3737 case t =>
3838 throw("wrong type, expected: Int3")
3939 }
4040
4141
4242 func asUserBalanceData (value) = match value {
4343 case x: (Int, Int, Int, Int, Int, Boolean) =>
4444 x
4545 case t =>
4646 throw("wrong type, expected: Int5&Boolean")
4747 }
4848
4949
5050 let configStore = "config"
5151
5252 let reservesStore = "reserves"
5353
5454 let aTokenIdStore = "aTokenId"
5555
5656 let assetIdStore = "assetId"
5757
5858 let distributorStore = "vires_distributor"
5959
6060 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6161
6262 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6363
6464 let reserves = split(reservesStr, "|")
6565
6666 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards contract in config"))
6767
6868 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "invalid viresMinter")
6969
7070 let maybevS = getString(configAddress, "vires_staker")
7171
7272 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7373
7474 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
7575
7676 let mVD = match getString(configAddress, distributorStore) {
7777 case d: String =>
7878 addressFromStringValue(d)
7979 case _ =>
8080 unit
8181 }
8282
8383 let VD = valueOrErrorMessage(mVD, "no distributor to claim rewards")
8484
8585 let maybeViresAssetId = getString(viresMinter, "assetId")
8686
8787 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "vires assetId not found")), "invalid vires assetId")
8888
8989 func viresPayment (i) = if ((size(i.payments) == 0))
9090 then 0
9191 else if ((i.payments[0].assetId != viresAssetId))
9292 then throw("not vires")
9393 else i.payments[0].amount
9494
9595
9696 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, assetIdStore), "no assetId in rsr")
9797
9898
99-func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor in config")
99+func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor")
100100
101101
102-func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
102+func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold")
103103
104104
105-func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
105+func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty")
106106
107107
108108 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no account_health_threshold")
109109
110110 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no account_health_overlap")
111111
112112 let collapsePenalty = valueOrErrorMessage(getInteger(configAddress, "collapse_penalty"), "no collapse_penalty")
113113
114114 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
115115
116-func findReserveBy (store,value) = {
116+func reserveBy (store,value) = {
117117 func fold (a,r) = match a {
118118 case found: Address =>
119119 found
120120 case _ =>
121121 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
122122 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
123123 then rsr
124124 else unit
125125 }
126126
127127 match let $l = reserves
128128 let $s = size($l)
129129 let $acc0 = unit
130130 func $f0_1 ($a,$i) = if (($i >= $s))
131131 then $a
132132 else fold($a, $l[$i])
133133
134134 func $f0_2 ($a,$i) = if (($i >= $s))
135135 then $a
136136 else throw("List size exceeds 7")
137137
138138 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
139139 case found: Address =>
140140 found
141141 case _ =>
142142 throw(("unknown " + store))
143143 }
144144 }
145145
146146
147147 func vlR (r) = if (contains(reservesStr, r))
148148 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
149149 else throw(("unknown rsr:" + r))
150150
151151
152152 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
153153
154154
155-let maybeProtectedReserve = match getString(configAddress, "protected_reserve") {
155+let maybeProtected = match getString(configAddress, "protected_reserve") {
156156 case pds: String =>
157- valueOrErrorMessage(addressFromString(pds), "bad protected_reserve")
157+ valueOrErrorMessage(addressFromString(pds), "bad protected")
158158 case _ =>
159159 unit
160160 }
161161
162-let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected rsr")
162+let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
163163
164164 func ensureNoProtected (user) = {
165- let has = match maybeProtectedReserve {
165+ let has = match maybeProtected {
166166 case pa: Address =>
167167 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
168168 case _ =>
169169 false
170170 }
171171 if (has)
172172 then throw("disallowed: can't have regular when protected exists")
173173 else unit
174174 }
175175
176176
177177 func userPower (user) = {
178- let protectedDeposit = match maybeProtectedReserve {
178+ let protectedDeposit = match maybeProtected {
179179 case pa: Address =>
180180 asInt(invoke(pa, "borrowPower", [user], nil))
181181 case _ =>
182182 0
183183 }
184184 func fold (totals,r) = {
185- let $t053745420 = totals
186- let totalD = $t053745420._1
187- let totalB = $t053745420._2
188- let numberOfBorrows = $t053745420._3
185+ let $t053045350 = totals
186+ let totalD = $t053045350._1
187+ let totalB = $t053045350._2
188+ let numberOfBorrows = $t053045350._3
189189 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
190190 let cf = collateralFactor(rsr)
191191 let lt = liquidationThreshold(rsr)
192- let $t055745658 = userBalance(rsr, user)
193- let token = $t055745658._1
194- let asset = $t055745658._2
195- let depositUsd = $t055745658._3
196- let debt = $t055745658._4
197- let debtUsd = $t055745658._5
198- let asCollateral = $t055745658._6
192+ let $t055045588 = userBalance(rsr, user)
193+ let token = $t055045588._1
194+ let asset = $t055045588._2
195+ let depositUsd = $t055045588._3
196+ let debt = $t055045588._4
197+ let debtUsd = $t055045588._5
198+ let asCollateral = $t055045588._6
199199 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
200200 then 1
201201 else 0))
202202 let effectiveDepositUsd = if (asCollateral)
203203 then depositUsd
204204 else 0
205205 let overlapUsd = min([debtUsd, effectiveDepositUsd])
206206 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
207207 if ((debtUsd > effectiveDepositUsd))
208208 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
209209 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
210210 }
211211
212212 let r = {
213213 let $l = reserves
214214 let $s = size($l)
215215 let $acc0 = $Tuple3(protectedDeposit, 0, 0)
216216 func $f0_1 ($a,$i) = if (($i >= $s))
217217 then $a
218218 else fold($a, $l[$i])
219219
220220 func $f0_2 ($a,$i) = if (($i >= $s))
221221 then $a
222222 else throw("List size exceeds 7")
223223
224224 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
225225 }
226226 if (if ((protectedDeposit > 0))
227227 then (r._3 > 2)
228228 else false)
229229 then throw("can't have more than 2 borrows with protected collateral")
230230 else r
231231 }
232232
233233
234234 func getUserHealth (account) = {
235- let $t064476498 = asInt3(userPower(account))
236- let bp = $t064476498._1
237- let bpu = $t064476498._2
238- let ignore = $t064476498._3
235+ let $t063776428 = asInt3(userPower(account))
236+ let bp = $t063776428._1
237+ let bpu = $t063776428._2
238+ let ignore = $t063776428._3
239239 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
240240 }
241241
242242
243243 func validateAfter (user,op) = {
244- let $t066096640 = userPower(user)
245- let bp = $t066096640._1
246- let bpu = $t066096640._2
244+ let $t065396570 = userPower(user)
245+ let bp = $t065396570._1
246+ let bpu = $t065396570._2
247247 let accHealth = (((bp - bpu) * factorsBase) / bp)
248248 if (if ((bp == 0))
249249 then (bpu == 0)
250250 else false)
251251 then nil
252252 else if (if ((bp == 0))
253253 then (bpu > 0)
254254 else false)
255255 then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
256256 else if ((accountHealthThreshold > accHealth))
257257 then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
258258 else nil
259259 }
260260
261261
262262 func updateStream (rsr,action,user,userChange,streamChange) = match mVD {
263263 case a: Address =>
264264 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
265265 case _ =>
266266 unit
267267 }
268268
269269
270-func moveStream (rsr,action,from,string,amount) = match mVD {
270+func moveStream (rsr,action,from,string,amt) = match mVD {
271271 case a: Address =>
272- invoke(a, "move", [rsr, action, from, string, amount], nil)
272+ invoke(a, "move", [rsr, action, from, string, amt], nil)
273273 case _ =>
274274 unit
275275 }
276276
277277
278-func syncRewardsHeight (rsr) = match mVD {
278+func syncRewards (rsr) = match mVD {
279279 case a: Address =>
280280 invoke(a, "syncHeight", [rsr], nil)
281281 case _ =>
282282 unit
283283 }
284284
285285
286-func lockOrPayout (recipient,amount,lock) = if (!(lock))
287- then [ScriptTransfer(recipient, amount, viresAssetId)]
286+func lockOrPayout (recipient,amt,lock) = if (!(lock))
287+ then [ScriptTransfer(recipient, amt, viresAssetId)]
288288 else {
289- let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amount)])
289+ let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
290290 if ((doLock == doLock))
291291 then nil
292292 else throw("Strict value is not equal to itself.")
293293 }
294294
295295
296-func doDeposit (i,rsr,useAsCollateral) = {
296+func doDeposit (i,rsr,asCol) = {
297297 let user = toString(i.caller)
298298 let checks = ensureNoProtected(user)
299299 if ((checks == checks))
300300 then {
301- let sh = syncRewardsHeight(rsr)
301+ let sh = syncRewards(rsr)
302302 if ((sh == sh))
303303 then {
304- let action = invoke(vlR(rsr), "depositFor", [user, useAsCollateral], i.payments)
304+ let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
305305 if ((action == action))
306306 then {
307307 let amt = i.payments[0].amount
308308 let pRw = updateStream(rsr, "deposit", user, amt, amt)
309309 if ((pRw == pRw))
310- then if (!(useAsCollateral))
310+ then if (!(asCol))
311311 then validateAfter(user, "depositing")
312312 else nil
313313 else throw("Strict value is not equal to itself.")
314314 }
315315 else throw("Strict value is not equal to itself.")
316316 }
317317 else throw("Strict value is not equal to itself.")
318318 }
319319 else throw("Strict value is not equal to itself.")
320320 }
321321
322322
323323 func claimAllRewardsForUser (user) = {
324324 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
325325 if ((claimedEb == claimedEb))
326326 then {
327327 let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
328328 func fold (acc,rsr) = {
329329 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
330330 if ((claimed == claimed))
331331 then (acc + claimed)
332332 else throw("Strict value is not equal to itself.")
333333 }
334334
335335 let claimedTotal = {
336336 let $l = rewardReserves
337337 let $s = size($l)
338338 let $acc0 = 0
339339 func $f0_1 ($a,$i) = if (($i >= $s))
340340 then $a
341341 else fold($a, $l[$i])
342342
343343 func $f0_2 ($a,$i) = if (($i >= $s))
344344 then $a
345345 else throw("List size exceeds 7")
346346
347347 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
348348 }
349349 (claimedTotal + claimedEb)
350350 }
351351 else throw("Strict value is not equal to itself.")
352352 }
353353
354354
355355 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
356356 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
357357 if ((amt == amt))
358358 then {
359359 let assetId = if ((assetStr == "WAVES"))
360360 then unit
361361 else fromBase58String(assetStr)
362362 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
363363 if ((dep == dep))
364364 then {
365365 let prop = updateStream(reserveStr, "deposit", addr, amt, amt)
366366 if ((prop == prop))
367367 then unit
368368 else throw("Strict value is not equal to itself.")
369369 }
370370 else throw("Strict value is not equal to itself.")
371371 }
372372 else throw("Strict value is not equal to itself.")
373373 }
374374
375375
376376 func transferDebtInternal (liquidator,borrowReserve,collateralReserve,borrower,liquidateDebtAmount,fromProtected) = {
377- let sh1 = syncRewardsHeight(borrowReserve)
377+ let sh1 = syncRewards(borrowReserve)
378378 if ((sh1 == sh1))
379379 then {
380- let sh2 = syncRewardsHeight(collateralReserve)
380+ let sh2 = syncRewards(collateralReserve)
381381 if ((sh2 == sh2))
382382 then if ((0 >= liquidateDebtAmount))
383383 then throw("can't liquidate non-positive amount")
384384 else if ((collateralReserve == borrowReserve))
385385 then throw("collateralReserve equals borrowReserve")
386386 else if ((liquidator == borrower))
387387 then throw("can't liquidate self")
388388 else {
389- let $t099609995 = userPower(borrower)
390- let bp = $t099609995._1
391- let bpu = $t099609995._2
389+ let $t098219856 = userPower(borrower)
390+ let bp = $t098219856._1
391+ let bpu = $t098219856._2
392392 if ((bp > bpu))
393- then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
393+ then throw(("can't liquidate healthy user: u=" + borrower))
394394 else {
395395 let br = vlR(borrowReserve)
396396 let cr = vlR(collateralReserve)
397- let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
398- let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), ("no assetId field in collateralReserve " + collateralReserve))
397+ let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), "no assetId field in br")
398+ let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), "no assetId field in cr")
399399 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
400400 if ((isCollateral == isCollateral))
401401 then if (if (!(fromProtected))
402402 then !(isCollateral)
403403 else false)
404404 then throw("can't liquidate deposit not used as collateral")
405405 else {
406- let $t01063610726 = userBalance(br, borrower)
407- if (($t01063610726 == $t01063610726))
406+ let $t01037910469 = userBalance(br, borrower)
407+ if (($t01037910469 == $t01037910469))
408408 then {
409- let userDebtUsd = $t01063610726._5
410- let userDebt = $t01063610726._4
411- let userAssetUsd = $t01063610726._3
412- let userAsset = $t01063610726._2
413- let ignore = $t01063610726._1
409+ let userDebtUsd = $t01037910469._5
410+ let userDebt = $t01037910469._4
411+ let userAssetUsd = $t01037910469._3
412+ let userAsset = $t01037910469._2
413+ let ignore = $t01037910469._1
414414 if ((userAsset >= userDebt))
415415 then throw("can't liquidate debt of asset of positive saldo")
416416 else if ((0 >= liquidateDebtAmount))
417417 then throw("can't liquidate zero or negative amount")
418418 else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
419419 then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
420420 else {
421421 let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
422422 let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
423423 let mc = if (fromProtected)
424424 then moveCollateral(borrower, collateralAsset, cr, collateralReserve)
425425 else unit
426426 if ((mc == mc))
427427 then {
428428 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
429429 if ((transferredCollateral == transferredCollateral))
430430 then {
431431 let pRw1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
432432 if ((pRw1 == pRw1))
433433 then {
434434 let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
435435 if ((transferredDebt == transferredDebt))
436436 then {
437437 let pRw2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
438438 if ((pRw2 == pRw2))
439439 then {
440440 let liquidatorHealthCheck = if (contains(liquidators, liquidator))
441441 then nil
442442 else validateAfter(liquidator, "transferring debt")
443443 if ((liquidatorHealthCheck == liquidatorHealthCheck))
444444 then $Tuple2(liquidatorHealthCheck, transferredCollateral)
445445 else throw("Strict value is not equal to itself.")
446446 }
447447 else throw("Strict value is not equal to itself.")
448448 }
449449 else throw("Strict value is not equal to itself.")
450450 }
451451 else throw("Strict value is not equal to itself.")
452452 }
453453 else throw("Strict value is not equal to itself.")
454454 }
455455 else throw("Strict value is not equal to itself.")
456456 }
457457 }
458458 else throw("Strict value is not equal to itself.")
459459 }
460460 else throw("Strict value is not equal to itself.")
461461 }
462462 }
463463 else throw("Strict value is not equal to itself.")
464464 }
465465 else throw("Strict value is not equal to itself.")
466466 }
467467
468468
469469 func forceCollapseInternal (liquidator,rsr,borrower,fromProtected) = {
470470 let reserveAddress = vlR(rsr)
471471 if ((reserveAddress == reserveAddress))
472472 then {
473- let sh = syncRewardsHeight(rsr)
473+ let sh = syncRewards(rsr)
474474 if ((sh == sh))
475475 then if ((liquidator == borrower))
476476 then throw("can't collapse self in this function")
477477 else {
478- let $t01238912424 = userPower(borrower)
479- let bp = $t01238912424._1
480- let bpu = $t01238912424._2
478+ let $t01212612161 = userPower(borrower)
479+ let bp = $t01212612161._1
480+ let bpu = $t01212612161._2
481481 if ((bp > bpu))
482- then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
482+ then throw(("can't force collapse healthy user " + borrower))
483483 else {
484484 let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in rsr " + rsr))
485485 let mc = if (fromProtected)
486486 then moveCollateral(borrower, asset, reserveAddress, rsr)
487487 else unit
488488 if ((mc == mc))
489489 then {
490- let $t01278812896 = userBalance(reserveAddress, borrower)
491- if (($t01278812896 == $t01278812896))
490+ let $t01246812576 = userBalance(reserveAddress, borrower)
491+ if (($t01246812576 == $t01246812576))
492492 then {
493- let userDebtUsd = $t01278812896._5
494- let userDebt = $t01278812896._4
495- let userAssetUsd = $t01278812896._3
496- let borrowerDeposit = $t01278812896._2
497- let ignore = $t01278812896._1
493+ let userDebtUsd = $t01246812576._5
494+ let userDebt = $t01246812576._4
495+ let userAssetUsd = $t01246812576._3
496+ let borrowerDeposit = $t01246812576._2
497+ let ignore = $t01246812576._1
498498 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
499499 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
500500 if ((transferredAssets == transferredAssets))
501501 then {
502502 let pRw1 = moveStream(rsr, "deposit", borrower, liquidator, transferredAssets)
503503 if ((pRw1 == pRw1))
504504 then {
505505 let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
506506 if ((collapsed == collapsed))
507507 then {
508508 let pRw2 = updateStream(rsr, "borrow", borrower, -(collapsed), -(collapsed))
509509 if ((pRw2 == pRw2))
510510 then {
511511 let pRw3 = updateStream(rsr, "deposit", borrower, -(collapsed), -(collapsed))
512512 if ((pRw3 == pRw3))
513513 then nil
514514 else throw("Strict value is not equal to itself.")
515515 }
516516 else throw("Strict value is not equal to itself.")
517517 }
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else throw("Strict value is not equal to itself.")
521521 }
522522 else throw("Strict value is not equal to itself.")
523523 }
524524 else throw("Strict value is not equal to itself.")
525525 }
526526 else throw("Strict value is not equal to itself.")
527527 }
528528 }
529529 else throw("Strict value is not equal to itself.")
530530 }
531531 else throw("Strict value is not equal to itself.")
532532 }
533533
534534
535535 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
536536
537537
538-func wdInternal (user,rsr,amount,op) = {
539- let sh = syncRewardsHeight(toString(rsr))
538+func wdInternal (user,rsr,amt,op) = {
539+ let sh = syncRewards(toString(rsr))
540540 if ((sh == sh))
541541 then {
542- let withdrawnAmount = asInt(invoke(rsr, op, [user, amount], nil))
542+ let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
543543 if ((withdrawnAmount == withdrawnAmount))
544544 then {
545545 let pRw = updateStream(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
546546 if ((pRw == pRw))
547547 then withdrawnAmount
548548 else throw("Strict value is not equal to itself.")
549549 }
550550 else throw("Strict value is not equal to itself.")
551551 }
552552 else throw("Strict value is not equal to itself.")
553553 }
554554
555555
556556 @Callable(i)
557557 func initialize (ca) = [writeConstString(configStore, ca)]
558558
559559
560560
561561 @Callable(i)
562-func deposit (rsr,useAsCollateral) = doDeposit(i, rsr, useAsCollateral)
562+func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
563563
564564
565565
566566 @Callable(i)
567-func depositRef (rsr,useAsCollateral,ref) = doDeposit(i, rsr, useAsCollateral)
567+func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
568568
569569
570570
571571 @Callable(i)
572572 func repay (rsr) = {
573573 let user = toString(i.caller)
574- let sh = syncRewardsHeight(rsr)
574+ let sh = syncRewards(rsr)
575575 if ((sh == sh))
576576 then {
577577 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
578578 if ((repaid == repaid))
579579 then {
580580 let pRw = updateStream(rsr, "borrow", user, -(repaid), -(repaid))
581581 if ((pRw == pRw))
582582 then nil
583583 else throw("Strict value is not equal to itself.")
584584 }
585585 else throw("Strict value is not equal to itself.")
586586 }
587587 else throw("Strict value is not equal to itself.")
588588 }
589589
590590
591591
592592 @Callable(i)
593-func mintAtoken (aTokenId,amount) = {
593+func mintAtoken (aTokenId,amt) = {
594594 let user = toString(i.caller)
595- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
596- let sh = syncRewardsHeight(toString(targetContract))
595+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
596+ let sh = syncRewards(toString(targetContract))
597597 if ((sh == sh))
598598 then {
599- let amt = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
600- if ((amt == amt))
599+ let actual = asInt(invoke(targetContract, "mintAtokenFor", [user, amt], nil))
600+ if ((actual == actual))
601601 then {
602- let pRw = updateStream(toString(targetContract), "deposit", user, -(amt), 0)
602+ let pRw = updateStream(toString(targetContract), "deposit", user, -(actual), 0)
603603 if ((pRw == pRw))
604604 then validateAfter(user, "minting")
605605 else throw("Strict value is not equal to itself.")
606606 }
607607 else throw("Strict value is not equal to itself.")
608608 }
609609 else throw("Strict value is not equal to itself.")
610610 }
611611
612612
613613
614614 @Callable(i)
615615 func replenishWithAtoken () = {
616616 let user = toString(i.caller)
617617 let checks = ensureNoProtected(user)
618618 if ((checks == checks))
619619 then {
620620 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
621- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
622- let sh = syncRewardsHeight(toString(targetContract))
621+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
622+ let sh = syncRewards(toString(targetContract))
623623 if ((sh == sh))
624624 then {
625625 let amt = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
626626 if ((amt == amt))
627627 then {
628628 let pRw = updateStream(toString(targetContract), "deposit", user, amt, 0)
629629 if ((pRw == pRw))
630630 then nil
631631 else throw("Strict value is not equal to itself.")
632632 }
633633 else throw("Strict value is not equal to itself.")
634634 }
635635 else throw("Strict value is not equal to itself.")
636636 }
637637 else throw("Strict value is not equal to itself.")
638638 }
639639
640640
641641
642642 @Callable(i)
643+func repayWithAtoken () = {
644+ let user = toString(i.caller)
645+ let checks = ensureNoProtected(user)
646+ if ((checks == checks))
647+ then {
648+ let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
649+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
650+ let sh = syncRewards(toString(targetContract))
651+ if ((sh == sh))
652+ then {
653+ let amt = asInt(invoke(targetContract, "replenishForRepayWithAtokenFor", [user], i.payments))
654+ if ((amt == amt))
655+ then {
656+ let c = asInt(invoke(targetContract, "collapseForAmount", [user, amt], nil))
657+ if ((c == c))
658+ then {
659+ let pRw = updateStream(toString(targetContract), "borrow", user, -(c), -(c))
660+ if ((pRw == pRw))
661+ then {
662+ let pRw2 = updateStream(toString(targetContract), "deposit", user, (amt - c), -(c))
663+ if ((pRw2 == pRw2))
664+ then nil
665+ else throw("Strict value is not equal to itself.")
666+ }
667+ else throw("Strict value is not equal to itself.")
668+ }
669+ else throw("Strict value is not equal to itself.")
670+ }
671+ else throw("Strict value is not equal to itself.")
672+ }
673+ else throw("Strict value is not equal to itself.")
674+ }
675+ else throw("Strict value is not equal to itself.")
676+ }
677+
678+
679+
680+@Callable(i)
643681 func redeemAtokens () = {
644682 let user = toString(i.caller)
645683 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
646- let targetContract = findReserveBy(aTokenIdStore, aTokenId)
647- let sh = syncRewardsHeight(toString(targetContract))
684+ let targetContract = reserveBy(aTokenIdStore, aTokenId)
685+ let sh = syncRewards(toString(targetContract))
648686 if ((sh == sh))
649687 then {
650688 let amt = asInt(invoke(targetContract, "redeemAtokensFor", [user], i.payments))
651689 if ((amt == amt))
652690 then {
653691 let pRw = updateStream(toString(targetContract), "deposit", user, 0, -(amt))
654692 if ((pRw == pRw))
655693 then nil
656694 else throw("Strict value is not equal to itself.")
657695 }
658696 else throw("Strict value is not equal to itself.")
659697 }
660698 else throw("Strict value is not equal to itself.")
661699 }
662700
663701
664702
665703 @Callable(i)
666-func withdraw (assetId,amount) = {
704+func withdraw (assetId,amt) = {
667705 let user = toString(i.caller)
668- let result = asInt(wdInternal(user, findReserveBy(assetIdStore, assetId), amount, "withdrawFor"))
706+ let result = asInt(wdInternal(user, reserveBy(assetIdStore, assetId), amt, "withdrawFor"))
669707 if ((result == result))
670708 then $Tuple2(validateAfter(user, "withdrawing"), result)
671709 else throw("Strict value is not equal to itself.")
672710 }
673711
674712
675713
676714 @Callable(i)
677-func withdraw2 (rsr,amount) = {
715+func withdraw2 (rsr,amt) = {
678716 let user = toString(i.caller)
679- let sh = syncRewardsHeight(rsr)
717+ let sh = syncRewards(rsr)
680718 if ((sh == sh))
681719 then {
682- let amt = asInt(invoke(vlR(rsr), "withdrawFor", [user, amount], nil))
683- if ((amt == amt))
720+ let actual = asInt(invoke(vlR(rsr), "withdrawFor", [user, amt], nil))
721+ if ((actual == actual))
684722 then {
685- let pRw = updateStream(rsr, "deposit", user, -(amt), -(amt))
723+ let pRw = updateStream(rsr, "deposit", user, -(actual), -(actual))
686724 if ((pRw == pRw))
687725 then if (contains(liquidators, user))
688726 then nil
689727 else validateAfter(user, "withdrawing2")
690728 else throw("Strict value is not equal to itself.")
691729 }
692730 else throw("Strict value is not equal to itself.")
693731 }
694732 else throw("Strict value is not equal to itself.")
695733 }
696734
697735
698736
699737 @Callable(i)
700738 func protectCollateral (rsr) = {
701739 let user = toString(i.caller)
702740 let r = vlR(rsr)
703741 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
704742 if ((amt == amt))
705743 then {
706744 let assetId = assetStrToId(getStringValue(r, assetIdStore))
707745 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(assetId, amt)])
708746 if ((p == p))
709747 then $Tuple2(validateAfter(user, "protecting"), amt)
710748 else throw("Strict value is not equal to itself.")
711749 }
712750 else throw("Strict value is not equal to itself.")
713751 }
714752
715753
716754
717755 @Callable(i)
718-func withdrawProtectedCollateral (assetId,amount) = {
756+func withdrawProtectedCollateral (assetId,amt) = {
719757 let user = toString(i.caller)
720- let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amount], nil))
758+ let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
721759 if ((a == a))
722760 then validateAfter(user, "withdrawing protected collateral")
723761 else throw("Strict value is not equal to itself.")
724762 }
725763
726764
727765
728766 @Callable(i)
729767 func normalizeCollateral (rsr) = {
730768 let addr = toString(i.caller)
731769 let rA = vlR(rsr)
732770 if ((rA == rA))
733771 then {
734- let sh = syncRewardsHeight(rsr)
772+ let sh = syncRewards(rsr)
735773 if ((sh == sh))
736774 then {
737775 let assetIdStr = valueOrErrorMessage(getString(rA, "assetId"), ("no assetId field in reserveAddress " + rsr))
738776 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
739777 if ((mc == mc))
740778 then nil
741779 else throw("Strict value is not equal to itself.")
742780 }
743781 else throw("Strict value is not equal to itself.")
744782 }
745783 else throw("Strict value is not equal to itself.")
746784 }
747785
748786
749787
750788 @Callable(i)
751-func borrow (assetId,amount) = {
789+func borrow (assetId,amt) = {
752790 let user = toString(i.caller)
753- let rsr = findReserveBy(assetIdStore, assetId)
754- let sh = syncRewardsHeight(toString(rsr))
791+ let rsr = reserveBy(assetIdStore, assetId)
792+ let sh = syncRewards(toString(rsr))
755793 if ((sh == sh))
756794 then {
757- let a = invoke(rsr, "borrowFor", [user, amount], nil)
795+ let a = invoke(rsr, "borrowFor", [user, amt], nil)
758796 if ((a == a))
759797 then {
760- let pRw = updateStream(toString(rsr), "borrow", user, amount, amount)
798+ let pRw = updateStream(toString(rsr), "borrow", user, amt, amt)
761799 if ((pRw == pRw))
762800 then validateAfter(user, "borrowing")
763801 else throw("Strict value is not equal to itself.")
764802 }
765803 else throw("Strict value is not equal to itself.")
766804 }
767805 else throw("Strict value is not equal to itself.")
768806 }
769807
770808
771809
772810 @Callable(i)
773-func borrow2 (rsr,amount) = {
811+func borrow2 (rsr,amt) = {
774812 let user = toString(i.caller)
775- let sh = syncRewardsHeight(rsr)
813+ let sh = syncRewards(rsr)
776814 if ((sh == sh))
777815 then {
778- let a = invoke(vlR(rsr), "borrowFor", [user, amount], nil)
816+ let a = invoke(vlR(rsr), "borrowFor", [user, amt], nil)
779817 if ((a == a))
780818 then {
781- let pRw = updateStream(rsr, "borrow", user, amount, amount)
819+ let pRw = updateStream(rsr, "borrow", user, amt, amt)
782820 if ((pRw == pRw))
783821 then validateAfter(user, "borrowing")
784822 else throw("Strict value is not equal to itself.")
785823 }
786824 else throw("Strict value is not equal to itself.")
787825 }
788826 else throw("Strict value is not equal to itself.")
789827 }
790828
791829
792830
793831 @Callable(i)
794-func collapse (rsr,amount) = {
832+func collapse (rsr,amt) = {
795833 let user = toString(i.caller)
796- let sh = syncRewardsHeight(rsr)
834+ let sh = syncRewards(rsr)
797835 if ((sh == sh))
798836 then {
799- let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amount], nil))
837+ let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
800838 if ((c == c))
801839 then {
802840 let pRw = updateStream(rsr, "borrow", user, -(c), -(c))
803841 if ((pRw == pRw))
804842 then {
805843 let pRw2 = updateStream(rsr, "deposit", user, -(c), -(c))
806844 if ((pRw2 == pRw2))
807845 then nil
808846 else throw("Strict value is not equal to itself.")
809847 }
810848 else throw("Strict value is not equal to itself.")
811849 }
812850 else throw("Strict value is not equal to itself.")
813851 }
814852 else throw("Strict value is not equal to itself.")
815853 }
816854
817855
818856
819857 @Callable(i)
820-func claimEbReward2 (amount,lock) = {
858+func claimEbReward2 (amt,lock) = {
821859 let user = toString(i.caller)
822- let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amount], nil))
860+ let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
823861 if ((c == c))
824862 then lockOrPayout(i.caller, c, lock)
825863 else throw("Strict value is not equal to itself.")
826864 }
827865
828866
829867
830868 @Callable(i)
831-func claimReward2 (rsr,amount,lock) = {
869+func claimReward2 (rsr,amt,lock) = {
832870 let v = vlR(rsr)
833871 if ((v == v))
834872 then {
835873 let user = toString(i.caller)
836- let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amount], nil))
874+ let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
837875 if ((c == c))
838876 then lockOrPayout(i.caller, c, lock)
839877 else throw("Strict value is not equal to itself.")
840878 }
841879 else throw("Strict value is not equal to itself.")
842880 }
843881
844882
845883
846884 @Callable(i)
847885 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
848886 let user = toString(i.caller)
849887 let cr = claimAllRewardsForUser(user)
850888 if ((cr == cr))
851889 then {
852890 let lA = if (unstakeLegacy)
853891 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
854892 else 0
855893 if ((lA == lA))
856894 then lockOrPayout(i.caller, (cr + lA), lock)
857895 else throw("Strict value is not equal to itself.")
858896 }
859897 else throw("Strict value is not equal to itself.")
860898 }
861899
862900
863901
864902 @Callable(i)
865903 func disableUseAsCollateral (rsr) = {
866904 let user = toString(i.caller)
867905 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
868906 if ((d == d))
869907 then validateAfter(user, "changing collateral status")
870908 else throw("Strict value is not equal to itself.")
871909 }
872910
873911
874912
875913 @Callable(i)
876914 func transferDebt (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, false)
877915
878916
879917
880918 @Callable(i)
881919 func transferDebt2 (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, true)
882920
883921
884922
885923 @Callable(i)
886924 func forceCollapse (r,b) = forceCollapseInternal(toString(i.caller), r, b, false)
887925
888926
889927
890928 @Callable(i)
891929 func forceCollapse2 (r,b) = forceCollapseInternal(toString(i.caller), r, b, true)
892930
893931
894932
895933 @Callable(i)
896934 func lockVires (factor,migrate) = {
897935 let user = toString(i.caller)
898936 let a = spfr()
899937 if ((a == a))
900938 then {
901939 let migrateAmount = if (migrate)
902940 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
903941 else 0
904942 let total = (migrateAmount + viresPayment(i))
905943 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
906944 then nil
907945 else [AttachedPayment(viresAssetId, total)])
908946 if ((l == l))
909947 then nil
910948 else throw("Strict value is not equal to itself.")
911949 }
912950 else throw("Strict value is not equal to itself.")
913951 }
914952
915953
916954
917955 @Callable(i)
918956 func withdrawAllPossibleVires () = {
919957 let user = toString(i.caller)
920958 let a = spfr()
921959 if ((a == a))
922960 then {
923961 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
924962 if ((stakerViresAmount == stakerViresAmount))
925963 then {
926964 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
927965 if ((u == u))
928966 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
929967 else throw("Strict value is not equal to itself.")
930968 }
931969 else throw("Strict value is not equal to itself.")
932970 }
933971 else throw("Strict value is not equal to itself.")
934972 }
935973
936974
937975
938976 @Callable(i)
939977 func claimProtocolProfitFrom (from,relock) = {
940978 let user = toString(i.caller)
941979 let a = spfr()
942980 if ((a == a))
943981 then {
944982 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
945983 if ((u == u))
946984 then nil
947985 else throw("Strict value is not equal to itself.")
948986 }
949987 else throw("Strict value is not equal to itself.")
950988 }
951989
952990
953991
954992 @Callable(i)
955993 func withdrawUnlockedVires () = {
956994 let a = spfr()
957995 if ((a == a))
958996 then {
959997 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
960998 if ((u == u))
961999 then nil
9621000 else throw("Strict value is not equal to itself.")
9631001 }
9641002 else throw("Strict value is not equal to itself.")
9651003 }
9661004
9671005

github/deemru/w8io/786bc32 
181.22 ms