tx · BXe4xkbsyqYZcukriWez3gfhvtJdyY4iHxkDNMthG8fe

3MvGMtmdY1eSW4iY922zj5bx8hBfyP1qgHo:  -0.04000000 Waves

2021.09.05 21:55 [1690134] smart account 3MvGMtmdY1eSW4iY922zj5bx8hBfyP1qgHo > SELF 0.00000000 Waves

{ "type": 13, "id": "BXe4xkbsyqYZcukriWez3gfhvtJdyY4iHxkDNMthG8fe", "fee": 4000000, "feeAssetId": null, "timestamp": 1630868204251, "version": 2, "chainId": 84, "sender": "3MvGMtmdY1eSW4iY922zj5bx8hBfyP1qgHo", "senderPublicKey": "CD4N2SBeZVBUwmtsqwfmQ3ZKnBP3AxpZCvJ5QkHytUed", "proofs": [ "51jsp3K9im5EdMcgAoJrQyEh1ezQuimp8ybrBFg1KuTE9d9U7g8sV3EPzYmrKuLqKASQwBWSwqgyWmedVE1Uv4bq" ], "script": "base64:AAIFAAAAAAAAADoIAhIECgIIGBIDCgEIEgMKAQgSBAoCCAQSAwoBCBIDCgEIEgUKAwgIARIDCgEIEgUKAwgIARIDCgEIAAAADAAAAAAGY29uZmlnCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzAgAAAAZjb25maWcCAAAAAAAAAAAFYWRtaW4JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAABmNvbmZpZwIAAAAFYWRtaW4CAAAAAAAAAAAFcG9vbHMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMCAAAABXBvb2xzAgAAAAABAAAAB2lzQWRtaW4AAAABAAAADWNhbGxlckFkZHJlc3MDCQAAAAAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAABWFkbWluBgcBAAAACWNoZWNrUG9vbAAAAAEAAAAHcG9vbEFkZAMJAQAAAAhjb250YWlucwAAAAIFAAAABXBvb2xzBQAAAAdwb29sQWRkBgcBAAAAC3dyaXRlU3RyaW5nAAAAAgAAAANrZXkAAAALc3RyaW5nVmFsdWUJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAALc3RyaW5nVmFsdWUBAAAADHdyaXRlSW50ZWdlcgAAAAIAAAADa2V5AAAADGludGVnZXJWYWx1ZQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAMaW50ZWdlclZhbHVlAQAAABJjaGVja1Bvb2xMaXF1aWRpdHkAAAACAAAAC3Bvb2xBZGRyZXNzAAAABmFtb3VudAQAAAALdG90YWxTdXBwbHkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAt0b3RhbFN1cHBseQQAAAALdG90YWxCb3Jyb3cJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAt0b3RhbEJvcnJvdwQAAAASYXZhaWxhYmxlTGlxdWlkaXR5CQAAZQAAAAIFAAAAC3RvdGFsU3VwcGx5BQAAAAt0b3RhbEJvcnJvdwMJAABnAAAAAgUAAAASYXZhaWxhYmxlTGlxdWlkaXR5BQAAAAZhbW91bnQGBwEAAAASZ2V0SGVhbHRoUGFyYW1ldGVyAAAABgAAAAR1c2VyAAAAC3Bvb2xBZGRyZXNzAAAADW5ld0RlYnRBbW91bnQAAAAJbmV3RGVidElkAAAAEGNvbGxhdGVyYWxBbW91bnQAAAAMY29sbGF0ZXJhbElkBAAAAAZyZXN1bHQJAAP8AAAABAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALcG9vbEFkZHJlc3MCAAAAFmdldFVzZXJIZWFsdGhQYXJhbWV0ZXIJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAABBjb2xsYXRlcmFsQW1vdW50CQAETAAAAAIFAAAADGNvbGxhdGVyYWxJZAkABEwAAAACBQAAAA1uZXdEZWJ0QW1vdW50CQAETAAAAAIFAAAACW5ld0RlYnRJZAUAAAADbmlsBQAAAANuaWwEAAAAByRtYXRjaDAFAAAABnJlc3VsdAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKKEludCwgSW50KQQAAAABdAUAAAAHJG1hdGNoMAUAAAABdAkAAAIAAAABAgAAACRSZXR1cm4gdmFsdWUgaGFzIHRoZSB3cm9uZyBkYXRhIHR5cGUBAAAAEGNhbGNIZWFsdGhGYWN0b3IAAAACAAAADmJvcnJvd0NhcGFjaXR5AAAAEmJvcnJvd0NhcGFjaXR5VXNlZAkAAGsAAAADCQAAZQAAAAIFAAAADmJvcnJvd0NhcGFjaXR5BQAAABJib3Jyb3dDYXBhY2l0eVVzZWQAAAAAAAAAA+gFAAAADmJvcnJvd0NhcGFjaXR5AQAAABNjYWxjQm9ycm93Q0JvcnJvd0NVAAAABQAAAAR1c2VyAAAADW5ld0RlYnRBbW91bnQAAAAJbmV3RGVidElkAAAAEGNvbGxhdGVyYWxBbW91bnQAAAAMY29sbGF0ZXJhbElkBAAAAAhwb29sTGlzdAkABLUAAAACBQAAAAVwb29scwIAAAABOwQAAAAIbGlzdFNpemUJAAGQAAAAAQUAAAAIcG9vbExpc3QKAQAAAAlmb2xkUG9vbHMAAAACAAAABWFjY3VtAAAABG5leHQEAAAADGhlYWx0aFBhcmFtcwkBAAAAEmdldEhlYWx0aFBhcmFtZXRlcgAAAAYFAAAABHVzZXIFAAAABG5leHQFAAAADW5ld0RlYnRBbW91bnQFAAAACW5ld0RlYnRJZAUAAAAQY29sbGF0ZXJhbEFtb3VudAUAAAAMY29sbGF0ZXJhbElkBAAAAAckbWF0Y2gwBQAAAAxoZWFsdGhQYXJhbXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACihJbnQsIEludCkEAAAAAXQFAAAAByRtYXRjaDAJAAUUAAAAAgkAAGQAAAACCAUAAAAFYWNjdW0AAAACXzEIBQAAAAxoZWFsdGhQYXJhbXMAAAACXzEJAABkAAAAAggFAAAABWFjY3VtAAAAAl8yCAUAAAAMaGVhbHRoUGFyYW1zAAAAAl8xBAAAAAFlBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAABFRlc3QEAAAADSRsaXN0MjMxMjIzNDYFAAAACHBvb2xMaXN0BAAAAA0kc2l6ZTIzMTIyMzQ2CQABkAAAAAEFAAAADSRsaXN0MjMxMjIzNDYEAAAADSRhY2MwMjMxMjIzNDYJAAUUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAMJAAAAAAAAAgUAAAANJHNpemUyMzEyMjM0NgAAAAAAAAAAAAUAAAANJGFjYzAyMzEyMjM0NgQAAAANJGFjYzEyMzEyMjM0NgkBAAAACWZvbGRQb29scwAAAAIFAAAADSRhY2MwMjMxMjIzNDYJAAGRAAAAAgUAAAANJGxpc3QyMzEyMjM0NgAAAAAAAAAAAAMJAAAAAAAAAgUAAAANJHNpemUyMzEyMjM0NgAAAAAAAAAAAQUAAAANJGFjYzEyMzEyMjM0NgQAAAANJGFjYzIyMzEyMjM0NgkBAAAACWZvbGRQb29scwAAAAIFAAAADSRhY2MxMjMxMjIzNDYJAAGRAAAAAgUAAAANJGxpc3QyMzEyMjM0NgAAAAAAAAAAAQMJAAAAAAAAAgUAAAANJHNpemUyMzEyMjM0NgAAAAAAAAAAAgUAAAANJGFjYzIyMzEyMjM0NgQAAAANJGFjYzMyMzEyMjM0NgkBAAAACWZvbGRQb29scwAAAAIFAAAADSRhY2MyMjMxMjIzNDYJAAGRAAAAAgUAAAANJGxpc3QyMzEyMjM0NgAAAAAAAAAAAgkAAAIAAAABAgAAABJMaXN0IHNpemUgZXhjZWVkIDIBAAAAD2NoZWNrVXNlckhlYWx0aAAAAAUAAAAEdXNlcgAAAA1uZXdEZWJ0QW1vdW50AAAACW5ld0RlYnRJZAAAABBjb2xsYXRlcmFsQW1vdW50AAAADGNvbGxhdGVyYWxJZAQAAAAFYmNCY3UJAQAAABNjYWxjQm9ycm93Q0JvcnJvd0NVAAAABQUAAAAEdXNlcgUAAAANbmV3RGVidEFtb3VudAUAAAAJbmV3RGVidElkBQAAABBjb2xsYXRlcmFsQW1vdW50BQAAAAxjb2xsYXRlcmFsSWQEAAAACnVzZXJIZWFsdGgJAQAAABBjYWxjSGVhbHRoRmFjdG9yAAAAAggFAAAABWJjQmN1AAAAAl8xCAUAAAAFYmNCY3UAAAACXzIDCQAAZwAAAAIFAAAACnVzZXJIZWFsdGgAAAAAAAAAAAAGBwAAAAoAAAABaQEAAAAFc2V0dXAAAAACAAAADWNvbmZpZ0FkZHJlc3MAAAAFcG9vbHMDAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzAgAAAAZjb25maWcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwIAAAAFcG9vbHMHCQAETAAAAAIJAQAAAAt3cml0ZVN0cmluZwAAAAICAAAABmNvbmZpZwUAAAANY29uZmlnQWRkcmVzcwkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACAgAAAAVwb29scwkABLkAAAACBQAAAAVwb29scwIAAAABOwUAAAADbmlsCQAAAgAAAAECAAAAKkFkbWluIGFuZCBjb25maWcgYWRkcmVzcyBhbHJlYWR5IGRlZmluaWVkIQAAAAFpAQAAAAdhZGRQb29sAAAAAQAAAAtwb29sQWRkcmVzcwMJAQAAAAdpc0FkbWluAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAhwb29sTGlzdAkABLUAAAACBQAAAAVwb29scwIAAAABOwMJAAAAAAAAAgkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACHBvb2xMaXN0BQAAAAtwb29sQWRkcmVzcwcEAAAACG5ld1Bvb2xzCQAETQAAAAIFAAAACHBvb2xMaXN0BQAAAAtwb29sQWRkcmVzcwkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACAgAAAAVwb29scwkABLkAAAACBQAAAAhuZXdQb29scwIAAAABOwUAAAADbmlsCQAAAgAAAAECAAAAFFBvb2wgYWxyZWFkeSBleGlzdHMhCQAAAgAAAAECAAAAKkFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCBhZG1pbiBhZGRyZXNzIQAAAAFpAQAAAAx1cGRhdGVDb25maWcAAAABAAAADWNvbmZpZ0FkZHJlc3MDCQEAAAAHaXNBZG1pbgAAAAEIBQAAAAFpAAAABmNhbGxlcgkABEwAAAACCQEAAAALd3JpdGVTdHJpbmcAAAACAgAAAAZjb25maWcFAAAADWNvbmZpZ0FkZHJlc3MFAAAAA25pbAkAAAIAAAABAgAAACpBZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggYWRtaW4gYWRkcmVzcyEAAAABaQEAAAAJZGVwb3NpdEF0AAAAAgAAAAtwb29sQWRkcmVzcwAAAAxpc0NvbGxhdGVyYWwDCQEAAAAJY2hlY2tQb29sAAAAAQUAAAALcG9vbEFkZHJlc3MDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABHVzZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAALdG9rZW5BbW91bnQJAAP8AAAABAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALcG9vbEFkZHJlc3MCAAAAB2RlcG9zaXQJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACBQAAAAxpc0NvbGxhdGVyYWwFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAC3Rva2VuQW1vdW50BQAAAAt0b2tlbkFtb3VudAQAAAAHdG9rZW5JZAkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALcG9vbEFkZHJlc3MCAAAACGRUb2tlbklkBAAAAAckbWF0Y2gwBQAAAAt0b2tlbkFtb3VudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAF0BQAAAAckbWF0Y2gwCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAABdAkAAlkAAAABBQAAAAd0b2tlbklkBQAAAANuaWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABdAUAAAAHJG1hdGNoMAUAAAADbmlsCQAAAgAAAAECAAAAGEluY29ycmVjdCBpbnZva2UgcmVzdWx0IQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAUTm8gcGF5bWVudCBhdHRhY2hlZCEJAAACAAAAAQIAAAAXUG9vbCBhZGRyZXNzIG5vdCBmb3VuZCEAAAABaQEAAAAMd2l0aGRyYXdGcm9tAAAAAQAAAAtwb29sQWRkcmVzcwMJAQAAAAljaGVja1Bvb2wAAAABBQAAAAtwb29sQWRkcmVzcwQAAAAIZFRva2VuSWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAhkVG9rZW5JZAMJAAAAAAAAAgkAAlkAAAABBQAAAAhkVG9rZW5JZAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAEdXNlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAt0b2tlbkFtb3VudAkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAId2l0aGRyYXcJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsCAUAAAABaQAAAAhwYXltZW50cwMJAAAAAAAAAgUAAAALdG9rZW5BbW91bnQFAAAAC3Rva2VuQW1vdW50BAAAAAd0b2tlbklkCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAALdG9rZW5BbW91bnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABdAUAAAAHJG1hdGNoMAMJAAAAAAAAAgUAAAAHdG9rZW5JZAIAAAAFV0FWRVMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAF0BQAAAAR1bml0BQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAF0CQACWQAAAAEFAAAAB3Rva2VuSWQFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAF0BQAAAAckbWF0Y2gwBQAAAANuaWwJAAACAAAAAQIAAAAYSW5jb3JyZWN0IGludm9rZSByZXN1bHQhCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAABRObyBwYXltZW50IGF0dGFjaGVkIQkAAAIAAAABAgAAABdBc3NldElkcyBkb2VzIG5vdCBtYXRjaAkAAAIAAAABAgAAABdQb29sIGFkZHJlc3Mgbm90IGZvdW5kIQAAAAFpAQAAAAdyZXBheVRvAAAAAQAAAAtwb29sQWRkcmVzcwMJAQAAAAljaGVja1Bvb2wAAAABBQAAAAtwb29sQWRkcmVzcwQAAAAJcG9vbEFzc2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAHYXNzZXRJZAMJAAAAAAAAAgkAAlkAAAABBQAAAAlwb29sQXNzZXQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABHVzZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAGYW1vdW50CQAD/AAAAAQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAVyZXBheQkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwIBQAAAAFpAAAACHBheW1lbnRzAwkAAAAAAAACBQAAAAZhbW91bnQFAAAABmFtb3VudAQAAAAHYXNzZXRJZAkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALcG9vbEFkZHJlc3MCAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAABmFtb3VudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAF0BQAAAAckbWF0Y2gwAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAAXQFAAAABHVuaXQFAAAAA25pbAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAAXQJAAJZAAAAAQUAAAAHYXNzZXRJZAUAAAADbmlsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXQFAAAAByRtYXRjaDAFAAAAA25pbAkAAAIAAAABAgAAABhJbmNvcnJlY3QgaW52b2tlIHJlc3VsdCEJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAFE5vIHBheW1lbnQgYXR0YWNoZWQhCQAAAgAAAAECAAAAF0Fzc2V0SWRzIGRvZXMgbm90IG1hdGNoCQAAAgAAAAECAAAAF1Bvb2wgYWRkcmVzcyBub3QgZm91bmQhAAAAAWkBAAAACmJvcnJvd0Zyb20AAAADAAAAC3Bvb2xBZGRyZXNzAAAAB2Fzc2V0SWQAAAAGYW1vdW50AwkBAAAACWNoZWNrUG9vbAAAAAEFAAAAC3Bvb2xBZGRyZXNzBAAAAAlwb29sQXNzZXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAdhc3NldElkAwkAAAAAAAACBQAAAAlwb29sQXNzZXQFAAAAB2Fzc2V0SWQDCQEAAAASY2hlY2tQb29sTGlxdWlkaXR5AAAAAgUAAAALcG9vbEFkZHJlc3MFAAAABmFtb3VudAQAAAAEdXNlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzAwkBAAAAD2NoZWNrVXNlckhlYWx0aAAAAAUFAAAABHVzZXIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAAAAAAAAAAAAAIAAAAABAAAAAt0b2tlbkFtb3VudAkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAGYm9ycm93CQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAGYW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAALdG9rZW5BbW91bnQFAAAAC3Rva2VuQW1vdW50BAAAAAckbWF0Y2gwBQAAAAt0b2tlbkFtb3VudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAF0BQAAAAckbWF0Y2gwAwkAAAAAAAACBQAAAAlwb29sQXNzZXQCAAAABVdBVkVTCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAABdAUAAAAEdW5pdAUAAAADbmlsCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAABdAkAAlkAAAABBQAAAAlwb29sQXNzZXQFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAF0BQAAAAckbWF0Y2gwBQAAAANuaWwJAAACAAAAAQIAAAAYSW5jb3JyZWN0IGludm9rZSByZXN1bHQhCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAABtCb3Jyb3cgZXhjZWVkcyB1c2VyIGhlYWx0aCEJAAACAAAAAQIAAAAhUG9vbCBsaXF1aWRpdHkgaXMgbm90IHN1ZmZpY2llbnQhCQAAAgAAAAECAAAAF0Fzc2V0SWRzIGRvZXMgbm90IG1hdGNoCQAAAgAAAAECAAAAF1Bvb2wgYWRkcmVzcyBub3QgZm91bmQhAAAAAWkBAAAAEmxvY2tBc0NvbGxhdGVyYWxBdAAAAAEAAAALcG9vbEFkZHJlc3MDCQEAAAAJY2hlY2tQb29sAAAAAQUAAAALcG9vbEFkZHJlc3MEAAAACGRUb2tlbklkCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAIZFRva2VuSWQDCQAAAAAAAAIJAAJZAAAAAQUAAAAIZFRva2VuSWQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABHVzZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAADbXNnCQAD/AAAAAQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAABBsb2NrQXNDb2xsYXRlcmFsCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAgFAAAAAWkAAAAIcGF5bWVudHMDCQAAAAAAAAIFAAAAA21zZwUAAAADbXNnBAAAAAckbWF0Y2gwBQAAAANtc2cDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABdAUAAAAHJG1hdGNoMAUAAAADbmlsCQAAAgAAAAECAAAAGEluY29ycmVjdCBpbnZva2UgcmVzdWx0IQkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAUTm8gcGF5bWVudCBhdHRhY2hlZCEJAAACAAAAAQIAAAAXQXNzZXRJZHMgZG9lcyBub3QgbWF0Y2gJAAACAAAAAQIAAAAXUG9vbCBhZGRyZXNzIG5vdCBmb3VuZCEAAAABaQEAAAAUcmVkZWVtQ29sbGF0ZXJhbEZyb20AAAADAAAAC3Bvb2xBZGRyZXNzAAAAB2R0b2tlSWQAAAAGYW1vdW50AwkBAAAACWNoZWNrUG9vbAAAAAEFAAAAC3Bvb2xBZGRyZXNzBAAAAAxwb29sRFRva2VuSWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAAAhkVG9rZW5JZAMJAAAAAAAAAgUAAAAMcG9vbERUb2tlbklkBQAAAAdkdG9rZUlkBAAAAAR1c2VyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMDCQEAAAAPY2hlY2tVc2VySGVhbHRoAAAABQUAAAAEdXNlcgAAAAAAAAAAAAIAAAAABQAAAAZhbW91bnQFAAAAB2R0b2tlSWQEAAAAC3Rva2VuQW1vdW50CQAD/AAAAAQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3Bvb2xBZGRyZXNzAgAAABByZWRlZW1Db2xsYXRlcmFsCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAGYW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAALdG9rZW5BbW91bnQFAAAAC3Rva2VuQW1vdW50BAAAAAd0b2tlbklkCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAtwb29sQWRkcmVzcwIAAAAIZFRva2VuSWQEAAAAByRtYXRjaDAFAAAAC3Rva2VuQW1vdW50AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXQFAAAAByRtYXRjaDAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAF0CQACWQAAAAEFAAAAB3Rva2VuSWQFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAF0BQAAAAckbWF0Y2gwBQAAAANuaWwJAAACAAAAAQIAAAAYSW5jb3JyZWN0IGludm9rZSByZXN1bHQhCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAABtCb3Jyb3cgZXhjZWVkcyB1c2VyIGhlYWx0aCEJAAACAAAAAQIAAAAXQXNzZXRJZHMgZG9lcyBub3QgbWF0Y2gJAAACAAAAAQIAAAAXUG9vbCBhZGRyZXNzIG5vdCBmb3VuZCEAAAABaQEAAAAKZGVsZXRlRGF0YQAAAAEAAAAEbmFtZQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAARuYW1lBQAAAANuaWwAAAAAdhp2MA==", "height": 1690134, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3j4sC8PjvcAqGKV9Znf6DEYrnNUiqTKC1sHnkfizoPcN Next: 8SePcoWGcguP1VHso6rjpGWaHtxSzKRdU1PN3vxGjMiX Diff:
OldNewDifferences
9292
9393
9494 @Callable(i)
95-func repayTo (poolAddress) = if (checkPool(poolAddress))
96- then {
97- let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
98- if ((fromBase58String(poolAsset) == i.payments[0].assetId))
99- then if ((size(i.payments) > 0))
100- then {
101- let user = toBase58String(i.caller.bytes)
102- let amount = invoke(addressFromStringValue(poolAddress), "repay", [user], i.payments)
103- if ((amount == amount))
104- then {
105- let assetId = getStringValue(addressFromStringValue(poolAddress), "assetId")
106- match amount {
107- case t: Int =>
108- if ((assetId == "WAVES"))
109- then [ScriptTransfer(i.caller, t, unit)]
110- else [ScriptTransfer(i.caller, t, fromBase58String(assetId))]
111- case t: String =>
112- nil
113- case _ =>
114- throw("Incorrect invoke result!")
115- }
116- }
117- else throw("Strict value is not equal to itself.")
118- }
119- else throw("No payment attached!")
120- else throw("AssetIds does not match")
121- }
122- else throw("Pool address not found!")
123-
124-
125-
126-@Callable(i)
127-func borrowFrom (poolAddress,assetId,amount) = if (checkPool(poolAddress))
128- then {
129- let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
130- if ((poolAsset == assetId))
131- then if (checkPoolLiquidity(poolAddress, amount))
132- then {
133- let user = toBase58String(i.caller.bytes)
134- if (checkUserHealth(user, amount, assetId, 0, ""))
135- then {
136- let tokenAmount = invoke(addressFromStringValue(poolAddress), "borrow", [user, amount], nil)
137- if ((tokenAmount == tokenAmount))
138- then match tokenAmount {
139- case t: Int =>
140- if ((poolAsset == "WAVES"))
141- then [ScriptTransfer(i.caller, t, unit)]
142- else [ScriptTransfer(i.caller, t, fromBase58String(poolAsset))]
143- case t: String =>
144- nil
145- case _ =>
146- throw("Incorrect invoke result!")
147- }
148- else throw("Strict value is not equal to itself.")
149- }
150- else throw("Borrow exceeds user health!")
151- }
152- else throw("Pool liquidity is not sufficient!")
153- else throw("AssetIds does not match")
154- }
155- else throw("Pool address not found!")
156-
157-
158-
159-@Callable(i)
16095 func setup (configAddress,pools) = if (if (!(isDefined(getString(this, "config"))))
16196 then !(isDefined(getString(this, "pools")))
16297 else false)
245180
246181
247182 @Callable(i)
183+func repayTo (poolAddress) = if (checkPool(poolAddress))
184+ then {
185+ let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
186+ if ((fromBase58String(poolAsset) == i.payments[0].assetId))
187+ then if ((size(i.payments) > 0))
188+ then {
189+ let user = toBase58String(i.caller.bytes)
190+ let amount = invoke(addressFromStringValue(poolAddress), "repay", [user], i.payments)
191+ if ((amount == amount))
192+ then {
193+ let assetId = getStringValue(addressFromStringValue(poolAddress), "assetId")
194+ match amount {
195+ case t: Int =>
196+ if ((assetId == "WAVES"))
197+ then [ScriptTransfer(i.caller, t, unit)]
198+ else [ScriptTransfer(i.caller, t, fromBase58String(assetId))]
199+ case t: String =>
200+ nil
201+ case _ =>
202+ throw("Incorrect invoke result!")
203+ }
204+ }
205+ else throw("Strict value is not equal to itself.")
206+ }
207+ else throw("No payment attached!")
208+ else throw("AssetIds does not match")
209+ }
210+ else throw("Pool address not found!")
211+
212+
213+
214+@Callable(i)
215+func borrowFrom (poolAddress,assetId,amount) = if (checkPool(poolAddress))
216+ then {
217+ let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
218+ if ((poolAsset == assetId))
219+ then if (checkPoolLiquidity(poolAddress, amount))
220+ then {
221+ let user = toBase58String(i.caller.bytes)
222+ if (checkUserHealth(user, amount, assetId, 0, ""))
223+ then {
224+ let tokenAmount = invoke(addressFromStringValue(poolAddress), "borrow", [user, amount], nil)
225+ if ((tokenAmount == tokenAmount))
226+ then match tokenAmount {
227+ case t: Int =>
228+ if ((poolAsset == "WAVES"))
229+ then [ScriptTransfer(i.caller, t, unit)]
230+ else [ScriptTransfer(i.caller, t, fromBase58String(poolAsset))]
231+ case t: String =>
232+ nil
233+ case _ =>
234+ throw("Incorrect invoke result!")
235+ }
236+ else throw("Strict value is not equal to itself.")
237+ }
238+ else throw("Borrow exceeds user health!")
239+ }
240+ else throw("Pool liquidity is not sufficient!")
241+ else throw("AssetIds does not match")
242+ }
243+ else throw("Pool address not found!")
244+
245+
246+
247+@Callable(i)
248248 func lockAsCollateralAt (poolAddress) = if (checkPool(poolAddress))
249249 then {
250250 let dTokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
270270
271271
272272 @Callable(i)
273+func redeemCollateralFrom (poolAddress,dtokeId,amount) = if (checkPool(poolAddress))
274+ then {
275+ let poolDTokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
276+ if ((poolDTokenId == dtokeId))
277+ then {
278+ let user = toBase58String(i.caller.bytes)
279+ if (checkUserHealth(user, 0, "", amount, dtokeId))
280+ then {
281+ let tokenAmount = invoke(addressFromStringValue(poolAddress), "redeemCollateral", [user, amount], nil)
282+ if ((tokenAmount == tokenAmount))
283+ then {
284+ let tokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
285+ match tokenAmount {
286+ case t: Int =>
287+[ScriptTransfer(i.caller, t, fromBase58String(tokenId))]
288+ case t: String =>
289+ nil
290+ case _ =>
291+ throw("Incorrect invoke result!")
292+ }
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+ else throw("Borrow exceeds user health!")
297+ }
298+ else throw("AssetIds does not match")
299+ }
300+ else throw("Pool address not found!")
301+
302+
303+
304+@Callable(i)
273305 func deleteData (name) = [DeleteEntry(name)]
274306
275307
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let config = valueOrElse(getStringValue(this, "config"), "")
55
66 let admin = valueOrElse(getStringValue(addressFromStringValue(config), "admin"), "")
77
88 let pools = valueOrElse(getStringValue(this, "pools"), "")
99
1010 func isAdmin (callerAddress) = if ((callerAddress == addressFromStringValue(admin)))
1111 then true
1212 else false
1313
1414
1515 func checkPool (poolAdd) = if (contains(pools, poolAdd))
1616 then true
1717 else false
1818
1919
2020 func writeString (key,stringValue) = StringEntry(key, stringValue)
2121
2222
2323 func writeInteger (key,integerValue) = IntegerEntry(key, integerValue)
2424
2525
2626 func checkPoolLiquidity (poolAddress,amount) = {
2727 let totalSupply = getIntegerValue(addressFromStringValue(poolAddress), "totalSupply")
2828 let totalBorrow = getIntegerValue(addressFromStringValue(poolAddress), "totalBorrow")
2929 let availableLiquidity = (totalSupply - totalBorrow)
3030 if ((availableLiquidity >= amount))
3131 then true
3232 else false
3333 }
3434
3535
3636 func getHealthParameter (user,poolAddress,newDebtAmount,newDebtId,collateralAmount,collateralId) = {
3737 let result = invoke(addressFromStringValue(poolAddress), "getUserHealthParameter", [user, collateralAmount, collateralId, newDebtAmount, newDebtId], nil)
3838 match result {
3939 case t: (Int, Int) =>
4040 t
4141 case _ =>
4242 throw("Return value has the wrong data type")
4343 }
4444 }
4545
4646
4747 func calcHealthFactor (borrowCapacity,borrowCapacityUsed) = fraction((borrowCapacity - borrowCapacityUsed), 1000, borrowCapacity)
4848
4949
5050 func calcBorrowCBorrowCU (user,newDebtAmount,newDebtId,collateralAmount,collateralId) = {
5151 let poolList = split(pools, ";")
5252 let listSize = size(poolList)
5353 func foldPools (accum,next) = {
5454 let healthParams = getHealthParameter(user, next, newDebtAmount, newDebtId, collateralAmount, collateralId)
5555 match healthParams {
5656 case t: (Int, Int) =>
5757 $Tuple2((accum._1 + healthParams._1), (accum._2 + healthParams._1))
5858 case e =>
5959 throw("Test")
6060 }
6161 }
6262
6363 let $list23122346 = poolList
6464 let $size23122346 = size($list23122346)
6565 let $acc023122346 = $Tuple2(0, 0)
6666 if (($size23122346 == 0))
6767 then $acc023122346
6868 else {
6969 let $acc123122346 = foldPools($acc023122346, $list23122346[0])
7070 if (($size23122346 == 1))
7171 then $acc123122346
7272 else {
7373 let $acc223122346 = foldPools($acc123122346, $list23122346[1])
7474 if (($size23122346 == 2))
7575 then $acc223122346
7676 else {
7777 let $acc323122346 = foldPools($acc223122346, $list23122346[2])
7878 throw("List size exceed 2")
7979 }
8080 }
8181 }
8282 }
8383
8484
8585 func checkUserHealth (user,newDebtAmount,newDebtId,collateralAmount,collateralId) = {
8686 let bcBcu = calcBorrowCBorrowCU(user, newDebtAmount, newDebtId, collateralAmount, collateralId)
8787 let userHealth = calcHealthFactor(bcBcu._1, bcBcu._2)
8888 if ((userHealth >= 0))
8989 then true
9090 else false
9191 }
9292
9393
9494 @Callable(i)
95-func repayTo (poolAddress) = if (checkPool(poolAddress))
96- then {
97- let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
98- if ((fromBase58String(poolAsset) == i.payments[0].assetId))
99- then if ((size(i.payments) > 0))
100- then {
101- let user = toBase58String(i.caller.bytes)
102- let amount = invoke(addressFromStringValue(poolAddress), "repay", [user], i.payments)
103- if ((amount == amount))
104- then {
105- let assetId = getStringValue(addressFromStringValue(poolAddress), "assetId")
106- match amount {
107- case t: Int =>
108- if ((assetId == "WAVES"))
109- then [ScriptTransfer(i.caller, t, unit)]
110- else [ScriptTransfer(i.caller, t, fromBase58String(assetId))]
111- case t: String =>
112- nil
113- case _ =>
114- throw("Incorrect invoke result!")
115- }
116- }
117- else throw("Strict value is not equal to itself.")
118- }
119- else throw("No payment attached!")
120- else throw("AssetIds does not match")
121- }
122- else throw("Pool address not found!")
123-
124-
125-
126-@Callable(i)
127-func borrowFrom (poolAddress,assetId,amount) = if (checkPool(poolAddress))
128- then {
129- let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
130- if ((poolAsset == assetId))
131- then if (checkPoolLiquidity(poolAddress, amount))
132- then {
133- let user = toBase58String(i.caller.bytes)
134- if (checkUserHealth(user, amount, assetId, 0, ""))
135- then {
136- let tokenAmount = invoke(addressFromStringValue(poolAddress), "borrow", [user, amount], nil)
137- if ((tokenAmount == tokenAmount))
138- then match tokenAmount {
139- case t: Int =>
140- if ((poolAsset == "WAVES"))
141- then [ScriptTransfer(i.caller, t, unit)]
142- else [ScriptTransfer(i.caller, t, fromBase58String(poolAsset))]
143- case t: String =>
144- nil
145- case _ =>
146- throw("Incorrect invoke result!")
147- }
148- else throw("Strict value is not equal to itself.")
149- }
150- else throw("Borrow exceeds user health!")
151- }
152- else throw("Pool liquidity is not sufficient!")
153- else throw("AssetIds does not match")
154- }
155- else throw("Pool address not found!")
156-
157-
158-
159-@Callable(i)
16095 func setup (configAddress,pools) = if (if (!(isDefined(getString(this, "config"))))
16196 then !(isDefined(getString(this, "pools")))
16297 else false)
16398 then [writeString("config", configAddress), writeString("pools", makeString(pools, ";"))]
16499 else throw("Admin and config address already definied!")
165100
166101
167102
168103 @Callable(i)
169104 func addPool (poolAddress) = if (isAdmin(i.caller))
170105 then {
171106 let poolList = split(pools, ";")
172107 if ((containsElement(poolList, poolAddress) == false))
173108 then {
174109 let newPools = (poolList :+ poolAddress)
175110 [writeString("pools", makeString(newPools, ";"))]
176111 }
177112 else throw("Pool already exists!")
178113 }
179114 else throw("Address does not match with admin address!")
180115
181116
182117
183118 @Callable(i)
184119 func updateConfig (configAddress) = if (isAdmin(i.caller))
185120 then [writeString("config", configAddress)]
186121 else throw("Address does not match with admin address!")
187122
188123
189124
190125 @Callable(i)
191126 func depositAt (poolAddress,isCollateral) = if (checkPool(poolAddress))
192127 then if ((size(i.payments) > 0))
193128 then {
194129 let user = toBase58String(i.caller.bytes)
195130 let tokenAmount = invoke(addressFromStringValue(poolAddress), "deposit", [user, isCollateral], i.payments)
196131 if ((tokenAmount == tokenAmount))
197132 then {
198133 let tokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
199134 match tokenAmount {
200135 case t: Int =>
201136 [ScriptTransfer(i.caller, t, fromBase58String(tokenId))]
202137 case t: String =>
203138 nil
204139 case _ =>
205140 throw("Incorrect invoke result!")
206141 }
207142 }
208143 else throw("Strict value is not equal to itself.")
209144 }
210145 else throw("No payment attached!")
211146 else throw("Pool address not found!")
212147
213148
214149
215150 @Callable(i)
216151 func withdrawFrom (poolAddress) = if (checkPool(poolAddress))
217152 then {
218153 let dTokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
219154 if ((fromBase58String(dTokenId) == i.payments[0].assetId))
220155 then if ((size(i.payments) > 0))
221156 then {
222157 let user = toBase58String(i.caller.bytes)
223158 let tokenAmount = invoke(addressFromStringValue(poolAddress), "withdraw", [user], i.payments)
224159 if ((tokenAmount == tokenAmount))
225160 then {
226161 let tokenId = getStringValue(addressFromStringValue(poolAddress), "assetId")
227162 match tokenAmount {
228163 case t: Int =>
229164 if ((tokenId == "WAVES"))
230165 then [ScriptTransfer(i.caller, t, unit)]
231166 else [ScriptTransfer(i.caller, t, fromBase58String(tokenId))]
232167 case t: String =>
233168 nil
234169 case _ =>
235170 throw("Incorrect invoke result!")
236171 }
237172 }
238173 else throw("Strict value is not equal to itself.")
239174 }
240175 else throw("No payment attached!")
241176 else throw("AssetIds does not match")
242177 }
243178 else throw("Pool address not found!")
244179
245180
246181
247182 @Callable(i)
183+func repayTo (poolAddress) = if (checkPool(poolAddress))
184+ then {
185+ let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
186+ if ((fromBase58String(poolAsset) == i.payments[0].assetId))
187+ then if ((size(i.payments) > 0))
188+ then {
189+ let user = toBase58String(i.caller.bytes)
190+ let amount = invoke(addressFromStringValue(poolAddress), "repay", [user], i.payments)
191+ if ((amount == amount))
192+ then {
193+ let assetId = getStringValue(addressFromStringValue(poolAddress), "assetId")
194+ match amount {
195+ case t: Int =>
196+ if ((assetId == "WAVES"))
197+ then [ScriptTransfer(i.caller, t, unit)]
198+ else [ScriptTransfer(i.caller, t, fromBase58String(assetId))]
199+ case t: String =>
200+ nil
201+ case _ =>
202+ throw("Incorrect invoke result!")
203+ }
204+ }
205+ else throw("Strict value is not equal to itself.")
206+ }
207+ else throw("No payment attached!")
208+ else throw("AssetIds does not match")
209+ }
210+ else throw("Pool address not found!")
211+
212+
213+
214+@Callable(i)
215+func borrowFrom (poolAddress,assetId,amount) = if (checkPool(poolAddress))
216+ then {
217+ let poolAsset = getStringValue(addressFromStringValue(poolAddress), "assetId")
218+ if ((poolAsset == assetId))
219+ then if (checkPoolLiquidity(poolAddress, amount))
220+ then {
221+ let user = toBase58String(i.caller.bytes)
222+ if (checkUserHealth(user, amount, assetId, 0, ""))
223+ then {
224+ let tokenAmount = invoke(addressFromStringValue(poolAddress), "borrow", [user, amount], nil)
225+ if ((tokenAmount == tokenAmount))
226+ then match tokenAmount {
227+ case t: Int =>
228+ if ((poolAsset == "WAVES"))
229+ then [ScriptTransfer(i.caller, t, unit)]
230+ else [ScriptTransfer(i.caller, t, fromBase58String(poolAsset))]
231+ case t: String =>
232+ nil
233+ case _ =>
234+ throw("Incorrect invoke result!")
235+ }
236+ else throw("Strict value is not equal to itself.")
237+ }
238+ else throw("Borrow exceeds user health!")
239+ }
240+ else throw("Pool liquidity is not sufficient!")
241+ else throw("AssetIds does not match")
242+ }
243+ else throw("Pool address not found!")
244+
245+
246+
247+@Callable(i)
248248 func lockAsCollateralAt (poolAddress) = if (checkPool(poolAddress))
249249 then {
250250 let dTokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
251251 if ((fromBase58String(dTokenId) == i.payments[0].assetId))
252252 then if ((size(i.payments) > 0))
253253 then {
254254 let user = toBase58String(i.caller.bytes)
255255 let msg = invoke(addressFromStringValue(poolAddress), "lockAsCollateral", [user], i.payments)
256256 if ((msg == msg))
257257 then match msg {
258258 case t: String =>
259259 nil
260260 case _ =>
261261 throw("Incorrect invoke result!")
262262 }
263263 else throw("Strict value is not equal to itself.")
264264 }
265265 else throw("No payment attached!")
266266 else throw("AssetIds does not match")
267267 }
268268 else throw("Pool address not found!")
269269
270270
271271
272272 @Callable(i)
273+func redeemCollateralFrom (poolAddress,dtokeId,amount) = if (checkPool(poolAddress))
274+ then {
275+ let poolDTokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
276+ if ((poolDTokenId == dtokeId))
277+ then {
278+ let user = toBase58String(i.caller.bytes)
279+ if (checkUserHealth(user, 0, "", amount, dtokeId))
280+ then {
281+ let tokenAmount = invoke(addressFromStringValue(poolAddress), "redeemCollateral", [user, amount], nil)
282+ if ((tokenAmount == tokenAmount))
283+ then {
284+ let tokenId = getStringValue(addressFromStringValue(poolAddress), "dTokenId")
285+ match tokenAmount {
286+ case t: Int =>
287+[ScriptTransfer(i.caller, t, fromBase58String(tokenId))]
288+ case t: String =>
289+ nil
290+ case _ =>
291+ throw("Incorrect invoke result!")
292+ }
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+ else throw("Borrow exceeds user health!")
297+ }
298+ else throw("AssetIds does not match")
299+ }
300+ else throw("Pool address not found!")
301+
302+
303+
304+@Callable(i)
273305 func deleteData (name) = [DeleteEntry(name)]
274306
275307

github/deemru/w8io/026f985 
43.56 ms