tx · GWoszeizZzbB46BwzBybGu5JPGNtRYsTt2pKVZaQGVgD

3PEhGDwvjrjVKRPv5kHkjfDLmBJK1dd2frT:  -0.02300000 Waves

2022.09.20 13:40 [3302796] smart account 3PEhGDwvjrjVKRPv5kHkjfDLmBJK1dd2frT > SELF 0.00000000 Waves

{ "type": 13, "id": "GWoszeizZzbB46BwzBybGu5JPGNtRYsTt2pKVZaQGVgD", "fee": 2300000, "feeAssetId": null, "timestamp": 1663670458402, "version": 2, "chainId": 87, "sender": "3PEhGDwvjrjVKRPv5kHkjfDLmBJK1dd2frT", "senderPublicKey": "BjDUSXyo3yUJSxVFdH2pYANz31E6xzH7rdyYLBMRvHE2", "proofs": [ "62pKF5W71hm8XQxQYVUGhQ9tPn6X7igAqFyDVhBhsPhE3V4LitTrM1pZbEqimW1FQqfdTVEJEpHSffBRrnD7hiyx" ], "script": "base64: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AA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACAgAAAA90b3RhbF9zdXBwbGllZF8FAAAACmFzc2V0SWRTdHIFAAAABmFtb3VudAUAAAADbmlsBQAAABFyYXRlc1JlY2FsY1Jlc3VsdAAAAAFpAQAAAAh3aXRoZHJhdwAAAAIAAAAKYXNzZXRJZFN0cgAAAAthc3NldEFtb3VudAQAAAALJHQwNTEzOTUyMDYJAQAAAA1nZXRBY3R1YWxSYXRlAAAAAgUAAAAKYXNzZXRJZFN0cgIAAAAFc1JhdGUEAAAABXNSYXRlCAUAAAALJHQwNTEzOTUyMDYAAAACXzEEAAAAEXJhdGVzUmVjYWxjUmVzdWx0CAUAAAALJHQwNTEzOTUyMDYAAAACXzIEAAAABmFtb3VudAkAAGsAAAADBQAAAAthc3NldEFtb3VudAUAAAAHU2NhbGUxNgUAAAAFc1JhdGUEAAAAB2FkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA1hc3NldFN1cHBsaWVkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgIAAAAPdG90YWxfc3VwcGxpZWRfBQAAAAphc3NldElkU3RyBAAAAA1hc3NldEJvcnJvd2VkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgIAAAAPdG90YWxfYm9ycm93ZWRfBQAAAAphc3NldElkU3RyBAAAABF1c2VyQXNzZXRTdXBwbGllZAkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgUAAAAHYWRkcmVzcwIAAAAKX3N1cHBsaWVkXwUAAAAKYXNzZXRJZFN0cgQAAAARdXNlckFzc2V0Qm9ycm93ZWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl9ib3Jyb3dlZF8FAAAACmFzc2V0SWRTdHIDCQEAAAABIQAAAAEJAQAAAA10cnlHZXRCb29sZWFuAAAAAQIAAAAMc2V0dXBfYWN0aXZlCQAAAgAAAAECAAAAEW1hcmtldCBpcyBzdG9wcGVkAwkAAGYAAAACBQAAAAZhbW91bnQJAABlAAAAAgUAAAANYXNzZXRTdXBwbGllZAUAAAANYXNzZXRCb3Jyb3dlZAkAAAIAAAABAgAAACp0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBtYXJrZXQDCQAAZgAAAAIFAAAABmFtb3VudAkAAGUAAAACBQAAABF1c2VyQXNzZXRTdXBwbGllZAUAAAARdXNlckFzc2V0Qm9ycm93ZWQJAAACAAAAAQIAAAAqdGhpcyBhbW91bnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB1c2VyCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAdhZGRyZXNzAgAAAApfc3VwcGxpZWRfBQAAAAphc3NldElkU3RyCQAAZQAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl9zdXBwbGllZF8FAAAACmFzc2V0SWRTdHIFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAA90b3RhbF9zdXBwbGllZF8FAAAACmFzc2V0SWRTdHIJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAICAAAAD3RvdGFsX3N1cHBsaWVkXwUAAAAKYXNzZXRJZFN0cgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50CQEAAAANZ2V0QXNzZXRCeXRlcwAAAAEFAAAACmFzc2V0SWRTdHIFAAAAA25pbAUAAAARcmF0ZXNSZWNhbGNSZXN1bHQAAAABaQEAAAAGYm9ycm93AAAAAgAAAAphc3NldElkU3RyAAAAC2Fzc2V0QW1vdW50BAAAAAdhZGRyZXNzCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALJHQwNjM1MTY0MTgJAQAAAA1nZXRBY3R1YWxSYXRlAAAAAgUAAAAKYXNzZXRJZFN0cgIAAAAFYlJhdGUEAAAABWJSYXRlCAUAAAALJHQwNjM1MTY0MTgAAAACXzEEAAAAEXJhdGVzUmVjYWxjUmVzdWx0CAUAAAALJHQwNjM1MTY0MTgAAAAC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UmVjYWxjUmVzdWx0MQgFAAAADSR0MDEwMzcxMTA0NDAAAAACXzIEAAAADSR0MDEwNDQzMTA1MTIJAQAAAA1nZXRBY3R1YWxSYXRlAAAAAgUAAAALYkFzc2V0SWRTdHICAAAABWJSYXRlBAAAAAViUmF0ZQgFAAAADSR0MDEwNDQzMTA1MTIAAAACXzEEAAAAEnJhdGVzUmVjYWxjUmVzdWx0MggFAAAADSR0MDEwNDQzMTA1MTIAAAACXzIEAAAADHNBc3NldEFtb3VudAkAAGsAAAADBQAAAAthc3NldEFtb3VudAUAAAAHU2NhbGUxNgUAAAAFc1JhdGUEAAAAEGN1cnJlbnRTUG9zaXRpb24JAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl9zdXBwbGllZF8FAAAAC3NBc3NldElkU3RyBAAAABBjdXJyZW50QlBvc2l0aW9uCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACBQAAAAdhZGRyZXNzAgAAAApfYm9ycm93ZWRfBQAAAAtiQXNzZXRJZFN0cgMJAABmAAAAAgUAAAATdXNlckNvbGxhdGVyYWxWYWx1ZQAAAAAAAAAAAAkAAAIAAAABAgAAABh1c2VyIGNhbid0IGJlIGxpcXVpZGF0ZWQDCQAAZgAAAAIFAAAADHNBc3NldEFtb3VudAUAAAAQY3VycmVudFNQb3NpdGlvbgkAAAIAAAABAgAAADJwb3NpdGlvbiB0byBsaXF1aWRhdGUgaXMgYmlnZ2VyIHRoYW4gdXNlcidzIHN1cHBseQQAAAARYWdncmVnYXRvckFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVedDKrGE1GpbsuA92N9wWR44u9yTagMutMEAAAADmJhbGFuY2UwQmVmb3JlCQEAAAAKZ2V0QmFsYW5jZQAAAAEFAAAAC3NBc3NldElkU3RyAwkAAAAAAAACBQAAAA5iYWxhbmNlMEJlZm9yZQUAAAAOYmFsYW5jZTBCZWZvcmUEAAAADmJhbGFuY2UxQmVmb3JlCQEAAAAKZ2V0QmFsYW5jZQAAAAEFAAAAC2JBc3NldElkU3RyAwkAAAAAAAACBQAAAA5iYWxhbmNlMUJlZm9yZQUAAAAOYmFsYW5jZTFCZWZvcmUEAAAADmV4Y2hhbmdlSW52b2tlCQAD/AAAAAQFAAAAEWFnZ3JlZ2F0b3JBZGRyZXNzAgAAAARzd2FwCQAETAAAAAIFAAAACHJvdXRlU3RyCQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgkBAAAADWdldEFzc2V0Qnl0ZXMAAAABBQAAAAtzQXNzZXRJZFN0cgUAAAALYXNzZXRBbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAOZXhjaGFuZ2VJbnZva2UFAAAADmV4Y2hhbmdlSW52b2tlBAAAAAphc3NldDBTb2xkCQAAZQAAAAIFAAAADmJhbGFuY2UwQmVmb3JlCQEAAAAKZ2V0QmFsYW5jZQAAAAEFAAAAC3NBc3NldElkU3RyAwkAAAAAAAACBQAAAAphc3NldDBTb2xkBQAAAAphc3NldDBTb2xkBAAAAAxhc3NldDFCb3VnaHQJAABlAAAAAgkBAAAACmdldEJhbGFuY2UAAAABBQAAAAtiQXNzZXRJZFN0cgUAAAAOYmFsYW5jZTFCZWZvcmUDCQAAAAAAAAIFAAAADGFzc2V0MUJvdWdodAUAAAAMYXNzZXQxQm91Z2h0BAAAAAxzQXNzZXRDaGFuZ2UJAABrAAAAAwUAAAAKYXNzZXQwU29sZAUAAAAHU2NhbGUxNgUAAAAFc1JhdGUEAAAADGJBc3NldENoYW5nZQkAAGsAAAADBQAAAAxhc3NldDFCb3VnaHQFAAAAB1NjYWxlMTYFAAAABWJSYXRlAwkAAGYAAAACBQAAAAphc3NldDBTb2xkBQAAAAthc3NldEFtb3VudAkAAAIAAAABAgAAACNtb3JlIGFzc2V0cyBleGNoYW5nZWQgdGhhbiBleHBlY3RlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl9zdXBwbGllZF8FAAAAC3NBc3NldElkU3RyCQAAZQAAAAIFAAAAEGN1cnJlbnRTUG9zaXRpb24FAAAADHNBc3NldENoYW5nZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl9ib3Jyb3dlZF8FAAAAC2JBc3NldElkU3RyCQAAZQAAAAIFAAAAEGN1cnJlbnRCUG9zaXRpb24FAAAADGJBc3NldENoYW5nZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAA90b3RhbF9zdXBwbGllZF8FAAAAC3NBc3NldElkU3RyCQAAZQAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACAgAAAA90b3RhbF9zdXBwbGllZF8FAAAAC3NBc3NldElkU3RyBQAAAAxzQXNzZXRDaGFuZ2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAPdG90YWxfYm9ycm93ZWRfBQAAAAtiQXNzZXRJZFN0cgkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgIAAAAPdG90YWxfYm9ycm93ZWRfBQAAAAtiQXNzZXRJZFN0cgUAAAAMYkFzc2V0Q2hhbmdlBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACWdldFByaWNlcwAAAAEAAAAFZGVidWcEAAAABmFzc2V0cwkBAAAAD2dldE1hcmtldEFzc2V0cwAAAAAKAQAAAAFmAAAAAgAAAAVhY2N1bQAAAARuZXh0AwkAAGcAAAACBQAAAARuZXh0CQABkAAAAAEFAAAABmFzc2V0cwUAAAAFYWNjdW0EAAAACmFzc2V0UHJpY2UJAQAAAA1nZXRUb2tlblByaWNlAAAAAQkAAZEAAAACBQAAAAZhc3NldHMFAAAABG5leHQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAFYWNjdW0JAAGkAAAAAQgFAAAACmFzc2V0UHJpY2UAAAACXzECAAAAASwJAAGkAAAAAQgFAAAACmFzc2V0UHJpY2UAAAACXzICAAAAAXwEAAAABnJlc3VsdAoAAAAAAiRsCQAETAAAAAIAAAAAAAAAAAAJAARMAAAAAgAAAAAAAAAAAQkABEwAAAACAAAAAAAAAAACCQAETAAAAAIAAAAAAAAAAAMJAARMAAAAAgAAAAAAAAAABAkABEwAAAACAAAAAAAAAAAFBQAAAANuaWwKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwAgAAAAAKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAAFmAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAwUAAAAFZGVidWcJAAACAAAAAQUAAAAGcmVzdWx0CQAFFAAAAAIFAAAAA25pbAUAAAAGcmVzdWx0AAAAAWkBAAAAGWNhbGN1bGF0ZVV0aWxpemF0aW9uUmF0aW8AAAACAAAACmFzc2V0SWRTdHIAAAAFZGVidWcDBQAAAAVkZWJ1ZwkAAAIAAAABCQABpAAAAAEJAQAAAAVnZXRVcgAAAAEFAAAACmFzc2V0SWRTdHIJAAUUAAAAAgUAAAADbmlsCQEAAAAFZ2V0VXIAAAABBQAAAAphc3NldElkU3RyAAAAAWkBAAAAE2NhbGN1bGF0ZVRva2VuUmF0ZXMAAAABAAAABWRlYnVnCgEAAAABZgAAAAIAAAAFYWNjdW0AAAAKYXNzZXRJZFN0cgQAAAAFcmF0ZXMJAQAAABB0b2tlblJhdGVzUmVjYWxjAAAAAQUAAAAKYXNzZXRJZFN0cgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAVhY2N1bQkAAaQAAAABCAkAAZEAAAACBQAAAAVyYXRlcwAAAAAAAAAAAQAAAAV2YWx1ZQIAAAABfAkAAaQAAAABCAkAAZEAAAACBQAAAAVyYXRlcwAAAAAAAAAAAAAAAAV2YWx1ZQIAAAABLAQAAAAJcGFyYW1ldGVyCgAAAAACJGwJAQAAAA9nZXRNYXJrZXRBc3NldHMAAAAACgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAIAAAAACgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAABZgAAAAIFAAAAAiRhCQABkQAAAAIFAAAAAiRsBQAAAAIkaQoBAAAABSRmMF8yAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkAAAIAAAABAgAAABNMaXN0IHNpemUgZXhjZWVkcyA2CQEAAAAFJGYwXzIAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgMFAAAABWRlYnVnCQAAAgAAAAEFAAAACXBhcmFtZXRlcgkABRQAAAACBQAAAANuaWwFAAAACXBhcmFtZXRlcgAAAAFpAQAAABdjYWxjdWxhdGVUb2tlbnNJbnRlcmVzdAAAAAEAAAAFZGVidWcEAAAADWRhaWx5SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAOc2V0dXBfaW50ZXJlc3QKAQAAAAFmAAAAAgAAAAVhY2N1bQAAAAphc3NldElkU3RyBAAAAAJ1cgkBAAAABWdldFVyAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAAEcmF0ZQkAAZYAAAABCQAETAAAAAIJAABrAAAAAwUAAAANZGFpbHlJbnRlcmVzdAUAAAACdXIFAAAABlNjYWxlOAkABEwAAAACBQAAAAlkYXlCbG9ja3MFAAAAA25pbAkAASwAAAACCQABLAAAAAIFAAAABWFjY3VtCQABpAAAAAEFAAAABHJhdGUCAAAAASwEAAAACXBhcmFtZXRlcgoAAAAAAiRsCQEAAAAPZ2V0TWFya2V0QXNzZXRzAAAAAAoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzACAAAAAAoBAAAABSRmMF8xAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkBAAAAAWYAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgNgkBAAAABSRmMF8yAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYDBQAAAAVkZWJ1ZwkAAAIAAAABBQAAAAlwYXJhbWV0ZXIJAAUUAAAAAgUAAAADbmlsBQAAAAlwYXJhbWV0ZXIAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleXsJYGI=", "height": 3302796, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GZfg9wTpmvyBrhxqGYBVpSZE5QXPu5i7pgzQk1AsVNh Next: 95onnZmUbgcqgQqgYp9RmNQYL5WEqVaiELsJ7PUF5euo Diff:
OldNewDifferences
4646 else fromBase58String(assetIdStr)
4747
4848
49+func getBalance (assetIdStr) = if ((assetIdStr == "WAVES"))
50+ then wavesBalance(this).available
51+ else assetBalance(this, fromBase58String(assetIdStr))
52+
53+
4954 func getMarketAssets () = split(tryGetString("setup_tokens"), ",")
5055
5156
5762
5863 func getInterest (assetIdStr) = {
5964 let ur = getUr(assetIdStr)
60- let dailyInterest = tryGetInteger("setup_interest")
65+ let dailyInterest = if ((80000000 >= ur))
66+ then fraction(ur, 54794, 80000000)
67+ else (54794 + fraction((ur - 80000000), 54794, 20000000))
6168 max([(fraction(dailyInterest, ur, dayBlocks) / Scale8), 1])
6269 }
6370
117124 }
118125
119126
120-func getTokenPrice (assetIdStr) = if ((assetIdStr == "HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS"))
121- then $Tuple2(15000000, 15000000)
122- else if ((assetIdStr == "WAVES"))
123- then $Tuple2(5000000, 5000000)
124- else if ((assetIdStr == "Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5"))
125- then $Tuple2(2000000, 2000000)
126- else if ((assetIdStr == "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ"))
127- then $Tuple2(1000000, 1000000)
128- else if ((assetIdStr == "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ"))
129- then $Tuple2(1000000, 1000000)
130- else $Tuple2(950000, 950000)
127+func getTokenPrice (assetIdStr) = {
128+ let inv = invoke(addressFromStringValue("3P5BTtdj32Sd1Dyh1Mdw33xQAAckSfMfnKf"), "getTWAP60", [assetIdStr, false], nil)
129+ if ((inv == inv))
130+ then match inv {
131+ case x: (Int, Int) =>
132+ x
133+ case _ =>
134+ throw("error of price oracle")
135+ }
136+ else throw("Strict value is not equal to itself.")
137+ }
131138
132139
133140 @Callable(i)
163170 else {
164171 let assetIdStr = getAssetString(i.payments[0].assetId)
165172 let assetAmount = i.payments[0].amount
166- let $t039494016 = getActualRate(assetIdStr, "sRate")
167- let sRate = $t039494016._1
168- let ratesRecalcResult = $t039494016._2
173+ let $t045084575 = getActualRate(assetIdStr, "sRate")
174+ let sRate = $t045084575._1
175+ let ratesRecalcResult = $t045084575._2
169176 let amount = fraction(assetAmount, Scale16, sRate)
170177 let address = toString(i.caller)
171178 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
177184
178185 @Callable(i)
179186 func withdraw (assetIdStr,assetAmount) = {
180- let $t045804647 = getActualRate(assetIdStr, "sRate")
181- let sRate = $t045804647._1
182- let ratesRecalcResult = $t045804647._2
187+ let $t051395206 = getActualRate(assetIdStr, "sRate")
188+ let sRate = $t051395206._1
189+ let ratesRecalcResult = $t051395206._2
183190 let amount = fraction(assetAmount, Scale16, sRate)
184191 let address = toString(i.caller)
185192 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
200207 @Callable(i)
201208 func borrow (assetIdStr,assetAmount) = {
202209 let address = toString(i.caller)
203- let $t057925859 = getActualRate(assetIdStr, "bRate")
204- let bRate = $t057925859._1
205- let ratesRecalcResult = $t057925859._2
210+ let $t063516418 = getActualRate(assetIdStr, "bRate")
211+ let bRate = $t063516418._1
212+ let ratesRecalcResult = $t063516418._2
206213 let amount = fraction(assetAmount, Scale16, bRate)
207214 let price = getTokenPrice(assetIdStr)._2
208215 let decimals = if ((assetIdStr == "WAVES"))
245252 else {
246253 let assetIdStr = getAssetString(i.payments[0].assetId)
247254 let assetAmount = i.payments[0].amount
248- let $t074307497 = getActualRate(assetIdStr, "bRate")
249- let bRate = $t074307497._1
250- let ratesRecalcResult = $t074307497._2
255+ let $t079898056 = getActualRate(assetIdStr, "bRate")
256+ let bRate = $t079898056._1
257+ let ratesRecalcResult = $t079898056._2
251258 let amount = fraction(assetAmount, Scale16, bRate)
252259 let address = toString(i.caller)
253260 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
259266 then throw("payed amount is bigger than user's borrowed amount")
260267 else ([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed - amount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed - amount))] ++ ratesRecalcResult)
261268 }
269+
270+
271+
272+@Callable(i)
273+func getUserCollateral (debug,address,minusBorrowed) = {
274+ let assets = getMarketAssets()
275+ let ltvs = split(tryGetString("setup_ltvs"), ",")
276+ let rates = getActualRate(assets[0], "sRate")._2
277+ func f (accum,next) = if ((next >= size(assets)))
278+ then accum
279+ else {
280+ let decimals = if ((assets[next] == "WAVES"))
281+ then 8
282+ else value(assetInfo(fromBase58String(assets[next]))).decimals
283+ let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
284+ let assetPrice = getTokenPrice(assets[next])
285+ ((accum + fraction(fraction(fraction(tryGetInteger(((address + "_supplied_") + assets[next])), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
286+ then fraction(fraction(tryGetInteger(((address + "_borrowed_") + assets[next])), rates[((next * 3) + 1)].value, Scale16), assetPrice._2, assetScale)
287+ else 0))
288+ }
289+
290+ let result = {
291+ let $l = [0, 1, 2, 3, 4, 5]
292+ let $s = size($l)
293+ let $acc0 = 0
294+ func $f0_1 ($a,$i) = if (($i >= $s))
295+ then $a
296+ else f($a, $l[$i])
297+
298+ func $f0_2 ($a,$i) = if (($i >= $s))
299+ then $a
300+ else throw("List size exceeds 6")
301+
302+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
303+ }
304+ if (debug)
305+ then throw(toString(result))
306+ else $Tuple2(rates, result)
307+ }
308+
309+
310+
311+@Callable(i)
312+func liquidate (debug,address,assetAmount,sAssetIdStr,bAssetIdStr,routeStr) = {
313+ let userCollateralInvoke = invoke(this, "getUserCollateral", [false, address, true], nil)
314+ if ((userCollateralInvoke == userCollateralInvoke))
315+ then {
316+ let userCollateralValue = match userCollateralInvoke {
317+ case x: Int =>
318+ x
319+ case _ =>
320+ throw("issue while doing in-dapp invocation")
321+ }
322+ if ((userCollateralValue == userCollateralValue))
323+ then {
324+ let $t01037110440 = getActualRate(sAssetIdStr, "sRate")
325+ let sRate = $t01037110440._1
326+ let ratesRecalcResult1 = $t01037110440._2
327+ let $t01044310512 = getActualRate(bAssetIdStr, "bRate")
328+ let bRate = $t01044310512._1
329+ let ratesRecalcResult2 = $t01044310512._2
330+ let sAssetAmount = fraction(assetAmount, Scale16, sRate)
331+ let currentSPosition = tryGetInteger(((address + "_supplied_") + sAssetIdStr))
332+ let currentBPosition = tryGetInteger(((address + "_borrowed_") + bAssetIdStr))
333+ if ((userCollateralValue > 0))
334+ then throw("user can't be liquidated")
335+ else if ((sAssetAmount > currentSPosition))
336+ then throw("position to liquidate is bigger than user's supply")
337+ else {
338+ let aggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
339+ let balance0Before = getBalance(sAssetIdStr)
340+ if ((balance0Before == balance0Before))
341+ then {
342+ let balance1Before = getBalance(bAssetIdStr)
343+ if ((balance1Before == balance1Before))
344+ then {
345+ let exchangeInvoke = invoke(aggregatorAddress, "swap", [routeStr, 0], [AttachedPayment(getAssetBytes(sAssetIdStr), assetAmount)])
346+ if ((exchangeInvoke == exchangeInvoke))
347+ then {
348+ let asset0Sold = (balance0Before - getBalance(sAssetIdStr))
349+ if ((asset0Sold == asset0Sold))
350+ then {
351+ let asset1Bought = (getBalance(bAssetIdStr) - balance1Before)
352+ if ((asset1Bought == asset1Bought))
353+ then {
354+ let sAssetChange = fraction(asset0Sold, Scale16, sRate)
355+ let bAssetChange = fraction(asset1Bought, Scale16, bRate)
356+ if ((asset0Sold > assetAmount))
357+ then throw("more assets exchanged than expected")
358+ else [IntegerEntry(((address + "_supplied_") + sAssetIdStr), (currentSPosition - sAssetChange)), IntegerEntry(((address + "_borrowed_") + bAssetIdStr), (currentBPosition - bAssetChange)), IntegerEntry(("total_supplied_" + sAssetIdStr), (tryGetInteger(("total_supplied_" + sAssetIdStr)) - sAssetChange)), IntegerEntry(("total_borrowed_" + bAssetIdStr), (tryGetInteger(("total_borrowed_" + bAssetIdStr)) - bAssetChange))]
359+ }
360+ else throw("Strict value is not equal to itself.")
361+ }
362+ else throw("Strict value is not equal to itself.")
363+ }
364+ else throw("Strict value is not equal to itself.")
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+ else throw("Strict value is not equal to itself.")
369+ }
370+ }
371+ else throw("Strict value is not equal to itself.")
372+ }
373+ else throw("Strict value is not equal to itself.")
374+ }
375+
376+
377+
378+@Callable(i)
379+func getPrices (debug) = {
380+ let assets = getMarketAssets()
381+ func f (accum,next) = if ((next >= size(assets)))
382+ then accum
383+ else {
384+ let assetPrice = getTokenPrice(assets[next])
385+ ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
386+ }
387+
388+ let result = {
389+ let $l = [0, 1, 2, 3, 4, 5]
390+ let $s = size($l)
391+ let $acc0 = ""
392+ func $f0_1 ($a,$i) = if (($i >= $s))
393+ then $a
394+ else f($a, $l[$i])
395+
396+ func $f0_2 ($a,$i) = if (($i >= $s))
397+ then $a
398+ else throw("List size exceeds 6")
399+
400+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
401+ }
402+ if (debug)
403+ then throw(result)
404+ else $Tuple2(nil, result)
405+ }
262406
263407
264408
326470 }
327471
328472
329-
330-@Callable(i)
331-func getUserCollateral (debug,address,minusBorrowed) = {
332- let assets = getMarketAssets()
333- let ltvs = split(tryGetString("setup_ltvs"), ",")
334- let rates = getActualRate(assets[0], "sRate")._2
335- func f (accum,next) = if ((next >= size(assets)))
336- then accum
337- else {
338- let decimals = if ((assets[next] == "WAVES"))
339- then 8
340- else value(assetInfo(fromBase58String(assets[next]))).decimals
341- let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
342- let assetPrice = getTokenPrice(assets[next])
343- ((accum + fraction(fraction(fraction(tryGetInteger(((address + "_supplied_") + assets[next])), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
344- then fraction(fraction(tryGetInteger(((address + "_borrowed_") + assets[next])), rates[((next * 3) + 1)].value, Scale16), assetPrice._2, assetScale)
345- else 0))
346- }
347-
348- let result = {
349- let $l = [0, 1, 2, 3, 4, 5]
350- let $s = size($l)
351- let $acc0 = 0
352- func $f0_1 ($a,$i) = if (($i >= $s))
353- then $a
354- else f($a, $l[$i])
355-
356- func $f0_2 ($a,$i) = if (($i >= $s))
357- then $a
358- else throw("List size exceeds 6")
359-
360- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
361- }
362- if (debug)
363- then throw(toString(result))
364- else $Tuple2(rates, result)
365- }
366-
367-
368-
369-@Callable(i)
370-func getPrices (debug) = {
371- let assets = getMarketAssets()
372- func f (accum,next) = if ((next >= size(assets)))
373- then accum
374- else {
375- let assetPrice = getTokenPrice(assets[next])
376- ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
377- }
378-
379- let result = {
380- let $l = [0, 1, 2, 3, 4, 5]
381- let $s = size($l)
382- let $acc0 = ""
383- func $f0_1 ($a,$i) = if (($i >= $s))
384- then $a
385- else f($a, $l[$i])
386-
387- func $f0_2 ($a,$i) = if (($i >= $s))
388- then $a
389- else throw("List size exceeds 6")
390-
391- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
392- }
393- if (debug)
394- then throw(result)
395- else $Tuple2(nil, result)
396- }
397-
398-
399473 @Verifier(tx)
400474 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
401475
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale8 = 100000000
55
66 let Scale10 = 10000000000
77
88 let Scale16 = (Scale8 * Scale8)
99
1010 let dayBlocks = 1440
1111
1212 func tryGetInteger (key) = match getInteger(this, key) {
1313 case b: Int =>
1414 b
1515 case _ =>
1616 0
1717 }
1818
1919
2020 func tryGetBoolean (key) = match getBoolean(this, key) {
2121 case b: Boolean =>
2222 b
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func tryGetString (key) = match getString(this, key) {
2929 case b: String =>
3030 b
3131 case _ =>
3232 ""
3333 }
3434
3535
3636 func getAssetString (assetId) = match assetId {
3737 case b: ByteVector =>
3838 toBase58String(b)
3939 case _ =>
4040 "WAVES"
4141 }
4242
4343
4444 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
4545 then unit
4646 else fromBase58String(assetIdStr)
4747
4848
49+func getBalance (assetIdStr) = if ((assetIdStr == "WAVES"))
50+ then wavesBalance(this).available
51+ else assetBalance(this, fromBase58String(assetIdStr))
52+
53+
4954 func getMarketAssets () = split(tryGetString("setup_tokens"), ",")
5055
5156
5257 func getUr (assetIdStr) = {
5358 let down = max([fraction(tryGetInteger(("total_supplied_" + assetIdStr)), tryGetInteger((assetIdStr + "_sRate")), Scale16), Scale8])
5459 fraction(Scale8, fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), tryGetInteger((assetIdStr + "_bRate")), Scale16), down)
5560 }
5661
5762
5863 func getInterest (assetIdStr) = {
5964 let ur = getUr(assetIdStr)
60- let dailyInterest = tryGetInteger("setup_interest")
65+ let dailyInterest = if ((80000000 >= ur))
66+ then fraction(ur, 54794, 80000000)
67+ else (54794 + fraction((ur - 80000000), 54794, 20000000))
6168 max([(fraction(dailyInterest, ur, dayBlocks) / Scale8), 1])
6269 }
6370
6471
6572 func tokenRatesRecalc (assetIdStr) = {
6673 let interest = getInterest(assetIdStr)
6774 let ur = getUr(assetIdStr)
6875 let lastRecalcHeight = tryGetInteger("lastRateHeight")
6976 let lastBRate = max([tryGetInteger((assetIdStr + "_bRate")), Scale16])
7077 let newBRate = (lastBRate + ((height - lastRecalcHeight) * interest))
7178 let lastSRate = max([tryGetInteger((assetIdStr + "_sRate")), Scale16])
7279 let newSRate = (lastSRate + ((height - lastRecalcHeight) * fraction(interest, ur, Scale8)))
7380 [IntegerEntry((assetIdStr + "_sRate"), newSRate), IntegerEntry((assetIdStr + "_bRate"), newBRate), IntegerEntry("lastRateHeight", height)]
7481 }
7582
7683
7784 func getActualRate (assetIdStr,rateType) = {
7885 func f (accum,token) = {
7986 let recalc = tokenRatesRecalc(token)
8087 $Tuple2(if ((token != assetIdStr))
8188 then accum._1
8289 else if ((rateType == "sRate"))
8390 then recalc[0].value
8491 else recalc[1].value, (accum._2 ++ recalc))
8592 }
8693
8794 let $l = getMarketAssets()
8895 let $s = size($l)
8996 let $acc0 = $Tuple2(0, nil)
9097 func $f0_1 ($a,$i) = if (($i >= $s))
9198 then $a
9299 else f($a, $l[$i])
93100
94101 func $f0_2 ($a,$i) = if (($i >= $s))
95102 then $a
96103 else throw("List size exceeds 6")
97104
98105 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
99106 }
100107
101108
102109 func ratesRecalc () = {
103110 func f (accum,token) = (accum ++ tokenRatesRecalc(token))
104111
105112 let $l = getMarketAssets()
106113 let $s = size($l)
107114 let $acc0 = nil
108115 func $f0_1 ($a,$i) = if (($i >= $s))
109116 then $a
110117 else f($a, $l[$i])
111118
112119 func $f0_2 ($a,$i) = if (($i >= $s))
113120 then $a
114121 else throw("List size exceeds 6")
115122
116123 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
117124 }
118125
119126
120-func getTokenPrice (assetIdStr) = if ((assetIdStr == "HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS"))
121- then $Tuple2(15000000, 15000000)
122- else if ((assetIdStr == "WAVES"))
123- then $Tuple2(5000000, 5000000)
124- else if ((assetIdStr == "Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5"))
125- then $Tuple2(2000000, 2000000)
126- else if ((assetIdStr == "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ"))
127- then $Tuple2(1000000, 1000000)
128- else if ((assetIdStr == "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ"))
129- then $Tuple2(1000000, 1000000)
130- else $Tuple2(950000, 950000)
127+func getTokenPrice (assetIdStr) = {
128+ let inv = invoke(addressFromStringValue("3P5BTtdj32Sd1Dyh1Mdw33xQAAckSfMfnKf"), "getTWAP60", [assetIdStr, false], nil)
129+ if ((inv == inv))
130+ then match inv {
131+ case x: (Int, Int) =>
132+ x
133+ case _ =>
134+ throw("error of price oracle")
135+ }
136+ else throw("Strict value is not equal to itself.")
137+ }
131138
132139
133140 @Callable(i)
134141 func preInit (tokens,ltvs,dailyPercent) = {
135142 func f (accum,token) = (accum ++ [IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16)])
136143
137144 let rates = {
138145 let $l = split(tokens, ",")
139146 let $s = size($l)
140147 let $acc0 = nil
141148 func $f0_1 ($a,$i) = if (($i >= $s))
142149 then $a
143150 else f($a, $l[$i])
144151
145152 func $f0_2 ($a,$i) = if (($i >= $s))
146153 then $a
147154 else throw("List size exceeds 6")
148155
149156 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
150157 }
151158 ([StringEntry("setup_tokens", tokens), StringEntry("setup_ltvs", ltvs), IntegerEntry("setup_interest", dailyPercent), BooleanEntry("setup_active", true)] ++ rates)
152159 }
153160
154161
155162
156163 @Callable(i)
157164 func supply () = if (!(tryGetBoolean("setup_active")))
158165 then throw("market is stopped")
159166 else if (if ((size(i.payments) != 1))
160167 then true
161168 else (i.payments[0].amount == 0))
162169 then throw("1 payment has to be attached")
163170 else {
164171 let assetIdStr = getAssetString(i.payments[0].assetId)
165172 let assetAmount = i.payments[0].amount
166- let $t039494016 = getActualRate(assetIdStr, "sRate")
167- let sRate = $t039494016._1
168- let ratesRecalcResult = $t039494016._2
173+ let $t045084575 = getActualRate(assetIdStr, "sRate")
174+ let sRate = $t045084575._1
175+ let ratesRecalcResult = $t045084575._2
169176 let amount = fraction(assetAmount, Scale16, sRate)
170177 let address = toString(i.caller)
171178 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
172179 then throw("this asset is not supported by the market")
173180 else ([IntegerEntry(((address + "_supplied_") + assetIdStr), (tryGetInteger(((address + "_supplied_") + assetIdStr)) + amount)), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) + amount))] ++ ratesRecalcResult)
174181 }
175182
176183
177184
178185 @Callable(i)
179186 func withdraw (assetIdStr,assetAmount) = {
180- let $t045804647 = getActualRate(assetIdStr, "sRate")
181- let sRate = $t045804647._1
182- let ratesRecalcResult = $t045804647._2
187+ let $t051395206 = getActualRate(assetIdStr, "sRate")
188+ let sRate = $t051395206._1
189+ let ratesRecalcResult = $t051395206._2
183190 let amount = fraction(assetAmount, Scale16, sRate)
184191 let address = toString(i.caller)
185192 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
186193 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
187194 let userAssetSupplied = tryGetInteger(((address + "_supplied_") + assetIdStr))
188195 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
189196 if (!(tryGetBoolean("setup_active")))
190197 then throw("market is stopped")
191198 else if ((amount > (assetSupplied - assetBorrowed)))
192199 then throw("this amount is not available on the market")
193200 else if ((amount > (userAssetSupplied - userAssetBorrowed)))
194201 then throw("this amount is not available for this user")
195202 else ([IntegerEntry(((address + "_supplied_") + assetIdStr), (tryGetInteger(((address + "_supplied_") + assetIdStr)) - amount)), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) - amount)), ScriptTransfer(i.caller, amount, getAssetBytes(assetIdStr))] ++ ratesRecalcResult)
196203 }
197204
198205
199206
200207 @Callable(i)
201208 func borrow (assetIdStr,assetAmount) = {
202209 let address = toString(i.caller)
203- let $t057925859 = getActualRate(assetIdStr, "bRate")
204- let bRate = $t057925859._1
205- let ratesRecalcResult = $t057925859._2
210+ let $t063516418 = getActualRate(assetIdStr, "bRate")
211+ let bRate = $t063516418._1
212+ let ratesRecalcResult = $t063516418._2
206213 let amount = fraction(assetAmount, Scale16, bRate)
207214 let price = getTokenPrice(assetIdStr)._2
208215 let decimals = if ((assetIdStr == "WAVES"))
209216 then 8
210217 else value(assetInfo(fromBase58String(assetIdStr))).decimals
211218 let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
212219 let usdEquivalent = fraction(amount, price, assetScale)
213220 let collateralValueInv = invoke(this, "getUserCollateral", [false, address, true], nil)
214221 if ((collateralValueInv == collateralValueInv))
215222 then {
216223 let collateralValue = match collateralValueInv {
217224 case x: Int =>
218225 x
219226 case _ =>
220227 throw("can't get user collateral value")
221228 }
222229 if ((usdEquivalent > collateralValue))
223230 then throw("you have to supply more to borrow")
224231 else {
225232 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
226233 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
227234 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
228235 if ((amount > (assetSupplied - assetBorrowed)))
229236 then throw("this amount is not available")
230237 else ([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed + amount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed + amount)), ScriptTransfer(i.caller, amount, getAssetBytes(assetIdStr))] ++ ratesRecalcResult)
231238 }
232239 }
233240 else throw("Strict value is not equal to itself.")
234241 }
235242
236243
237244
238245 @Callable(i)
239246 func repay () = if (!(tryGetBoolean("setup_active")))
240247 then throw("market is stopped")
241248 else if (if ((size(i.payments) != 1))
242249 then true
243250 else (i.payments[0].amount == 0))
244251 then throw("1 payment has to be attached")
245252 else {
246253 let assetIdStr = getAssetString(i.payments[0].assetId)
247254 let assetAmount = i.payments[0].amount
248- let $t074307497 = getActualRate(assetIdStr, "bRate")
249- let bRate = $t074307497._1
250- let ratesRecalcResult = $t074307497._2
255+ let $t079898056 = getActualRate(assetIdStr, "bRate")
256+ let bRate = $t079898056._1
257+ let ratesRecalcResult = $t079898056._2
251258 let amount = fraction(assetAmount, Scale16, bRate)
252259 let address = toString(i.caller)
253260 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
254261 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
255262 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
256263 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
257264 then throw("this asset is not supported by the market")
258265 else if ((amount > userAssetBorrowed))
259266 then throw("payed amount is bigger than user's borrowed amount")
260267 else ([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed - amount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed - amount))] ++ ratesRecalcResult)
261268 }
269+
270+
271+
272+@Callable(i)
273+func getUserCollateral (debug,address,minusBorrowed) = {
274+ let assets = getMarketAssets()
275+ let ltvs = split(tryGetString("setup_ltvs"), ",")
276+ let rates = getActualRate(assets[0], "sRate")._2
277+ func f (accum,next) = if ((next >= size(assets)))
278+ then accum
279+ else {
280+ let decimals = if ((assets[next] == "WAVES"))
281+ then 8
282+ else value(assetInfo(fromBase58String(assets[next]))).decimals
283+ let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
284+ let assetPrice = getTokenPrice(assets[next])
285+ ((accum + fraction(fraction(fraction(tryGetInteger(((address + "_supplied_") + assets[next])), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
286+ then fraction(fraction(tryGetInteger(((address + "_borrowed_") + assets[next])), rates[((next * 3) + 1)].value, Scale16), assetPrice._2, assetScale)
287+ else 0))
288+ }
289+
290+ let result = {
291+ let $l = [0, 1, 2, 3, 4, 5]
292+ let $s = size($l)
293+ let $acc0 = 0
294+ func $f0_1 ($a,$i) = if (($i >= $s))
295+ then $a
296+ else f($a, $l[$i])
297+
298+ func $f0_2 ($a,$i) = if (($i >= $s))
299+ then $a
300+ else throw("List size exceeds 6")
301+
302+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
303+ }
304+ if (debug)
305+ then throw(toString(result))
306+ else $Tuple2(rates, result)
307+ }
308+
309+
310+
311+@Callable(i)
312+func liquidate (debug,address,assetAmount,sAssetIdStr,bAssetIdStr,routeStr) = {
313+ let userCollateralInvoke = invoke(this, "getUserCollateral", [false, address, true], nil)
314+ if ((userCollateralInvoke == userCollateralInvoke))
315+ then {
316+ let userCollateralValue = match userCollateralInvoke {
317+ case x: Int =>
318+ x
319+ case _ =>
320+ throw("issue while doing in-dapp invocation")
321+ }
322+ if ((userCollateralValue == userCollateralValue))
323+ then {
324+ let $t01037110440 = getActualRate(sAssetIdStr, "sRate")
325+ let sRate = $t01037110440._1
326+ let ratesRecalcResult1 = $t01037110440._2
327+ let $t01044310512 = getActualRate(bAssetIdStr, "bRate")
328+ let bRate = $t01044310512._1
329+ let ratesRecalcResult2 = $t01044310512._2
330+ let sAssetAmount = fraction(assetAmount, Scale16, sRate)
331+ let currentSPosition = tryGetInteger(((address + "_supplied_") + sAssetIdStr))
332+ let currentBPosition = tryGetInteger(((address + "_borrowed_") + bAssetIdStr))
333+ if ((userCollateralValue > 0))
334+ then throw("user can't be liquidated")
335+ else if ((sAssetAmount > currentSPosition))
336+ then throw("position to liquidate is bigger than user's supply")
337+ else {
338+ let aggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
339+ let balance0Before = getBalance(sAssetIdStr)
340+ if ((balance0Before == balance0Before))
341+ then {
342+ let balance1Before = getBalance(bAssetIdStr)
343+ if ((balance1Before == balance1Before))
344+ then {
345+ let exchangeInvoke = invoke(aggregatorAddress, "swap", [routeStr, 0], [AttachedPayment(getAssetBytes(sAssetIdStr), assetAmount)])
346+ if ((exchangeInvoke == exchangeInvoke))
347+ then {
348+ let asset0Sold = (balance0Before - getBalance(sAssetIdStr))
349+ if ((asset0Sold == asset0Sold))
350+ then {
351+ let asset1Bought = (getBalance(bAssetIdStr) - balance1Before)
352+ if ((asset1Bought == asset1Bought))
353+ then {
354+ let sAssetChange = fraction(asset0Sold, Scale16, sRate)
355+ let bAssetChange = fraction(asset1Bought, Scale16, bRate)
356+ if ((asset0Sold > assetAmount))
357+ then throw("more assets exchanged than expected")
358+ else [IntegerEntry(((address + "_supplied_") + sAssetIdStr), (currentSPosition - sAssetChange)), IntegerEntry(((address + "_borrowed_") + bAssetIdStr), (currentBPosition - bAssetChange)), IntegerEntry(("total_supplied_" + sAssetIdStr), (tryGetInteger(("total_supplied_" + sAssetIdStr)) - sAssetChange)), IntegerEntry(("total_borrowed_" + bAssetIdStr), (tryGetInteger(("total_borrowed_" + bAssetIdStr)) - bAssetChange))]
359+ }
360+ else throw("Strict value is not equal to itself.")
361+ }
362+ else throw("Strict value is not equal to itself.")
363+ }
364+ else throw("Strict value is not equal to itself.")
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+ else throw("Strict value is not equal to itself.")
369+ }
370+ }
371+ else throw("Strict value is not equal to itself.")
372+ }
373+ else throw("Strict value is not equal to itself.")
374+ }
375+
376+
377+
378+@Callable(i)
379+func getPrices (debug) = {
380+ let assets = getMarketAssets()
381+ func f (accum,next) = if ((next >= size(assets)))
382+ then accum
383+ else {
384+ let assetPrice = getTokenPrice(assets[next])
385+ ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
386+ }
387+
388+ let result = {
389+ let $l = [0, 1, 2, 3, 4, 5]
390+ let $s = size($l)
391+ let $acc0 = ""
392+ func $f0_1 ($a,$i) = if (($i >= $s))
393+ then $a
394+ else f($a, $l[$i])
395+
396+ func $f0_2 ($a,$i) = if (($i >= $s))
397+ then $a
398+ else throw("List size exceeds 6")
399+
400+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
401+ }
402+ if (debug)
403+ then throw(result)
404+ else $Tuple2(nil, result)
405+ }
262406
263407
264408
265409 @Callable(i)
266410 func calculateUtilizationRatio (assetIdStr,debug) = if (debug)
267411 then throw(toString(getUr(assetIdStr)))
268412 else $Tuple2(nil, getUr(assetIdStr))
269413
270414
271415
272416 @Callable(i)
273417 func calculateTokenRates (debug) = {
274418 func f (accum,assetIdStr) = {
275419 let rates = tokenRatesRecalc(assetIdStr)
276420 ((((accum + toString(rates[1].value)) + "|") + toString(rates[0].value)) + ",")
277421 }
278422
279423 let parameter = {
280424 let $l = getMarketAssets()
281425 let $s = size($l)
282426 let $acc0 = ""
283427 func $f0_1 ($a,$i) = if (($i >= $s))
284428 then $a
285429 else f($a, $l[$i])
286430
287431 func $f0_2 ($a,$i) = if (($i >= $s))
288432 then $a
289433 else throw("List size exceeds 6")
290434
291435 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
292436 }
293437 if (debug)
294438 then throw(parameter)
295439 else $Tuple2(nil, parameter)
296440 }
297441
298442
299443
300444 @Callable(i)
301445 func calculateTokensInterest (debug) = {
302446 let dailyInterest = tryGetInteger("setup_interest")
303447 func f (accum,assetIdStr) = {
304448 let ur = getUr(assetIdStr)
305449 let rate = max([fraction(dailyInterest, ur, Scale8), dayBlocks])
306450 ((accum + toString(rate)) + ",")
307451 }
308452
309453 let parameter = {
310454 let $l = getMarketAssets()
311455 let $s = size($l)
312456 let $acc0 = ""
313457 func $f0_1 ($a,$i) = if (($i >= $s))
314458 then $a
315459 else f($a, $l[$i])
316460
317461 func $f0_2 ($a,$i) = if (($i >= $s))
318462 then $a
319463 else throw("List size exceeds 6")
320464
321465 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
322466 }
323467 if (debug)
324468 then throw(parameter)
325469 else $Tuple2(nil, parameter)
326470 }
327471
328472
329-
330-@Callable(i)
331-func getUserCollateral (debug,address,minusBorrowed) = {
332- let assets = getMarketAssets()
333- let ltvs = split(tryGetString("setup_ltvs"), ",")
334- let rates = getActualRate(assets[0], "sRate")._2
335- func f (accum,next) = if ((next >= size(assets)))
336- then accum
337- else {
338- let decimals = if ((assets[next] == "WAVES"))
339- then 8
340- else value(assetInfo(fromBase58String(assets[next]))).decimals
341- let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
342- let assetPrice = getTokenPrice(assets[next])
343- ((accum + fraction(fraction(fraction(tryGetInteger(((address + "_supplied_") + assets[next])), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
344- then fraction(fraction(tryGetInteger(((address + "_borrowed_") + assets[next])), rates[((next * 3) + 1)].value, Scale16), assetPrice._2, assetScale)
345- else 0))
346- }
347-
348- let result = {
349- let $l = [0, 1, 2, 3, 4, 5]
350- let $s = size($l)
351- let $acc0 = 0
352- func $f0_1 ($a,$i) = if (($i >= $s))
353- then $a
354- else f($a, $l[$i])
355-
356- func $f0_2 ($a,$i) = if (($i >= $s))
357- then $a
358- else throw("List size exceeds 6")
359-
360- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
361- }
362- if (debug)
363- then throw(toString(result))
364- else $Tuple2(rates, result)
365- }
366-
367-
368-
369-@Callable(i)
370-func getPrices (debug) = {
371- let assets = getMarketAssets()
372- func f (accum,next) = if ((next >= size(assets)))
373- then accum
374- else {
375- let assetPrice = getTokenPrice(assets[next])
376- ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
377- }
378-
379- let result = {
380- let $l = [0, 1, 2, 3, 4, 5]
381- let $s = size($l)
382- let $acc0 = ""
383- func $f0_1 ($a,$i) = if (($i >= $s))
384- then $a
385- else f($a, $l[$i])
386-
387- func $f0_2 ($a,$i) = if (($i >= $s))
388- then $a
389- else throw("List size exceeds 6")
390-
391- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
392- }
393- if (debug)
394- then throw(result)
395- else $Tuple2(nil, result)
396- }
397-
398-
399473 @Verifier(tx)
400474 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
401475

github/deemru/w8io/6500d08 
69.31 ms