2021.08.21 15:55 [2733012] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "3frNzGBzUrUSPeRGJUEBzQjT9VXKeHBKgnG9uf3q1SMv", "fee": 1000000, "feeAssetId": null, "timestamp": 1629547984987, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "4hGCvgKpy6dUtZreyR3zAEgAbsguwFyP8SK6yiZL7x1UpsBbECg7WZhARALhaapV6ug33XYpW1uTrwYuzgb5qCdL" ], "script": "base64:AAIFAAAAAAAAAEoIAhIDCgEIEgMKAQgSBAoCCAQSBQoDCAQIEgQKAggBEgQKAggBEgQKAggBEgQKAggBEgQKAggBEgMKAQgSBgoECAgIARIECgIICAAAAB0AAAAAC2ZhY3RvcnNCYXNlAAAAAAAAAAPoAQAAAAxmcmFjdGlvbkNlaWwAAAADAAAABXZhbHVlAAAACW51bWVyYXRvcgAAAAtkZW5vbWluYXRvcgQAAAAEY2FuZAkAAGsAAAADBQAAAAV2YWx1ZQUAAAAJbnVtZXJhdG9yBQAAAAtkZW5vbWluYXRvcgQAAAABRAAAAAAAtQTzMwQAAAAFZXhhY3QJAAAAAAAAAgkAAGoAAAACCQAAaAAAAAIJAABqAAAAAgUAAAAEY2FuZAUAAAABRAkAAGoAAAACBQAAAAtkZW5vbWluYXRvcgUAAAABRAUAAAABRAkAAGoAAAACCQAAaAAAAAIJAABqAAAAAgUAAAAFdmFsdWUFAAAAAUQJAABqAAAAAgUAAAAJbnVtZXJhdG9yBQAAAAFEBQAAAAFEAwUAAAAFZXhhY3QFAAAABGNhbmQJAABkAAAAAgUAAAAEY2FuZAAAAAAAAAAAAQEAAAAQd3JpdGVDb25zdFN0cmluZwAAAAIAAAADa2V5AAAABXZhbHVlAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABVhbHJlYWR5IGluaXRpYWxpemVkOiAFAAAAA2tleQEAAAAFYXNJbnQAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAkAAAIAAAABAgAAABl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQAAAAZhc0ludDIAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKKEludCwgSW50KQQAAAABeAUAAAAHJG1hdGNoMAUAAAABeAQAAAABdAUAAAAHJG1hdGNoMAkAAAIAAAABAgAAAA1nb3Qgc29tZXRoaW5nAQAAABFhc1VzZXJCYWxhbmNlRGF0YQAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAACIoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEJvb2xlYW4pBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAFWV4cGVjdGVkIGludDUmYm9vbGVhbgAAAAAKYWRtaW5TdG9yZQIAAAAFYWRtaW4AAAAAC2NvbmZpZ1N0b3JlAgAAAAZjb25maWcAAAAADXJlc2VydmVzU3RvcmUCAAAACHJlc2VydmVzAAAAAA1hVG9rZW5JZFN0b3JlAgAAAAhhVG9rZW5JZAAAAAAMYXNzZXRJZFN0b3JlAgAAAAdhc3NldElkAAAAAAVhZG1pbgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAKYWRtaW5TdG9yZQAAAAAGY29uZmlnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAtjb25maWdTdG9yZQAAAAALcmVzZXJ2ZXNTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAA1yZXNlcnZlc1N0b3JlAgAAABZubyByZXNlcnZlcyByZWdpc3RlcmVkAAAAAAhyZXNlcnZlcwkABLUAAAACBQAAAAtyZXNlcnZlc1N0cgIAAAABfAEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB3Jlc2VydmUFAAAADGFzc2V0SWRTdG9yZQIAAAAVbm8gYXNzZXRJZCBpbiByZXNlcnZlAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAARX0NvbGxhdGVyYWxGYWN0b3ICAAAAHW5vIENvbGxhdGVyYWxGYWN0b3IgaW4gY29uZmlnAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAIAAAAhbm8gTGlxdWlkYXRpb25UaHJlc2hvbGQgaW4gY29uZmlnAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQIAAAAfbm8gTGlxdWlkYXRpb25QZW5hbHR5IGluIGNvbmZpZwAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgAAABtubyBhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQAAAAAFGFjY291bnRIZWFsdGhPdmVybGFwCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAABlubyBhY2NvdW50X2hlYWx0aF9vdmVybGFwAAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAEGNvbGxhcHNlX3BlbmFsdHkCAAAAE25vIGNvbGxhcHNlX3BlbmFsdHkAAAAAC2xpcXVpZGF0b3JzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIF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AAAABAUAAAAHcmVzZXJ2ZQIAAAALdXNlckJhbGFuY2UJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwBAAAACXVzZXJQb3dlcgAAAAEAAAAEdXNlcgoBAAAABGZvbGQAAAACAAAABnRvdGFscwAAAAFyBAAAAAskdDAzMjA3MzIzNgUAAAAGdG90YWxzBAAAAAZ0b3RhbEQIBQAAAAskdDAzMjA3MzIzNgAAAAJfMQQAAAAGdG90YWxCCAUAAAALJHQwMzIwNzMyMzYAAAACXzIEAAAAB3Jlc2VydmUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAFyAgAAABNyZXNlcnZlIGJhZCBhZGRyZXNzBAAAAAJjZgkBAAAAEGNvbGxhdGVyYWxGYWN0b3IAAAABBQAAAAdyZXNlcnZlBAAAAAJsdAkBAAAAFGxpcXVpZGF0aW9uVGhyZXNob2xkAAAAAQUAAAAHcmVzZXJ2ZQQAAAALJHQwMzQwNzM0OTUJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAAB3Jlc2VydmUFAAAABHVzZXIEAAAABXRva2VuCAUAAAALJHQwMzQwNzM0OTUAAAACXzEEAAAABWFzc2V0CAUAAAALJHQwMzQwNzM0OTUAAAACXzIEAAAACmRlcG9zaXRVc2QIBQAAAAskdDAzNDA3MzQ5NQAAAAJfMwQAAAAEZGVidAgFAAAACyR0MDM0MDczNDk1AAAAAl80BAAAAAdkZWJ0VXNkCAUAAAALJHQwMzQwNzM0OTUAAAACXzUEAAAADGFzQ29sbGF0ZXJhbAgFAAAACyR0MDM0MDczNDk1AAAAAl82BAAAABNlZmZlY3RpdmVEZXBvc2l0VXNkAwUAAAAMYXNDb2xsYXRlcmFsBQAAAApkZXBvc2l0VXNkAAAAAAAAAAAABAAAAApvdmVybGFwVXNkCQABlwAAAAEJAARMAAAAAgUAAAAHZGVidFVzZAkABEwAAAACBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkBQAAAANuaWwEAAAADW92ZXJsYXBDaGFyZ2UJAQAAAAxmcmFjdGlvbkNlaWwAAAADBQAAAApvdmVybGFwVXNkBQAAABRhY2NvdW50SGVhbHRoT3ZlcmxhcAUAAAALZmFjdG9yc0Jh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bGlxdWlkYXRlIGRlYnQgb2YgYXNzZXQgb2YgcG9zaXRpdmUgc2FsZG8DCQAAZwAAAAIAAAAAAAAAAAAFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQJAAACAAAAAQIAAAAnY2FuJ3QgbGlxdWlkYXRlIHplcm8gb3IgbmVnYXRpdmUgYW1vdW50AwkAAGYAAAACCQAAaAAAAAIFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQAAAAAAAAAAAIJAABlAAAAAgUAAAAIdXNlckRlYnQFAAAACXVzZXJBc3NldAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAuY2FuJ3QgbGlxdWlkYXRlIG1vcmUgdGhhbiBoYWxmIG9mIHNhbGRvOiBkZWJ0PQkAAaQAAAABBQAAAAh1c2VyRGVidAIAAAAKLCBkZXBvc2l0PQkAAaQAAAABBQAAAAl1c2VyQXNzZXQCAAAAGCwgbGlxdWlkYXRlRGVidEFtb3VudCA9IAkAAaQAAAABBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BAAAAA1jb2xsYXRlcmFsVXNkCQAAawAAAAMFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAAC3VzZXJEZWJ0VXNkBQAAAAh1c2VyRGVidAQAAAANcGVuYWx0aXplZFVzZAkAAGsAAAADBQAAAA1jb2xsYXRlcmFsVXNkCQAAZAAAAAIFAAAAC2ZhY3RvcnNCYXNlCQEAAAASbGlxdWlkYXRpb25QZW5hbHR5AAAAAQUAAAALYm9ycm93QXNzZXQFAAAAC2ZhY3RvcnNCYXNlBAAAABJ0cmFuc2ZlckNvbGxhdGVyYWwJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAACY3ICAAAAEnRyYW5zZmVyQVRva2Vuc0ZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAADXBlbmFsdGl6ZWRVc2QFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABJ0cmFuc2ZlckNvbGxhdGVyYWwFAAAAEnRyYW5zZmVyQ29sbGF0ZXJhbAQAAAAMdHJhbnNmZXJEZWJ0CQAD/AAAAAQFAAAAAmJyAgAAAA90cmFuc2ZlckRlYnRGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAMdHJhbnNmZXJEZWJ0BQAAAAx0cmFuc2ZlckRlYnQEAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawMJAQAAAAhjb250YWlucwAAAAIFAAAAC2xpcXVpZGF0b3JzBQAAAApsaXF1aWRhdG9yBQAAAANuaWwJAQAAAA12YWxpZGF0ZUFmdGVyAAAAAgUAAAAKbGlxdWlkYXRvcgIAAAARdHJhbnNmZXJyaW5nIGRlYnQDCQAAAAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrCQAFFAAAAAIFAAAAFWxpcXVpZGF0b3JIZWFsdGhDaGVjawUAAAASdHJhbnNmZXJDb2xsYXRlcmFsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADWZvcmNlQ29sbGFwc2UAAAACAAAAB3Jlc2VydmUAAAAIYm9ycm93ZXIEAAAAAXYJAQAAAA92YWxpZGF0ZVJlc2VydmUAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAAF2BQAAAAF2BAAAAApsaXF1aWRhdG9yCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAKbGlxdWlkYXRvcgUAAAAIYm9ycm93ZXIJAAACAAAAAQIAAAAkY2FuJ3QgY29sbGFwc2Ugc2VsZiBpbiB0aGlzIGZ1bmN0aW9uBAAAAA0kdDAxMDAzMTEwMDY2CQEAAAAJdXNlclBvd2VyAAAAAQUAAAAIYm9ycm93ZXIEAAAAAmJwCAUAAAANJHQwMTAwMzExMDA2NgAAAAJfMQQAAAADYnB1CAUAAAANJHQwMTAwMzExMDA2NgAAAAJfMgMJAABmAAAAAgUAAAACYnAFAAAAA2JwdQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAlY2FuJ3QgZm9yY2UgY29sbGFwc2UgaGVhbHRoeSB1c2VyOiB1PQUAAAAIYm9ycm93ZXICAAAABSwgYnA9CQABpAAAAAEFAAAAAmJwAgAAAAYsIGJwdT0JAAGkAAAAAQUAAAADYnB1BAAAAA5yZXNlcnZlQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHcmVzZXJ2ZQQAAAANJHQwMTAyNjkxMDM3MQkBAAAAC3VzZXJCYWxhbmNlAAAAAgUAAAAOcmVzZXJ2ZUFkZHJlc3MFAAAACGJvcnJvd2VyAwkAAAAAAAACBQAAAA0kdDAxMDI2OTEwMzcxBQAAAA0kdDAxMDI2OTEwMzcxBAAAAAt1c2VyRGVidFVzZAgFAAAADSR0MDEwMjY5MTAzNzEAAAACXzUEAAAACHVzZXJEZWJ0CAUAAAANJHQwMTAyNjkxMDM3MQAAAAJfNAQAAAAMdXNlckFzc2V0VXNkCAUAAAANJHQwMTAyNjkxMDM3MQAAAAJfMwQAAAAJdXNlckFzc2V0CAUAAAANJHQwMTAyNjkxMDM3MQAAAAJfMgQAAAAGaWdub3JlCAUAAAANJHQwMTAyNjkxMDM3MQAAAAJfMQQAAAANcGVuYWx0aXplZFVzZAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAAMdXNlckFzc2V0VXNkCQAETAAAAAIFAAAAC3VzZXJEZWJ0VXNkBQAAAANuaWwFAAAAD2NvbGxhcHNlUGVuYWx0eQUAAAALZmFjdG9yc0Jhc2UEAAAABWJvbnVzCQAD/AAAAAQFAAAADnJlc2VydmVBZGRyZXNzAgAAABJ0cmFuc2ZlckFUb2tlbnNGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAAA1wZW5hbHRpemVkVXNkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAFYm9udXMFAAAABWJvbnVzBAAAAAhjb2xsYXBzZQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAALY29sbGFwc2VGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAhjb2xsYXBzZQUAAAAIY29sbGFwc2UFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAAQLcGKg==", "chainId": 87, "height": 2733012, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4kZXUgnATnSPp1qXraveFNR7djW6D4PFLn9BCP4kZrvM Next: H1DvqbGhyaSC1rAaXt18ydZxdYe7Gc9BQTXYtHWpbLzs Diff:
OldNewDifferences
5656
5757 let config = addressFromStringValue(getStringValue(this, configStore))
5858
59-let reserves = split(valueOrErrorMessage(getString(this, reservesStore), "no reserves registered"), "|")
59+let reservesStr = valueOrErrorMessage(getString(this, reservesStore), "no reserves registered")
60+
61+let reserves = split(reservesStr, "|")
6062
6163 func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
6264
8991 else unit
9092 }
9193
92- match let $list27482777 = reserves
93- let $size27482777 = size($list27482777)
94- let $acc027482777 = unit
95- if (($size27482777 == 0))
96- then $acc027482777
94+ match let $list27782807 = reserves
95+ let $size27782807 = size($list27782807)
96+ let $acc027782807 = unit
97+ if (($size27782807 == 0))
98+ then $acc027782807
9799 else {
98- let $acc127482777 = fold($acc027482777, $list27482777[0])
99- if (($size27482777 == 1))
100- then $acc127482777
100+ let $acc127782807 = fold($acc027782807, $list27782807[0])
101+ if (($size27782807 == 1))
102+ then $acc127782807
101103 else {
102- let $acc227482777 = fold($acc127482777, $list27482777[1])
103- if (($size27482777 == 2))
104- then $acc227482777
104+ let $acc227782807 = fold($acc127782807, $list27782807[1])
105+ if (($size27782807 == 2))
106+ then $acc227782807
105107 else {
106- let $acc327482777 = fold($acc227482777, $list27482777[2])
107- if (($size27482777 == 3))
108- then $acc327482777
108+ let $acc327782807 = fold($acc227782807, $list27782807[2])
109+ if (($size27782807 == 3))
110+ then $acc327782807
109111 else {
110- let $acc427482777 = fold($acc327482777, $list27482777[3])
111- if (($size27482777 == 4))
112- then $acc427482777
112+ let $acc427782807 = fold($acc327782807, $list27782807[3])
113+ if (($size27782807 == 4))
114+ then $acc427782807
113115 else {
114- let $acc527482777 = fold($acc427482777, $list27482777[4])
115- if (($size27482777 == 5))
116- then $acc527482777
116+ let $acc527782807 = fold($acc427782807, $list27782807[4])
117+ if (($size27782807 == 5))
118+ then $acc527782807
117119 else {
118- let $acc627482777 = fold($acc527482777, $list27482777[5])
119- if (($size27482777 == 6))
120- then $acc627482777
120+ let $acc627782807 = fold($acc527782807, $list27782807[5])
121+ if (($size27782807 == 6))
122+ then $acc627782807
121123 else {
122- let $acc727482777 = fold($acc627482777, $list27482777[6])
124+ let $acc727782807 = fold($acc627782807, $list27782807[6])
123125 throw("List size exceed 6")
124126 }
125127 }
136138 }
137139
138140
141+func validateReserve (r) = if (contains(reservesStr, r))
142+ then true
143+ else throw(("unknown reserve:" + r))
144+
145+
139146 func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
140147
141148
142149 func userPower (user) = {
143150 func fold (totals,r) = {
144- let $t030683097 = totals
145- let totalD = $t030683097._1
146- let totalB = $t030683097._2
151+ let $t032073236 = totals
152+ let totalD = $t032073236._1
153+ let totalB = $t032073236._2
147154 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
148155 let cf = collateralFactor(reserve)
149156 let lt = liquidationThreshold(reserve)
150- let $t032683356 = userBalance(reserve, user)
151- let token = $t032683356._1
152- let asset = $t032683356._2
153- let depositUsd = $t032683356._3
154- let debt = $t032683356._4
155- let debtUsd = $t032683356._5
156- let asCollateral = $t032683356._6
157+ let $t034073495 = userBalance(reserve, user)
158+ let token = $t034073495._1
159+ let asset = $t034073495._2
160+ let depositUsd = $t034073495._3
161+ let debt = $t034073495._4
162+ let debtUsd = $t034073495._5
163+ let asCollateral = $t034073495._6
157164 let effectiveDepositUsd = if (asCollateral)
158165 then depositUsd
159166 else 0
164171 else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
165172 }
166173
167- let $list38233853 = reserves
168- let $size38233853 = size($list38233853)
169- let $acc038233853 = $Tuple2(0, 0)
170- if (($size38233853 == 0))
171- then $acc038233853
174+ let $list39623992 = reserves
175+ let $size39623992 = size($list39623992)
176+ let $acc039623992 = $Tuple2(0, 0)
177+ if (($size39623992 == 0))
178+ then $acc039623992
172179 else {
173- let $acc138233853 = fold($acc038233853, $list38233853[0])
174- if (($size38233853 == 1))
175- then $acc138233853
180+ let $acc139623992 = fold($acc039623992, $list39623992[0])
181+ if (($size39623992 == 1))
182+ then $acc139623992
176183 else {
177- let $acc238233853 = fold($acc138233853, $list38233853[1])
178- if (($size38233853 == 2))
179- then $acc238233853
184+ let $acc239623992 = fold($acc139623992, $list39623992[1])
185+ if (($size39623992 == 2))
186+ then $acc239623992
180187 else {
181- let $acc338233853 = fold($acc238233853, $list38233853[2])
182- if (($size38233853 == 3))
183- then $acc338233853
188+ let $acc339623992 = fold($acc239623992, $list39623992[2])
189+ if (($size39623992 == 3))
190+ then $acc339623992
184191 else {
185- let $acc438233853 = fold($acc338233853, $list38233853[3])
186- if (($size38233853 == 4))
187- then $acc438233853
192+ let $acc439623992 = fold($acc339623992, $list39623992[3])
193+ if (($size39623992 == 4))
194+ then $acc439623992
188195 else {
189- let $acc538233853 = fold($acc438233853, $list38233853[4])
190- if (($size38233853 == 5))
191- then $acc538233853
196+ let $acc539623992 = fold($acc439623992, $list39623992[4])
197+ if (($size39623992 == 5))
198+ then $acc539623992
192199 else {
193- let $acc638233853 = fold($acc538233853, $list38233853[5])
194- if (($size38233853 == 6))
195- then $acc638233853
200+ let $acc639623992 = fold($acc539623992, $list39623992[5])
201+ if (($size39623992 == 6))
202+ then $acc639623992
196203 else {
197- let $acc738233853 = fold($acc638233853, $list38233853[6])
204+ let $acc739623992 = fold($acc639623992, $list39623992[6])
198205 throw("List size exceed 6")
199206 }
200207 }
207214
208215
209216 func getUserHealth (account) = {
210- let $t039013944 = asInt2(userPower(account))
211- let bp = $t039013944._1
212- let bpu = $t039013944._2
217+ let $t040404083 = asInt2(userPower(account))
218+ let bp = $t040404083._1
219+ let bpu = $t040404083._2
213220 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
214221 }
215222
216223
217224 func validateAfter (user,op) = {
218- let $t040544085 = userPower(user)
219- let bp = $t040544085._1
220- let bpu = $t040544085._2
225+ let $t041934224 = userPower(user)
226+ let bp = $t041934224._1
227+ let bpu = $t041934224._2
221228 let accHealth = (((bp - bpu) * factorsBase) / bp)
222229 if (if ((bp == 0))
223230 then (bpu == 0)
247254
248255 @Callable(i)
249256 func deposit (reserve,useAsCollateral) = {
250- let user = toString(i.caller)
251- let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
252- if ((doDeposit == doDeposit))
253- then if (!(useAsCollateral))
254- then validateAfter(user, "depositing")
255- else nil
257+ let v = validateReserve(reserve)
258+ if ((v == v))
259+ then {
260+ let user = toString(i.caller)
261+ let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
262+ if ((doDeposit == doDeposit))
263+ then if (!(useAsCollateral))
264+ then validateAfter(user, "depositing")
265+ else nil
266+ else throw("Strict value is not equal to itself.")
267+ }
256268 else throw("Strict value is not equal to itself.")
257269 }
258270
260272
261273 @Callable(i)
262274 func depositRef (reserve,useAsCollateral,ref) = {
263- let user = toString(i.caller)
264- let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
265- if ((doDeposit == doDeposit))
266- then if (!(useAsCollateral))
267- then validateAfter(user, "depositing")
268- else nil
275+ let v = validateReserve(reserve)
276+ if ((v == v))
277+ then {
278+ let user = toString(i.caller)
279+ let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
280+ if ((doDeposit == doDeposit))
281+ then if (!(useAsCollateral))
282+ then validateAfter(user, "depositing")
283+ else nil
284+ else throw("Strict value is not equal to itself.")
285+ }
269286 else throw("Strict value is not equal to itself.")
270287 }
271288
297314
298315 @Callable(i)
299316 func withdraw2 (reserve,amount) = {
300- let user = toString(i.caller)
301- let targetContract = addressFromStringValue(reserve)
302- let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
303- if ((doWithdraw == doWithdraw))
304- then validateAfter(user, "withdrawing2")
317+ let v = validateReserve(reserve)
318+ if ((v == v))
319+ then {
320+ let user = toString(i.caller)
321+ let targetContract = addressFromStringValue(reserve)
322+ let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
323+ if ((doWithdraw == doWithdraw))
324+ then validateAfter(user, "withdrawing2")
325+ else throw("Strict value is not equal to itself.")
326+ }
305327 else throw("Strict value is not equal to itself.")
306328 }
307329
321343
322344 @Callable(i)
323345 func borrow2 (reserve,amount) = {
324- let user = toString(i.caller)
325- let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
326- let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
327- if ((doBorrow == doBorrow))
328- then validateAfter(user, "borrowing2")
346+ let v = validateReserve(reserve)
347+ if ((v == v))
348+ then {
349+ let user = toString(i.caller)
350+ let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
351+ let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
352+ if ((doBorrow == doBorrow))
353+ then validateAfter(user, "borrowing2")
354+ else throw("Strict value is not equal to itself.")
355+ }
329356 else throw("Strict value is not equal to itself.")
330357 }
331358
333360
334361 @Callable(i)
335362 func disableUseAsCollateral (reserve) = {
336- let user = toString(i.caller)
337- let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
338- if ((doSetCollateral == doSetCollateral))
339- then validateAfter(user, "changing collateral status")
363+ let v = validateReserve(reserve)
364+ if ((v == v))
365+ then {
366+ let user = toString(i.caller)
367+ let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
368+ if ((doSetCollateral == doSetCollateral))
369+ then validateAfter(user, "changing collateral status")
370+ else throw("Strict value is not equal to itself.")
371+ }
340372 else throw("Strict value is not equal to itself.")
341373 }
342374
343375
344376
345377 @Callable(i)
346-func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = if ((0 >= liquidateDebtAmount))
347- then throw("can't liquidate non-positive amount")
348- else if ((collateralReserve == borrowReserve))
349- then throw("collateralReserve equals borrowReserve")
350- else {
351- let liquidator = toString(i.caller)
352- if ((liquidator == borrower))
353- then throw("can't liquidate self")
378+func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
379+ let v = if (validateReserve(borrowReserve))
380+ then validateReserve(collateralReserve)
381+ else false
382+ if ((v == v))
383+ then if ((0 >= liquidateDebtAmount))
384+ then throw("can't liquidate non-positive amount")
385+ else if ((collateralReserve == borrowReserve))
386+ then throw("collateralReserve equals borrowReserve")
354387 else {
355- let $t077437778 = userPower(borrower)
356- let bp = $t077437778._1
357- let bpu = $t077437778._2
358- if ((bp > bpu))
359- then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
388+ let liquidator = toString(i.caller)
389+ if ((liquidator == borrower))
390+ then throw("can't liquidate self")
360391 else {
361- let br = addressFromStringValue(borrowReserve)
362- let cr = addressFromStringValue(collateralReserve)
363- let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
364- let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
365- if ((isCollateral == isCollateral))
366- then if (!(isCollateral))
367- then throw("can't liquidate deposit not used as collateral")
368- else {
369- let $t083108400 = userBalance(br, borrower)
370- if (($t083108400 == $t083108400))
371- then {
372- let userDebtUsd = $t083108400._5
373- let userDebt = $t083108400._4
374- let userAssetUsd = $t083108400._3
375- let userAsset = $t083108400._2
376- let ignore = $t083108400._1
377- if ((userAsset >= userDebt))
378- then throw("can't liquidate debt of asset of positive saldo")
379- else if ((0 >= liquidateDebtAmount))
380- then throw("can't liquidate zero or negative amount")
381- else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
382- then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
383- else {
384- let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
385- let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
386- let transferCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
387- if ((transferCollateral == transferCollateral))
388- then {
389- let transferDebt = invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil)
390- if ((transferDebt == transferDebt))
392+ let $t080738108 = userPower(borrower)
393+ let bp = $t080738108._1
394+ let bpu = $t080738108._2
395+ if ((bp > bpu))
396+ then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
397+ else {
398+ let br = addressFromStringValue(borrowReserve)
399+ let cr = addressFromStringValue(collateralReserve)
400+ let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
401+ let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
402+ if ((isCollateral == isCollateral))
403+ then if (!(isCollateral))
404+ then throw("can't liquidate deposit not used as collateral")
405+ else {
406+ let $t086408730 = userBalance(br, borrower)
407+ if (($t086408730 == $t086408730))
408+ then {
409+ let userDebtUsd = $t086408730._5
410+ let userDebt = $t086408730._4
411+ let userAssetUsd = $t086408730._3
412+ let userAsset = $t086408730._2
413+ let ignore = $t086408730._1
414+ if ((userAsset >= userDebt))
415+ then throw("can't liquidate debt of asset of positive saldo")
416+ else if ((0 >= liquidateDebtAmount))
417+ then throw("can't liquidate zero or negative amount")
418+ else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
419+ then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
420+ else {
421+ let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
422+ let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
423+ let transferCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
424+ if ((transferCollateral == transferCollateral))
391425 then {
392- let liquidatorHealthCheck = if (contains(liquidators, liquidator))
393- then nil
394- else validateAfter(liquidator, "transferring debt")
395- if ((liquidatorHealthCheck == liquidatorHealthCheck))
396- then $Tuple2(liquidatorHealthCheck, transferCollateral)
426+ let transferDebt = invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil)
427+ if ((transferDebt == transferDebt))
428+ then {
429+ let liquidatorHealthCheck = if (contains(liquidators, liquidator))
430+ then nil
431+ else validateAfter(liquidator, "transferring debt")
432+ if ((liquidatorHealthCheck == liquidatorHealthCheck))
433+ then $Tuple2(liquidatorHealthCheck, transferCollateral)
434+ else throw("Strict value is not equal to itself.")
435+ }
397436 else throw("Strict value is not equal to itself.")
398437 }
399438 else throw("Strict value is not equal to itself.")
400439 }
401- else throw("Strict value is not equal to itself.")
402- }
440+ }
441+ else throw("Strict value is not equal to itself.")
403442 }
404- else throw("Strict value is not equal to itself.")
405- }
406- else throw("Strict value is not equal to itself.")
443+ else throw("Strict value is not equal to itself.")
444+ }
407445 }
408446 }
409- }
447+ else throw("Strict value is not equal to itself.")
448+ }
410449
411450
412451
413452 @Callable(i)
414453 func forceCollapse (reserve,borrower) = {
415- let liquidator = toString(i.caller)
416- if ((liquidator == borrower))
417- then throw("can't collapse self in this function")
418- else {
419- let $t096629697 = userPower(borrower)
420- let bp = $t096629697._1
421- let bpu = $t096629697._2
422- if ((bp > bpu))
423- then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
454+ let v = validateReserve(reserve)
455+ if ((v == v))
456+ then {
457+ let liquidator = toString(i.caller)
458+ if ((liquidator == borrower))
459+ then throw("can't collapse self in this function")
424460 else {
425- let reserveAddress = addressFromStringValue(reserve)
426- let $t0990010002 = userBalance(reserveAddress, borrower)
427- if (($t0990010002 == $t0990010002))
428- then {
429- let userDebtUsd = $t0990010002._5
430- let userDebt = $t0990010002._4
431- let userAssetUsd = $t0990010002._3
432- let userAsset = $t0990010002._2
433- let ignore = $t0990010002._1
434- let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
435- let bonus = invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil)
436- if ((bonus == bonus))
461+ let $t01003110066 = userPower(borrower)
462+ let bp = $t01003110066._1
463+ let bpu = $t01003110066._2
464+ if ((bp > bpu))
465+ then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
466+ else {
467+ let reserveAddress = addressFromStringValue(reserve)
468+ let $t01026910371 = userBalance(reserveAddress, borrower)
469+ if (($t01026910371 == $t01026910371))
437470 then {
438- let collapse = invoke(reserveAddress, "collapseFor", [borrower], nil)
439- if ((collapse == collapse))
440- then nil
471+ let userDebtUsd = $t01026910371._5
472+ let userDebt = $t01026910371._4
473+ let userAssetUsd = $t01026910371._3
474+ let userAsset = $t01026910371._2
475+ let ignore = $t01026910371._1
476+ let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
477+ let bonus = invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil)
478+ if ((bonus == bonus))
479+ then {
480+ let collapse = invoke(reserveAddress, "collapseFor", [borrower], nil)
481+ if ((collapse == collapse))
482+ then nil
483+ else throw("Strict value is not equal to itself.")
484+ }
441485 else throw("Strict value is not equal to itself.")
442486 }
443487 else throw("Strict value is not equal to itself.")
444488 }
445- else throw("Strict value is not equal to itself.")
446489 }
447490 }
491+ else throw("Strict value is not equal to itself.")
448492 }
449493
450494
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fractionCeil (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
1717 then StringEntry(key, value)
1818 else throw(("already initialized: " + key))
1919
2020
2121 func asInt (value) = match value {
2222 case int: Int =>
2323 int
2424 case _ =>
2525 throw("wrong type, expected: Int")
2626 }
2727
2828
2929 func asInt2 (value) = match value {
3030 case x: (Int, Int) =>
3131 x
3232 case t =>
3333 throw("got something")
3434 }
3535
3636
3737 func asUserBalanceData (value) = match value {
3838 case x: (Int, Int, Int, Int, Int, Boolean) =>
3939 x
4040 case t =>
4141 throw("expected int5&boolean")
4242 }
4343
4444
4545 let adminStore = "admin"
4646
4747 let configStore = "config"
4848
4949 let reservesStore = "reserves"
5050
5151 let aTokenIdStore = "aTokenId"
5252
5353 let assetIdStore = "assetId"
5454
5555 let admin = addressFromStringValue(getStringValue(this, adminStore))
5656
5757 let config = addressFromStringValue(getStringValue(this, configStore))
5858
59-let reserves = split(valueOrErrorMessage(getString(this, reservesStore), "no reserves registered"), "|")
59+let reservesStr = valueOrErrorMessage(getString(this, reservesStore), "no reserves registered")
60+
61+let reserves = split(reservesStr, "|")
6062
6163 func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
6264
6365
6466 func collateralFactor (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
6567
6668
6769 func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
6870
6971
7072 func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(config, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
7173
7274
7375 let accountHealthThreshold = valueOrErrorMessage(getInteger(config, "account_health_threshold"), "no account_health_threshold")
7476
7577 let accountHealthOverlap = valueOrErrorMessage(getInteger(config, "account_health_overlap"), "no account_health_overlap")
7678
7779 let collapsePenalty = valueOrErrorMessage(getInteger(config, "collapse_penalty"), "no collapse_penalty")
7880
7981 let liquidators = valueOrElse(getString(config, "liquidators"), "")
8082
8183 func findReserveBy (store,value) = {
8284 func fold (a,r) = match a {
8385 case found: Address =>
8486 found
8587 case _ =>
8688 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
8789 if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
8890 then reserve
8991 else unit
9092 }
9193
92- match let $list27482777 = reserves
93- let $size27482777 = size($list27482777)
94- let $acc027482777 = unit
95- if (($size27482777 == 0))
96- then $acc027482777
94+ match let $list27782807 = reserves
95+ let $size27782807 = size($list27782807)
96+ let $acc027782807 = unit
97+ if (($size27782807 == 0))
98+ then $acc027782807
9799 else {
98- let $acc127482777 = fold($acc027482777, $list27482777[0])
99- if (($size27482777 == 1))
100- then $acc127482777
100+ let $acc127782807 = fold($acc027782807, $list27782807[0])
101+ if (($size27782807 == 1))
102+ then $acc127782807
101103 else {
102- let $acc227482777 = fold($acc127482777, $list27482777[1])
103- if (($size27482777 == 2))
104- then $acc227482777
104+ let $acc227782807 = fold($acc127782807, $list27782807[1])
105+ if (($size27782807 == 2))
106+ then $acc227782807
105107 else {
106- let $acc327482777 = fold($acc227482777, $list27482777[2])
107- if (($size27482777 == 3))
108- then $acc327482777
108+ let $acc327782807 = fold($acc227782807, $list27782807[2])
109+ if (($size27782807 == 3))
110+ then $acc327782807
109111 else {
110- let $acc427482777 = fold($acc327482777, $list27482777[3])
111- if (($size27482777 == 4))
112- then $acc427482777
112+ let $acc427782807 = fold($acc327782807, $list27782807[3])
113+ if (($size27782807 == 4))
114+ then $acc427782807
113115 else {
114- let $acc527482777 = fold($acc427482777, $list27482777[4])
115- if (($size27482777 == 5))
116- then $acc527482777
116+ let $acc527782807 = fold($acc427782807, $list27782807[4])
117+ if (($size27782807 == 5))
118+ then $acc527782807
117119 else {
118- let $acc627482777 = fold($acc527482777, $list27482777[5])
119- if (($size27482777 == 6))
120- then $acc627482777
120+ let $acc627782807 = fold($acc527782807, $list27782807[5])
121+ if (($size27782807 == 6))
122+ then $acc627782807
121123 else {
122- let $acc727482777 = fold($acc627482777, $list27482777[6])
124+ let $acc727782807 = fold($acc627782807, $list27782807[6])
123125 throw("List size exceed 6")
124126 }
125127 }
126128 }
127129 }
128130 }
129131 }
130132 } {
131133 case found: Address =>
132134 found
133135 case _ =>
134136 throw(("unknown " + store))
135137 }
136138 }
137139
138140
141+func validateReserve (r) = if (contains(reservesStr, r))
142+ then true
143+ else throw(("unknown reserve:" + r))
144+
145+
139146 func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
140147
141148
142149 func userPower (user) = {
143150 func fold (totals,r) = {
144- let $t030683097 = totals
145- let totalD = $t030683097._1
146- let totalB = $t030683097._2
151+ let $t032073236 = totals
152+ let totalD = $t032073236._1
153+ let totalB = $t032073236._2
147154 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
148155 let cf = collateralFactor(reserve)
149156 let lt = liquidationThreshold(reserve)
150- let $t032683356 = userBalance(reserve, user)
151- let token = $t032683356._1
152- let asset = $t032683356._2
153- let depositUsd = $t032683356._3
154- let debt = $t032683356._4
155- let debtUsd = $t032683356._5
156- let asCollateral = $t032683356._6
157+ let $t034073495 = userBalance(reserve, user)
158+ let token = $t034073495._1
159+ let asset = $t034073495._2
160+ let depositUsd = $t034073495._3
161+ let debt = $t034073495._4
162+ let debtUsd = $t034073495._5
163+ let asCollateral = $t034073495._6
157164 let effectiveDepositUsd = if (asCollateral)
158165 then depositUsd
159166 else 0
160167 let overlapUsd = min([debtUsd, effectiveDepositUsd])
161168 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
162169 if ((debtUsd > effectiveDepositUsd))
163170 then $Tuple2(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge))
164171 else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
165172 }
166173
167- let $list38233853 = reserves
168- let $size38233853 = size($list38233853)
169- let $acc038233853 = $Tuple2(0, 0)
170- if (($size38233853 == 0))
171- then $acc038233853
174+ let $list39623992 = reserves
175+ let $size39623992 = size($list39623992)
176+ let $acc039623992 = $Tuple2(0, 0)
177+ if (($size39623992 == 0))
178+ then $acc039623992
172179 else {
173- let $acc138233853 = fold($acc038233853, $list38233853[0])
174- if (($size38233853 == 1))
175- then $acc138233853
180+ let $acc139623992 = fold($acc039623992, $list39623992[0])
181+ if (($size39623992 == 1))
182+ then $acc139623992
176183 else {
177- let $acc238233853 = fold($acc138233853, $list38233853[1])
178- if (($size38233853 == 2))
179- then $acc238233853
184+ let $acc239623992 = fold($acc139623992, $list39623992[1])
185+ if (($size39623992 == 2))
186+ then $acc239623992
180187 else {
181- let $acc338233853 = fold($acc238233853, $list38233853[2])
182- if (($size38233853 == 3))
183- then $acc338233853
188+ let $acc339623992 = fold($acc239623992, $list39623992[2])
189+ if (($size39623992 == 3))
190+ then $acc339623992
184191 else {
185- let $acc438233853 = fold($acc338233853, $list38233853[3])
186- if (($size38233853 == 4))
187- then $acc438233853
192+ let $acc439623992 = fold($acc339623992, $list39623992[3])
193+ if (($size39623992 == 4))
194+ then $acc439623992
188195 else {
189- let $acc538233853 = fold($acc438233853, $list38233853[4])
190- if (($size38233853 == 5))
191- then $acc538233853
196+ let $acc539623992 = fold($acc439623992, $list39623992[4])
197+ if (($size39623992 == 5))
198+ then $acc539623992
192199 else {
193- let $acc638233853 = fold($acc538233853, $list38233853[5])
194- if (($size38233853 == 6))
195- then $acc638233853
200+ let $acc639623992 = fold($acc539623992, $list39623992[5])
201+ if (($size39623992 == 6))
202+ then $acc639623992
196203 else {
197- let $acc738233853 = fold($acc638233853, $list38233853[6])
204+ let $acc739623992 = fold($acc639623992, $list39623992[6])
198205 throw("List size exceed 6")
199206 }
200207 }
201208 }
202209 }
203210 }
204211 }
205212 }
206213 }
207214
208215
209216 func getUserHealth (account) = {
210- let $t039013944 = asInt2(userPower(account))
211- let bp = $t039013944._1
212- let bpu = $t039013944._2
217+ let $t040404083 = asInt2(userPower(account))
218+ let bp = $t040404083._1
219+ let bpu = $t040404083._2
213220 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
214221 }
215222
216223
217224 func validateAfter (user,op) = {
218- let $t040544085 = userPower(user)
219- let bp = $t040544085._1
220- let bpu = $t040544085._2
225+ let $t041934224 = userPower(user)
226+ let bp = $t041934224._1
227+ let bpu = $t041934224._2
221228 let accHealth = (((bp - bpu) * factorsBase) / bp)
222229 if (if ((bp == 0))
223230 then (bpu == 0)
224231 else false)
225232 then nil
226233 else if (if ((bp == 0))
227234 then (bpu > 0)
228235 else false)
229236 then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
230237 else if ((accountHealthThreshold > accHealth))
231238 then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
232239 else nil
233240 }
234241
235242
236243 @Callable(i)
237244 func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
238245
239246
240247
241248 @Callable(i)
242249 func registerReserves (addresses) = if ((i.caller != admin))
243250 then throw("only admin can do")
244251 else [StringEntry(reservesStore, addresses)]
245252
246253
247254
248255 @Callable(i)
249256 func deposit (reserve,useAsCollateral) = {
250- let user = toString(i.caller)
251- let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
252- if ((doDeposit == doDeposit))
253- then if (!(useAsCollateral))
254- then validateAfter(user, "depositing")
255- else nil
257+ let v = validateReserve(reserve)
258+ if ((v == v))
259+ then {
260+ let user = toString(i.caller)
261+ let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
262+ if ((doDeposit == doDeposit))
263+ then if (!(useAsCollateral))
264+ then validateAfter(user, "depositing")
265+ else nil
266+ else throw("Strict value is not equal to itself.")
267+ }
256268 else throw("Strict value is not equal to itself.")
257269 }
258270
259271
260272
261273 @Callable(i)
262274 func depositRef (reserve,useAsCollateral,ref) = {
263- let user = toString(i.caller)
264- let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
265- if ((doDeposit == doDeposit))
266- then if (!(useAsCollateral))
267- then validateAfter(user, "depositing")
268- else nil
275+ let v = validateReserve(reserve)
276+ if ((v == v))
277+ then {
278+ let user = toString(i.caller)
279+ let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
280+ if ((doDeposit == doDeposit))
281+ then if (!(useAsCollateral))
282+ then validateAfter(user, "depositing")
283+ else nil
284+ else throw("Strict value is not equal to itself.")
285+ }
269286 else throw("Strict value is not equal to itself.")
270287 }
271288
272289
273290
274291 @Callable(i)
275292 func mintAtoken (aTokenId,amount) = {
276293 let user = toString(i.caller)
277294 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
278295 let doMint = invoke(targetContract, "mintAtokenFor", [user, amount], nil)
279296 if ((doMint == doMint))
280297 then validateAfter(user, "minting")
281298 else throw("Strict value is not equal to itself.")
282299 }
283300
284301
285302
286303 @Callable(i)
287304 func withdraw (assetId,amount) = {
288305 let user = toString(i.caller)
289306 let targetContract = findReserveBy(assetIdStore, assetId)
290307 let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
291308 if ((doWithdraw == doWithdraw))
292309 then validateAfter(user, "withdrawing")
293310 else throw("Strict value is not equal to itself.")
294311 }
295312
296313
297314
298315 @Callable(i)
299316 func withdraw2 (reserve,amount) = {
300- let user = toString(i.caller)
301- let targetContract = addressFromStringValue(reserve)
302- let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
303- if ((doWithdraw == doWithdraw))
304- then validateAfter(user, "withdrawing2")
317+ let v = validateReserve(reserve)
318+ if ((v == v))
319+ then {
320+ let user = toString(i.caller)
321+ let targetContract = addressFromStringValue(reserve)
322+ let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
323+ if ((doWithdraw == doWithdraw))
324+ then validateAfter(user, "withdrawing2")
325+ else throw("Strict value is not equal to itself.")
326+ }
305327 else throw("Strict value is not equal to itself.")
306328 }
307329
308330
309331
310332 @Callable(i)
311333 func borrow (assetId,amount) = {
312334 let user = toString(i.caller)
313335 let targetContract = findReserveBy(assetIdStore, assetId)
314336 let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
315337 if ((doBorrow == doBorrow))
316338 then validateAfter(user, "borrowing")
317339 else throw("Strict value is not equal to itself.")
318340 }
319341
320342
321343
322344 @Callable(i)
323345 func borrow2 (reserve,amount) = {
324- let user = toString(i.caller)
325- let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
326- let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
327- if ((doBorrow == doBorrow))
328- then validateAfter(user, "borrowing2")
346+ let v = validateReserve(reserve)
347+ if ((v == v))
348+ then {
349+ let user = toString(i.caller)
350+ let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
351+ let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
352+ if ((doBorrow == doBorrow))
353+ then validateAfter(user, "borrowing2")
354+ else throw("Strict value is not equal to itself.")
355+ }
329356 else throw("Strict value is not equal to itself.")
330357 }
331358
332359
333360
334361 @Callable(i)
335362 func disableUseAsCollateral (reserve) = {
336- let user = toString(i.caller)
337- let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
338- if ((doSetCollateral == doSetCollateral))
339- then validateAfter(user, "changing collateral status")
363+ let v = validateReserve(reserve)
364+ if ((v == v))
365+ then {
366+ let user = toString(i.caller)
367+ let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
368+ if ((doSetCollateral == doSetCollateral))
369+ then validateAfter(user, "changing collateral status")
370+ else throw("Strict value is not equal to itself.")
371+ }
340372 else throw("Strict value is not equal to itself.")
341373 }
342374
343375
344376
345377 @Callable(i)
346-func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = if ((0 >= liquidateDebtAmount))
347- then throw("can't liquidate non-positive amount")
348- else if ((collateralReserve == borrowReserve))
349- then throw("collateralReserve equals borrowReserve")
350- else {
351- let liquidator = toString(i.caller)
352- if ((liquidator == borrower))
353- then throw("can't liquidate self")
378+func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
379+ let v = if (validateReserve(borrowReserve))
380+ then validateReserve(collateralReserve)
381+ else false
382+ if ((v == v))
383+ then if ((0 >= liquidateDebtAmount))
384+ then throw("can't liquidate non-positive amount")
385+ else if ((collateralReserve == borrowReserve))
386+ then throw("collateralReserve equals borrowReserve")
354387 else {
355- let $t077437778 = userPower(borrower)
356- let bp = $t077437778._1
357- let bpu = $t077437778._2
358- if ((bp > bpu))
359- then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
388+ let liquidator = toString(i.caller)
389+ if ((liquidator == borrower))
390+ then throw("can't liquidate self")
360391 else {
361- let br = addressFromStringValue(borrowReserve)
362- let cr = addressFromStringValue(collateralReserve)
363- let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
364- let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
365- if ((isCollateral == isCollateral))
366- then if (!(isCollateral))
367- then throw("can't liquidate deposit not used as collateral")
368- else {
369- let $t083108400 = userBalance(br, borrower)
370- if (($t083108400 == $t083108400))
371- then {
372- let userDebtUsd = $t083108400._5
373- let userDebt = $t083108400._4
374- let userAssetUsd = $t083108400._3
375- let userAsset = $t083108400._2
376- let ignore = $t083108400._1
377- if ((userAsset >= userDebt))
378- then throw("can't liquidate debt of asset of positive saldo")
379- else if ((0 >= liquidateDebtAmount))
380- then throw("can't liquidate zero or negative amount")
381- else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
382- then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
383- else {
384- let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
385- let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
386- let transferCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
387- if ((transferCollateral == transferCollateral))
388- then {
389- let transferDebt = invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil)
390- if ((transferDebt == transferDebt))
392+ let $t080738108 = userPower(borrower)
393+ let bp = $t080738108._1
394+ let bpu = $t080738108._2
395+ if ((bp > bpu))
396+ then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
397+ else {
398+ let br = addressFromStringValue(borrowReserve)
399+ let cr = addressFromStringValue(collateralReserve)
400+ let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
401+ let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
402+ if ((isCollateral == isCollateral))
403+ then if (!(isCollateral))
404+ then throw("can't liquidate deposit not used as collateral")
405+ else {
406+ let $t086408730 = userBalance(br, borrower)
407+ if (($t086408730 == $t086408730))
408+ then {
409+ let userDebtUsd = $t086408730._5
410+ let userDebt = $t086408730._4
411+ let userAssetUsd = $t086408730._3
412+ let userAsset = $t086408730._2
413+ let ignore = $t086408730._1
414+ if ((userAsset >= userDebt))
415+ then throw("can't liquidate debt of asset of positive saldo")
416+ else if ((0 >= liquidateDebtAmount))
417+ then throw("can't liquidate zero or negative amount")
418+ else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
419+ then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
420+ else {
421+ let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
422+ let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
423+ let transferCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
424+ if ((transferCollateral == transferCollateral))
391425 then {
392- let liquidatorHealthCheck = if (contains(liquidators, liquidator))
393- then nil
394- else validateAfter(liquidator, "transferring debt")
395- if ((liquidatorHealthCheck == liquidatorHealthCheck))
396- then $Tuple2(liquidatorHealthCheck, transferCollateral)
426+ let transferDebt = invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil)
427+ if ((transferDebt == transferDebt))
428+ then {
429+ let liquidatorHealthCheck = if (contains(liquidators, liquidator))
430+ then nil
431+ else validateAfter(liquidator, "transferring debt")
432+ if ((liquidatorHealthCheck == liquidatorHealthCheck))
433+ then $Tuple2(liquidatorHealthCheck, transferCollateral)
434+ else throw("Strict value is not equal to itself.")
435+ }
397436 else throw("Strict value is not equal to itself.")
398437 }
399438 else throw("Strict value is not equal to itself.")
400439 }
401- else throw("Strict value is not equal to itself.")
402- }
440+ }
441+ else throw("Strict value is not equal to itself.")
403442 }
404- else throw("Strict value is not equal to itself.")
405- }
406- else throw("Strict value is not equal to itself.")
443+ else throw("Strict value is not equal to itself.")
444+ }
407445 }
408446 }
409- }
447+ else throw("Strict value is not equal to itself.")
448+ }
410449
411450
412451
413452 @Callable(i)
414453 func forceCollapse (reserve,borrower) = {
415- let liquidator = toString(i.caller)
416- if ((liquidator == borrower))
417- then throw("can't collapse self in this function")
418- else {
419- let $t096629697 = userPower(borrower)
420- let bp = $t096629697._1
421- let bpu = $t096629697._2
422- if ((bp > bpu))
423- then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
454+ let v = validateReserve(reserve)
455+ if ((v == v))
456+ then {
457+ let liquidator = toString(i.caller)
458+ if ((liquidator == borrower))
459+ then throw("can't collapse self in this function")
424460 else {
425- let reserveAddress = addressFromStringValue(reserve)
426- let $t0990010002 = userBalance(reserveAddress, borrower)
427- if (($t0990010002 == $t0990010002))
428- then {
429- let userDebtUsd = $t0990010002._5
430- let userDebt = $t0990010002._4
431- let userAssetUsd = $t0990010002._3
432- let userAsset = $t0990010002._2
433- let ignore = $t0990010002._1
434- let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
435- let bonus = invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil)
436- if ((bonus == bonus))
461+ let $t01003110066 = userPower(borrower)
462+ let bp = $t01003110066._1
463+ let bpu = $t01003110066._2
464+ if ((bp > bpu))
465+ then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
466+ else {
467+ let reserveAddress = addressFromStringValue(reserve)
468+ let $t01026910371 = userBalance(reserveAddress, borrower)
469+ if (($t01026910371 == $t01026910371))
437470 then {
438- let collapse = invoke(reserveAddress, "collapseFor", [borrower], nil)
439- if ((collapse == collapse))
440- then nil
471+ let userDebtUsd = $t01026910371._5
472+ let userDebt = $t01026910371._4
473+ let userAssetUsd = $t01026910371._3
474+ let userAsset = $t01026910371._2
475+ let ignore = $t01026910371._1
476+ let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
477+ let bonus = invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil)
478+ if ((bonus == bonus))
479+ then {
480+ let collapse = invoke(reserveAddress, "collapseFor", [borrower], nil)
481+ if ((collapse == collapse))
482+ then nil
483+ else throw("Strict value is not equal to itself.")
484+ }
441485 else throw("Strict value is not equal to itself.")
442486 }
443487 else throw("Strict value is not equal to itself.")
444488 }
445- else throw("Strict value is not equal to itself.")
446489 }
447490 }
491+ else throw("Strict value is not equal to itself.")
448492 }
449493
450494

github/deemru/w8io/786bc32 
301.62 ms