2022.04.05 14:22 [3060480] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "GPqPcWqYHNssKezTg34GapBCp2YKXCSBdqKAssMxg6xp", "fee": 1000000, "feeAssetId": null, "timestamp": 1649156629528, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "2wTppp142gjfZcFFivN5Md9bDAhhrBJYG8QAWDcKTgQBgYgndV41hN6rUX8w3241WNS5LLMqQ5gbFJbU8x2aFtjs" ], "script": "base64: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c2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAKZWJfcmV3YXJkcwIAAAAgbm8gZWJfcmV3YXJkcyBjb250cmFjdCBpbiBjb25maWcAAAAAC3ZpcmVzTWludGVyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAADHZpcmVzX21pbnRlcgIAAAAUbWFpbjogbm8gdmlyZXNNaW50ZXICAAAAE2ludmFsaWQgdmlyZXNNaW50ZXIAAAAAB21heWJldlMJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAMdmlyZXNfc3Rha2VyAAAAAAJ2UwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAAAdtYXliZXZTAgAAAA9ubyB2aXJlc19zdGFrZXIAAAAAAmRDCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAEmRpdmlkZW5kc19jb250cmFjdAIAAAAVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AgAAABppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAAAAAADbVZEBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MFAAAAEGRpc3RyaWJ1dG9yU3RvcmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABZAUAAAAHJG1hdGNoMAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAABZAUAAAAEdW5pdAAAAAACVkQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgUAAAADbVZEAgAAAB9ubyBkaXN0cmlidXRvciB0byBjbGFpbSByZXdhcmRzAAAAABFtYXliZVZpcmVzQXNzZXRJZAkABB0AAAACBQAAAAt2aXJlc01pbnRlcgIAAAAHYXNzZXRJZAAAAAAMdmlyZXNBc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAABFtYXliZVZpcmVzQXNzZXRJZAIAAAAXdmlyZXMgYXNzZXRJZCBub3QgZm91bmQCAAAAFWludmFsaWQgdmlyZXMgYXNzZXRJZAEAAAAMdmlyZXNQYXltZW50AAAAAQAAAAFpAwkAAAAAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAAAAAAAAAAwkBAAAAAiE9AAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAAMdmlyZXNBc3NldElkCQAAAgAAAAECAAAACW5vdCB2aXJlcwgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50AQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQAAAANyc3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAANyc3IFAAAADGFzc2V0SWRTdG9yZQIAAAARbm8gYXNzZXRJZCBpbiByc3IBAAAAEGNvbGxhdGVyYWxGYWN0b3IAAAABAAAAA3JzcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgkBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABBQAAAANyc3ICAAAAEV9Db2xsYXRlcmFsRmFjdG9yAgAAAB1ubyBDb2xsYXRlcmFsRmFjdG9yIGluIGNvbmZpZwEAAAAUbGlxdWlkYXRpb25UaHJlc2hvbGQAAAABAAAAA3JzcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgkBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABBQAAAANyc3ICAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAIAAAAhbm8gTGlxdWlkYXRpb25UaHJlc2hvbGQgaW4gY29uZmlnAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAE19MaXF1aWRhdGlvblBlbmFsdHkCAAAAH25vIExpcXVpZGF0aW9uUGVuYWx0eSBpbiBjb25maWcAAAAAFmFjY291bnRIZWFsdGhUaHJlc2hvbGQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABhhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQCAAAAG25vIGFjY291bnRfaGVhbHRoX3RocmVzaG9sZAAAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAABlubyBhY2NvdW50X2hlYWx0aF9vdmVybGFwAAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABBjb2xsYXBzZV9wZW5hbHR5AgAAABNubyBjb2xsYXBzZV9wZW5hbHR5AAAAAAtsaXF1aWRhdG9ycwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAAtsaXF1aWRhdG9ycwIAAAAAAQAAAA1maW5kUmVzZXJ2ZUJ5AAAAAgAAAAVzdG9yZQAAAAV2YWx1ZQoBAAAABGZvbGQAAAACAAAAAWEAAAABcgQAAAAHJG1hdGNoMAUAAAABYQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQWRkcmVzcwQAAAAFZm91bmQFAAAAByRtYXRjaDAFAAAABWZvdW5kBAAAAANyc3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAFyAgAAAA9yc3IgYmFkIGFkZHJlc3MDCQAAAAAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAANyc3IF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Y2FuJ3QgbGlxdWlkYXRlIGRlcG9zaXQgbm90IHVzZWQgYXMgY29sbGF0ZXJhbAQAAAANJHQwMTA2MzYxMDcyNgkBAAAAC3VzZXJCYWxhbmNlAAAAAgUAAAACYnIFAAAACGJvcnJvd2VyAwkAAAAAAAACBQAAAA0kdDAxMDYzNjEwNzI2BQAAAA0kdDAxMDYzNjEwNzI2BAAAAAt1c2VyRGVidFVzZAgFAAAADSR0MDEwNjM2MTA3MjYAAAACXzUEAAAACHVzZXJEZWJ0CAUAAAANJHQwMTA2MzYxMDcyNgAAAAJfNAQAAAAMdXNlckFzc2V0VXNkCAUAAAANJHQwMTA2MzYxMDcyNgAAAAJfMwQAAAAJdXNlckFzc2V0CAUAAAANJHQwMTA2MzYxMDcyNgAAAAJfMgQAAAAGaWdub3JlCAUAAAANJHQwMTA2MzYxMDcyNgAAAAJfMQMJAABnAAAAAgUAAAAJdXNlckFzc2V0BQAAAAh1c2VyRGVidAkAAAIAAAABAgAAAC9jYW4ndCBsaXF1aWRhdGUgZGVidCBvZiBhc3NldCBvZiBwb3NpdGl2ZSBzYWxkbwMJAABnAAAAAgAAAAAAAAAAAAUAAAATbGlxdWlkYXRlRGVidEFtb3VudAkAAAIAAAABAgAAACdjYW4ndCBsaXF1aWRhdGUgemVybyBvciBuZWdhdGl2ZSBhbW91bnQDCQAAZgAAAAIJAABoAAAAAgUAAAATbGlxdWlkYXRlRGVidEFtb3VudAAAAAAAAAAAAgkAAGUAAAACBQAAAAh1c2VyRGVidAUAAAAJdXNlckFzc2V0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAC5jYW4ndCBsaXF1aWRhdGUgbW9yZSB0aGFuIGhhbGYgb2Ygc2FsZG86IGRlYnQ9CQABpAAAAAEFAAAACHVzZXJEZWJ0AgAAAAosIGRlcG9zaXQ9CQABpAAAAAEFAAAACXVzZXJBc3NldAIAAAAYLCBsaXF1aWRhdGVEZWJ0QW1vdW50ID0gCQABpAAAAAEFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQEAAAADWNvbGxhdGVyYWxVc2QJAABrAAAAAwUAAAATbGlxdWlkYXRlRGVidEFtb3VudAUAAAALdXNlckRlYnRVc2QFAAAACHVzZXJEZWJ0BAAAAA1wZW5hbHRpemVkVXNkCQAAawAAAAMFAAAADWNvbGxhdGVyYWxVc2QJAABkAAAAAgUAAAALZmFjdG9yc0Jhc2UJAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABBQAAAAtib3Jyb3dBc3NldAUAAAALZmFjdG9yc0Jhc2UEAAAAAm1jAwUAAAANZnJvbVByb3RlY3RlZAkBAAAADm1vdmVDb2xsYXRlcmFsAAAABAUAAAAIYm9ycm93ZXIFAAAAD2NvbGxhdGVyYWxBc3NldAUAAAACY3IFAAAAEWNvbGxhdGVyYWxSZXNlcnZlBQAAAAR1bml0AwkAAAAAAAACBQAAAAJtYwUAAAACbWMEAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAJjcgIAAAASdHJhbnNmZXJBVG9rZW5zRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAANcGVuYWx0aXplZFVzZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsBAAAAARwUncxCQEAAAAKbW92ZVN0cmVhbQAAAAUFAAAAEWNvbGxhdGVyYWxSZXNlcnZlAgAAAAdkZXBvc2l0BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsAwkAAAAAAAACBQAAAARwUncxBQAAAARwUncxBAAAAA90cmFuc2ZlcnJlZERlYnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAACYnICAAAAD3RyYW5zZmVyRGVidEZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA90cmFuc2ZlcnJlZERlYnQFAAAAD3RyYW5zZmVycmVkRGVidAQAAAAEcFJ3MgkBAAAACm1vdmVTdHJlYW0AAAAFBQAAAA1ib3Jyb3dSZXNlcnZlAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyBQAAAApsaXF1aWRhdG9yBQAAAA90cmFuc2ZlcnJlZERlYnQDCQAAAAAAAAIFAAAABHBSdzIFAAAABHBSdzIEAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawMJAQAAAAhjb250YWlucwAAAAIFAAAAC2xpcXVpZGF0b3JzBQAAAApsaXF1aWRhdG9yBQAAAANuaWwJAQAAAA12YWxpZGF0ZUFmdGVyAAAAAgUAAAAKbGlxdWlkYXRvcgIAAAARdHJhbnNmZXJyaW5nIGRlYnQDCQAAAAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrCQAFFAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAVZm9yY2VDb2xsYXBzZUludGVybmFsAAAABAAAAApsaXF1aWRhdG9yAAAAA3JzcgAAAAhib3Jyb3dlcgAAAA1mcm9tUHJvdGVjdGVkBAAAAA5yZXNlcnZlQWRkcmVzcwkBAAAAA3ZsUgAAAAEFAAAAA3JzcgMJAAAAAAAAAgUAAAAOcmVzZXJ2ZUFkZHJlc3MFAAAADnJlc2VydmVBZGRyZXNzBAAAAAJzaAkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQUAAAADcnNyAwkAAAAAAAACBQAAAAJzaAUAAAACc2gDCQAAAAAAAAIFAAAACmxpcXVpZGF0b3IFAAAACGJvcnJvd2VyCQAAAgAAAAECAAAAJGNhbid0IGNvbGxhcHNlIHNlbGYgaW4gdGhpcyBmdW5jdGlvbgQAAAANJHQwMTIzODkxMjQyNAkBAAAACXVzZXJQb3dlcgAAAAEFAAAACGJvcnJvd2VyBAAAAAJicAgFAAAADSR0MDEyMzg5MTI0MjQAAAACXzEEAAAAA2JwdQgFAAAADSR0MDEyMzg5MTI0MjQAAAACXzIDCQAAZgAAAAIFAAAAAmJwBQAAAANicHUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJWNhbid0IGZvcmNlIGNvbGxhcHNlIGhlYWx0aHkgdXNlcjogdT0FAAAACGJvcnJvd2VyAgAAAAUsIGJwPQkAAaQAAAABBQAAAAJicAIAAAAGLCBicHU9CQABpAAAAAEFAAAAA2JwdQQAAAAFYXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAAHYXNzZXRJZAkAASwAAAACAgAAABhubyBhc3NldElkIGZpZWxkIGluIHJzciAFAAAAA3JzcgQAAAACbWMDBQAAAA1mcm9tUHJvdGVjdGVkCQEAAAAObW92ZUNvbGxhdGVyYWwAAAAEBQAAAAhib3Jyb3dlcgUAAAAFYXNzZXQFAAAADnJlc2VydmVBZGRyZXNzBQAAAANyc3IFAAAABHVuaXQDCQAAAAAAAAIFAAAAAm1jBQAAAAJtYwQAAAANJHQwMTI3ODgxMjg5NgkBAAAAC3VzZXJCYWxhbmNlAAAAAgUAAAAOcmVzZXJ2ZUFkZHJlc3MFAAAACGJvcnJvd2VyAwkAAAAAAAACBQAAAA0kdDAxMjc4ODEyODk2BQAAAA0kdDAxMjc4ODEyODk2BAAAAAt1c2VyRGVidFVzZAgFAAAADSR0MDEyNzg4MTI4OTYAAAACXzUEAAAACHVzZXJEZWJ0CAUAAAANJHQwMTI3ODgxMjg5NgAAAAJfNAQAAAAMdXNlckFzc2V0VXNkCAUAAAANJHQwMTI3ODgxMjg5NgAAAAJfMwQAAAAPYm9ycm93ZXJEZXBvc2l0CAUAAAANJHQwMTI3ODgxMjg5NgAAAAJfMgQAAAAGaWdub3JlCAUAAAANJHQwMTI3ODgxMjg5NgAAAAJfMQQAAAANcGVuYWx0aXplZFVzZAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAAMdXNlckFzc2V0VXNkCQAETAAAAAIFAAAAC3VzZXJEZWJ0VXNkBQAAAANuaWwFAAAAD2NvbGxhcHNlUGVuYWx0eQUAAAALZmFjdG9yc0Jhc2UEAAAAEXRyYW5zZmVycmVkQXNzZXRzCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADnJlc2VydmVBZGRyZXNzAgAAABJ0cmFuc2ZlckFUb2tlbnNGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAAA1wZW5hbHRpemVkVXNkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAARdHJhbnNmZXJyZWRBc3NldHMFAAAAEXRyYW5zZmVycmVkQXNzZXRzBAAAAARwUncxCQEAAAAKbW92ZVN0cmVhbQAAAAUFAAAAA3JzcgIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAEXRyYW5zZmVycmVkQXNzZXRzAwkAAAAAAAACBQAAAARwUncxBQAAAARwUncxBAAAAAljb2xsYXBzZWQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOcmVzZXJ2ZUFkZHJlc3MCAAAAC2NvbGxhcHNlRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAJY29sbGFwc2VkBQAAAAljb2xsYXBzZWQEAAAABHBSdzIJAQAAAAx1cGRhdGVTdHJlYW0AAAAF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", "chainId": 87, "height": 3060480, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dmgi6FXUV4QaEQPFGxxa25dYa9m7YXitjLV5Eko4j5gw Next: FYugRjNsDRPdozY7MMr1DqLPC4fLem6onpqJANtykDY6 Diff:
OldNewDifferences
3131 }
3232
3333
34-func asInt2 (value) = match value {
35- case x: (Int, Int) =>
36- x
37- case t =>
38- throw("wrong type, expected: Int2")
39-}
40-
41-
4234 func asInt3 (value) = match value {
4335 case x: (Int, Int, Int) =>
4436 x
4537 case t =>
4638 throw("wrong type, expected: Int3")
47-}
48-
49-
50-func asInt4 (value) = match value {
51- case x: (Int, Int, Int, Int) =>
52- x
53- case t =>
54- throw("wrong type, expected: Int4")
55-}
56-
57-
58-func asInt5 (value) = match value {
59- case x: (Int, Int, Int, Int, Int) =>
60- x
61- case t =>
62- throw("wrong type, expected: Int5")
6339 }
6440
6541
11793 else i.payments[0].amount
11894
11995
120-func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
96+func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, assetIdStore), "no assetId in rsr")
12197
12298
123-func collateralFactor (reserve) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
99+func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor in config")
124100
125101
126-func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
102+func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
127103
128104
129105 func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
142118 case found: Address =>
143119 found
144120 case _ =>
145- let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
146- if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
147- then reserve
121+ let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
122+ if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
123+ then rsr
148124 else unit
149125 }
150126
168144 }
169145
170146
171-func validateReserve (r) = if (contains(reservesStr, r))
172- then valueOrErrorMessage(addressFromString(r), "main: bad reserve")
173- else throw(("unknown reserve:" + r))
147+func vlR (r) = if (contains(reservesStr, r))
148+ then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
149+ else throw(("unknown rsr:" + r))
174150
175151
176-func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
152+func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
177153
178154
179155 let maybeProtectedReserve = match getString(configAddress, "protected_reserve") {
183159 unit
184160 }
185161
186-let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected reserve")
162+let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected rsr")
187163
188164 func ensureNoProtected (user) = {
189165 let has = match maybeProtectedReserve {
206182 0
207183 }
208184 func fold (totals,r) = {
209- let $t058345880 = totals
210- let totalD = $t058345880._1
211- let totalB = $t058345880._2
212- let numberOfBorrows = $t058345880._3
213- let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
214- let cf = collateralFactor(reserve)
215- let lt = liquidationThreshold(reserve)
216- let $t060506138 = userBalance(reserve, user)
217- let token = $t060506138._1
218- let asset = $t060506138._2
219- let depositUsd = $t060506138._3
220- let debt = $t060506138._4
221- let debtUsd = $t060506138._5
222- let asCollateral = $t060506138._6
185+ let $t053745420 = totals
186+ let totalD = $t053745420._1
187+ let totalB = $t053745420._2
188+ let numberOfBorrows = $t053745420._3
189+ let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
190+ let cf = collateralFactor(rsr)
191+ 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
223199 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
224200 then 1
225201 else 0))
256232
257233
258234 func getUserHealth (account) = {
259- let $t069276978 = asInt3(userPower(account))
260- let bp = $t069276978._1
261- let bpu = $t069276978._2
262- let ignore = $t069276978._3
235+ let $t064476498 = asInt3(userPower(account))
236+ let bp = $t064476498._1
237+ let bpu = $t064476498._2
238+ let ignore = $t064476498._3
263239 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
264240 }
265241
266242
267243 func validateAfter (user,op) = {
268- let $t070897120 = userPower(user)
269- let bp = $t070897120._1
270- let bpu = $t070897120._2
244+ let $t066096640 = userPower(user)
245+ let bp = $t066096640._1
246+ let bpu = $t066096640._2
271247 let accHealth = (((bp - bpu) * factorsBase) / bp)
272248 if (if ((bp == 0))
273249 then (bpu == 0)
283259 }
284260
285261
286-func updateStream (reserve,action,user,userChange,streamChange) = match mVD {
262+func updateStream (rsr,action,user,userChange,streamChange) = match mVD {
287263 case a: Address =>
288- invoke(a, "onAction", [reserve, action, user, userChange, streamChange], nil)
264+ invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
289265 case _ =>
290266 unit
291267 }
292268
293269
294-func moveStream (reserve,action,from,string,amount) = match mVD {
270+func moveStream (rsr,action,from,string,amount) = match mVD {
295271 case a: Address =>
296- invoke(a, "move", [reserve, action, from, string, amount], nil)
272+ invoke(a, "move", [rsr, action, from, string, amount], nil)
297273 case _ =>
298274 unit
299275 }
300276
301277
302-func syncRewardsHeight (reserve) = match mVD {
278+func syncRewardsHeight (rsr) = match mVD {
303279 case a: Address =>
304- invoke(a, "syncHeight", [reserve], nil)
280+ invoke(a, "syncHeight", [rsr], nil)
305281 case _ =>
306282 unit
307283 }
317293 }
318294
319295
320-func doDeposit (i,reserve,useAsCollateral) = {
296+func doDeposit (i,rsr,useAsCollateral) = {
321297 let user = toString(i.caller)
322298 let checks = ensureNoProtected(user)
323299 if ((checks == checks))
324300 then {
325- let sh = syncRewardsHeight(reserve)
301+ let sh = syncRewardsHeight(rsr)
326302 if ((sh == sh))
327303 then {
328- let action = invoke(validateReserve(reserve), "depositFor", [user, useAsCollateral], i.payments)
304+ let action = invoke(vlR(rsr), "depositFor", [user, useAsCollateral], i.payments)
329305 if ((action == action))
330306 then {
331307 let amt = i.payments[0].amount
332- let pRw = updateStream(reserve, "deposit", user, amt, amt)
308+ let pRw = updateStream(rsr, "deposit", user, amt, amt)
333309 if ((pRw == pRw))
334310 then if (!(useAsCollateral))
335311 then validateAfter(user, "depositing")
349325 if ((claimedEb == claimedEb))
350326 then {
351327 let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
352- func fold (acc,reserve) = {
353- let claimed = asInt(invoke(VD, "claimRewardFor", [reserve, user, -1], nil))
328+ func fold (acc,rsr) = {
329+ let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
354330 if ((claimed == claimed))
355331 then (acc + claimed)
356332 else throw("Strict value is not equal to itself.")
376352 }
377353
378354
379-func moveCollateral (addr,assetStr,reserve,reserveStr) = {
355+func moveCollateral (addr,assetStr,rsr,reserveStr) = {
380356 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
381357 if ((amt == amt))
382358 then {
383359 let assetId = if ((assetStr == "WAVES"))
384360 then unit
385361 else fromBase58String(assetStr)
386- let dep = invoke(reserve, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
362+ let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
387363 if ((dep == dep))
388364 then {
389365 let prop = updateStream(reserveStr, "deposit", addr, amt, amt)
410386 else if ((liquidator == borrower))
411387 then throw("can't liquidate self")
412388 else {
413- let $t01051210547 = userPower(borrower)
414- let bp = $t01051210547._1
415- let bpu = $t01051210547._2
389+ let $t099609995 = userPower(borrower)
390+ let bp = $t099609995._1
391+ let bpu = $t099609995._2
416392 if ((bp > bpu))
417393 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
418394 else {
419- let br = validateReserve(borrowReserve)
420- let cr = validateReserve(collateralReserve)
395+ let br = vlR(borrowReserve)
396+ let cr = vlR(collateralReserve)
421397 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
422398 let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), ("no assetId field in collateralReserve " + collateralReserve))
423399 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
427403 else false)
428404 then throw("can't liquidate deposit not used as collateral")
429405 else {
430- let $t01121211302 = userBalance(br, borrower)
431- if (($t01121211302 == $t01121211302))
406+ let $t01063610726 = userBalance(br, borrower)
407+ if (($t01063610726 == $t01063610726))
432408 then {
433- let userDebtUsd = $t01121211302._5
434- let userDebt = $t01121211302._4
435- let userAssetUsd = $t01121211302._3
436- let userAsset = $t01121211302._2
437- let ignore = $t01121211302._1
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
438414 if ((userAsset >= userDebt))
439415 then throw("can't liquidate debt of asset of positive saldo")
440416 else if ((0 >= liquidateDebtAmount))
490466 }
491467
492468
493-func forceCollapseInternal (liquidator,reserve,borrower,fromProtected) = {
494- let reserveAddress = validateReserve(reserve)
469+func forceCollapseInternal (liquidator,rsr,borrower,fromProtected) = {
470+ let reserveAddress = vlR(rsr)
495471 if ((reserveAddress == reserveAddress))
496472 then {
497- let sh = syncRewardsHeight(reserve)
473+ let sh = syncRewardsHeight(rsr)
498474 if ((sh == sh))
499475 then if ((liquidator == borrower))
500476 then throw("can't collapse self in this function")
501477 else {
502- let $t01298913024 = userPower(borrower)
503- let bp = $t01298913024._1
504- let bpu = $t01298913024._2
478+ let $t01238912424 = userPower(borrower)
479+ let bp = $t01238912424._1
480+ let bpu = $t01238912424._2
505481 if ((bp > bpu))
506482 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
507483 else {
508- let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in reserve " + reserve))
484+ let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in rsr " + rsr))
509485 let mc = if (fromProtected)
510- then moveCollateral(borrower, asset, reserveAddress, reserve)
486+ then moveCollateral(borrower, asset, reserveAddress, rsr)
511487 else unit
512488 if ((mc == mc))
513489 then {
514- let $t01340013508 = userBalance(reserveAddress, borrower)
515- if (($t01340013508 == $t01340013508))
490+ let $t01278812896 = userBalance(reserveAddress, borrower)
491+ if (($t01278812896 == $t01278812896))
516492 then {
517- let userDebtUsd = $t01340013508._5
518- let userDebt = $t01340013508._4
519- let userAssetUsd = $t01340013508._3
520- let borrowerDeposit = $t01340013508._2
521- let ignore = $t01340013508._1
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
522498 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
523499 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
524500 if ((transferredAssets == transferredAssets))
525501 then {
526- let pRw1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
502+ let pRw1 = moveStream(rsr, "deposit", borrower, liquidator, transferredAssets)
527503 if ((pRw1 == pRw1))
528504 then {
529505 let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
530506 if ((collapsed == collapsed))
531507 then {
532- let pRw2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
508+ let pRw2 = updateStream(rsr, "borrow", borrower, -(collapsed), -(collapsed))
533509 if ((pRw2 == pRw2))
534510 then {
535- let pRw3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
511+ let pRw3 = updateStream(rsr, "deposit", borrower, -(collapsed), -(collapsed))
536512 if ((pRw3 == pRw3))
537513 then nil
538514 else throw("Strict value is not equal to itself.")
559535 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
560536
561537
562-func wdInternal (user,reserve,amount,op) = {
563- let sh = syncRewardsHeight(toString(reserve))
538+func wdInternal (user,rsr,amount,op) = {
539+ let sh = syncRewardsHeight(toString(rsr))
564540 if ((sh == sh))
565541 then {
566- let withdrawnAmount = asInt(invoke(reserve, op, [user, amount], nil))
542+ let withdrawnAmount = asInt(invoke(rsr, op, [user, amount], nil))
567543 if ((withdrawnAmount == withdrawnAmount))
568544 then {
569- let pRw = updateStream(toString(reserve), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
545+ let pRw = updateStream(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
570546 if ((pRw == pRw))
571547 then withdrawnAmount
572548 else throw("Strict value is not equal to itself.")
583559
584560
585561 @Callable(i)
586-func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
562+func deposit (rsr,useAsCollateral) = doDeposit(i, rsr, useAsCollateral)
587563
588564
589565
590566 @Callable(i)
591-func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
567+func depositRef (rsr,useAsCollateral,ref) = doDeposit(i, rsr, useAsCollateral)
592568
593569
594570
595571 @Callable(i)
596-func repay (reserve) = {
572+func repay (rsr) = {
597573 let user = toString(i.caller)
598- let sh = syncRewardsHeight(reserve)
574+ let sh = syncRewardsHeight(rsr)
599575 if ((sh == sh))
600576 then {
601- let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
577+ let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
602578 if ((repaid == repaid))
603579 then {
604- let pRw = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
580+ let pRw = updateStream(rsr, "borrow", user, -(repaid), -(repaid))
605581 if ((pRw == pRw))
606582 then nil
607583 else throw("Strict value is not equal to itself.")
698674
699675
700676 @Callable(i)
701-func withdraw2 (reserve,amount) = {
677+func withdraw2 (rsr,amount) = {
702678 let user = toString(i.caller)
703- let sh = syncRewardsHeight(reserve)
679+ let sh = syncRewardsHeight(rsr)
704680 if ((sh == sh))
705681 then {
706- let amt = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
682+ let amt = asInt(invoke(vlR(rsr), "withdrawFor", [user, amount], nil))
707683 if ((amt == amt))
708684 then {
709- let pRw = updateStream(reserve, "deposit", user, -(amt), -(amt))
685+ let pRw = updateStream(rsr, "deposit", user, -(amt), -(amt))
710686 if ((pRw == pRw))
711687 then if (contains(liquidators, user))
712688 then nil
721697
722698
723699 @Callable(i)
724-func protectCollateral (reserve) = {
700+func protectCollateral (rsr) = {
725701 let user = toString(i.caller)
726- let r = validateReserve(reserve)
702+ let r = vlR(rsr)
727703 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
728704 if ((amt == amt))
729705 then {
750726
751727
752728 @Callable(i)
729+func normalizeCollateral (rsr) = {
730+ let addr = toString(i.caller)
731+ let rA = vlR(rsr)
732+ if ((rA == rA))
733+ then {
734+ let sh = syncRewardsHeight(rsr)
735+ if ((sh == sh))
736+ then {
737+ let assetIdStr = valueOrErrorMessage(getString(rA, "assetId"), ("no assetId field in reserveAddress " + rsr))
738+ let mc = moveCollateral(addr, assetIdStr, rA, rsr)
739+ if ((mc == mc))
740+ then nil
741+ else throw("Strict value is not equal to itself.")
742+ }
743+ else throw("Strict value is not equal to itself.")
744+ }
745+ else throw("Strict value is not equal to itself.")
746+ }
747+
748+
749+
750+@Callable(i)
753751 func borrow (assetId,amount) = {
754752 let user = toString(i.caller)
755- let reserve = findReserveBy(assetIdStore, assetId)
756- let sh = syncRewardsHeight(toString(reserve))
753+ let rsr = findReserveBy(assetIdStore, assetId)
754+ let sh = syncRewardsHeight(toString(rsr))
757755 if ((sh == sh))
758756 then {
759- let a = invoke(reserve, "borrowFor", [user, amount], nil)
757+ let a = invoke(rsr, "borrowFor", [user, amount], nil)
760758 if ((a == a))
761759 then {
762- let pRw = updateStream(toString(reserve), "borrow", user, amount, amount)
760+ let pRw = updateStream(toString(rsr), "borrow", user, amount, amount)
763761 if ((pRw == pRw))
764762 then validateAfter(user, "borrowing")
765763 else throw("Strict value is not equal to itself.")
772770
773771
774772 @Callable(i)
775-func borrow2 (reserve,amount) = {
773+func borrow2 (rsr,amount) = {
776774 let user = toString(i.caller)
777- let sh = syncRewardsHeight(reserve)
775+ let sh = syncRewardsHeight(rsr)
778776 if ((sh == sh))
779777 then {
780- let a = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
778+ let a = invoke(vlR(rsr), "borrowFor", [user, amount], nil)
781779 if ((a == a))
782780 then {
783- let pRw = updateStream(reserve, "borrow", user, amount, amount)
781+ let pRw = updateStream(rsr, "borrow", user, amount, amount)
784782 if ((pRw == pRw))
785783 then validateAfter(user, "borrowing")
786784 else throw("Strict value is not equal to itself.")
793791
794792
795793 @Callable(i)
796-func collapse (reserve,amount) = {
794+func collapse (rsr,amount) = {
797795 let user = toString(i.caller)
798- let sh = syncRewardsHeight(reserve)
796+ let sh = syncRewardsHeight(rsr)
799797 if ((sh == sh))
800798 then {
801- let c = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
799+ let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amount], nil))
802800 if ((c == c))
803801 then {
804- let pRw = updateStream(reserve, "borrow", user, -(c), -(c))
802+ let pRw = updateStream(rsr, "borrow", user, -(c), -(c))
805803 if ((pRw == pRw))
806804 then {
807- let pRw2 = updateStream(reserve, "deposit", user, -(c), -(c))
805+ let pRw2 = updateStream(rsr, "deposit", user, -(c), -(c))
808806 if ((pRw2 == pRw2))
809807 then nil
810808 else throw("Strict value is not equal to itself.")
830828
831829
832830 @Callable(i)
833-func claimReward2 (reserve,amount,lock) = {
834- let v = validateReserve(reserve)
831+func claimReward2 (rsr,amount,lock) = {
832+ let v = vlR(rsr)
835833 if ((v == v))
836834 then {
837835 let user = toString(i.caller)
838- let c = asInt(invoke(VD, "claimRewardFor", [reserve, user, amount], nil))
836+ let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amount], nil))
839837 if ((c == c))
840838 then lockOrPayout(i.caller, c, lock)
841839 else throw("Strict value is not equal to itself.")
864862
865863
866864 @Callable(i)
867-func disableUseAsCollateral (reserve) = {
865+func disableUseAsCollateral (rsr) = {
868866 let user = toString(i.caller)
869- let d = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
867+ let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
870868 if ((d == d))
871869 then validateAfter(user, "changing collateral status")
872870 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
34-func asInt2 (value) = match value {
35- case x: (Int, Int) =>
36- x
37- case t =>
38- throw("wrong type, expected: Int2")
39-}
40-
41-
4234 func asInt3 (value) = match value {
4335 case x: (Int, Int, Int) =>
4436 x
4537 case t =>
4638 throw("wrong type, expected: Int3")
47-}
48-
49-
50-func asInt4 (value) = match value {
51- case x: (Int, Int, Int, Int) =>
52- x
53- case t =>
54- throw("wrong type, expected: Int4")
55-}
56-
57-
58-func asInt5 (value) = match value {
59- case x: (Int, Int, Int, Int, Int) =>
60- x
61- case t =>
62- throw("wrong type, expected: Int5")
6339 }
6440
6541
6642 func asUserBalanceData (value) = match value {
6743 case x: (Int, Int, Int, Int, Int, Boolean) =>
6844 x
6945 case t =>
7046 throw("wrong type, expected: Int5&Boolean")
7147 }
7248
7349
7450 let configStore = "config"
7551
7652 let reservesStore = "reserves"
7753
7854 let aTokenIdStore = "aTokenId"
7955
8056 let assetIdStore = "assetId"
8157
8258 let distributorStore = "vires_distributor"
8359
8460 let configAddress = addressFromStringValue(getStringValue(this, configStore))
8561
8662 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
8763
8864 let reserves = split(reservesStr, "|")
8965
9066 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards contract in config"))
9167
9268 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "invalid viresMinter")
9369
9470 let maybevS = getString(configAddress, "vires_staker")
9571
9672 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
9773
9874 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
9975
10076 let mVD = match getString(configAddress, distributorStore) {
10177 case d: String =>
10278 addressFromStringValue(d)
10379 case _ =>
10480 unit
10581 }
10682
10783 let VD = valueOrErrorMessage(mVD, "no distributor to claim rewards")
10884
10985 let maybeViresAssetId = getString(viresMinter, "assetId")
11086
11187 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "vires assetId not found")), "invalid vires assetId")
11288
11389 func viresPayment (i) = if ((size(i.payments) == 0))
11490 then 0
11591 else if ((i.payments[0].assetId != viresAssetId))
11692 then throw("not vires")
11793 else i.payments[0].amount
11894
11995
120-func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
96+func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, assetIdStore), "no assetId in rsr")
12197
12298
123-func collateralFactor (reserve) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
99+func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no CollateralFactor in config")
124100
125101
126-func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
102+func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
127103
128104
129105 func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
130106
131107
132108 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no account_health_threshold")
133109
134110 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no account_health_overlap")
135111
136112 let collapsePenalty = valueOrErrorMessage(getInteger(configAddress, "collapse_penalty"), "no collapse_penalty")
137113
138114 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
139115
140116 func findReserveBy (store,value) = {
141117 func fold (a,r) = match a {
142118 case found: Address =>
143119 found
144120 case _ =>
145- let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
146- if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
147- then reserve
121+ let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
122+ if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
123+ then rsr
148124 else unit
149125 }
150126
151127 match let $l = reserves
152128 let $s = size($l)
153129 let $acc0 = unit
154130 func $f0_1 ($a,$i) = if (($i >= $s))
155131 then $a
156132 else fold($a, $l[$i])
157133
158134 func $f0_2 ($a,$i) = if (($i >= $s))
159135 then $a
160136 else throw("List size exceeds 7")
161137
162138 $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) {
163139 case found: Address =>
164140 found
165141 case _ =>
166142 throw(("unknown " + store))
167143 }
168144 }
169145
170146
171-func validateReserve (r) = if (contains(reservesStr, r))
172- then valueOrErrorMessage(addressFromString(r), "main: bad reserve")
173- else throw(("unknown reserve:" + r))
147+func vlR (r) = if (contains(reservesStr, r))
148+ then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
149+ else throw(("unknown rsr:" + r))
174150
175151
176-func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
152+func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
177153
178154
179155 let maybeProtectedReserve = match getString(configAddress, "protected_reserve") {
180156 case pds: String =>
181157 valueOrErrorMessage(addressFromString(pds), "bad protected_reserve")
182158 case _ =>
183159 unit
184160 }
185161
186-let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected reserve")
162+let protectedReserve = valueOrErrorMessage(maybeProtectedReserve, "no protected rsr")
187163
188164 func ensureNoProtected (user) = {
189165 let has = match maybeProtectedReserve {
190166 case pa: Address =>
191167 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
192168 case _ =>
193169 false
194170 }
195171 if (has)
196172 then throw("disallowed: can't have regular when protected exists")
197173 else unit
198174 }
199175
200176
201177 func userPower (user) = {
202178 let protectedDeposit = match maybeProtectedReserve {
203179 case pa: Address =>
204180 asInt(invoke(pa, "borrowPower", [user], nil))
205181 case _ =>
206182 0
207183 }
208184 func fold (totals,r) = {
209- let $t058345880 = totals
210- let totalD = $t058345880._1
211- let totalB = $t058345880._2
212- let numberOfBorrows = $t058345880._3
213- let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
214- let cf = collateralFactor(reserve)
215- let lt = liquidationThreshold(reserve)
216- let $t060506138 = userBalance(reserve, user)
217- let token = $t060506138._1
218- let asset = $t060506138._2
219- let depositUsd = $t060506138._3
220- let debt = $t060506138._4
221- let debtUsd = $t060506138._5
222- let asCollateral = $t060506138._6
185+ let $t053745420 = totals
186+ let totalD = $t053745420._1
187+ let totalB = $t053745420._2
188+ let numberOfBorrows = $t053745420._3
189+ let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
190+ let cf = collateralFactor(rsr)
191+ 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
223199 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
224200 then 1
225201 else 0))
226202 let effectiveDepositUsd = if (asCollateral)
227203 then depositUsd
228204 else 0
229205 let overlapUsd = min([debtUsd, effectiveDepositUsd])
230206 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
231207 if ((debtUsd > effectiveDepositUsd))
232208 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
233209 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
234210 }
235211
236212 let r = {
237213 let $l = reserves
238214 let $s = size($l)
239215 let $acc0 = $Tuple3(protectedDeposit, 0, 0)
240216 func $f0_1 ($a,$i) = if (($i >= $s))
241217 then $a
242218 else fold($a, $l[$i])
243219
244220 func $f0_2 ($a,$i) = if (($i >= $s))
245221 then $a
246222 else throw("List size exceeds 7")
247223
248224 $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)
249225 }
250226 if (if ((protectedDeposit > 0))
251227 then (r._3 > 2)
252228 else false)
253229 then throw("can't have more than 2 borrows with protected collateral")
254230 else r
255231 }
256232
257233
258234 func getUserHealth (account) = {
259- let $t069276978 = asInt3(userPower(account))
260- let bp = $t069276978._1
261- let bpu = $t069276978._2
262- let ignore = $t069276978._3
235+ let $t064476498 = asInt3(userPower(account))
236+ let bp = $t064476498._1
237+ let bpu = $t064476498._2
238+ let ignore = $t064476498._3
263239 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
264240 }
265241
266242
267243 func validateAfter (user,op) = {
268- let $t070897120 = userPower(user)
269- let bp = $t070897120._1
270- let bpu = $t070897120._2
244+ let $t066096640 = userPower(user)
245+ let bp = $t066096640._1
246+ let bpu = $t066096640._2
271247 let accHealth = (((bp - bpu) * factorsBase) / bp)
272248 if (if ((bp == 0))
273249 then (bpu == 0)
274250 else false)
275251 then nil
276252 else if (if ((bp == 0))
277253 then (bpu > 0)
278254 else false)
279255 then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
280256 else if ((accountHealthThreshold > accHealth))
281257 then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
282258 else nil
283259 }
284260
285261
286-func updateStream (reserve,action,user,userChange,streamChange) = match mVD {
262+func updateStream (rsr,action,user,userChange,streamChange) = match mVD {
287263 case a: Address =>
288- invoke(a, "onAction", [reserve, action, user, userChange, streamChange], nil)
264+ invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
289265 case _ =>
290266 unit
291267 }
292268
293269
294-func moveStream (reserve,action,from,string,amount) = match mVD {
270+func moveStream (rsr,action,from,string,amount) = match mVD {
295271 case a: Address =>
296- invoke(a, "move", [reserve, action, from, string, amount], nil)
272+ invoke(a, "move", [rsr, action, from, string, amount], nil)
297273 case _ =>
298274 unit
299275 }
300276
301277
302-func syncRewardsHeight (reserve) = match mVD {
278+func syncRewardsHeight (rsr) = match mVD {
303279 case a: Address =>
304- invoke(a, "syncHeight", [reserve], nil)
280+ invoke(a, "syncHeight", [rsr], nil)
305281 case _ =>
306282 unit
307283 }
308284
309285
310286 func lockOrPayout (recipient,amount,lock) = if (!(lock))
311287 then [ScriptTransfer(recipient, amount, viresAssetId)]
312288 else {
313289 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amount)])
314290 if ((doLock == doLock))
315291 then nil
316292 else throw("Strict value is not equal to itself.")
317293 }
318294
319295
320-func doDeposit (i,reserve,useAsCollateral) = {
296+func doDeposit (i,rsr,useAsCollateral) = {
321297 let user = toString(i.caller)
322298 let checks = ensureNoProtected(user)
323299 if ((checks == checks))
324300 then {
325- let sh = syncRewardsHeight(reserve)
301+ let sh = syncRewardsHeight(rsr)
326302 if ((sh == sh))
327303 then {
328- let action = invoke(validateReserve(reserve), "depositFor", [user, useAsCollateral], i.payments)
304+ let action = invoke(vlR(rsr), "depositFor", [user, useAsCollateral], i.payments)
329305 if ((action == action))
330306 then {
331307 let amt = i.payments[0].amount
332- let pRw = updateStream(reserve, "deposit", user, amt, amt)
308+ let pRw = updateStream(rsr, "deposit", user, amt, amt)
333309 if ((pRw == pRw))
334310 then if (!(useAsCollateral))
335311 then validateAfter(user, "depositing")
336312 else nil
337313 else throw("Strict value is not equal to itself.")
338314 }
339315 else throw("Strict value is not equal to itself.")
340316 }
341317 else throw("Strict value is not equal to itself.")
342318 }
343319 else throw("Strict value is not equal to itself.")
344320 }
345321
346322
347323 func claimAllRewardsForUser (user) = {
348324 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
349325 if ((claimedEb == claimedEb))
350326 then {
351327 let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
352- func fold (acc,reserve) = {
353- let claimed = asInt(invoke(VD, "claimRewardFor", [reserve, user, -1], nil))
328+ func fold (acc,rsr) = {
329+ let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
354330 if ((claimed == claimed))
355331 then (acc + claimed)
356332 else throw("Strict value is not equal to itself.")
357333 }
358334
359335 let claimedTotal = {
360336 let $l = rewardReserves
361337 let $s = size($l)
362338 let $acc0 = 0
363339 func $f0_1 ($a,$i) = if (($i >= $s))
364340 then $a
365341 else fold($a, $l[$i])
366342
367343 func $f0_2 ($a,$i) = if (($i >= $s))
368344 then $a
369345 else throw("List size exceeds 7")
370346
371347 $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)
372348 }
373349 (claimedTotal + claimedEb)
374350 }
375351 else throw("Strict value is not equal to itself.")
376352 }
377353
378354
379-func moveCollateral (addr,assetStr,reserve,reserveStr) = {
355+func moveCollateral (addr,assetStr,rsr,reserveStr) = {
380356 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
381357 if ((amt == amt))
382358 then {
383359 let assetId = if ((assetStr == "WAVES"))
384360 then unit
385361 else fromBase58String(assetStr)
386- let dep = invoke(reserve, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
362+ let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
387363 if ((dep == dep))
388364 then {
389365 let prop = updateStream(reserveStr, "deposit", addr, amt, amt)
390366 if ((prop == prop))
391367 then unit
392368 else throw("Strict value is not equal to itself.")
393369 }
394370 else throw("Strict value is not equal to itself.")
395371 }
396372 else throw("Strict value is not equal to itself.")
397373 }
398374
399375
400376 func transferDebtInternal (liquidator,borrowReserve,collateralReserve,borrower,liquidateDebtAmount,fromProtected) = {
401377 let sh1 = syncRewardsHeight(borrowReserve)
402378 if ((sh1 == sh1))
403379 then {
404380 let sh2 = syncRewardsHeight(collateralReserve)
405381 if ((sh2 == sh2))
406382 then if ((0 >= liquidateDebtAmount))
407383 then throw("can't liquidate non-positive amount")
408384 else if ((collateralReserve == borrowReserve))
409385 then throw("collateralReserve equals borrowReserve")
410386 else if ((liquidator == borrower))
411387 then throw("can't liquidate self")
412388 else {
413- let $t01051210547 = userPower(borrower)
414- let bp = $t01051210547._1
415- let bpu = $t01051210547._2
389+ let $t099609995 = userPower(borrower)
390+ let bp = $t099609995._1
391+ let bpu = $t099609995._2
416392 if ((bp > bpu))
417393 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
418394 else {
419- let br = validateReserve(borrowReserve)
420- let cr = validateReserve(collateralReserve)
395+ let br = vlR(borrowReserve)
396+ let cr = vlR(collateralReserve)
421397 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
422398 let collateralAsset = valueOrErrorMessage(getString(cr, "assetId"), ("no assetId field in collateralReserve " + collateralReserve))
423399 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
424400 if ((isCollateral == isCollateral))
425401 then if (if (!(fromProtected))
426402 then !(isCollateral)
427403 else false)
428404 then throw("can't liquidate deposit not used as collateral")
429405 else {
430- let $t01121211302 = userBalance(br, borrower)
431- if (($t01121211302 == $t01121211302))
406+ let $t01063610726 = userBalance(br, borrower)
407+ if (($t01063610726 == $t01063610726))
432408 then {
433- let userDebtUsd = $t01121211302._5
434- let userDebt = $t01121211302._4
435- let userAssetUsd = $t01121211302._3
436- let userAsset = $t01121211302._2
437- let ignore = $t01121211302._1
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
438414 if ((userAsset >= userDebt))
439415 then throw("can't liquidate debt of asset of positive saldo")
440416 else if ((0 >= liquidateDebtAmount))
441417 then throw("can't liquidate zero or negative amount")
442418 else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
443419 then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
444420 else {
445421 let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
446422 let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
447423 let mc = if (fromProtected)
448424 then moveCollateral(borrower, collateralAsset, cr, collateralReserve)
449425 else unit
450426 if ((mc == mc))
451427 then {
452428 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
453429 if ((transferredCollateral == transferredCollateral))
454430 then {
455431 let pRw1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
456432 if ((pRw1 == pRw1))
457433 then {
458434 let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
459435 if ((transferredDebt == transferredDebt))
460436 then {
461437 let pRw2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
462438 if ((pRw2 == pRw2))
463439 then {
464440 let liquidatorHealthCheck = if (contains(liquidators, liquidator))
465441 then nil
466442 else validateAfter(liquidator, "transferring debt")
467443 if ((liquidatorHealthCheck == liquidatorHealthCheck))
468444 then $Tuple2(liquidatorHealthCheck, transferredCollateral)
469445 else throw("Strict value is not equal to itself.")
470446 }
471447 else throw("Strict value is not equal to itself.")
472448 }
473449 else throw("Strict value is not equal to itself.")
474450 }
475451 else throw("Strict value is not equal to itself.")
476452 }
477453 else throw("Strict value is not equal to itself.")
478454 }
479455 else throw("Strict value is not equal to itself.")
480456 }
481457 }
482458 else throw("Strict value is not equal to itself.")
483459 }
484460 else throw("Strict value is not equal to itself.")
485461 }
486462 }
487463 else throw("Strict value is not equal to itself.")
488464 }
489465 else throw("Strict value is not equal to itself.")
490466 }
491467
492468
493-func forceCollapseInternal (liquidator,reserve,borrower,fromProtected) = {
494- let reserveAddress = validateReserve(reserve)
469+func forceCollapseInternal (liquidator,rsr,borrower,fromProtected) = {
470+ let reserveAddress = vlR(rsr)
495471 if ((reserveAddress == reserveAddress))
496472 then {
497- let sh = syncRewardsHeight(reserve)
473+ let sh = syncRewardsHeight(rsr)
498474 if ((sh == sh))
499475 then if ((liquidator == borrower))
500476 then throw("can't collapse self in this function")
501477 else {
502- let $t01298913024 = userPower(borrower)
503- let bp = $t01298913024._1
504- let bpu = $t01298913024._2
478+ let $t01238912424 = userPower(borrower)
479+ let bp = $t01238912424._1
480+ let bpu = $t01238912424._2
505481 if ((bp > bpu))
506482 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
507483 else {
508- let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in reserve " + reserve))
484+ let asset = valueOrErrorMessage(getString(reserveAddress, "assetId"), ("no assetId field in rsr " + rsr))
509485 let mc = if (fromProtected)
510- then moveCollateral(borrower, asset, reserveAddress, reserve)
486+ then moveCollateral(borrower, asset, reserveAddress, rsr)
511487 else unit
512488 if ((mc == mc))
513489 then {
514- let $t01340013508 = userBalance(reserveAddress, borrower)
515- if (($t01340013508 == $t01340013508))
490+ let $t01278812896 = userBalance(reserveAddress, borrower)
491+ if (($t01278812896 == $t01278812896))
516492 then {
517- let userDebtUsd = $t01340013508._5
518- let userDebt = $t01340013508._4
519- let userAssetUsd = $t01340013508._3
520- let borrowerDeposit = $t01340013508._2
521- let ignore = $t01340013508._1
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
522498 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
523499 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
524500 if ((transferredAssets == transferredAssets))
525501 then {
526- let pRw1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
502+ let pRw1 = moveStream(rsr, "deposit", borrower, liquidator, transferredAssets)
527503 if ((pRw1 == pRw1))
528504 then {
529505 let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
530506 if ((collapsed == collapsed))
531507 then {
532- let pRw2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
508+ let pRw2 = updateStream(rsr, "borrow", borrower, -(collapsed), -(collapsed))
533509 if ((pRw2 == pRw2))
534510 then {
535- let pRw3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
511+ let pRw3 = updateStream(rsr, "deposit", borrower, -(collapsed), -(collapsed))
536512 if ((pRw3 == pRw3))
537513 then nil
538514 else throw("Strict value is not equal to itself.")
539515 }
540516 else throw("Strict value is not equal to itself.")
541517 }
542518 else throw("Strict value is not equal to itself.")
543519 }
544520 else throw("Strict value is not equal to itself.")
545521 }
546522 else throw("Strict value is not equal to itself.")
547523 }
548524 else throw("Strict value is not equal to itself.")
549525 }
550526 else throw("Strict value is not equal to itself.")
551527 }
552528 }
553529 else throw("Strict value is not equal to itself.")
554530 }
555531 else throw("Strict value is not equal to itself.")
556532 }
557533
558534
559535 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
560536
561537
562-func wdInternal (user,reserve,amount,op) = {
563- let sh = syncRewardsHeight(toString(reserve))
538+func wdInternal (user,rsr,amount,op) = {
539+ let sh = syncRewardsHeight(toString(rsr))
564540 if ((sh == sh))
565541 then {
566- let withdrawnAmount = asInt(invoke(reserve, op, [user, amount], nil))
542+ let withdrawnAmount = asInt(invoke(rsr, op, [user, amount], nil))
567543 if ((withdrawnAmount == withdrawnAmount))
568544 then {
569- let pRw = updateStream(toString(reserve), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
545+ let pRw = updateStream(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
570546 if ((pRw == pRw))
571547 then withdrawnAmount
572548 else throw("Strict value is not equal to itself.")
573549 }
574550 else throw("Strict value is not equal to itself.")
575551 }
576552 else throw("Strict value is not equal to itself.")
577553 }
578554
579555
580556 @Callable(i)
581557 func initialize (ca) = [writeConstString(configStore, ca)]
582558
583559
584560
585561 @Callable(i)
586-func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
562+func deposit (rsr,useAsCollateral) = doDeposit(i, rsr, useAsCollateral)
587563
588564
589565
590566 @Callable(i)
591-func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
567+func depositRef (rsr,useAsCollateral,ref) = doDeposit(i, rsr, useAsCollateral)
592568
593569
594570
595571 @Callable(i)
596-func repay (reserve) = {
572+func repay (rsr) = {
597573 let user = toString(i.caller)
598- let sh = syncRewardsHeight(reserve)
574+ let sh = syncRewardsHeight(rsr)
599575 if ((sh == sh))
600576 then {
601- let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
577+ let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
602578 if ((repaid == repaid))
603579 then {
604- let pRw = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
580+ let pRw = updateStream(rsr, "borrow", user, -(repaid), -(repaid))
605581 if ((pRw == pRw))
606582 then nil
607583 else throw("Strict value is not equal to itself.")
608584 }
609585 else throw("Strict value is not equal to itself.")
610586 }
611587 else throw("Strict value is not equal to itself.")
612588 }
613589
614590
615591
616592 @Callable(i)
617593 func mintAtoken (aTokenId,amount) = {
618594 let user = toString(i.caller)
619595 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
620596 let sh = syncRewardsHeight(toString(targetContract))
621597 if ((sh == sh))
622598 then {
623599 let amt = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
624600 if ((amt == amt))
625601 then {
626602 let pRw = updateStream(toString(targetContract), "deposit", user, -(amt), 0)
627603 if ((pRw == pRw))
628604 then validateAfter(user, "minting")
629605 else throw("Strict value is not equal to itself.")
630606 }
631607 else throw("Strict value is not equal to itself.")
632608 }
633609 else throw("Strict value is not equal to itself.")
634610 }
635611
636612
637613
638614 @Callable(i)
639615 func replenishWithAtoken () = {
640616 let user = toString(i.caller)
641617 let checks = ensureNoProtected(user)
642618 if ((checks == checks))
643619 then {
644620 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
645621 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
646622 let sh = syncRewardsHeight(toString(targetContract))
647623 if ((sh == sh))
648624 then {
649625 let amt = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
650626 if ((amt == amt))
651627 then {
652628 let pRw = updateStream(toString(targetContract), "deposit", user, amt, 0)
653629 if ((pRw == pRw))
654630 then nil
655631 else throw("Strict value is not equal to itself.")
656632 }
657633 else throw("Strict value is not equal to itself.")
658634 }
659635 else throw("Strict value is not equal to itself.")
660636 }
661637 else throw("Strict value is not equal to itself.")
662638 }
663639
664640
665641
666642 @Callable(i)
667643 func redeemAtokens () = {
668644 let user = toString(i.caller)
669645 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
670646 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
671647 let sh = syncRewardsHeight(toString(targetContract))
672648 if ((sh == sh))
673649 then {
674650 let amt = asInt(invoke(targetContract, "redeemAtokensFor", [user], i.payments))
675651 if ((amt == amt))
676652 then {
677653 let pRw = updateStream(toString(targetContract), "deposit", user, 0, -(amt))
678654 if ((pRw == pRw))
679655 then nil
680656 else throw("Strict value is not equal to itself.")
681657 }
682658 else throw("Strict value is not equal to itself.")
683659 }
684660 else throw("Strict value is not equal to itself.")
685661 }
686662
687663
688664
689665 @Callable(i)
690666 func withdraw (assetId,amount) = {
691667 let user = toString(i.caller)
692668 let result = asInt(wdInternal(user, findReserveBy(assetIdStore, assetId), amount, "withdrawFor"))
693669 if ((result == result))
694670 then $Tuple2(validateAfter(user, "withdrawing"), result)
695671 else throw("Strict value is not equal to itself.")
696672 }
697673
698674
699675
700676 @Callable(i)
701-func withdraw2 (reserve,amount) = {
677+func withdraw2 (rsr,amount) = {
702678 let user = toString(i.caller)
703- let sh = syncRewardsHeight(reserve)
679+ let sh = syncRewardsHeight(rsr)
704680 if ((sh == sh))
705681 then {
706- let amt = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
682+ let amt = asInt(invoke(vlR(rsr), "withdrawFor", [user, amount], nil))
707683 if ((amt == amt))
708684 then {
709- let pRw = updateStream(reserve, "deposit", user, -(amt), -(amt))
685+ let pRw = updateStream(rsr, "deposit", user, -(amt), -(amt))
710686 if ((pRw == pRw))
711687 then if (contains(liquidators, user))
712688 then nil
713689 else validateAfter(user, "withdrawing2")
714690 else throw("Strict value is not equal to itself.")
715691 }
716692 else throw("Strict value is not equal to itself.")
717693 }
718694 else throw("Strict value is not equal to itself.")
719695 }
720696
721697
722698
723699 @Callable(i)
724-func protectCollateral (reserve) = {
700+func protectCollateral (rsr) = {
725701 let user = toString(i.caller)
726- let r = validateReserve(reserve)
702+ let r = vlR(rsr)
727703 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
728704 if ((amt == amt))
729705 then {
730706 let assetId = assetStrToId(getStringValue(r, assetIdStore))
731707 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(assetId, amt)])
732708 if ((p == p))
733709 then $Tuple2(validateAfter(user, "protecting"), amt)
734710 else throw("Strict value is not equal to itself.")
735711 }
736712 else throw("Strict value is not equal to itself.")
737713 }
738714
739715
740716
741717 @Callable(i)
742718 func withdrawProtectedCollateral (assetId,amount) = {
743719 let user = toString(i.caller)
744720 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amount], nil))
745721 if ((a == a))
746722 then validateAfter(user, "withdrawing protected collateral")
747723 else throw("Strict value is not equal to itself.")
748724 }
749725
750726
751727
752728 @Callable(i)
729+func normalizeCollateral (rsr) = {
730+ let addr = toString(i.caller)
731+ let rA = vlR(rsr)
732+ if ((rA == rA))
733+ then {
734+ let sh = syncRewardsHeight(rsr)
735+ if ((sh == sh))
736+ then {
737+ let assetIdStr = valueOrErrorMessage(getString(rA, "assetId"), ("no assetId field in reserveAddress " + rsr))
738+ let mc = moveCollateral(addr, assetIdStr, rA, rsr)
739+ if ((mc == mc))
740+ then nil
741+ else throw("Strict value is not equal to itself.")
742+ }
743+ else throw("Strict value is not equal to itself.")
744+ }
745+ else throw("Strict value is not equal to itself.")
746+ }
747+
748+
749+
750+@Callable(i)
753751 func borrow (assetId,amount) = {
754752 let user = toString(i.caller)
755- let reserve = findReserveBy(assetIdStore, assetId)
756- let sh = syncRewardsHeight(toString(reserve))
753+ let rsr = findReserveBy(assetIdStore, assetId)
754+ let sh = syncRewardsHeight(toString(rsr))
757755 if ((sh == sh))
758756 then {
759- let a = invoke(reserve, "borrowFor", [user, amount], nil)
757+ let a = invoke(rsr, "borrowFor", [user, amount], nil)
760758 if ((a == a))
761759 then {
762- let pRw = updateStream(toString(reserve), "borrow", user, amount, amount)
760+ let pRw = updateStream(toString(rsr), "borrow", user, amount, amount)
763761 if ((pRw == pRw))
764762 then validateAfter(user, "borrowing")
765763 else throw("Strict value is not equal to itself.")
766764 }
767765 else throw("Strict value is not equal to itself.")
768766 }
769767 else throw("Strict value is not equal to itself.")
770768 }
771769
772770
773771
774772 @Callable(i)
775-func borrow2 (reserve,amount) = {
773+func borrow2 (rsr,amount) = {
776774 let user = toString(i.caller)
777- let sh = syncRewardsHeight(reserve)
775+ let sh = syncRewardsHeight(rsr)
778776 if ((sh == sh))
779777 then {
780- let a = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
778+ let a = invoke(vlR(rsr), "borrowFor", [user, amount], nil)
781779 if ((a == a))
782780 then {
783- let pRw = updateStream(reserve, "borrow", user, amount, amount)
781+ let pRw = updateStream(rsr, "borrow", user, amount, amount)
784782 if ((pRw == pRw))
785783 then validateAfter(user, "borrowing")
786784 else throw("Strict value is not equal to itself.")
787785 }
788786 else throw("Strict value is not equal to itself.")
789787 }
790788 else throw("Strict value is not equal to itself.")
791789 }
792790
793791
794792
795793 @Callable(i)
796-func collapse (reserve,amount) = {
794+func collapse (rsr,amount) = {
797795 let user = toString(i.caller)
798- let sh = syncRewardsHeight(reserve)
796+ let sh = syncRewardsHeight(rsr)
799797 if ((sh == sh))
800798 then {
801- let c = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
799+ let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amount], nil))
802800 if ((c == c))
803801 then {
804- let pRw = updateStream(reserve, "borrow", user, -(c), -(c))
802+ let pRw = updateStream(rsr, "borrow", user, -(c), -(c))
805803 if ((pRw == pRw))
806804 then {
807- let pRw2 = updateStream(reserve, "deposit", user, -(c), -(c))
805+ let pRw2 = updateStream(rsr, "deposit", user, -(c), -(c))
808806 if ((pRw2 == pRw2))
809807 then nil
810808 else throw("Strict value is not equal to itself.")
811809 }
812810 else throw("Strict value is not equal to itself.")
813811 }
814812 else throw("Strict value is not equal to itself.")
815813 }
816814 else throw("Strict value is not equal to itself.")
817815 }
818816
819817
820818
821819 @Callable(i)
822820 func claimEbReward2 (amount,lock) = {
823821 let user = toString(i.caller)
824822 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amount], nil))
825823 if ((c == c))
826824 then lockOrPayout(i.caller, c, lock)
827825 else throw("Strict value is not equal to itself.")
828826 }
829827
830828
831829
832830 @Callable(i)
833-func claimReward2 (reserve,amount,lock) = {
834- let v = validateReserve(reserve)
831+func claimReward2 (rsr,amount,lock) = {
832+ let v = vlR(rsr)
835833 if ((v == v))
836834 then {
837835 let user = toString(i.caller)
838- let c = asInt(invoke(VD, "claimRewardFor", [reserve, user, amount], nil))
836+ let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amount], nil))
839837 if ((c == c))
840838 then lockOrPayout(i.caller, c, lock)
841839 else throw("Strict value is not equal to itself.")
842840 }
843841 else throw("Strict value is not equal to itself.")
844842 }
845843
846844
847845
848846 @Callable(i)
849847 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
850848 let user = toString(i.caller)
851849 let cr = claimAllRewardsForUser(user)
852850 if ((cr == cr))
853851 then {
854852 let lA = if (unstakeLegacy)
855853 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
856854 else 0
857855 if ((lA == lA))
858856 then lockOrPayout(i.caller, (cr + lA), lock)
859857 else throw("Strict value is not equal to itself.")
860858 }
861859 else throw("Strict value is not equal to itself.")
862860 }
863861
864862
865863
866864 @Callable(i)
867-func disableUseAsCollateral (reserve) = {
865+func disableUseAsCollateral (rsr) = {
868866 let user = toString(i.caller)
869- let d = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
867+ let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
870868 if ((d == d))
871869 then validateAfter(user, "changing collateral status")
872870 else throw("Strict value is not equal to itself.")
873871 }
874872
875873
876874
877875 @Callable(i)
878876 func transferDebt (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, false)
879877
880878
881879
882880 @Callable(i)
883881 func transferDebt2 (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, true)
884882
885883
886884
887885 @Callable(i)
888886 func forceCollapse (r,b) = forceCollapseInternal(toString(i.caller), r, b, false)
889887
890888
891889
892890 @Callable(i)
893891 func forceCollapse2 (r,b) = forceCollapseInternal(toString(i.caller), r, b, true)
894892
895893
896894
897895 @Callable(i)
898896 func lockVires (factor,migrate) = {
899897 let user = toString(i.caller)
900898 let a = spfr()
901899 if ((a == a))
902900 then {
903901 let migrateAmount = if (migrate)
904902 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
905903 else 0
906904 let total = (migrateAmount + viresPayment(i))
907905 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
908906 then nil
909907 else [AttachedPayment(viresAssetId, total)])
910908 if ((l == l))
911909 then nil
912910 else throw("Strict value is not equal to itself.")
913911 }
914912 else throw("Strict value is not equal to itself.")
915913 }
916914
917915
918916
919917 @Callable(i)
920918 func withdrawAllPossibleVires () = {
921919 let user = toString(i.caller)
922920 let a = spfr()
923921 if ((a == a))
924922 then {
925923 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
926924 if ((stakerViresAmount == stakerViresAmount))
927925 then {
928926 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
929927 if ((u == u))
930928 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
931929 else throw("Strict value is not equal to itself.")
932930 }
933931 else throw("Strict value is not equal to itself.")
934932 }
935933 else throw("Strict value is not equal to itself.")
936934 }
937935
938936
939937
940938 @Callable(i)
941939 func claimProtocolProfitFrom (from,relock) = {
942940 let user = toString(i.caller)
943941 let a = spfr()
944942 if ((a == a))
945943 then {
946944 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
947945 if ((u == u))
948946 then nil
949947 else throw("Strict value is not equal to itself.")
950948 }
951949 else throw("Strict value is not equal to itself.")
952950 }
953951
954952
955953
956954 @Callable(i)
957955 func withdrawUnlockedVires () = {
958956 let a = spfr()
959957 if ((a == a))
960958 then {
961959 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
962960 if ((u == u))
963961 then nil
964962 else throw("Strict value is not equal to itself.")
965963 }
966964 else throw("Strict value is not equal to itself.")
967965 }
968966
969967

github/deemru/w8io/786bc32 
163.73 ms