2021.10.18 18:02 [2816845] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "HNCW2peBCEsamg9S9CQUbohwyGVvHzJ4aB7g4VcCM4Cj", "fee": 1000000, "feeAssetId": null, "timestamp": 1634569304556, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "4hbCL8kkEsAJ5w92ZwburLH2DoeEviGpHHeFMWMzrYpntDxawBu5ty6z6ghqiumQfcsxzKc2uYoUUiDTTMqjBCwF" ], "script": "base64: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bklkU3RvcmUCAAAACGFUb2tlbklkAAAAAAxhc3NldElkU3RvcmUCAAAAB2Fzc2V0SWQAAAAAEGRpc3RyaWJ1dG9yU3RvcmUCAAAAEXZpcmVzX2Rpc3RyaWJ1dG9yAAAAAAVhZG1pbgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAKYWRtaW5TdG9yZQAAAAAGY29uZmlnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAtjb25maWdTdG9yZQAAAAALcmVzZXJ2ZXNTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAA1yZXNlcnZlc1N0b3JlAgAAABZubyByZXNlcnZlcyByZWdpc3RlcmVkAAAAAAhyZXNlcnZlcwkABLUAAAACBQAAAAtyZXNlcnZlc1N0cgIAAAABfAAAAAALdmlyZXNNaW50ZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAGY29uZmlnAgAAAAx2aXJlc19taW50ZXICAAAADm5vIHZpcmVzTWludGVyAgAAABNpbnZhbGlkIHZpcmVzTWludGVyAAAAABBtYXliZVZpcmVzU3Rha2VyCQAEHQAAAAIFAAAABmNvbmZpZwIAAAAMdmlyZXNfc3Rha2VyAAAAAAt2aXJlc1N0YWtlcgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAABBtYXliZVZpcmVzU3Rha2VyAgAAAA9ubyB2aXJlc19zdGFrZXIAAAAAFW1heWJlVmlyZXNEaXN0cmlidXRvcgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZjb25maWcFAAAAEGRpc3RyaWJ1dG9yU3RvcmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABZAUAAAAHJG1hdGNoMAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAABZAUAAAAEdW5pdAAAAAARbWF5YmVWaXJlc0Fzc2V0SWQJAAQdAAAAAgUAAAALdmlyZXNNaW50ZXICAAAAB2Fzc2V0SWQAAAAADHZpcmVzQXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgUAAAARbWF5YmVWaXJlc0Fzc2V0SWQCAAAAF3ZpcmVzIGFzc2V0SWQgbm90IGZvdW5kAgAAABVpbnZhbGlkIHZpcmVzIGFzc2V0SWQBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABAAAAB3Jlc2VydmUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdyZXNlcnZlBQAAAAxhc3NldElkU3RvcmUCAAAAFW5vIGFzc2V0SWQgaW4gcmVzZXJ2ZQEAAAAQY29sbGF0ZXJhbEZhY3RvcgAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAEV9Db2xsYXRlcmFsRmFjdG9yAgAAAB1ubyBDb2xsYXRlcmFsRmFjdG9yIGluIGNvbmZpZwEAAAAUbGlxdWlkYXRpb25UaHJlc2hvbGQAAAABAAAAB3Jlc2VydmUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgkBAAAAEGFzc2V0SWRPZlJlc2VydmUAAAABBQAAAAdyZXNlcnZlAgAAABVfTGlxdWlkYXRpb25UaHJlc2hvbGQCAAAAIW5vIExpcXVpZGF0aW9uVGhyZXNob2xkIGluIGNvbmZpZwEAAAASbGlxdWlkYXRpb25QZW5hbHR5AAAAAQAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIFAAAAB2Fzc2V0SWQCAAAAE19MaXF1aWRhdGlvblBlbmFsdHkCAAAAH25vIExpcXVpZGF0aW9uUGVuYWx0eSBpbiBjb25maWcAAAAAFmFjY291bnRIZWFsdGhUaHJlc2hvbGQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAGGFjY291bnRfaGVhbHRoX3RocmVzaG9sZAIAAAAbbm8gYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAAAAABRhY2NvdW50SGVhbHRoT3ZlcmxhcAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAIAAAAZbm8gYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAAAAAAPY29sbGFwc2VQZW5hbHR5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABBjb2xsYXBzZV9wZW5hbHR5AgAAABNubyBjb2xsYXBzZV9wZW5hbHR5AAAAAAtsaXF1aWRhdG9ycwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAZjb25maWcCAAAAC2xpcXVpZGF0b3JzAgAAAAABAAAADWZpbmRSZXNlcnZlQnkAAAACAAAABXN0b3JlAAAABXZhbHVlCgEAAAAEZm9sZAAAAAIAAAABYQAAAAFyBAAAAAckbWF0Y2gwBQAAAAFhAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdBZGRyZXNzBAAAAAVmb3VuZAUAAAAHJG1hdGNoMAUAAAAFZm91bmQEAAAAB3Jlc2VydmUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAAAFyAgAAABNyZXNlcnZlIGJhZCBhZGRyZXNzAwkAAAAAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHcmVzZXJ2ZQUAAAAFc3RvcmUJAAEsAAAAAgIAAAAPcmVzZXJ2ZSBoYXMgbm8gBQAAAAVzdG9yZQUAAAAFdmFsdWUFAAAAB3Jlc2VydmUFAAAABHVuaXQEAAAAByRtYXRjaDAKAAAAAAIkbAUAAAAIcmVzZXJ2ZXMKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwBQAAAAR1bml0CgEAAAABMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAARmb2xkAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAABMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgNwkBAAAAATIAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIJAQAAAAExAAAAAgkBAAAAATEAAAACCQEAAAABMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdBZGRyZXNzBAAAAAVmb3VuZAUAAAAHJG1hdGNoMAUAAAAFZm91bmQJAAACAAAAAQkAASwAAAACAgAAAAh1bmtub3duIAUAAAAFc3RvcmUBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEAAAABcgMJAQAAAAhjb250YWlucwAAAAIFAAAAC3Jlc2VydmVzU3RyBQAAAAFyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAARbWFpbjogYmFkIHJlc2VydmUJAAACAAAAAQkAASwAAAACAgAAABB1bmtub3duIHJlc2VydmU6BQAAAAFyAQAAAAt1c2VyQmFsYW5jZQAAAAIAAAAHcmVzZXJ2ZQAAAAR1c2VyCQEAAAARYXNVc2VyQmFsYW5jZURhdGEAAAABCQAD/AAAAAQFAAAAB3Jlc2VydmUCAAAAC3VzZXJCYWxhbmNlCQAETAAAAAIFAAAABHVzZXIFAAAAA25pbAUAAAADbmlsAQAAAAl1c2VyUG93ZXIAAAABAAAABHVzZXIKAQAAAARmb2xkAAAAAgAAAAZ0b3RhbHMAAAABcgQAAAALJHQwNDQzMTQ0NjAFAAAABnRvdGFscwQAAAAGdG90YWxECAUAAAALJHQwNDQzMTQ0NjAAAAACXzEEAAAABnRvdGFsQggFAAAACyR0MDQ0MzE0NDYwAAAAAl8yBAAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAABcgIAAAATcmVzZXJ2ZSBiYWQgYWRkcmVzcwQAAAACY2YJAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQUAAAAHcmVzZXJ2ZQQAAAACbHQJAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEFAAAAB3Jlc2VydmUEAAAACyR0MDQ2MzE0NzE5CQEAAAALdXNlckJhbGFuY2UAAAACBQAAAAdyZXNlcnZlBQAAAAR1c2VyBAAAAAV0b2tlbggFAAAACyR0MDQ2MzE0NzE5AAAAAl8xBAAAAAVhc3NldAgFAAAACyR0MDQ2MzE0NzE5AAAAAl8yBAAAAApkZXBvc2l0VXNkCAUAAAALJHQwNDYzMTQ3MTkAAAACXzMEAAAABGRlYnQIBQAAAAskdDA0NjMxNDcxOQAAAAJfNAQAAAAHZGVidFVzZAgFAAAACyR0MDQ2MzE0NzE5AAAAAl81BAAAAAxhc0NvbGxhdGVyYWwIBQAAAAskdDA0NjMxNDcxOQAAAAJfNgQAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAMFAAAADGFzQ29sbGF0ZXJhbAUAAAAKZGVwb3NpdFVzZAAAAAAAAAAAAAQAAAAKb3ZlcmxhcFVzZAkAAZcAAAABCQAETAAAAAIFAAAAB2RlYnRVc2QJAARMAAAAAgUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAUAAAADbmlsBAAAAA1vdmVybGFwQ2hhcmdlCQEAAAAMZnJhY3Rpb25DZWlsAAAAAwUAAAAKb3ZlcmxhcFVzZAUAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAFAAAAC2ZhY3RvcnNCYXNlAwkAAGYAAAACBQAAAAdkZWJ0VXNkBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkCQAFFAAAAAIFAAAABnRvdGFsRAkAAGQAAAACCQAAZAAAAAIFAAAABnRvdGFsQgkAAGsAAAADCQAAZQAAAAIFAAAAB2RlYnRVc2QFAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QFAAAAC2ZhY3RvcnNCYXNlBQAAAAJsdAUAAAANb3ZlcmxhcENoYXJn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dW50BAAAABBwcm9wYWdhdGVSZXdhcmRzCQEAAAAMdXBkYXRlU3RyZWFtAAAABQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAIAAAAHZGVwb3NpdAUAAAAEdXNlcgUAAAAWcmVwbGVuaXNoZWRBc3NldEFtb3VudAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAQcHJvcGFnYXRlUmV3YXJkcwUAAAAQcHJvcGFnYXRlUmV3YXJkcwkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAAR1c2VyAgAAAAxyZXBsZW5pc2hpbmcJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAId2l0aGRyYXcAAAACAAAAB2Fzc2V0SWQAAAAGYW1vdW50BAAAAAR1c2VyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAOdGFyZ2V0Q29udHJhY3QJAQAAAA1maW5kUmVzZXJ2ZUJ5AAAAAgUAAAAMYXNzZXRJZFN0b3JlBQAAAAdhc3NldElkBAAAAAJzaAkBAAAAEXN5bmNSZXdhcmRzSGVpZ2h0AAAAAQkABCUAAAABBQAAAA50YXJnZXRDb250cmFjdAMJAAAAAAAAAgUAAAACc2gFAAAAAnNoBAAAAA93aXRoZHJhd25BbW91bnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOdGFyZ2V0Q29udHJhY3QCAAAAC3dpdGhkcmF3Rm9yCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgUAAAAGYW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAPd2l0aGRyYXduQW1vdW50BQAAAA93aXRoZHJhd25BbW91bnQEAAAAEHByb3BhZ2F0ZVJld2FyZHMJAQAAAAx1cGRhdGVTdHJlYW0AAAAFCQAEJQAAAAEFAAAADnRhcmdldENvbnRyYWN0AgAAAAdkZXBvc2l0BQAAAAR1c2VyCQEAAAABLQAAAAEFAAAAD3dpdGhk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VG90YWwFAAAABXN0YWtlAAAAAWkBAAAAIGNsYWltQWxsUmV3YXJkc0FuZEFsbEViQXZhaWxhYmxlAAAAAQAAAAVzdGFrZQQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACWNsYWltZWRFYgkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAGY29uZmlnAgAAAAplYl9yZXdhcmRzAgAAACBubyBlYl9yZXdhcmRzIGNvbnRyYWN0IGluIGNvbmZpZwIAAAAQY2xhaW1FYlJld2FyZEZvcgkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIA//////////8FAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAljbGFpbWVkRWIFAAAACWNsYWltZWRFYgQAAAAOY2xhaW1lZFJld2FyZHMJAQAAABZjbGFpbUFsbFJld2FyZHNGb3JVc2VyAAAAAQUAAAAEdXNlcgMJAAAAAAAAAgUAAAAOY2xhaW1lZFJld2FyZHMFAAAADmNsYWltZWRSZXdhcmRzBAAAAAxjbGFpbWVkVG90YWwJAABkAAAAAgUAAAAJY2xhaW1lZEViBQAAAA5jbGFpbWVkUmV3YXJkcwMJAAAAAAAAAgUAAAAMY2xhaW1lZFRvdGFsBQAAAAxjbGFpbWVkVG90YWwJAQAAAA1zdGFrZU9yUGF5b3V0AAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxjbGFpbWVkVG90YWwFAAAABXN0YWtlCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFmRpc2FibGVVc2VBc0NvbGxhdGVyYWwAAAABAAAAB3Jlc2VydmUEAAAABHVzZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA9kb1NldENvbGxhdGVyYWwJAAP8AAAABAkBAAAAD3ZhbGlkYXRlUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAGWRpc2FibGVVc2VBc0NvbGxhdGVyYWxGb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2RvU2V0Q29sbGF0ZXJhbAUAAAAPZG9TZXRDb2xsYXRlcmFsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAAGmNoYW5naW5nIGNvbGxhdGVyYWwgc3RhdHVzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAx0cmFuc2ZlckRlYnQAAAAEAAAADWJvcnJvd1Jlc2VydmUAAAARY29sbGF0ZXJhbFJlc2VydmUAAAAIYm9ycm93ZXIAAAATbGlxdWlkYXRlRGVidEFtb3VudAQAAAADc2gxCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAAA1ib3Jyb3dSZXNlcnZlAwkAAAAAAAACBQAAAANzaDEFAAAAA3NoMQQAAAADc2gyCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQMJAAAAAAAAAgUAAAADc2gyBQAAAANzaDIDCQAAZwAAAAIAAAAAAAAAAAAFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQJAAACAAAAAQIAAAAjY2FuJ3QgbGlxdWlkYXRlIG5vbi1wb3NpdGl2ZSBhbW91bnQDCQAAAAAAAAIFAAAAEWNvbGxhdGVyYWxSZXNlcnZlBQAAAA1ib3Jyb3dSZXNlcnZlCQAAAgAAAAECAAAAJmNvbGxhdGVyYWxSZXNlcnZlIGVxdWFscyBib3Jyb3dSZXNlcnZlBAAAAApsaXF1aWRhdG9yCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAKbGlxdWlkYXRvcgUAAAAIYm9ycm93ZXIJAAACAAAAAQIAAAAUY2FuJ3QgbGlxdWlkYXRlIHNlbGYEAAAADSR0MDE0MjQ2MTQyODEJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAA0kdDAxNDI0NjE0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dWlkYXRvcgkABEwAAAACBQAAAA1wZW5hbHRpemVkVXNkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwEAAAAEXByb3BhZ2F0ZVJld2FyZHMxCQEAAAAKbW92ZVN0cmVhbQAAAAUFAAAAEWNvbGxhdGVyYWxSZXNlcnZlAgAAAAdkZXBvc2l0BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAVdHJhbnNmZXJyZWRDb2xsYXRlcmFsAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMQUAAAARcHJvcGFnYXRlUmV3YXJkczEEAAAAD3RyYW5zZmVycmVkRGVidAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAJicgIAAAAPdHJhbnNmZXJEZWJ0Rm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAATbGlxdWlkYXRlRGVidEFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD3RyYW5zZmVycmVkRGVidAUAAAAPdHJhbnNmZXJyZWREZWJ0BAAAABFwcm9wYWdhdGVSZXdhcmRzMgkBAAAACm1vdmVTdHJlYW0AAAAFBQAAAA1ib3Jyb3dSZXNlcnZlAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyBQAAAApsaXF1aWRhdG9yBQAAAA90cmFuc2ZlcnJlZERlYnQDCQAAAAAAAAIFAAAAEXByb3BhZ2F0ZVJld2FyZHMyBQAAABFwcm9wYWdhdGVSZXdhcmRzMgQAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrAwkBAAAACGNvbnRhaW5zAAAAAgUAAAALbGlxdWlkYXRvcnMFAAAACmxpcXVpZGF0b3IFAAAAA25pbAkBAAAADXZhbGlkYXRlQWZ0ZXIAAAACBQAAAApsaXF1aWRhdG9yAgAAABF0cmFuc2ZlcnJpbmcgZGVidAMJAAAAAAAAAgUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrBQAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sJAAUUAAAAAgUAAAAVbGlxdWlkYXRvckhlYWx0aENoZWNrBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAANZm9yY2VDb2xsYXBzZQAAAAIAAAAHcmVzZXJ2ZQAAAAhib3Jyb3dlcgQAAAAOcmVzZXJ2ZUFkZHJlc3MJAQAAAA92YWxpZGF0ZVJlc2VydmUAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAA5yZXNlcnZlQWRkcmVzcwUAAAAOcmVzZXJ2ZUFkZHJlc3MEAAAAAnNoCQEAAAARc3luY1Jld2FyZHNIZWlnaHQAAAABBQAAAAdyZXNlcnZlAwkAAAAAAAACBQAAAAJzaAUAAAACc2gEAAAACmxpcXVpZGF0b3IJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAAAAAAACBQAAAApsaXF1aWRhdG9yBQAAAAhib3Jyb3dlcgkAAAIAAAABAgAAACRjYW4ndCBjb2xsYXBzZSBzZWxmIGluIHRoaXMgZnVuY3Rpb24EAAAADSR0MDE2NDgxMTY1MTYJAQAAAAl1c2VyUG93ZXIAAAABBQAAAAhib3Jyb3dlcgQAAAACYnAIBQAAAA0kdDAxNjQ4MTE2NTE2AAAAAl8xBAAAAANicHUIBQAAAA0kdDAxNjQ4MTE2NTE2AAAAAl8yAwkAAGYAAAACBQAAAAJicAUAAAADYnB1CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACVjYW4ndCBmb3JjZSBjb2xsYXBzZSBoZWFsdGh5IHVzZXI6IHU9BQAAAAhib3Jyb3dlcgIAAAAFLCBicD0JAAGkAAAAAQUAAAACYnACAAAABiwgYnB1PQkAAaQAAAABBQAAAANicHUEAAAADSR0MDE2NjYxMTY3NjkJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAADnJlc2VydmVBZGRyZXNzBQAAAAhib3Jyb3dlcgMJAAAAAAAAAgUAAAANJHQwMTY2NjExNjc2OQUAAAANJHQwMTY2NjExNjc2OQQAAAALdXNlckRlYnRVc2QIBQAAAA0kdDAxNjY2MTE2NzY5AAAAAl81BAAAAAh1c2VyRGVidAgFAAAADSR0MDE2NjYxMTY3NjkAAAACXzQEAAAADHVzZXJBc3NldFVzZAgFAAAADSR0MDE2NjYxMTY3NjkAAAACXzMEAAAAD2JvcnJvd2VyRGVwb3NpdAgFAAAADSR0MDE2NjYxMTY3NjkAAAACXzIEAAAABmlnbm9yZQgFAAAADSR0MDE2NjYxMTY3NjkAAAACXzEEAAAADXBlbmFsdGl6ZWRVc2QJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAADHVzZXJBc3NldFVzZAkABEwAAAACBQAAAAt1c2VyRGVidFVzZAUAAAADbmlsBQAAAA9jb2xsYXBzZVBlbmFsdHkFAAAAC2ZhY3RvcnNCYXNlBAAAABF0cmFuc2ZlcnJlZEFzc2V0cwkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAASdHJhbnNmZXJBVG9rZW5zRm9yCQAETAAAAAIFAAAACGJvcnJvd2VyCQAETAAAAAIFAAAACmxpcXVpZGF0b3IJAARMAAAAAgUAAAANcGVuYWx0aXplZFVzZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAEXRyYW5zZmVycmVkQXNzZXRzBQAAABF0cmFuc2ZlcnJlZEFzc2V0cwQAAAARcHJvcGFnYXRlUmV3YXJkczEJAQAAAAptb3ZlU3RyZWFtAAAABQUAAAAHcmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAEXRyYW5zZmVycmVkQXNzZXRzAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMQUAAAARcHJvcGFnYXRlUmV3YXJkczEEAAAACWNvbGxhcHNlZAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA5yZXNlcnZlQWRkcmVzcwIAAAALY29sbGFwc2VGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAljb2xsYXBzZWQFAAAACWNvbGxhcHNlZAQAAAARcHJvcGFnYXRlUmV3YXJkczIJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAAdyZXNlcnZlAgAAAAZib3Jyb3cFAAAACGJvcnJvd2VyCQEAAAABLQAAAAEFAAAACWNvbGxhcHNlZAkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQDCQAAAAAAAAIFAAAAEXByb3BhZ2F0ZVJld2FyZHMyBQAAABFwcm9wYWdhdGVSZXdhcmRzMgQAAAARcHJvcGFnYXRlUmV3YXJkczMJAQAAAAx1cGRhdGVTdHJlYW0AAAAFBQAAAAdyZXNlcnZlAgAAAAdkZXBvc2l0BQAAAAhib3Jyb3dlcgkBAAAAAS0AAAABBQAAAAljb2xsYXBzZWQJAQAAAAEtAAAAAQUAAAAJY29sbGFwc2VkAwkAAAAAAAACBQAAABFwcm9wYWdhdGVSZXdhcmRzMwUAAAARcHJvcGFnYXRlUmV3YXJkczMFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAOONgtc=", "chainId": 87, "height": 2816845, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2z4Uxwk9RKkjGCLiR6shC3f6g1E62bWft9d8mgLgsBkm Next: BcVQveN3Ct6VjL26XSajfKuNhHxkhY3DgNMYbxUVCA42 Diff:
OldNewDifferences
285285 }
286286
287287
288+func claimAllRewardsForUser (user) = {
289+ let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
290+ let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
291+ func fold (acc,reserve) = {
292+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
293+ if ((claimed == claimed))
294+ then (acc + claimed)
295+ else throw("Strict value is not equal to itself.")
296+ }
297+
298+ let claimedTotal = {
299+ let $l = rewardReserves
300+ let $s = size($l)
301+ let $acc0 = 0
302+ func 1 ($a,$i) = if (($i >= $s))
303+ then $a
304+ else fold($a, $l[$i])
305+
306+ func 2 ($a,$i) = if (($i >= $s))
307+ then $a
308+ else throw("List size exceeds 7")
309+
310+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
311+ }
312+ claimedTotal
313+ }
314+
315+
288316 @Callable(i)
289317 func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
290318
523551 @Callable(i)
524552 func claimAllRewards (stake) = {
525553 let user = toString(i.caller)
526- let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
527- let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
528- func fold (acc,reserve) = {
529- let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
530- if ((claimed == claimed))
531- then (acc + claimed)
532- else throw("Strict value is not equal to itself.")
533- }
554+ let claimedTotal = claimAllRewardsForUser(user)
555+ stakeOrPayout(i.caller, claimedTotal, stake)
556+ }
534557
535- let claimedTotal = {
536- let $l = rewardReserves
537- let $s = size($l)
538- let $acc0 = 0
539- func 1 ($a,$i) = if (($i >= $s))
540- then $a
541- else fold($a, $l[$i])
542558
543- func 2 ($a,$i) = if (($i >= $s))
544- then $a
545- else throw("List size exceeds 7")
546559
547- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
548- }
549- stakeOrPayout(i.caller, claimedTotal, stake)
560+@Callable(i)
561+func claimAllRewardsAndAllEbAvailable (stake) = {
562+ let user = toString(i.caller)
563+ let claimedEb = asInt(invoke(addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config")), "claimEbRewardFor", [user, -1], nil))
564+ if ((claimedEb == claimedEb))
565+ then {
566+ let claimedRewards = claimAllRewardsForUser(user)
567+ if ((claimedRewards == claimedRewards))
568+ then {
569+ let claimedTotal = (claimedEb + claimedRewards)
570+ if ((claimedTotal == claimedTotal))
571+ then stakeOrPayout(i.caller, claimedTotal, stake)
572+ else throw("Strict value is not equal to itself.")
573+ }
574+ else throw("Strict value is not equal to itself.")
575+ }
576+ else throw("Strict value is not equal to itself.")
550577 }
551578
552579
578605 if ((liquidator == borrower))
579606 then throw("can't liquidate self")
580607 else {
581- let $t01363013665 = userPower(borrower)
582- let bp = $t01363013665._1
583- let bpu = $t01363013665._2
608+ let $t01424614281 = userPower(borrower)
609+ let bp = $t01424614281._1
610+ let bpu = $t01424614281._2
584611 if ((bp > bpu))
585612 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
586613 else {
592619 then if (!(isCollateral))
593620 then throw("can't liquidate deposit not used as collateral")
594621 else {
595- let $t01418114271 = userBalance(br, borrower)
596- if (($t01418114271 == $t01418114271))
622+ let $t01479714887 = userBalance(br, borrower)
623+ if (($t01479714887 == $t01479714887))
597624 then {
598- let userDebtUsd = $t01418114271._5
599- let userDebt = $t01418114271._4
600- let userAssetUsd = $t01418114271._3
601- let userAsset = $t01418114271._2
602- let ignore = $t01418114271._1
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
603630 if ((userAsset >= userDebt))
604631 then throw("can't liquidate debt of asset of positive saldo")
605632 else if ((0 >= liquidateDebtAmount))
662689 if ((liquidator == borrower))
663690 then throw("can't collapse self in this function")
664691 else {
665- let $t01586515900 = userPower(borrower)
666- let bp = $t01586515900._1
667- let bpu = $t01586515900._2
692+ let $t01648116516 = userPower(borrower)
693+ let bp = $t01648116516._1
694+ let bpu = $t01648116516._2
668695 if ((bp > bpu))
669696 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
670697 else {
671- let $t01604516153 = userBalance(reserveAddress, borrower)
672- if (($t01604516153 == $t01604516153))
698+ let $t01666116769 = userBalance(reserveAddress, borrower)
699+ if (($t01666116769 == $t01666116769))
673700 then {
674- let userDebtUsd = $t01604516153._5
675- let userDebt = $t01604516153._4
676- let userAssetUsd = $t01604516153._3
677- let borrowerDeposit = $t01604516153._2
678- let ignore = $t01604516153._1
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
679706 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
680707 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
681708 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
140140 func 1 ($a,$i) = if (($i >= $s))
141141 then $a
142142 else fold($a, $l[$i])
143143
144144 func 2 ($a,$i) = if (($i >= $s))
145145 then $a
146146 else throw("List size exceeds 7")
147147
148148 2(1(1(1(1(1(1(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)
193193 func 1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else fold($a, $l[$i])
196196
197197 func 2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 7")
200200
201201 2(1(1(1(1(1(1(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
288+func claimAllRewardsForUser (user) = {
289+ let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
290+ let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
291+ func fold (acc,reserve) = {
292+ let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
293+ if ((claimed == claimed))
294+ then (acc + claimed)
295+ else throw("Strict value is not equal to itself.")
296+ }
297+
298+ let claimedTotal = {
299+ let $l = rewardReserves
300+ let $s = size($l)
301+ let $acc0 = 0
302+ func 1 ($a,$i) = if (($i >= $s))
303+ then $a
304+ else fold($a, $l[$i])
305+
306+ func 2 ($a,$i) = if (($i >= $s))
307+ then $a
308+ else throw("List size exceeds 7")
309+
310+ 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
311+ }
312+ claimedTotal
313+ }
314+
315+
288316 @Callable(i)
289317 func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
290318
291319
292320
293321 @Callable(i)
294322 func registerReserves (addresses) = if ((i.caller != admin))
295323 then throw("only admin can do")
296324 else [StringEntry(reservesStore, addresses)]
297325
298326
299327
300328 @Callable(i)
301329 func deposit (reserve,useAsCollateral) = doDeposit(i, reserve, useAsCollateral)
302330
303331
304332
305333 @Callable(i)
306334 func depositRef (reserve,useAsCollateral,ref) = doDeposit(i, reserve, useAsCollateral)
307335
308336
309337
310338 @Callable(i)
311339 func repay (reserve) = {
312340 let user = toString(i.caller)
313341 let sh = syncRewardsHeight(reserve)
314342 if ((sh == sh))
315343 then {
316344 let repaid = asInt(invoke(validateReserve(reserve), "repayFor", [user], i.payments))
317345 if ((repaid == repaid))
318346 then {
319347 let propagateRewards = updateStream(reserve, "borrow", user, -(repaid), -(repaid))
320348 if ((propagateRewards == propagateRewards))
321349 then nil
322350 else throw("Strict value is not equal to itself.")
323351 }
324352 else throw("Strict value is not equal to itself.")
325353 }
326354 else throw("Strict value is not equal to itself.")
327355 }
328356
329357
330358
331359 @Callable(i)
332360 func mintAtoken (aTokenId,amount) = {
333361 let user = toString(i.caller)
334362 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
335363 let sh = syncRewardsHeight(toString(targetContract))
336364 if ((sh == sh))
337365 then {
338366 let mintedAssetAmount = asInt(invoke(targetContract, "mintAtokenFor", [user, amount], nil))
339367 if ((mintedAssetAmount == mintedAssetAmount))
340368 then {
341369 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(mintedAssetAmount), 0)
342370 if ((propagateRewards == propagateRewards))
343371 then validateAfter(user, "minting")
344372 else throw("Strict value is not equal to itself.")
345373 }
346374 else throw("Strict value is not equal to itself.")
347375 }
348376 else throw("Strict value is not equal to itself.")
349377 }
350378
351379
352380
353381 @Callable(i)
354382 func replenishWithAtoken () = {
355383 let user = toString(i.caller)
356384 let aTokenId = match i.payments[0].assetId {
357385 case bv: ByteVector =>
358386 toBase58String(bv)
359387 case _ =>
360388 throw("bad assetId: waves not allowed")
361389 }
362390 let targetContract = findReserveBy(aTokenIdStore, aTokenId)
363391 let sh = syncRewardsHeight(toString(targetContract))
364392 if ((sh == sh))
365393 then {
366394 let replenishedAssetAmount = asInt(invoke(targetContract, "replenishWithAtokenFor", [user], i.payments))
367395 if ((replenishedAssetAmount == replenishedAssetAmount))
368396 then {
369397 let propagateRewards = updateStream(toString(targetContract), "deposit", user, replenishedAssetAmount, 0)
370398 if ((propagateRewards == propagateRewards))
371399 then validateAfter(user, "replenishing")
372400 else throw("Strict value is not equal to itself.")
373401 }
374402 else throw("Strict value is not equal to itself.")
375403 }
376404 else throw("Strict value is not equal to itself.")
377405 }
378406
379407
380408
381409 @Callable(i)
382410 func withdraw (assetId,amount) = {
383411 let user = toString(i.caller)
384412 let targetContract = findReserveBy(assetIdStore, assetId)
385413 let sh = syncRewardsHeight(toString(targetContract))
386414 if ((sh == sh))
387415 then {
388416 let withdrawnAmount = asInt(invoke(targetContract, "withdrawFor", [user, amount], nil))
389417 if ((withdrawnAmount == withdrawnAmount))
390418 then {
391419 let propagateRewards = updateStream(toString(targetContract), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
392420 if ((propagateRewards == propagateRewards))
393421 then validateAfter(user, "withdrawing")
394422 else throw("Strict value is not equal to itself.")
395423 }
396424 else throw("Strict value is not equal to itself.")
397425 }
398426 else throw("Strict value is not equal to itself.")
399427 }
400428
401429
402430
403431 @Callable(i)
404432 func withdraw2 (reserve,amount) = {
405433 let user = toString(i.caller)
406434 let sh = syncRewardsHeight(reserve)
407435 if ((sh == sh))
408436 then {
409437 let withdrawnAmount = asInt(invoke(validateReserve(reserve), "withdrawFor", [user, amount], nil))
410438 if ((withdrawnAmount == withdrawnAmount))
411439 then {
412440 let propagateRewards = updateStream(reserve, "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
413441 if ((propagateRewards == propagateRewards))
414442 then if (contains(liquidators, user))
415443 then nil
416444 else validateAfter(user, "withdrawing2")
417445 else throw("Strict value is not equal to itself.")
418446 }
419447 else throw("Strict value is not equal to itself.")
420448 }
421449 else throw("Strict value is not equal to itself.")
422450 }
423451
424452
425453
426454 @Callable(i)
427455 func borrow (assetId,amount) = {
428456 let user = toString(i.caller)
429457 let reserve = findReserveBy(assetIdStore, assetId)
430458 let sh = syncRewardsHeight(toString(reserve))
431459 if ((sh == sh))
432460 then {
433461 let action = invoke(reserve, "borrowFor", [user, amount], nil)
434462 if ((action == action))
435463 then {
436464 let propagateRewards = updateStream(toString(reserve), "borrow", user, amount, amount)
437465 if ((propagateRewards == propagateRewards))
438466 then validateAfter(user, "borrowing")
439467 else throw("Strict value is not equal to itself.")
440468 }
441469 else throw("Strict value is not equal to itself.")
442470 }
443471 else throw("Strict value is not equal to itself.")
444472 }
445473
446474
447475
448476 @Callable(i)
449477 func borrow2 (reserve,amount) = {
450478 let user = toString(i.caller)
451479 let sh = syncRewardsHeight(reserve)
452480 if ((sh == sh))
453481 then {
454482 let action = invoke(validateReserve(reserve), "borrowFor", [user, amount], nil)
455483 if ((action == action))
456484 then {
457485 let propagateRewards = updateStream(reserve, "borrow", user, amount, amount)
458486 if ((propagateRewards == propagateRewards))
459487 then validateAfter(user, "borrowing")
460488 else throw("Strict value is not equal to itself.")
461489 }
462490 else throw("Strict value is not equal to itself.")
463491 }
464492 else throw("Strict value is not equal to itself.")
465493 }
466494
467495
468496
469497 @Callable(i)
470498 func collapse (reserve,amount) = {
471499 let user = toString(i.caller)
472500 let sh = syncRewardsHeight(reserve)
473501 if ((sh == sh))
474502 then {
475503 let collapse = asInt(invoke(validateReserve(reserve), "collapseForAmount", [user, amount], nil))
476504 if ((collapse == collapse))
477505 then {
478506 let propagateRewards = updateStream(reserve, "borrow", user, -(collapse), -(collapse))
479507 if ((propagateRewards == propagateRewards))
480508 then {
481509 let propagateRewards2 = updateStream(reserve, "deposit", user, -(collapse), -(collapse))
482510 if ((propagateRewards2 == propagateRewards2))
483511 then nil
484512 else throw("Strict value is not equal to itself.")
485513 }
486514 else throw("Strict value is not equal to itself.")
487515 }
488516 else throw("Strict value is not equal to itself.")
489517 }
490518 else throw("Strict value is not equal to itself.")
491519 }
492520
493521
494522
495523 @Callable(i)
496524 func claimEbReward (amount,stake) = {
497525 let user = toString(i.caller)
498526 let r = addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config"))
499527 let claimed = asInt(invoke(r, "claimEbRewardFor", [user, amount], nil))
500528 if ((claimed == claimed))
501529 then stakeOrPayout(i.caller, claimed, stake)
502530 else throw("Strict value is not equal to itself.")
503531 }
504532
505533
506534
507535 @Callable(i)
508536 func claimReward (reserve,amount,stake) = {
509537 let v = validateReserve(reserve)
510538 if ((v == v))
511539 then {
512540 let user = toString(i.caller)
513541 let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, amount], nil))
514542 if ((claimed == claimed))
515543 then stakeOrPayout(i.caller, claimed, stake)
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 claimAllRewards (stake) = {
525553 let user = toString(i.caller)
526- let distributor = valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards")
527- let rewardReserves = split(valueOrErrorMessage(getString(distributor, "reward_reserves"), "no string"), "|")
528- func fold (acc,reserve) = {
529- let claimed = asInt(invoke(valueOrErrorMessage(maybeViresDistributor, "no distributor to claim rewards"), "claimRewardFor", [reserve, user, -1], nil))
530- if ((claimed == claimed))
531- then (acc + claimed)
532- else throw("Strict value is not equal to itself.")
533- }
554+ let claimedTotal = claimAllRewardsForUser(user)
555+ stakeOrPayout(i.caller, claimedTotal, stake)
556+ }
534557
535- let claimedTotal = {
536- let $l = rewardReserves
537- let $s = size($l)
538- let $acc0 = 0
539- func 1 ($a,$i) = if (($i >= $s))
540- then $a
541- else fold($a, $l[$i])
542558
543- func 2 ($a,$i) = if (($i >= $s))
544- then $a
545- else throw("List size exceeds 7")
546559
547- 2(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
548- }
549- stakeOrPayout(i.caller, claimedTotal, stake)
560+@Callable(i)
561+func claimAllRewardsAndAllEbAvailable (stake) = {
562+ let user = toString(i.caller)
563+ let claimedEb = asInt(invoke(addressFromStringValue(valueOrErrorMessage(getString(config, "eb_rewards"), "no eb_rewards contract in config")), "claimEbRewardFor", [user, -1], nil))
564+ if ((claimedEb == claimedEb))
565+ then {
566+ let claimedRewards = claimAllRewardsForUser(user)
567+ if ((claimedRewards == claimedRewards))
568+ then {
569+ let claimedTotal = (claimedEb + claimedRewards)
570+ if ((claimedTotal == claimedTotal))
571+ then stakeOrPayout(i.caller, claimedTotal, stake)
572+ else throw("Strict value is not equal to itself.")
573+ }
574+ else throw("Strict value is not equal to itself.")
575+ }
576+ else throw("Strict value is not equal to itself.")
550577 }
551578
552579
553580
554581 @Callable(i)
555582 func disableUseAsCollateral (reserve) = {
556583 let user = toString(i.caller)
557584 let doSetCollateral = invoke(validateReserve(reserve), "disableUseAsCollateralFor", [user], nil)
558585 if ((doSetCollateral == doSetCollateral))
559586 then validateAfter(user, "changing collateral status")
560587 else throw("Strict value is not equal to itself.")
561588 }
562589
563590
564591
565592 @Callable(i)
566593 func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = {
567594 let sh1 = syncRewardsHeight(borrowReserve)
568595 if ((sh1 == sh1))
569596 then {
570597 let sh2 = syncRewardsHeight(collateralReserve)
571598 if ((sh2 == sh2))
572599 then if ((0 >= liquidateDebtAmount))
573600 then throw("can't liquidate non-positive amount")
574601 else if ((collateralReserve == borrowReserve))
575602 then throw("collateralReserve equals borrowReserve")
576603 else {
577604 let liquidator = toString(i.caller)
578605 if ((liquidator == borrower))
579606 then throw("can't liquidate self")
580607 else {
581- let $t01363013665 = userPower(borrower)
582- let bp = $t01363013665._1
583- let bpu = $t01363013665._2
608+ let $t01424614281 = userPower(borrower)
609+ let bp = $t01424614281._1
610+ let bpu = $t01424614281._2
584611 if ((bp > bpu))
585612 then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
586613 else {
587614 let br = validateReserve(borrowReserve)
588615 let cr = validateReserve(collateralReserve)
589616 let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
590617 let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
591618 if ((isCollateral == isCollateral))
592619 then if (!(isCollateral))
593620 then throw("can't liquidate deposit not used as collateral")
594621 else {
595- let $t01418114271 = userBalance(br, borrower)
596- if (($t01418114271 == $t01418114271))
622+ let $t01479714887 = userBalance(br, borrower)
623+ if (($t01479714887 == $t01479714887))
597624 then {
598- let userDebtUsd = $t01418114271._5
599- let userDebt = $t01418114271._4
600- let userAssetUsd = $t01418114271._3
601- let userAsset = $t01418114271._2
602- let ignore = $t01418114271._1
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
603630 if ((userAsset >= userDebt))
604631 then throw("can't liquidate debt of asset of positive saldo")
605632 else if ((0 >= liquidateDebtAmount))
606633 then throw("can't liquidate zero or negative amount")
607634 else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
608635 then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
609636 else {
610637 let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
611638 let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
612639 let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
613640 if ((transferredCollateral == transferredCollateral))
614641 then {
615642 let propagateRewards1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
616643 if ((propagateRewards1 == propagateRewards1))
617644 then {
618645 let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
619646 if ((transferredDebt == transferredDebt))
620647 then {
621648 let propagateRewards2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
622649 if ((propagateRewards2 == propagateRewards2))
623650 then {
624651 let liquidatorHealthCheck = if (contains(liquidators, liquidator))
625652 then nil
626653 else validateAfter(liquidator, "transferring debt")
627654 if ((liquidatorHealthCheck == liquidatorHealthCheck))
628655 then $Tuple2(liquidatorHealthCheck, transferredCollateral)
629656 else throw("Strict value is not equal to itself.")
630657 }
631658 else throw("Strict value is not equal to itself.")
632659 }
633660 else throw("Strict value is not equal to itself.")
634661 }
635662 else throw("Strict value is not equal to itself.")
636663 }
637664 else throw("Strict value is not equal to itself.")
638665 }
639666 }
640667 else throw("Strict value is not equal to itself.")
641668 }
642669 else throw("Strict value is not equal to itself.")
643670 }
644671 }
645672 }
646673 else throw("Strict value is not equal to itself.")
647674 }
648675 else throw("Strict value is not equal to itself.")
649676 }
650677
651678
652679
653680 @Callable(i)
654681 func forceCollapse (reserve,borrower) = {
655682 let reserveAddress = validateReserve(reserve)
656683 if ((reserveAddress == reserveAddress))
657684 then {
658685 let sh = syncRewardsHeight(reserve)
659686 if ((sh == sh))
660687 then {
661688 let liquidator = toString(i.caller)
662689 if ((liquidator == borrower))
663690 then throw("can't collapse self in this function")
664691 else {
665- let $t01586515900 = userPower(borrower)
666- let bp = $t01586515900._1
667- let bpu = $t01586515900._2
692+ let $t01648116516 = userPower(borrower)
693+ let bp = $t01648116516._1
694+ let bpu = $t01648116516._2
668695 if ((bp > bpu))
669696 then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
670697 else {
671- let $t01604516153 = userBalance(reserveAddress, borrower)
672- if (($t01604516153 == $t01604516153))
698+ let $t01666116769 = userBalance(reserveAddress, borrower)
699+ if (($t01666116769 == $t01666116769))
673700 then {
674- let userDebtUsd = $t01604516153._5
675- let userDebt = $t01604516153._4
676- let userAssetUsd = $t01604516153._3
677- let borrowerDeposit = $t01604516153._2
678- let ignore = $t01604516153._1
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
679706 let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
680707 let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
681708 if ((transferredAssets == transferredAssets))
682709 then {
683710 let propagateRewards1 = moveStream(reserve, "deposit", borrower, liquidator, transferredAssets)
684711 if ((propagateRewards1 == propagateRewards1))
685712 then {
686713 let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
687714 if ((collapsed == collapsed))
688715 then {
689716 let propagateRewards2 = updateStream(reserve, "borrow", borrower, -(collapsed), -(collapsed))
690717 if ((propagateRewards2 == propagateRewards2))
691718 then {
692719 let propagateRewards3 = updateStream(reserve, "deposit", borrower, -(collapsed), -(collapsed))
693720 if ((propagateRewards3 == propagateRewards3))
694721 then nil
695722 else throw("Strict value is not equal to itself.")
696723 }
697724 else throw("Strict value is not equal to itself.")
698725 }
699726 else throw("Strict value is not equal to itself.")
700727 }
701728 else throw("Strict value is not equal to itself.")
702729 }
703730 else throw("Strict value is not equal to itself.")
704731 }
705732 else throw("Strict value is not equal to itself.")
706733 }
707734 }
708735 }
709736 else throw("Strict value is not equal to itself.")
710737 }
711738 else throw("Strict value is not equal to itself.")
712739 }
713740
714741

github/deemru/w8io/786bc32 
96.97 ms