2021.12.28 15:21 [2919139] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "BcVQveN3Ct6VjL26XSajfKuNhHxkhY3DgNMYbxUVCA42", "fee": 1000000, "feeAssetId": null, "timestamp": 1640693895553, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "161Z8r1phEhgzUuf273JWiAFuU8T9VokFp3actz8KfNsRYTtbQ8hXMozUv1u6igJsoqRuVj346CY48RNef1uxap" ], "script": "base64:AAIFAAAAAAAAAHAIAhIDCgEIEgMKAQgSBAoCCAQSBQoDCAQIEgMKAQgSBAoCCAESABIAEgQKAggBEgQKAggBEgQKAggBEgQKAggBEgQKAggBEgQKAgEEEgUKAwgBBBIDCgEEEgMKAQQSAwoBCBIGCgQICAgBEgQKAggIAAAALQAAAAALZmFjdG9yc0Jhc2UAAAAAAAAAA+gBAAAADGZyYWN0aW9uQ2VpbAAAAAMAAAAFdmFsdWUAAAAJbnVtZXJhdG9yAAAAC2Rlbm9taW5hdG9yBAAAAARjYW5kCQAAawAAAAMFAAAABXZhbHVlBQAAAAludW1lcmF0b3IFAAAAC2Rlbm9taW5hdG9yBAAAAAFEAAAAAAC1BPMzBAAAAAVleGFjdAkAAAAAAAACCQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAARjYW5kBQAAAAFECQAAagAAAAIFAAAAC2Rlbm9taW5hdG9yBQAAAAFEBQAAAAFECQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAAV2YWx1ZQUAAAABRAkAAGoAAAACBQAAAAludW1lcmF0b3IFAAAAAUQFAAAAAUQDBQAAAAVleGFjdAUAAAAEY2FuZAkAAGQAAAACBQAAAARjYW5kAAAAAAAAAAABAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBAAAABmFzSW50MgAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAooSW50LCBJbnQpBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQyAQAAAAZhc0ludDMAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPKEludCwgSW50LCBJbnQpBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQzAQAAAAZhc0ludDQAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUKEludCwgSW50LCBJbnQsIEludCkEAAAAAXgFAAAAByRtYXRjaDAFAAAAAXgEAAAAAXQFAAAAByRtYXRjaDAJAAACAAAAAQIAAAAad3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludDQBAAAABmFzSW50NQAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABkoSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQ1AQAAABFhc1VzZXJCYWxhbmNlRGF0YQAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAACIoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEJvb2xlYW4pBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAIndyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQ1JkJvb2xlYW4AAAAACmFkbWluU3RvcmUCAAAABWFkbWluAAAAAAtjb25maWdTdG9yZQIAAAAGY29uZmlnAAAAAA1yZXNlcnZlc1N0b3JlAgAAAAhyZXNlcnZlcwAAAAANYVRva2VuSWRTdG9yZQIAAAAIYVRva2VuSWQAAAAADGFzc2V0SWRTdG9yZQIAAAAHYXNzZXRJZAAAAAAQZGlzdHJpYnV0b3JTdG9yZQIAAAARdmlyZXNfZGlzdHJpYnV0b3IAAAAABWFkbWluCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAphZG1pblN0b3JlAAAAAAZjb25maWcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAC2NvbmZpZ1N0b3JlAAAAAAtyZXNlcnZlc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADXJlc2VydmVzU3RvcmUCAAAAFm5vIHJlc2VydmVzIHJlZ2lzdGVyZWQAAAAACHJlc2VydmVzCQAEtQAAAAIFAAAAC3Jlc2VydmVzU3RyAgAAAAF8AAAAAAt2aXJlc01pbnRlcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAZjb25maWcCAAAADHZpcmVzX21pbnRlcgIAAAAObm8gdmlyZXNNaW50ZXICAAAAE2ludmFsaWQgdmlyZXNNaW50ZXIAAAAAEG1heWJlVmlyZXNTdGFrZXIJAAQdAAAAAgUAAAAGY29uZmlnAgAAAAx2aXJlc19zdGFrZXIAAAAAC3ZpcmVzU3Rha2VyCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIFAAAAEG1heWJlVmlyZXNTdGFrZXICAAAAD25vIHZpcmVzX3N0YWtlcgAAAAAVbWF5YmVWaXJlc0Rpc3RyaWJ1dG9yBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABmNvbmZpZwUAAAAQZGlzdHJpYnV0b3JTdG9yZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFkBQAAAAckbWF0Y2gwCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAFkBQAAAAR1bml0AAAAABFtYXliZVZpcmVzQXNzZXRJZAkABB0AAAACBQAAAAt2aXJlc01pbnRlcgIAAAAHYXNzZXRJZAAAAAAMdmlyZXNBc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAABFtYXliZVZpcmVzQXNzZXRJZAIAAAAXdmlyZXMgYXNzZXRJZCBub3QgZm91bmQCAAAAFWludmFsaWQgdmlyZXMgYXNzZXRJZAEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB3Jlc2VydmUFAAAADGFzc2V0SWRTdG9yZQIAAAAVbm8gYXNzZXRJZCBpbiByZXNlcnZlAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAARX0NvbGxhdGVyYWxGYWN0b3ICAAAAHW5vIENvbGxhdGVyYWxGYWN0b3IgaW4gY29uZmlnAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAIAAAAhbm8gTGlxdWlkYXRpb25UaHJlc2hvbGQgaW4gY29uZmlnAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQIAAAAfbm8gTGlxdWlkYXRpb25QZW5hbHR5IGluIGNvbmZpZwAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgAAABtubyBhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQAAAAAFGFjY291bnRIZWFsdGhPdmVybGFwCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAABlubyBhY2NvdW50X2hlYWx0aF9vdmVybGFwAAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAEGNvbGxhcHNlX3BlbmFsdHkCAAAAE25vIGNvbGxhcHNlX3BlbmFsdHkAAAAAC2xpcXVpZGF0b3JzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABmNvbmZpZwIAAAALbGlxdWlkYXRvcnMCAAAAAAEAAAANZmluZFJlc2VydmVCeQAAAAIAAAAFc3RvcmUAAAAFdmFsdWUKAQAAAARmb2xkAAAAAgAAAAFhAAAAAXIEAAAAByRtYXRjaDAFAAAAAWEDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0FkZHJlc3MEAAAABWZvdW5kBQAAAAckbWF0Y2gwBQAAAAVmb3VuZAQAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAAAXICAAAAE3Jlc2VydmUgYmFkIGFkZHJlc3MDCQAAAAAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdyZXNlcnZlBQAAAAVzdG9yZQkAASwAAAACAgAAAA9yZXNlcnZlIGhhcyBubyAFAAAABXN0b3JlBQAAAAV2YWx1ZQUAAAAHcmVzZXJ2ZQUAAAAEdW5pdAQAAAAHJG1hdGNoMAoAAAAAAiRsBQAAAAhyZXNlcnZlcwoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAFAAAABHVuaXQKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAARmb2xkAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdBZGRyZXNzBAAAAAVmb3VuZAUAAAAHJG1hdGNoMAUAAAAFZm91bmQJAAACAAAAAQkAASwAAAACAgAAAAh1bmtub3duIAUAAAAFc3RvcmUBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEAAAABcgMJAQAAAAhjb250YWlucwAAAAIFAAAAC3Jlc2VydmVzU3RyBQAAAAFyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAARbWFpbjogYmFkIHJlc2VydmUJAAACAAAAAQkAASwAAAACAgAAABB1bmtub3duIHJlc2VydmU6BQAAAAFyAQAAAAt1c2VyQmFsYW5jZQAAAAIAAAAHcmVzZXJ2ZQAAAAR1c2VyCQEAAAARYXNVc2VyQmFsYW5jZURhdGEAAAABCQAD/AAAAAQFAAAAB3Jlc2VydmUCAAAAC3VzZXJCYWxhbmNlCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAQAAAAl1c2VyUG93ZXIAAAABAAAABHVzZXIKAQAAAARmb2xkAAAAAgAAAAZ0b3RhbHMAAAABcgQAAAALJHQwNDQzMTQ0NjAFAAAABnRvdGFscwQAAAAGdG90YWxECAUAAAALJHQwNDQzMTQ0NjAAAAACXzEEAAAABnRvdGFsQggFAAAACyR0MDQ0MzE0NDYwAAAAAl8yBAAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAATcmVzZXJ2ZSBiYWQgYWRkcmVzcwQAAAACY2YJAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQUAAAAHcmVzZXJ2ZQQAAAACbHQJAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEFAAAAB3Jlc2VydmUEAAAACyR0MDQ2MzE0NzE5CQEAAAALdXNlckJhbGFuY2UAAAACBQAAAAdyZXNlcnZlBQAAAAR1c2VyBAAAAAV0b2tlbggFAAAACyR0MDQ2MzE0NzE5AAAAAl8xBAAAAAVhc3NldAgFAAAACyR0MDQ2MzE0NzE5AAAAAl8yBAAAAApkZXBvc2l0VXNkCAUAAAALJHQwNDYzMTQ3MTkAAAACXzMEAAAABGRlYnQIBQAAAAskdDA0NjMxNDcxOQAAAAJfNAQAAAAHZGVidFVzZAgFAAAACyR0MDQ2MzE0NzE5AAAAAl81BAAAAAxhc0NvbGxhdGVyYWwIBQAAAAskdDA0NjMxNDcxOQAAAAJfNgQAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAMFAAAADGFzQ29sbGF0ZXJhbAUAAAAKZGVwb3NpdFVzZAAAAAAAAAAAAAQAAAAKb3ZlcmxhcFVzZAkAAZcAAAABCQAETAAAAAIFAAAAB2RlYnRVc2QJAARMAAAAAgUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAUAAAADbmlsBAAAAA1vdmVybGFwQ2hhcmdlCQEAAAAMZnJhY3Rpb25DZWlsAAAAAwUAAAAKb3ZlcmxhcFVzZAUAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAFAAAAC2ZhY3RvcnNCYXNlAwkAAGYAAAACBQAAAAdkZWJ0VXNkBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkCQAFFAAAAAIFAAAABnRvdGFsRAkAAGQAAAACCQAAZAAAAAIFAAAABnRvdGFsQgkAAGsAAAADCQAAZQAAAAIFAAAAB2RlYnRVc2QFAAAAE2VmZmVjdGl2ZURlcG9zaXRV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bGxlcgQAAAAMY2xhaW1lZFRvdGFsCQEAAAAWY2xhaW1BbGxSZXdhcmRzRm9yVXNlcgAAAAEFAAAABHVzZXIJAQAAAA1zdGFrZU9yUGF5b3V0AAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxjbGFpbWVkVG90YWwFAAAABXN0YWtlAAAAAWkBAAAAIGNsYWltQWxsUmV3YXJkc0FuZEFsbEViQXZhaWxhYmxlAAAAAQAAAAVzdGFrZQQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACWNsYWltZWRFYgkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAGY29uZmlnAgAAAAplYl9yZXdhcmRzAgAAACBubyBlYl9yZXdhcmRzIGNvbnRyYWN0IGluIGNvbmZpZwIAAAAQY2xhaW1FYlJld2FyZEZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIA//////////8FAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAljbGFpbWVkRWIFAAAACWNsYWltZWRFYgQAAAAOY2xhaW1lZFJld2FyZHMJAQAAABZjbGFpbUFsbFJld2FyZHNGb3JVc2VyAAAAAQUAAAAEdXNlcgMJAAAAAAAAAgUAAAAOY2xhaW1lZFJld2FyZHMFAAAADmNsYWltZWRSZXdhcmRzBAAAAAxjbGFpbWVkVG90YWwJAABkAAAAAgUAAAAJY2xhaW1lZEViBQAAAA5jbGFpbWVkUmV3YXJkcwMJAAAAAAAAAgUAAAAMY2xhaW1lZFRvdGFsBQAAAAxjbGFpbWVkVG90YWwJAQAAAA1zdGFrZU9yUGF5b3V0AAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxjbGFpbWVkVG90YWwFAAAABXN0YWtlCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFmRpc2FibGVVc2VBc0NvbGxhdGVyYWwAAAABAAAAB3Jlc2VydmUEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA9kb1NldENvbGxhdGVyYWwJAAP8AAAABAkBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAGWRpc2FibGVVc2VBc0NvbGxhdGVyYWxGb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2RvU2V0Q29sbGF0ZXJhbAUAAAAPZG9TZXRDb2xsYXRlcmFsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAAGmNoYW5naW5nIGNvbGxhdGVyYWwgc3RhdHVzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAx0cmFuc2ZlckRlYnQAAAAEAAAADWJvcnJvd1Jlc2VydmUAAAARY29sbGF0ZXJhbFJlc2VydmUAAAAIYm9ycm93ZXIAAAATbGlxdWlkYXRlRGVidEFtb3VudAQAAAADc2gxCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAAA1ib3Jyb3dSZXNlcnZlAwkAAAAAAAACBQAAAANzaDEFAAAAA3NoMQQAAAADc2gyCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQMJAAAAAAAAAgUAAAADc2gyBQAAAANzaDIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQJAAACAAAAAQIAAAAjY2FuJ3QgbGlxdWlkYXRlIG5vbi1wb3NpdGl2ZSBhbW91bnQDCQAAAAAAAAIFAAAAEWNvbGxhdGVyYWxSZXNlcnZlBQAAAA1ib3Jyb3dSZXNlcnZlCQAAAgAAAAECAAAAJmNvbGxhdGVyYWxSZXNlcnZlIGVxdWFscyBib3Jyb3dSZXNlcnZlBAAAAApsaXF1aWRhdG9yCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAKbGlxdWlkYXRvcgUAAAAIYm9ycm93ZXIJAAACAAAAAQIAAAAUY2FuJ3QgbGlxdWlkYXRlIHNlbGYEAAAADSR0MDE0Nzk2MTQ4MzEJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAA0kdDAxNDc5NjE0ODMxAAAAAl8xBAAAAANicHUIBQAAAA0kdDAxNDc5NjE0ODMxAAAAAl8yAwkAAGYAAAACBQAAAAJicAUAAAADYnB1CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACBjYW4ndCBsaXF1aWRhdGUgaGVhbHRoeSB1c2VyOiB1PQUAAAAIYm9ycm93ZXICAAAABSwgYnA9CQABpAAAAAEFAAAAAmJwAgAAAAYsIGJwdT0JAAGkAAAAAQUAAAADYnB1BAAAAAJicgkBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEFAAAADWJvcnJvd1Jlc2VydmUEAAAAAmNyCQEAAAAPdmFsaWRhdGVSZXNlcnZlAAAAAQUAAAARY29sbGF0ZXJhbFJlc2VydmUEAAAAC2JvcnJvd0Fzc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAACYnICAAAAB2Fzc2V0SWQJAAEsAAAAAgIAAAAibm8gYXNzZXRJZCBmaWVsZCBpbiBib3Jyb3dSZXNlcnZlIAUAAAANYm9ycm93UmVzZXJ2ZQQAAAAMaXNDb2xsYXRlcmFsCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAAAmNyCQABLAAAAAIFAAAACGJvcnJvd2VyAgAAABBfdXNlQXNDb2xsYXRlcmFsBwMJAAAAAAAAAgUAAAAMaXNDb2xsYXRlcmFsBQAAAAxpc0NvbGxhdGVyYWwDCQEAAAABIQAAAAEFAAAADGlzQ29sbGF0ZXJhbAkAAAIAAAABAgAAAC5jYW4ndCBsaXF1aWRhdGUgZGVwb3NpdCBub3QgdXNlZCBhcyBjb2xsYXRlcmFsBAAAAA0kdDAxNTM0NzE1NDM3CQEAAAALdXNlckJhbGFuY2UAAAACBQAAAAJicgUAAAAIYm9ycm93ZXIDCQAAAAAAAAIFAAAADSR0MDE1MzQ3MTU0MzcFAAAADSR0MDE1MzQ3MTU0MzcEAAAAC3VzZXJEZWJ0VXNkCAUAAAANJHQwMTUzNDcxNTQzNwAAAAJfNQQAAAAIdXNlckRlYnQIBQAAAA0kdDAxNTM0NzE1NDM3AAAAAl80BAAAAAx1c2VyQXNzZXRVc2QIBQAAAA0kdDAxNTM0NzE1NDM3AAAAAl8zBAAAAAl1c2VyQXNzZXQIBQAAAA0kdDAxNTM0NzE1NDM3AAAAAl8yBAAAAAZpZ25vcmUIBQAAAA0kdDAxNTM0NzE1NDM3AAAAAl8xAwkAAGcAAAACBQAAAAl1c2VyQXNzZXQFAAAACHVzZXJEZWJ0CQAAAgAAAAECAAAAL2Nhbid0IGxpcXVpZGF0ZSBkZWJ0IG9mIGFzc2V0IG9mIHBvc2l0aXZlIHNhbGRvAwkAAGcAAAACAAAAAAAAAAAABQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50CQAAAgAAAAECAAAAJ2Nhbid0IGxpcXVpZGF0ZSB6ZXJvIG9yIG5lZ2F0aXZlIGFtb3VudAMJAABmAAAAAgkAAGgAAAACBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50AAAAAAAAAAACCQAAZQAAAAIFAAAACHVzZXJEZWJ0BQAAAAl1c2VyQXNzZXQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAALmNhbid0IGxpcXVpZGF0ZSBtb3JlIHRoYW4gaGFsZiBvZiBzYWxkbzogZGVidD0JAAGkAAAAAQUAAAAIdXNlckRlYnQCAAAACiwgZGVwb3NpdD0JAAGkAAAAAQUAAAAJdXNlckFzc2V0AgAAABgsIGxpcXVpZGF0ZURlYnRBbW91bnQgPSAJAAGkAAAAAQUAAAATbGlxdWlkYXRlRGVidEFtb3VudAQAAAANY29sbGF0ZXJhbFVzZAkAAGsAAAADBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BQAAAAt1c2VyRGVidFVzZAUAAAAIdXNlckRlYnQEAAAADXBlbmFsdGl6ZWRVc2QJAABrAAAAAwUAAAANY29sbGF0ZXJhbFVzZAkAAGQAAAACBQAAAAtmYWN0b3JzQmFzZQkBAAAAEmxpcXVpZGF0aW9uUGVuYWx0eQAAAAEFAAAAC2JvcnJvd0Fzc2V0BQAAAAtmYWN0b3JzQmFzZQQAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsCQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAmNyAgAAABJ0cmFuc2ZlckFUb2tlbnNGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAAA1wZW5hbHRpemVkVXNkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwEAAAAEXByb3BhZ2F0ZVJld2FyZHMxCQEAAAAKbW92ZVN0cmVhbQAAAAUFAAAAEWNvbGxhdGVyYWxSZXNlcnZlAgAAAAdkZXBvc2l0BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMQUAAAARcHJvcGFnYXRlUmV3YXJkczEEAAAAD3RyYW5zZmVycmVkRGVidAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAJicgIAAAAPdHJhbnNmZXJEZWJ0Rm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAATbGlxdWlkYXRlRGVidEFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD3RyYW5zZmVycmVkRGVidAUAAAAPdHJhbnNmZXJyZWREZWJ0BAAAABFwcm9wYWdhdGVSZXdhcmRzMgkBAAAACm1vdmVTdHJlYW0AAAAFBQAAAA1ib3Jyb3dSZXNlcnZlAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyBQAAAApsaXF1aWRhdG9yBQAAAA90cmFuc2ZlcnJlZERlYnQDCQAAAAAAAAIFAAAAEXByb3BhZ2F0ZVJld2FyZHMyBQAAABFwcm9wYWdhdGVSZXdhcmRzMgQAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrAwkBAAAACGNvbnRhaW5zAAAAAgUAAAALbGlxdWlkYXRvcnMFAAAACmxpcXVpZGF0b3IFAAAAA25pbAkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAApsaXF1aWRhdG9yAgAAABF0cmFuc2ZlcnJpbmcgZGVidAMJAAAAAAAAAgUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrBQAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sJAAUUAAAAAgUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAANZm9yY2VDb2xsYXBzZQAAAAIAAAAHcmVzZXJ2ZQAAAAhib3Jyb3dlcgQAAAAOcmVzZXJ2ZUFkZHJlc3MJAQAAAA92YWxpZGF0ZVJlc2VydmUAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAA5yZXNlcnZlQWRkcmVzcwUAAAAOcmVzZXJ2ZUFkZHJlc3MEAAAAAnNoCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAAJzaAUAAAACc2gEAAAACmxpcXVpZGF0b3IJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAAAAAAACBQAAAApsaXF1aWRhdG9yBQAAAAhib3Jyb3dlcgkAAAIAAAABAgAAACRjYW4ndCBjb2xsYXBzZSBzZWxmIGluIHRoaXMgZnVuY3Rpb24EAAAADSR0MDE3MDMxMTcwNjYJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAA0kdDAxNzAzMTE3MDY2AAAAAl8xBAAAAANicHUIBQAAAA0kdDAxNzAzMTE3MDY2AAAAAl8yAwkAAGYAAAACBQAAAAJicAUAAAADYnB1CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACVjYW4ndCBmb3JjZSBjb2xsYXBzZSBoZWFsdGh5IHVzZXI6IHU9BQAAAAhib3Jyb3dlcgIAAAAFLCBicD0JAAGkAAAAAQUAAAACYnACAAAABiwgYnB1PQkAAaQAAAABBQAAAANicHUEAAAADSR0MDE3MjExMTczMTkJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAADnJlc2VydmVBZGRyZXNzBQAAAAhib3Jyb3dlcgMJAAAAAAAAAgUAAAANJHQwMTcyMTExNzMxOQUAAAANJHQwMTcyMTExNzMxOQQAAAALdXNlckRlYnRVc2QIBQAAAA0kdDAxNzIxMTE3MzE5AAAAAl81BAAAAAh1c2VyRGVidAgFAAAADSR0MDE3MjExMTczMTkAAAACXzQEAAAADHVzZXJBc3NldFVzZAgFAAAADSR0MDE3MjExMTczMTkAAAACXzMEAAAAD2JvcnJvd2VyRGVwb3NpdAgFAAAADSR0MDE3MjExMTczMTkAAAACXzIEAAAABmlnbm9yZQgFAAAADSR0MDE3MjExMTczMTkAAAACXzEEAAAADXBlbmFsdGl6ZWRVc2QJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAADHVzZXJBc3NldFVzZAkABEwAAAACBQAAAAt1c2VyRGVidFVzZAUAAAADbmlsBQAAAA9jb2xsYXBzZVBlbmFsdHkFAAAAC2ZhY3RvcnNCYXNlBAAAABF0cmFuc2ZlcnJlZEFzc2V0cwkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAASdHJhbnNmZXJBVG9rZW5zRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAANcGVuYWx0aXplZFVzZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAEXRyYW5zZmVycmVkQXNzZXRzBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwQAAAARcHJvcGFnYXRlUmV3YXJkczEJAQAAAAptb3ZlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAEXRyYW5zZmVycmVkQXNzZXRzAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMQUAAAARcHJvcGFnYXRlUmV3YXJkczEEAAAACWNvbGxhcHNlZAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAALY29sbGFwc2VGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAljb2xsYXBzZWQFAAAACWNvbGxhcHNlZAQAAAARcHJvcGFnYXRlUmV3YXJkczIJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAAdyZXNlcnZlAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyCQEAAAABLQAAAAEFAAAACWNvbGxhcHNlZAkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQDCQAAAAAAAAIFAAAAEXByb3BhZ2F0ZVJld2FyZHMyBQAAABFwcm9wYWdhdGVSZXdhcmRzMgQAAAARcHJvcGFnYXRlUmV3YXJkczMJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAAdyZXNlcnZlAgAAAAdkZXBvc2l0BQAAAAhib3Jyb3dlcgkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQJAQAAAAEtAAAAAQUAAAAJY29sbGFwc2VkAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMwUAAAARcHJvcGFnYXRlUmV3YXJkczMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAOE7vFs=", "chainId": 87, "height": 2919139, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HNCW2peBCEsamg9S9CQUbohwyGVvHzJ4aB7g4VcCM4Cj Next: EmWEq8XmGgLoGazRJC7ND3dUHZZkWj8NrcFkjoL7uQi5 Diff:
OldNewDifferences
137137 match let $l = reserves
138138 let $s = size($l)
139139 let $acc0 = unit
140- func 1 ($a,$i) = if (($i >= $s))
140+ func $f0_1 ($a,$i) = if (($i >= $s))
141141 then $a
142142 else fold($a, $l[$i])
143143
144- func 2 ($a,$i) = if (($i >= $s))
144+ func $f0_2 ($a,$i) = if (($i >= $s))
145145 then $a
146146 else throw("List size exceeds 7")
147147
148- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
148+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
149149 case found: Address =>
150150 found
151151 case _ =>
190190 let $l = reserves
191191 let $s = size($l)
192192 let $acc0 = $Tuple2(0, 0)
193- func 1 ($a,$i) = if (($i >= $s))
193+ func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else fold($a, $l[$i])
196196
197- func 2 ($a,$i) = if (($i >= $s))
197+ func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 7")
200200
201- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
201+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
202202 }
203203
204204
299299 let $l = rewardReserves
300300 let $s = size($l)
301301 let $acc0 = 0
302- func 1 ($a,$i) = if (($i >= $s))
302+ func $f0_1 ($a,$i) = if (($i >= $s))
303303 then $a
304304 else fold($a, $l[$i])
305305
306- func 2 ($a,$i) = if (($i >= $s))
306+ func $f0_2 ($a,$i) = if (($i >= $s))
307307 then $a
308308 else throw("List size exceeds 7")
309309
310- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
310+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
311311 }
312312 claimedTotal
313313 }
396396 then {
397397 let propagateRewards = updateStream(toString(targetContract), "deposit", user, replenishedAssetAmount, 0)
398398 if ((propagateRewards == propagateRewards))
399- then validateAfter(user, "replenishing")
399+ then nil
400+ else throw("Strict value is not equal to itself.")
401+ }
402+ else throw("Strict value is not equal to itself.")
403+ }
404+ else throw("Strict value is not equal to itself.")
405+ }
406+
407+
408+
409+@Callable(i)
410+func redeemAtokens () = {
411+ let user = toString(i.caller)
412+ let aTokenId = match i.payments[0].assetId {
413+ case bv: ByteVector =>
414+ toBase58String(bv)
415+ case _ =>
416+ throw("bad assetId: waves not allowed")
417+ }
418+ let targetContract = findReserveBy(aTokenIdStore, aTokenId)
419+ let sh = syncRewardsHeight(toString(targetContract))
420+ if ((sh == sh))
421+ then {
422+ let redeemedAssetAmount = asInt(invoke(targetContract, "redeemAtokensFor", [user], i.payments))
423+ if ((redeemedAssetAmount == redeemedAssetAmount))
424+ then {
425+ let propagateRewards = updateStream(toString(targetContract), "deposit", user, 0, -(redeemedAssetAmount))
426+ if ((propagateRewards == propagateRewards))
427+ then nil
400428 else throw("Strict value is not equal to itself.")
401429 }
402430 else throw("Strict value is not equal to itself.")
605633 if ((liquidator == borrower))
606634 then throw("can't liquidate self")
607635 else {
608- let $t01424614281 = userPower(borrower)
609- let bp = $t01424614281._1
610- let bpu = $t01424614281._2
636+ let $t01479614831 = userPower(borrower)
637+ let bp = $t01479614831._1
638+ let bpu = $t01479614831._2
611639 if ((bp > bpu))
612640 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
613641 else {
619647 then if (!(isCollateral))
620648 then throw("can't liquidate deposit not used as collateral")
621649 else {
622- let $t01479714887 = userBalance(br, borrower)
623- if (($t01479714887 == $t01479714887))
650+ let $t01534715437 = userBalance(br, borrower)
651+ if (($t01534715437 == $t01534715437))
624652 then {
625- let userDebtUsd = $t01479714887._5
626- let userDebt = $t01479714887._4
627- let userAssetUsd = $t01479714887._3
628- let userAsset = $t01479714887._2
629- let ignore = $t01479714887._1
653+ let userDebtUsd = $t01534715437._5
654+ let userDebt = $t01534715437._4
655+ let userAssetUsd = $t01534715437._3
656+ let userAsset = $t01534715437._2
657+ let ignore = $t01534715437._1
630658 if ((userAsset >= userDebt))
631659 then throw("can't liquidate debt of asset of positive saldo")
632660 else if ((0 >= liquidateDebtAmount))
689717 if ((liquidator == borrower))
690718 then throw("can't collapse self in this function")
691719 else {
692- let $t01648116516 = userPower(borrower)
693- let bp = $t01648116516._1
694- let bpu = $t01648116516._2
720+ let $t01703117066 = userPower(borrower)
721+ let bp = $t01703117066._1
722+ let bpu = $t01703117066._2
695723 if ((bp > bpu))
696724 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
697725 else {
698- let $t01666116769 = userBalance(reserveAddress, borrower)
699- if (($t01666116769 == $t01666116769))
726+ let $t01721117319 = userBalance(reserveAddress, borrower)
727+ if (($t01721117319 == $t01721117319))
700728 then {
701- let userDebtUsd = $t01666116769._5
702- let userDebt = $t01666116769._4
703- let userAssetUsd = $t01666116769._3
704- let borrowerDeposit = $t01666116769._2
705- let ignore = $t01666116769._1
729+ let userDebtUsd = $t01721117319._5
730+ let userDebt = $t01721117319._4
731+ let userAssetUsd = $t01721117319._3
732+ let borrowerDeposit = $t01721117319._2
733+ let ignore = $t01721117319._1
706734 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
707735 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
708736 if ((transferredAssets == transferredAssets))
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("wrong type, expected: Int2")
3434 }
3535
3636
3737 func asInt3 (value) = match value {
3838 case x: (Int, Int, Int) =>
3939 x
4040 case t =>
4141 throw("wrong type, expected: Int3")
4242 }
4343
4444
4545 func asInt4 (value) = match value {
4646 case x: (Int, Int, Int, Int) =>
4747 x
4848 case t =>
4949 throw("wrong type, expected: Int4")
5050 }
5151
5252
5353 func asInt5 (value) = match value {
5454 case x: (Int, Int, Int, Int, Int) =>
5555 x
5656 case t =>
5757 throw("wrong type, expected: Int5")
5858 }
5959
6060
6161 func asUserBalanceData (value) = match value {
6262 case x: (Int, Int, Int, Int, Int, Boolean) =>
6363 x
6464 case t =>
6565 throw("wrong type, expected: Int5&Boolean")
6666 }
6767
6868
6969 let adminStore = "admin"
7070
7171 let configStore = "config"
7272
7373 let reservesStore = "reserves"
7474
7575 let aTokenIdStore = "aTokenId"
7676
7777 let assetIdStore = "assetId"
7878
7979 let distributorStore = "vires_distributor"
8080
8181 let admin = addressFromStringValue(getStringValue(this, adminStore))
8282
8383 let config = addressFromStringValue(getStringValue(this, configStore))
8484
8585 let reservesStr = valueOrErrorMessage(getString(this, reservesStore), "no reserves registered")
8686
8787 let reserves = split(reservesStr, "|")
8888
8989 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(config, "vires_minter"), "no viresMinter")), "invalid viresMinter")
9090
9191 let maybeViresStaker = getString(config, "vires_staker")
9292
9393 let viresStaker = addressFromStringValue(valueOrErrorMessage(maybeViresStaker, "no vires_staker"))
9494
9595 let maybeViresDistributor = match getString(config, distributorStore) {
9696 case d: String =>
9797 addressFromStringValue(d)
9898 case _ =>
9999 unit
100100 }
101101
102102 let maybeViresAssetId = getString(viresMinter, "assetId")
103103
104104 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "vires assetId not found")), "invalid vires assetId")
105105
106106 func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
107107
108108
109109 func collateralFactor (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
110110
111111
112112 func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
113113
114114
115115 func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(config, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
116116
117117
118118 let accountHealthThreshold = valueOrErrorMessage(getInteger(config, "account_health_threshold"), "no account_health_threshold")
119119
120120 let accountHealthOverlap = valueOrErrorMessage(getInteger(config, "account_health_overlap"), "no account_health_overlap")
121121
122122 let collapsePenalty = valueOrErrorMessage(getInteger(config, "collapse_penalty"), "no collapse_penalty")
123123
124124 let liquidators = valueOrElse(getString(config, "liquidators"), "")
125125
126126 func findReserveBy (store,value) = {
127127 func fold (a,r) = match a {
128128 case found: Address =>
129129 found
130130 case _ =>
131131 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
132132 if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
133133 then reserve
134134 else unit
135135 }
136136
137137 match let $l = reserves
138138 let $s = size($l)
139139 let $acc0 = unit
140- func 1 ($a,$i) = if (($i >= $s))
140+ func $f0_1 ($a,$i) = if (($i >= $s))
141141 then $a
142142 else fold($a, $l[$i])
143143
144- func 2 ($a,$i) = if (($i >= $s))
144+ func $f0_2 ($a,$i) = if (($i >= $s))
145145 then $a
146146 else throw("List size exceeds 7")
147147
148- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
148+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
149149 case found: Address =>
150150 found
151151 case _ =>
152152 throw(("unknown " + store))
153153 }
154154 }
155155
156156
157157 func validateReserve (r) = if (contains(reservesStr, r))
158158 then valueOrErrorMessage(addressFromString(r), "main: bad reserve")
159159 else throw(("unknown reserve:" + r))
160160
161161
162162 func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
163163
164164
165165 func userPower (user) = {
166166 func fold (totals,r) = {
167167 let $t044314460 = totals
168168 let totalD = $t044314460._1
169169 let totalB = $t044314460._2
170170 let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
171171 let cf = collateralFactor(reserve)
172172 let lt = liquidationThreshold(reserve)
173173 let $t046314719 = userBalance(reserve, user)
174174 let token = $t046314719._1
175175 let asset = $t046314719._2
176176 let depositUsd = $t046314719._3
177177 let debt = $t046314719._4
178178 let debtUsd = $t046314719._5
179179 let asCollateral = $t046314719._6
180180 let effectiveDepositUsd = if (asCollateral)
181181 then depositUsd
182182 else 0
183183 let overlapUsd = min([debtUsd, effectiveDepositUsd])
184184 let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
185185 if ((debtUsd > effectiveDepositUsd))
186186 then $Tuple2(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge))
187187 else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
188188 }
189189
190190 let $l = reserves
191191 let $s = size($l)
192192 let $acc0 = $Tuple2(0, 0)
193- func 1 ($a,$i) = if (($i >= $s))
193+ func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else fold($a, $l[$i])
196196
197- func 2 ($a,$i) = if (($i >= $s))
197+ func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 7")
200200
201- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
201+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
202202 }
203203
204204
205205 func getUserHealth (account) = {
206206 let $t052645307 = asInt2(userPower(account))
207207 let bp = $t052645307._1
208208 let bpu = $t052645307._2
209209 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
210210 }
211211
212212
213213 func validateAfter (user,op) = {
214214 let $t054185449 = userPower(user)
215215 let bp = $t054185449._1
216216 let bpu = $t054185449._2
217217 let accHealth = (((bp - bpu) * factorsBase) / bp)
218218 if (if ((bp == 0))
219219 then (bpu == 0)
220220 else false)
221221 then nil
222222 else if (if ((bp == 0))
223223 then (bpu > 0)
224224 else false)
225225 then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
226226 else if ((accountHealthThreshold > accHealth))
227227 then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
228228 else nil
229229 }
230230
231231
232232 func updateStream (reserve,action,user,userChange,streamChange) = match maybeViresDistributor {
233233 case a: Address =>
234234 invoke(a, "onAction", [reserve, action, user, userChange, streamChange], nil)
235235 case _ =>
236236 unit
237237 }
238238
239239
240240 func moveStream (reserve,action,from,string,amount) = match maybeViresDistributor {
241241 case a: Address =>
242242 invoke(a, "move", [reserve, action, from, string, amount], nil)
243243 case _ =>
244244 unit
245245 }
246246
247247
248248 func syncRewardsHeight (reserve) = match maybeViresDistributor {
249249 case a: Address =>
250250 invoke(a, "syncHeight", [reserve], nil)
251251 case _ =>
252252 unit
253253 }
254254
255255
256256 func stakeOrPayout (recipient,amount,stake) = if (!(stake))
257257 then [ScriptTransfer(recipient, amount, viresAssetId)]
258258 else {
259259 let doStake = invoke(viresStaker, "stakeVires", [toString(recipient)], [AttachedPayment(viresAssetId, amount)])
260260 if ((doStake == doStake))
261261 then nil
262262 else throw("Strict value is not equal to itself.")
263263 }
264264
265265
266266 func doDeposit (i,reserve,useAsCollateral) = {
267267 let user = toString(i.caller)
268268 let sh = syncRewardsHeight(reserve)
269269 if ((sh == sh))
270270 then {
271271 let action = invoke(validateReserve(reserve), "depositFor", [user, useAsCollateral], i.payments)
272272 if ((action == action))
273273 then {
274274 let amt = i.payments[0].amount
275275 let propagateRewards = updateStream(reserve, "deposit", user, amt, amt)
276276 if ((propagateRewards == propagateRewards))
277277 then if (!(useAsCollateral))
278278 then validateAfter(user, "depositing")
279279 else nil
280280 else throw("Strict value is not equal to itself.")
281281 }
282282 else throw("Strict value is not equal to itself.")
283283 }
284284 else throw("Strict value is not equal to itself.")
285285 }
286286
287287
288288 func claimAllRewardsForUser (user) = {
289289 let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
290290 let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
291291 func fold (acc,reserve) = {
292292 let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
293293 if ((claimed == claimed))
294294 then (acc + claimed)
295295 else throw("Strict value is not equal to itself.")
296296 }
297297
298298 let claimedTotal = {
299299 let $l = rewardReserves
300300 let $s = size($l)
301301 let $acc0 = 0
302- func 1 ($a,$i) = if (($i >= $s))
302+ func $f0_1 ($a,$i) = if (($i >= $s))
303303 then $a
304304 else fold($a, $l[$i])
305305
306- func 2 ($a,$i) = if (($i >= $s))
306+ func $f0_2 ($a,$i) = if (($i >= $s))
307307 then $a
308308 else throw("List size exceeds 7")
309309
310- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
310+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
311311 }
312312 claimedTotal
313313 }
314314
315315
316316 @Callable(i)
317317 func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
318318
319319
320320
321321 @Callable(i)
322322 func registerReserves (addresses) = if ((i.caller != admin))
323323 then throw("only admin can do")
324324 else [StringEntry(reservesStore, addresses)]
325325
326326
327327
328328 @Callable(i)
329329 func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
330330
331331
332332
333333 @Callable(i)
334334 func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
335335
336336
337337
338338 @Callable(i)
339339 func repay (reserve) = {
340340 let user = toString(i.caller)
341341 let sh = syncRewardsHeight(reserve)
342342 if ((sh == sh))
343343 then {
344344 let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
345345 if ((repaid == repaid))
346346 then {
347347 let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
348348 if ((propagateRewards == propagateRewards))
349349 then nil
350350 else throw("Strict value is not equal to itself.")
351351 }
352352 else throw("Strict value is not equal to itself.")
353353 }
354354 else throw("Strict value is not equal to itself.")
355355 }
356356
357357
358358
359359 @Callable(i)
360360 func mintAtoken (aTokenId,amount) = {
361361 let user = toString(i.caller)
362362 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
363363 let sh = syncRewardsHeight(toString(targetContract))
364364 if ((sh == sh))
365365 then {
366366 let mintedAssetAmount = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
367367 if ((mintedAssetAmount == mintedAssetAmount))
368368 then {
369369 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(mintedAssetAmount), 0)
370370 if ((propagateRewards == propagateRewards))
371371 then validateAfter(user, "minting")
372372 else throw("Strict value is not equal to itself.")
373373 }
374374 else throw("Strict value is not equal to itself.")
375375 }
376376 else throw("Strict value is not equal to itself.")
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func replenishWithAtoken () = {
383383 let user = toString(i.caller)
384384 let aTokenId = match i.payments[0].assetId {
385385 case bv: ByteVector =>
386386 toBase58String(bv)
387387 case _ =>
388388 throw("bad assetId: waves not allowed")
389389 }
390390 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
391391 let sh = syncRewardsHeight(toString(targetContract))
392392 if ((sh == sh))
393393 then {
394394 let replenishedAssetAmount = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
395395 if ((replenishedAssetAmount == replenishedAssetAmount))
396396 then {
397397 let propagateRewards = updateStream(toString(targetContract), "deposit", user, replenishedAssetAmount, 0)
398398 if ((propagateRewards == propagateRewards))
399- then validateAfter(user, "replenishing")
399+ then nil
400+ else throw("Strict value is not equal to itself.")
401+ }
402+ else throw("Strict value is not equal to itself.")
403+ }
404+ else throw("Strict value is not equal to itself.")
405+ }
406+
407+
408+
409+@Callable(i)
410+func redeemAtokens () = {
411+ let user = toString(i.caller)
412+ let aTokenId = match i.payments[0].assetId {
413+ case bv: ByteVector =>
414+ toBase58String(bv)
415+ case _ =>
416+ throw("bad assetId: waves not allowed")
417+ }
418+ let targetContract = findReserveBy(aTokenIdStore, aTokenId)
419+ let sh = syncRewardsHeight(toString(targetContract))
420+ if ((sh == sh))
421+ then {
422+ let redeemedAssetAmount = asInt(invoke(targetContract, "redeemAtokensFor", [user], i.payments))
423+ if ((redeemedAssetAmount == redeemedAssetAmount))
424+ then {
425+ let propagateRewards = updateStream(toString(targetContract), "deposit", user, 0, -(redeemedAssetAmount))
426+ if ((propagateRewards == propagateRewards))
427+ then nil
400428 else throw("Strict value is not equal to itself.")
401429 }
402430 else throw("Strict value is not equal to itself.")
403431 }
404432 else throw("Strict value is not equal to itself.")
405433 }
406434
407435
408436
409437 @Callable(i)
410438 func withdraw (assetId,amount) = {
411439 let user = toString(i.caller)
412440 let targetContract = findReserveBy(assetIdStore, assetId)
413441 let sh = syncRewardsHeight(toString(targetContract))
414442 if ((sh == sh))
415443 then {
416444 let withdrawnAmount = asInt(invoke(targetContract, "withdrawFor", [user, amount], nil))
417445 if ((withdrawnAmount == withdrawnAmount))
418446 then {
419447 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
420448 if ((propagateRewards == propagateRewards))
421449 then validateAfter(user, "withdrawing")
422450 else throw("Strict value is not equal to itself.")
423451 }
424452 else throw("Strict value is not equal to itself.")
425453 }
426454 else throw("Strict value is not equal to itself.")
427455 }
428456
429457
430458
431459 @Callable(i)
432460 func withdraw2 (reserve,amount) = {
433461 let user = toString(i.caller)
434462 let sh = syncRewardsHeight(reserve)
435463 if ((sh == sh))
436464 then {
437465 let withdrawnAmount = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
438466 if ((withdrawnAmount == withdrawnAmount))
439467 then {
440468 let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
441469 if ((propagateRewards == propagateRewards))
442470 then if (contains(liquidators, user))
443471 then nil
444472 else validateAfter(user, "withdrawing2")
445473 else throw("Strict value is not equal to itself.")
446474 }
447475 else throw("Strict value is not equal to itself.")
448476 }
449477 else throw("Strict value is not equal to itself.")
450478 }
451479
452480
453481
454482 @Callable(i)
455483 func borrow (assetId,amount) = {
456484 let user = toString(i.caller)
457485 let reserve = findReserveBy(assetIdStore, assetId)
458486 let sh = syncRewardsHeight(toString(reserve))
459487 if ((sh == sh))
460488 then {
461489 let action = invoke(reserve, "borrowFor", [user, amount], nil)
462490 if ((action == action))
463491 then {
464492 let propagateRewards = updateStream(toString(reserve), "borrow", user, amount, amount)
465493 if ((propagateRewards == propagateRewards))
466494 then validateAfter(user, "borrowing")
467495 else throw("Strict value is not equal to itself.")
468496 }
469497 else throw("Strict value is not equal to itself.")
470498 }
471499 else throw("Strict value is not equal to itself.")
472500 }
473501
474502
475503
476504 @Callable(i)
477505 func borrow2 (reserve,amount) = {
478506 let user = toString(i.caller)
479507 let sh = syncRewardsHeight(reserve)
480508 if ((sh == sh))
481509 then {
482510 let action = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
483511 if ((action == action))
484512 then {
485513 let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
486514 if ((propagateRewards == propagateRewards))
487515 then validateAfter(user, "borrowing")
488516 else throw("Strict value is not equal to itself.")
489517 }
490518 else throw("Strict value is not equal to itself.")
491519 }
492520 else throw("Strict value is not equal to itself.")
493521 }
494522
495523
496524
497525 @Callable(i)
498526 func collapse (reserve,amount) = {
499527 let user = toString(i.caller)
500528 let sh = syncRewardsHeight(reserve)
501529 if ((sh == sh))
502530 then {
503531 let collapse = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
504532 if ((collapse == collapse))
505533 then {
506534 let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
507535 if ((propagateRewards == propagateRewards))
508536 then {
509537 let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
510538 if ((propagateRewards2 == propagateRewards2))
511539 then nil
512540 else throw("Strict value is not equal to itself.")
513541 }
514542 else throw("Strict value is not equal to itself.")
515543 }
516544 else throw("Strict value is not equal to itself.")
517545 }
518546 else throw("Strict value is not equal to itself.")
519547 }
520548
521549
522550
523551 @Callable(i)
524552 func claimEbReward (amount,stake) = {
525553 let user = toString(i.caller)
526554 let r = addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config"))
527555 let claimed = asInt(invoke(r, "claimEbRewardFor", [user, amount], nil))
528556 if ((claimed == claimed))
529557 then stakeOrPayout(i.caller, claimed, stake)
530558 else throw("Strict value is not equal to itself.")
531559 }
532560
533561
534562
535563 @Callable(i)
536564 func claimReward (reserve,amount,stake) = {
537565 let v = validateReserve(reserve)
538566 if ((v == v))
539567 then {
540568 let user = toString(i.caller)
541569 let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, amount], nil))
542570 if ((claimed == claimed))
543571 then stakeOrPayout(i.caller, claimed, stake)
544572 else throw("Strict value is not equal to itself.")
545573 }
546574 else throw("Strict value is not equal to itself.")
547575 }
548576
549577
550578
551579 @Callable(i)
552580 func claimAllRewards (stake) = {
553581 let user = toString(i.caller)
554582 let claimedTotal = claimAllRewardsForUser(user)
555583 stakeOrPayout(i.caller, claimedTotal, stake)
556584 }
557585
558586
559587
560588 @Callable(i)
561589 func claimAllRewardsAndAllEbAvailable (stake) = {
562590 let user = toString(i.caller)
563591 let claimedEb = asInt(invoke(addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config")), "claimEbRewardFor", [user, -1], nil))
564592 if ((claimedEb == claimedEb))
565593 then {
566594 let claimedRewards = claimAllRewardsForUser(user)
567595 if ((claimedRewards == claimedRewards))
568596 then {
569597 let claimedTotal = (claimedEb + claimedRewards)
570598 if ((claimedTotal == claimedTotal))
571599 then stakeOrPayout(i.caller, claimedTotal, stake)
572600 else throw("Strict value is not equal to itself.")
573601 }
574602 else throw("Strict value is not equal to itself.")
575603 }
576604 else throw("Strict value is not equal to itself.")
577605 }
578606
579607
580608
581609 @Callable(i)
582610 func disableUseAsCollateral (reserve) = {
583611 let user = toString(i.caller)
584612 let doSetCollateral = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
585613 if ((doSetCollateral == doSetCollateral))
586614 then validateAfter(user, "changing collateral status")
587615 else throw("Strict value is not equal to itself.")
588616 }
589617
590618
591619
592620 @Callable(i)
593621 func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
594622 let sh1 = syncRewardsHeight(borrowReserve)
595623 if ((sh1 == sh1))
596624 then {
597625 let sh2 = syncRewardsHeight(collateralReserve)
598626 if ((sh2 == sh2))
599627 then if ((0 >= liquidateDebtAmount))
600628 then throw("can't liquidate non-positive amount")
601629 else if ((collateralReserve == borrowReserve))
602630 then throw("collateralReserve equals borrowReserve")
603631 else {
604632 let liquidator = toString(i.caller)
605633 if ((liquidator == borrower))
606634 then throw("can't liquidate self")
607635 else {
608- let $t01424614281 = userPower(borrower)
609- let bp = $t01424614281._1
610- let bpu = $t01424614281._2
636+ let $t01479614831 = userPower(borrower)
637+ let bp = $t01479614831._1
638+ let bpu = $t01479614831._2
611639 if ((bp > bpu))
612640 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
613641 else {
614642 let br = validateReserve(borrowReserve)
615643 let cr = validateReserve(collateralReserve)
616644 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
617645 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
618646 if ((isCollateral == isCollateral))
619647 then if (!(isCollateral))
620648 then throw("can't liquidate deposit not used as collateral")
621649 else {
622- let $t01479714887 = userBalance(br, borrower)
623- if (($t01479714887 == $t01479714887))
650+ let $t01534715437 = userBalance(br, borrower)
651+ if (($t01534715437 == $t01534715437))
624652 then {
625- let userDebtUsd = $t01479714887._5
626- let userDebt = $t01479714887._4
627- let userAssetUsd = $t01479714887._3
628- let userAsset = $t01479714887._2
629- let ignore = $t01479714887._1
653+ let userDebtUsd = $t01534715437._5
654+ let userDebt = $t01534715437._4
655+ let userAssetUsd = $t01534715437._3
656+ let userAsset = $t01534715437._2
657+ let ignore = $t01534715437._1
630658 if ((userAsset >= userDebt))
631659 then throw("can't liquidate debt of asset of positive saldo")
632660 else if ((0 >= liquidateDebtAmount))
633661 then throw("can't liquidate zero or negative amount")
634662 else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
635663 then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
636664 else {
637665 let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
638666 let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
639667 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
640668 if ((transferredCollateral == transferredCollateral))
641669 then {
642670 let propagateRewards1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
643671 if ((propagateRewards1 == propagateRewards1))
644672 then {
645673 let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
646674 if ((transferredDebt == transferredDebt))
647675 then {
648676 let propagateRewards2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
649677 if ((propagateRewards2 == propagateRewards2))
650678 then {
651679 let liquidatorHealthCheck = if (contains(liquidators, liquidator))
652680 then nil
653681 else validateAfter(liquidator, "transferring debt")
654682 if ((liquidatorHealthCheck == liquidatorHealthCheck))
655683 then $Tuple2(liquidatorHealthCheck, transferredCollateral)
656684 else throw("Strict value is not equal to itself.")
657685 }
658686 else throw("Strict value is not equal to itself.")
659687 }
660688 else throw("Strict value is not equal to itself.")
661689 }
662690 else throw("Strict value is not equal to itself.")
663691 }
664692 else throw("Strict value is not equal to itself.")
665693 }
666694 }
667695 else throw("Strict value is not equal to itself.")
668696 }
669697 else throw("Strict value is not equal to itself.")
670698 }
671699 }
672700 }
673701 else throw("Strict value is not equal to itself.")
674702 }
675703 else throw("Strict value is not equal to itself.")
676704 }
677705
678706
679707
680708 @Callable(i)
681709 func forceCollapse (reserve,borrower) = {
682710 let reserveAddress = validateReserve(reserve)
683711 if ((reserveAddress == reserveAddress))
684712 then {
685713 let sh = syncRewardsHeight(reserve)
686714 if ((sh == sh))
687715 then {
688716 let liquidator = toString(i.caller)
689717 if ((liquidator == borrower))
690718 then throw("can't collapse self in this function")
691719 else {
692- let $t01648116516 = userPower(borrower)
693- let bp = $t01648116516._1
694- let bpu = $t01648116516._2
720+ let $t01703117066 = userPower(borrower)
721+ let bp = $t01703117066._1
722+ let bpu = $t01703117066._2
695723 if ((bp > bpu))
696724 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
697725 else {
698- let $t01666116769 = userBalance(reserveAddress, borrower)
699- if (($t01666116769 == $t01666116769))
726+ let $t01721117319 = userBalance(reserveAddress, borrower)
727+ if (($t01721117319 == $t01721117319))
700728 then {
701- let userDebtUsd = $t01666116769._5
702- let userDebt = $t01666116769._4
703- let userAssetUsd = $t01666116769._3
704- let borrowerDeposit = $t01666116769._2
705- let ignore = $t01666116769._1
729+ let userDebtUsd = $t01721117319._5
730+ let userDebt = $t01721117319._4
731+ let userAssetUsd = $t01721117319._3
732+ let borrowerDeposit = $t01721117319._2
733+ let ignore = $t01721117319._1
706734 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
707735 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
708736 if ((transferredAssets == transferredAssets))
709737 then {
710738 let propagateRewards1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
711739 if ((propagateRewards1 == propagateRewards1))
712740 then {
713741 let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
714742 if ((collapsed == collapsed))
715743 then {
716744 let propagateRewards2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
717745 if ((propagateRewards2 == propagateRewards2))
718746 then {
719747 let propagateRewards3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
720748 if ((propagateRewards3 == propagateRewards3))
721749 then nil
722750 else throw("Strict value is not equal to itself.")
723751 }
724752 else throw("Strict value is not equal to itself.")
725753 }
726754 else throw("Strict value is not equal to itself.")
727755 }
728756 else throw("Strict value is not equal to itself.")
729757 }
730758 else throw("Strict value is not equal to itself.")
731759 }
732760 else throw("Strict value is not equal to itself.")
733761 }
734762 }
735763 }
736764 else throw("Strict value is not equal to itself.")
737765 }
738766 else throw("Strict value is not equal to itself.")
739767 }
740768
741769

github/deemru/w8io/786bc32 
140.45 ms