2022.03.09 13:35 [3021428] smart account 3P2RkFDTHJCB82HcVvJNU2eMEfUo82ZFagV > SELF 0.00000000 Waves

{ "type": 13, "id": "Cdeb4mFRqFvVxRqpq54KMEcbhCcwAfC5jWQZAJ3VdjnT", "fee": 1000000, "feeAssetId": null, "timestamp": 1646822045537, "version": 1, "sender": "3P2RkFDTHJCB82HcVvJNU2eMEfUo82ZFagV", "senderPublicKey": "Sx5vS5cxVcvs6Du84y8pwr1FKn6m2UH7jUsHVTBdnQT", "proofs": [ "4dCiVsPo6ZMALWASseX5W2vkjsSzc1fXYDBuHFxCRotyQxxinjM166mDrukowe7rJfu1S2HBqdiF7MZ3HbgXqZdR" ], "script": "base64:AAIFAAAAAAAAADEIAhIECgIICBIDCgEIEgcKBQgICAEBEgcKBQgICAgBEgUKAwgIARIAEgASAwoBCBIAAAAAJQAAAAALY29uZmlnU3RvcmUCAAAABmNvbmZpZwAAAAAKc3RhcnRlZEtleQIAAAAHc3RhcnRlZAEAAAAPc3luY0hlaWdodFN0b3JlAAAAAQAAAAdyZXNlcnZlCQABLAAAAAIFAAAAB3Jlc2VydmUCAAAAC19zeW5jSGVpZ2h0AQAAAApzcGVlZFN0b3JlAAAAAgAAAAdyZXNlcnZlAAAABmFjdGlvbgkAASwAAAACCQABLAAAAAIFAAAAB3Jlc2VydmUCAAAAB19zcGVlZF8FAAAABmFjdGlvbgEAAAALcmV3YXJkU3RvcmUAAAACAAAAB3Jlc2VydmUAAAAGYWN0aW9uCQABLAAAAAIJAAEsAAAAAgUAAAAHcmVzZXJ2ZQIAAAAIX3Jld2FyZF8FAAAABmFjdGlvbgEAAAAQdXNlckNsYWltZWRTdG9yZQAAAAIAAAAHcmVzZXJ2ZQAAAAR1c2VyCQABLAAAAAIJAAEsAAAAAgUAAAAHcmVzZXJ2ZQIAAAAJX2NsYWltZWRfBQAAAAR1c2VyAQAAABJ1c2VyUmV3YXJkQWRqU3RvcmUAAAADAAAAB3Jlc2VydmUAAAAGYWN0aW9uAAAABHVzZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAHcmVzZXJ2ZQIAAAAPX3VzZXJSZXdhcmRBZGpfBQAAAAZhY3Rpb24CAAAAAV8FAAAABHVzZXIBAAAABXBvdzEwAAAAAQAAAAFuAwkAAAAAAAACBQAAAAFuAAAAAAAAAAAGAAAAAAAAD0JAAwkAAAAAAAACBQAAAAFuAAAAAAAAAAAIAAAAAAAF9eEACQAAAgAAAAEJAAEsAAAAAgIAAAAOYmFkIGRlY2ltYWxzOiAJAAGkAAAAAQUAAAABbgEAAAAQd3JpdGVDb25zdFN0cmluZwAAAAIAAAADa2V5AAAABXZhbHVlAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABVhbHJlYWR5IGluaXRpYWxpemVkOiAFAAAAA2tleQAAAAANY29uZmlnQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAtjb25maWdTdG9yZQIAAAAjdmlyZXMtZGlzdHJpYnV0b3I6IG5vIGNvbmZpZ0FkZHJlc3MCAAAAFmludmFsaWQgY29uZmlnIGFkZHJlc3MAAAAAC3ZpcmVzTWludGVyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAADHZpcmVzX21pbnRlcgIAAAAhdmlyZXMtZGlzdHJpYnV0b3I6IG5vIHZpcmVzTWludGVyAgAAABNpbnZhbGlkIHZpcmVzTWludGVyAAAAABFyZXdhcmRSZXNlcnZlc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAE3Jld2FyZGFibGVfcmVzZXJ2ZXMCAAAAKHZpcmVzLWRpc3RyaWJ1dG9yOiBubyByZXNlcnZlcyBpbiBjb25maWcAAAAADnJld2FyZFJlc2VydmVzCQAEtQAAAAIFAAAAEXJld2FyZFJlc2VydmVzU3RyAgAAAAF8AAAAAAp2aXJlc0lkU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAALdmlyZXNNaW50ZXICAAAAB2Fzc2V0SWQCAAAAJ3ZpcmVzLWRpc3RyaWJ1dG9yOiBubyB2aXJlc0Fzc2V0SWRTdG9yZQAAAAAMdmlyZXNBc3NldElkCQACWQAAAAEFAAAACnZpcmVzSWRTdHIAAAAADWFjdGlvbkRlcG9zaXQCAAAAB2RlcG9zaXQAAAAADGFjdGlvbkJvcnJvdwIAAAAGYm9ycm93AQAAAAt2YWxpZEFjdGlvbgAAAAEAAAAGYWN0aW9uAwMJAQAAAAIhPQAAAAIFAAAABmFjdGlvbgUAAAANYWN0aW9uRGVwb3Np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AAGkAAAAAQUAAAAHY2xhaW1lZAAAAAFpAQAAAApzeW5jSGVpZ2h0AAAAAQAAAAdyZXNlcnZlAwkBAAAAASEAAAABBQAAAAdzdGFydGVkBQAAAANuaWwDCQAAAAAAAAIFAAAABkhFSUdIVAkABB8AAAABCQEAAAAPc3luY0hlaWdodFN0b3JlAAAAAQUAAAAHcmVzZXJ2ZQUAAAADbmlsBAAAABRjdXJyZW50RGVwb3NpdFJld2FyZAkBAAAAFGN1cnJlbnRSZXNlcnZlUmV3YXJkAAAAAgUAAAAHcmVzZXJ2ZQUAAAANYWN0aW9uRGVwb3NpdAQAAAATY3VycmVudEJvcnJvd1Jld2FyZAkBAAAAFGN1cnJlbnRSZXNlcnZlUmV3YXJkAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMYWN0aW9uQm9ycm93CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALcmV3YXJkU3RvcmUAAAACBQAAAAdyZXNlcnZlBQAAAA1hY3Rpb25EZXBvc2l0BQAAABRjdXJyZW50RGVwb3NpdFJld2FyZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC3Jld2FyZFN0b3JlAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMYWN0aW9uQm9ycm93BQAAABNjdXJyZW50Qm9ycm93UmV3YXJkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPc3luY0hlaWdodFN0b3JlAAAAAQUAAAAHcmVzZXJ2ZQUAAAAGSEVJR0hUBQAAAANuaWwAAAABaQEAAAAIb25BY3Rpb24AAAAFAAAAB3Jlc2VydmUAAAAGYWN0aW9uAAAABHVzZXIAAAAKdXNlckNoYW5nZQAAAAxzdHJlYW1DaGFuZ2UDCQEAAAABIQAAAAEFAAAAB3N0YXJ0ZWQFAAAAA25pbAQAAAAGY2hlY2tzAwkBAAAACG1haW5Pbmx5AAAAAQUAAAABaQkBAAAAC3ZhbGlkQWN0aW9uAAAAAQUAAAAGYWN0aW9uBwMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAETwAAAAIFAAAADnJld2FyZFJlc2VydmVzBQAAAAdyZXNlcnZlBQAAAANuaWwDCQEAAAACIT0AAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABCQEAAAAPc3luY0hlaWdodFN0b3JlAAAAAQUAAAAHcmVzZXJ2ZQUAAAAGSEVJR0hUCQAAAgAAAAECAAAAHmRpc3RyaWJ1dG9yOiBoZWlnaHQgbm90IHN5bmNlZAQAAAALJHQwODEzMzgyNzMJAQAAAAZhc0ludDQAAAABCQAD/AAAAAQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB3Jlc2VydmUCAAAAEGdldEN1cnJlbnRUb3RhbHMJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwEAAAAD2N1clRvdGFsRGVwb3NpdAgFAAAACyR0MDgxMzM4MjczAAAAAl8xBAAAAAxjdXJUb3RhbERlYnQIBQAAAAskdDA4MTMzODI3MwAAAAJfMgQAAAALdXNlckRlcG9zaXQIBQAAAAskdDA4MTMzODI3MwAAAAJfMwQAAAAIdXNlckRlYnQIBQAAAAskdDA4MTMzODI3MwAAAAJfNAQAAAAIbmV3VG90YWwDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAANYWN0aW9uRGVwb3NpdAUAAAAPY3VyVG90YWxEZXBvc2l0BQAAAAxjdXJUb3RhbERlYnQEAAAAB25ld1VzZXIDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAANYWN0aW9uRGVwb3NpdAUAAAALdXNlckRlcG9zaXQFAAAACHVzZXJEZWJ0BAAAAAlwcmV2VG90YWwJAABlAAAAAgUAAAAIbmV3VG90YWwFAAAADHN0cmVhbUNoYW5nZQQAAAAIcHJldlVzZXIJAABlAAAAAgUAAAAHbmV3VXNlcgUAAAAKdXNlckNoYW5nZQQAAAARcHJldlJlc2VydmVSZXdhcmQJAQAAABRjdXJyZW50UmVzZXJ2ZVJld2FyZAAAAAIFAAAAB3Jlc2VydmUFAAAABmFjdGlvbgQAAAALcHJldlVzZXJBZGoJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAEnVzZXJSZXdhcmRBZGpTdG9yZQAAAAMFAAAAB3Jlc2VydmUFAAAABmFjdGlvbgUAAAAEdXNlcgAAAAAAAAAAAAQAAAAQbmV3UmVzZXJ2ZVJld2FyZAMJAAAAAAAAAgUAAAAJcHJldlRvdGFsAAAAAAAAAAAABQAAABFwcmV2UmVzZXJ2ZVJld2FyZAkAAGsAAAADBQAAABFwcmV2UmVzZXJ2ZVJld2FyZAUAAAAIbmV3VG90YWwFAAAACXByZXZUb3RhbAQAAAAQbmV3VXNlclJld2FyZEFkagMJAAAAAAAAAgUAAAAIbmV3VG90YWwAAAAAAAAAAAAJAABkAAAAAgUAAAALcHJldlVzZXJBZGoFAAAAEXByZXZSZXNlcnZlUmV3YXJkCQAAZQAAAAIFAAAAC3ByZXZVc2VyQWRqCQAAawAAAAMFAAAAEG5ld1Jlc2VydmVSZXdhcmQFAAAACnVzZXJDaGFuZ2UFAAAACG5ld1RvdGFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALcmV3YXJkU3RvcmUAAAACBQAAAAdyZXNlcnZlBQAAAAZhY3Rpb24FAAAAEG5ld1Jlc2VydmVSZXdhcmQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJ1c2VyUmV3YXJkQWRqU3RvcmUAAAADBQAAAAdyZXNlcnZlBQAAAAZhY3Rpb24FAAAABHVzZXIFAAAAEG5ld1VzZXJSZXdhcmRBZGoFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAEbW92ZQAAAAUAAAAHcmVzZXJ2ZQAAAAZhY3Rpb24AAAAEZnJvbQAAAAJ0bwAAAAZhbW91bnQDCQEAAAABIQAAAAEFAAAAB3N0YXJ0ZWQFAAAAA25pbAQAAAAGY2hlY2tzAwkBAAAACG1haW5Pbmx5AAAAAQUAAAABaQkBAAAAC3ZhbGlkQWN0aW9uAAAAAQUAAAAGYWN0aW9uBwMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAETwAAAAIFAAAADnJld2FyZFJlc2VydmVzBQAAAAdyZXNlcnZlBQAAAANuaWwDCQEAAAACIT0AAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABCQEAAAAPc3luY0hlaWdodFN0b3JlAAAAAQUAAAAHcmVzZXJ2ZQUAAAAGSEVJR0hUCQAAAgAAAAECAAAAHmRpc3RyaWJ1dG9yOiBoZWlnaHQgbm90IHN5bmNlZAQAAAALJHQwOTU5Njk3ODQJAQAAAAZhc0ludDYAAAABCQAD/AAAAAQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB3Jlc2VydmUCAAAAEWdldEN1cnJlbnRUb3RhbHMyCQAETAAAAAIFAAAABGZyb20JAARMAAAAAgUAAAACdG8FAAAAA25pbAUAAAADbmlsBAAAAA9jdXJUb3RhbERlcG9zaXQIBQAAAAskdDA5NTk2OTc4NAAAAAJfMQQAAAAMY3VyVG90YWxEZWJ0CAUAAAALJHQwOTU5Njk3ODQAAAACXzIEAAAAD3VzZXJEZXBvc2l0RnJvbQgFAAAACyR0MDk1OTY5Nzg0AAAAAl8zBAAAAAx1c2VyRGVidEZyb20IBQAAAAskdDA5NTk2OTc4NAAAAAJfNAQAAAANdXNlckRlcG9zaXRUbwgFAAAACyR0MDk1OTY5Nzg0AAAAAl81BAAAAAp1c2VyRGVidFRvCAUAAAALJHQwOTU5Njk3ODQAAAACXzYEAAAABXRvdGFsAwkAAAAAAAACBQAAAAZhY3Rpb24FAAAADWFjdGlvbkRlcG9zaXQFAAAAD2N1clRvdGFsRGVwb3NpdAUAAAAMY3VyVG90YWxEZWJ0BAAAAAduZXdGcm9tAwkAAAAAAAACBQAAAAZhY3Rpb24FAAAADWFjdGlvbkRlcG9zaXQFAAAAD3VzZXJEZXBvc2l0RnJvbQUAAAAMdXNlckRlYnRGcm9tBAAAAAVuZXdUbwMJAAAAAAAAAgUAAAAGYWN0aW9uBQAAAA1hY3Rpb25EZXBvc2l0BQAAAA11c2VyRGVwb3NpdFRvBQAAAAp1c2VyRGVidFRvBAAAAA1yZXNlcnZlUmV3YXJkCQEAAAAUY3VycmVudFJlc2VydmVSZXdhcmQAAAACBQAAAAdyZXNlcnZlBQAAAAZhY3Rpb24EAAAAEWZyb21Vc2VyUmV3YXJkQWRqCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABJ1c2VyUmV3YXJkQWRqU3RvcmUAAAADBQAAAAdyZXNlcnZlBQAAAAZhY3Rpb24FAAAABGZyb20AAAAAAAAAAAAEAAAAD3RvVXNlclJld2FyZEFkagkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAASdXNlclJld2FyZEFkalN0b3JlAAAAAwUAAAAHcmVzZXJ2ZQUAAAAGYWN0aW9uBQAAAAJ0bwAAAAAAAAAAAAQAAAAUbmV3RnJvbVVzZXJSZXdhcmRBZGoJAABlAAAAAgUAAAARZnJvbVVzZXJSZXdhcmRBZGoJAABrAAAAAwUAAAANcmVzZXJ2ZVJld2FyZAkBAAAAAS0AAAABBQAAAAZhbW91bnQFAAAABXRvdGFsBAAAABJuZXdUb1VzZXJSZXdhcmRBZGoJAABlAAAAAgUAAAAPdG9Vc2VyUmV3YXJkQWRqCQAAawAAAAMFAAAADXJlc2VydmVSZXdhcmQFAAAABmFtb3VudAUAAAAFdG90YWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJ1c2VyUmV3YXJkQWRqU3RvcmUAAAADBQAAAAdyZXNlcnZlBQAAAAZhY3Rpb24FAAAABGZyb20FAAAAFG5ld0Zyb21Vc2VyUmV3YXJkQWRqCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASdXNlclJld2FyZEFkalN0b3JlAAAAAwUAAAAHcmVzZXJ2ZQUAAAAGYWN0aW9uBQAAAAJ0bwUAAAASbmV3VG9Vc2VyUmV3YXJkQWRqBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNsYWltUmV3YXJkRm9yAAAAAwAAAAdyZXNlcnZlAAAABHVzZXIAAAAGYW1vdW50AwkBAAAAAiE9AAAAAgUAAAAGYW1vdW50AP//////////CQAAAgAAAAECAAAAG2Rpc3RyaWJ1dG9yOiBjbGFpbSBhbGwgb25seQMJAQAAAAEhAAAAAQUAAAAHc3RhcnRlZAUAAAADbmlsBAAAAAZjaGVja3MDCQEAAAAIbWFpbk9ubHkAAAABBQAAAAFpCQEAAAAJb3BBbGxvd2VkAAAAAQIAAAAYY2xhaW1fdmlyZXNfZGlzdHJpYnV0aW9uBwMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAADSR0MDEwOTU4MTEwMjkJAQAAABF1c2VyUmV3YXJkQmFsYW5jZQAAAAIFAAAAB3Jlc2VydmUFAAAABHVzZXIEAAAACmFjY0RlcG9zaXQIBQAAAA0kdDAxMDk1ODExMDI5AAAAAl8xBAAAAAlhY2NCb3Jyb3cIBQAAAA0kdDAxMDk1ODExMDI5AAAAAl8yBAAAAAdjbGFpbWVkCAUAAAANJHQwMTA5NTgxMTAyOQAAAAJfMwQAAAALYWNjdW11bGF0ZWQJAABkAAAAAgUAAAAKYWNjRGVwb3NpdAUAAAAJYWNjQm9ycm93BAAAAAlhdmFpbGFibGUJAABlAAAAAgUAAAALYWNjdW11bGF0ZWQFAAAAB2NsYWltZWQDCQAAZwAAAAIAAAAAAAAAAAAFAAAACWF2YWlsYWJsZQkABRQAAAACBQAAAANuaWwAAAAAAAAAAAAEAAAABG1pbnQJAAP8AAAABAUAAAALdmlyZXNNaW50ZXICAAAAD2Rpc3RyaWJ1dG9yTWludAkABEwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABEwAAAACBQAAAAlhdmFpbGFibGUFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAARtaW50BQAAAARtaW50CQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABB1c2VyQ2xhaW1lZFN0b3JlAAAAAgUAAAAHcmVzZXJ2ZQUAAAAEdXNlcgkAAGQAAAACBQAAAAdjbGFpbWVkBQAAAAlhdmFpbGFibGUFAAAAA25pbAUAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAHcmVhbGxvYwAAAAADCQEAAAABIQAAAAEJAQAAAAlvcEFsbG93ZWQAAAABAgAAAAdyZWFsbG9jCQAAAgAAAAECAAAADnJlYWxsb2MgcGF1c2VkAwkBAAAAASEAAAABBQAAAAdzdGFydGVkBQAAAANuaWwEAAAACnRvdGFsU3BlZWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAC3RvdGFsX3NwZWVkAgAAABlubyB0b3RhbCBhbGxvY2F0aW9uIHNwZWVkBAAAAA10b3RhbFJlc2VydmVzCQABkAAAAAEFAAAADnJld2FyZFJlc2VydmVzBAAAAA0kdDAxMTYzODExNzA4CQEAAAAbYm9ycm93ZWRWYWx1ZUFuZFRvdGFsQm9ycm93AAAAAAQAAAAUYm9ycm93ZWRWYWx1ZUJ5SW5kZXgIBQAAAA0kdDAxMTYzODExNzA4AAAAAl8xBAAAAAt0b3RhbEJvcnJvdwgFAAAADSR0MDExNjM4MTE3MDgAAAACXzIKAQAAAARmb2xkAAAAAgAAAAFsAAAABWluZGV4AwkAAGcAAAACBQAAAAVpbmRleAUAAAANdG90YWxSZXNlcnZlcwUAAAABbAQAAAAHcmVzZXJ2ZQkAAZEAAAACBQAAAA5yZXdhcmRSZXNlcnZlcwUAAAAFaW5kZXgEAAAACmFzc2V0U3BlZWQDCQAAAAAAAAIFAAAAC3RvdGFsQm9ycm93AAAAAAAAAAAAAAAAAAAAAAAACQAAawAAAAMFAAAACnRvdGFsU3BlZWQJAAGRAAAAAgUAAAAUYm9ycm93ZWRWYWx1ZUJ5SW5kZXgFAAAABWluZGV4BQAAAAt0b3RhbEJvcnJvdwQAAAAPbmV3RGVwb3NpdFNwZWVkCQAAawAAAAMFAAAACmFzc2V0U3BlZWQJAQAAABRkZXBvc2l0VG9Cb3Jyb3dSYXRpbwAAAAEFAAAAB3Jlc2VydmUFAAAAC2ZhY3RvcnNCYXNlBAAAAA5uZXdCb3Jyb3dTcGVlZAkAAGUAAAACBQAAAAphc3NldFNwZWVkBQAAAA9uZXdEZXBvc2l0U3BlZWQEAAAAFGN1cnJlbnREZXBvc2l0UmV3YXJkCQEAAAAUY3VycmVudFJlc2VydmVSZXdhcmQAAAACBQAAAAdyZXNlcnZlBQAAAA1hY3Rpb25EZXBvc2l0BAAAABNjdXJyZW50Qm9ycm93UmV3YXJkCQEAAAAUY3VycmVudFJlc2VydmVSZXdhcmQAAAACBQAAAAdyZXNlcnZlBQAAAAxhY3Rpb25Cb3Jyb3cJAAROAAAAAgUAAAABbAkABEwAAAACCQEAAAAMSW50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", "chainId": 87, "height": 3021428, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9wejM5215URkZAx66inrVMXAmP1whjVw8SENKiPyQjjT Next: 7yQhs1wcnM9EjUJGVTn6UmQ5c4M2wqy5k9y8W5DDP27G Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let oracleStore = "oracleAddress"
5-
6-let mainStore = "main"
7-
8-let adminStore = "admin"
9-
104 let configStore = "config"
11-
12-let reservesStore = "reward_reserves"
13-
14-let viresAssetIdStore = "assetId"
155
166 let startedKey = "started"
177
4232 else throw(("already initialized: " + key))
4333
4434
45-let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "no configAddress")), "invalid config address")
35+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "vires-distributor: no configAddress")), "invalid config address")
4636
4737 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "vires-distributor: no viresMinter")), "invalid viresMinter")
4838
49-let rewardReservesStr = valueOrErrorMessage(getString(this, reservesStore), "vires-distributor: no reserves")
39+let rewardReservesStr = valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "vires-distributor: no reserves in config")
5040
5141 let rewardReserves = split(rewardReservesStr, "|")
5242
53-let viresIdStr = valueOrErrorMessage(getString(viresMinter, viresAssetIdStore), "vires-distributor: no viresAssetIdStore")
43+let viresIdStr = valueOrErrorMessage(getString(viresMinter, "assetId"), "vires-distributor: no viresAssetIdStore")
5444
5545 let viresAssetId = fromBase58String(viresIdStr)
5646
6555 else true
6656
6757
68-func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main in config")), "invalid main address")))
58+func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "main"), "no main in config")), "invalid main address")))
6959 then throw("only main can do")
7060 else true
7161
10494 }
10595
10696
107-func getS (key) = getString(this, key)
108-
109-
110-let admin = addressFromStringValue(getStringValue(this, adminStore))
111-
11297 let config = addressFromStringValue(getStringValue(this, configStore))
11398
11499 let factorsBase = 1000
116101 func depositToBorrowRatio (reserve) = valueOrErrorMessage(getInteger(config, (reserve + "_depositToBorrowRatio")), (("depositToBorrowRatio for " + reserve) + " not set"))
117102
118103
119-let maybeOracleAddress = match getS(oracleStore) {
104+let maybeOracleAddress = match getString(config, "oracle_address") {
120105 case s: String =>
121106 addressFromString(s)
122107 case _ =>
183168
184169
185170 func userRewardBalance (reserve,user) = {
186- let $t049685108 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
187- let curTotalDeposit = $t049685108._1
188- let curTotalDebt = $t049685108._2
189- let userDeposit = $t049685108._3
190- let userDebt = $t049685108._4
171+ let $t047494889 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
172+ let curTotalDeposit = $t047494889._1
173+ let curTotalDebt = $t047494889._2
174+ let userDeposit = $t047494889._3
175+ let userDebt = $t047494889._4
191176 let totalDepositReward = currentReserveReward(reserve, actionDeposit)
192177 let totalBorrowReward = currentReserveReward(reserve, actionBorrow)
193178 let userDepositAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, actionDeposit, user)), 0)
204189
205190
206191 func evalUser (reserve,user) = {
207- let $t059326003 = userRewardBalance(reserve, user)
208- let accDeposit = $t059326003._1
209- let accBorrow = $t059326003._2
210- let claimed = $t059326003._3
192+ let $t057135784 = userRewardBalance(reserve, user)
193+ let accDeposit = $t057135784._1
194+ let accBorrow = $t057135784._2
195+ let claimed = $t057135784._3
211196 ((((("accumulated_deposit: " + toString(accDeposit)) + ", accumulated_borrow: ") + toString(accBorrow)) + ", claimed: ") + toString(claimed))
212197 }
213198
221206 else valueOrErrorMessage(getInteger(address, "aTokenDecimals"), ("aTokenDecimals not found in reserve " + a))
222207 let assetDebt = valueOrElse(getInteger(address, "totalBorrow"), 0)
223208 let assetDebtUsd = fraction(assetDebt, oraclePrice(assetId), pow10(assetDecimals))
224- let $t067836803 = acc
225- let lst = $t067836803._1
226- let agg = $t067836803._2
209+ let $t065646584 = acc
210+ let lst = $t065646584._1
211+ let agg = $t065646584._2
227212 $Tuple2((lst ++ [assetDebtUsd]), (agg + assetDebtUsd))
228213 }
229214
244229
245230 @Callable(i)
246231 func adviseUser (reserve,user) = {
247- let $t069737044 = userRewardBalance(reserve, user)
248- let accDeposit = $t069737044._1
249- let accBorrow = $t069737044._2
250- let claimed = $t069737044._3
232+ let $t067546825 = userRewardBalance(reserve, user)
233+ let accDeposit = $t067546825._1
234+ let accBorrow = $t067546825._2
235+ let claimed = $t067546825._3
251236 let totalRewardsAccumulated = max([0, (accDeposit + accBorrow)])
252237 let rewardsAvailable = max([0, (totalRewardsAccumulated - claimed)])
253238 $Tuple2(nil, ((((("rewardsAccumulated: " + toString(totalRewardsAccumulated)) + ", rewardsAvailable: ") + toString(rewardsAvailable)) + ", rewardsClaimed: ") + toString(claimed)))
281266 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
282267 then throw("distributor: height not synced")
283268 else {
284- let $t083528492 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
285- let curTotalDeposit = $t083528492._1
286- let curTotalDebt = $t083528492._2
287- let userDeposit = $t083528492._3
288- let userDebt = $t083528492._4
269+ let $t081338273 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
270+ let curTotalDeposit = $t081338273._1
271+ let curTotalDebt = $t081338273._2
272+ let userDeposit = $t081338273._3
273+ let userDebt = $t081338273._4
289274 let newTotal = if ((action == actionDeposit))
290275 then curTotalDeposit
291276 else curTotalDebt
322307 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
323308 then throw("distributor: height not synced")
324309 else {
325- let $t0981510003 = asInt6(invoke(addressFromStringValue(reserve), "getCurrentTotals2", [from, to], nil))
326- let curTotalDeposit = $t0981510003._1
327- let curTotalDebt = $t0981510003._2
328- let userDepositFrom = $t0981510003._3
329- let userDebtFrom = $t0981510003._4
330- let userDepositTo = $t0981510003._5
331- let userDebtTo = $t0981510003._6
310+ let $t095969784 = asInt6(invoke(addressFromStringValue(reserve), "getCurrentTotals2", [from, to], nil))
311+ let curTotalDeposit = $t095969784._1
312+ let curTotalDebt = $t095969784._2
313+ let userDepositFrom = $t095969784._3
314+ let userDebtFrom = $t095969784._4
315+ let userDepositTo = $t095969784._5
316+ let userDebtTo = $t095969784._6
332317 let total = if ((action == actionDeposit))
333318 then curTotalDeposit
334319 else curTotalDebt
361346 else false
362347 if ((checks == checks))
363348 then {
364- let $t01117711248 = userRewardBalance(reserve, user)
365- let accDeposit = $t01117711248._1
366- let accBorrow = $t01117711248._2
367- let claimed = $t01117711248._3
349+ let $t01095811029 = userRewardBalance(reserve, user)
350+ let accDeposit = $t01095811029._1
351+ let accBorrow = $t01095811029._2
352+ let claimed = $t01095811029._3
368353 let accumulated = (accDeposit + accBorrow)
369354 let available = (accumulated - claimed)
370355 if ((0 >= available))
389374 else {
390375 let totalSpeed = valueOrErrorMessage(getInteger(config, "total_speed"), "no total allocation speed")
391376 let totalReserves = size(rewardReserves)
392- let $t01185711927 = borrowedValueAndTotalBorrow()
393- let borrowedValueByIndex = $t01185711927._1
394- let totalBorrow = $t01185711927._2
377+ let $t01163811708 = borrowedValueAndTotalBorrow()
378+ let borrowedValueByIndex = $t01163811708._1
379+ let totalBorrow = $t01163811708._2
395380 func fold (l,index) = if ((index >= totalReserves))
396381 then l
397382 else {
451436
452437
453438 @Callable(i)
454-func init (configAddress,oracleAddr,rsrvs) = [StringEntry(oracleStore, oracleAddr), StringEntry(reservesStore, rsrvs), writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
439+func init (configAddress) = [writeConstString(configStore, configAddress)]
455440
456441
457442
458443 @Callable(i)
459-func start () = if ((i.caller != admin))
460- then throw("only admin can do")
461- else if (started)
462- then throw("already started")
463- else {
464- func fold (l,reserve) = (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), 0), IntegerEntry(rewardStore(reserve, actionDeposit), 0), IntegerEntry(speedStore(reserve, actionBorrow), 0), IntegerEntry(rewardStore(reserve, actionBorrow), 0), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
444+func start () = {
445+ let adminStore = "admin"
446+ let admin = addressFromStringValue(getStringValue(config, adminStore))
447+ if ((i.caller != admin))
448+ then throw("only admin can do")
449+ else if (started)
450+ then throw("already started")
451+ else {
452+ func fold (l,reserve) = (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), 0), IntegerEntry(rewardStore(reserve, actionDeposit), 0), IntegerEntry(speedStore(reserve, actionBorrow), 0), IntegerEntry(rewardStore(reserve, actionBorrow), 0), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
465453
466- let $l = rewardReserves
467- let $s = size($l)
468- let $acc0 = [IntegerEntry(startedKey, HEIGHT)]
469- func $f0_1 ($a,$i) = if (($i >= $s))
470- then $a
471- else fold($a, $l[$i])
454+ let $l = rewardReserves
455+ let $s = size($l)
456+ let $acc0 = [IntegerEntry(startedKey, HEIGHT)]
457+ func $f0_1 ($a,$i) = if (($i >= $s))
458+ then $a
459+ else fold($a, $l[$i])
472460
473- func $f0_2 ($a,$i) = if (($i >= $s))
474- then $a
475- else throw("List size exceeds 7")
461+ func $f0_2 ($a,$i) = if (($i >= $s))
462+ then $a
463+ else throw("List size exceeds 7")
476464
477- $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)
478- }
465+ $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)
466+ }
467+ }
479468
480469
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let oracleStore = "oracleAddress"
5-
6-let mainStore = "main"
7-
8-let adminStore = "admin"
9-
104 let configStore = "config"
11-
12-let reservesStore = "reward_reserves"
13-
14-let viresAssetIdStore = "assetId"
155
166 let startedKey = "started"
177
188 func syncHeightStore (reserve) = (reserve + "_syncHeight")
199
2010
2111 func speedStore (reserve,action) = ((reserve + "_speed_") + action)
2212
2313
2414 func rewardStore (reserve,action) = ((reserve + "_reward_") + action)
2515
2616
2717 func userClaimedStore (reserve,user) = ((reserve + "_claimed_") + user)
2818
2919
3020 func userRewardAdjStore (reserve,action,user) = ((((reserve + "_userRewardAdj_") + action) + "_") + user)
3121
3222
3323 func pow10 (n) = if ((n == 6))
3424 then 1000000
3525 else if ((n == 8))
3626 then 100000000
3727 else throw(("bad decimals: " + toString(n)))
3828
3929
4030 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
4131 then StringEntry(key, value)
4232 else throw(("already initialized: " + key))
4333
4434
45-let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "no configAddress")), "invalid config address")
35+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "vires-distributor: no configAddress")), "invalid config address")
4636
4737 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "vires-distributor: no viresMinter")), "invalid viresMinter")
4838
49-let rewardReservesStr = valueOrErrorMessage(getString(this, reservesStore), "vires-distributor: no reserves")
39+let rewardReservesStr = valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "vires-distributor: no reserves in config")
5040
5141 let rewardReserves = split(rewardReservesStr, "|")
5242
53-let viresIdStr = valueOrErrorMessage(getString(viresMinter, viresAssetIdStore), "vires-distributor: no viresAssetIdStore")
43+let viresIdStr = valueOrErrorMessage(getString(viresMinter, "assetId"), "vires-distributor: no viresAssetIdStore")
5444
5545 let viresAssetId = fromBase58String(viresIdStr)
5646
5747 let actionDeposit = "deposit"
5848
5949 let actionBorrow = "borrow"
6050
6151 func validAction (action) = if (if ((action != actionDeposit))
6252 then (action != actionBorrow)
6353 else false)
6454 then throw(("invalid action: " + action))
6555 else true
6656
6757
68-func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main in config")), "invalid main address")))
58+func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "main"), "no main in config")), "invalid main address")))
6959 then throw("only main can do")
7060 else true
7161
7262
7363 let started = isDefined(getInteger(this, startedKey))
7464
7565 func asInt (value) = match value {
7666 case int: Int =>
7767 int
7868 case _ =>
7969 throw("wrong type, expected: Int")
8070 }
8171
8272
8373 func asInt4 (value) = match value {
8474 case x: (Int, Int, Int, Int) =>
8575 x
8676 case t =>
8777 throw("wrong type, expected: Int4")
8878 }
8979
9080
9181 func asInt6 (value) = match value {
9282 case x: (Int, Int, Int, Int, Int, Int) =>
9383 x
9484 case t =>
9585 throw("wrong type, expected: Int4")
9686 }
9787
9888
9989 func asUserBalanceData (value) = match value {
10090 case x: (Int, Int, Int, Int, Int, Boolean) =>
10191 x
10292 case t =>
10393 throw("wrong type, expected: Int5&Boolean")
10494 }
10595
10696
107-func getS (key) = getString(this, key)
108-
109-
110-let admin = addressFromStringValue(getStringValue(this, adminStore))
111-
11297 let config = addressFromStringValue(getStringValue(this, configStore))
11398
11499 let factorsBase = 1000
115100
116101 func depositToBorrowRatio (reserve) = valueOrErrorMessage(getInteger(config, (reserve + "_depositToBorrowRatio")), (("depositToBorrowRatio for " + reserve) + " not set"))
117102
118103
119-let maybeOracleAddress = match getS(oracleStore) {
104+let maybeOracleAddress = match getString(config, "oracle_address") {
120105 case s: String =>
121106 addressFromString(s)
122107 case _ =>
123108 unit
124109 }
125110
126111 func oraclePrice (assetId) = match invoke(valueOrErrorMessage(maybeOracleAddress, "no oracle"), "price", [assetId], nil) {
127112 case i: Int =>
128113 i
129114 case _ =>
130115 throw("bad oracle data")
131116 }
132117
133118
134119 let HEIGHT = height
135120
136121 func asInt2 (value) = match value {
137122 case x: (Int, Int) =>
138123 x
139124 case t =>
140125 throw("wrong type, expected: Int2")
141126 }
142127
143128
144129 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
145130 case b: Boolean =>
146131 if (b)
147132 then true
148133 else throw("not allowed")
149134 case _ =>
150135 throw("opAllowed: unexpected result type")
151136 }
152137
153138
154139 func currentReserveReward (reserve,action) = {
155140 let h = valueOrElse(getInteger(this, syncHeightStore(reserve)), HEIGHT)
156141 let storedReward = valueOrElse(getInteger(this, rewardStore(reserve, action)), 0)
157142 if ((h == HEIGHT))
158143 then storedReward
159144 else {
160145 let speed = valueOrElse(getInteger(this, speedStore(reserve, action)), 0)
161146 let accumulatedReward = ((HEIGHT - h) * speed)
162147 (storedReward + accumulatedReward)
163148 }
164149 }
165150
166151
167152 func currentReserveRewardsSpeed () = {
168153 func fold2 (l,reserve) = ((((((((((((l + reserve) + "_") + actionDeposit) + "=") + toString(valueOrElse(getInteger(this, speedStore(reserve, actionDeposit)), 0))) + ", ") + reserve) + "_") + actionBorrow) + "=") + toString(valueOrElse(getInteger(this, speedStore(reserve, actionBorrow)), 0))) + ", ")
169154
170155 let $l = rewardReserves
171156 let $s = size($l)
172157 let $acc0 = ""
173158 func $f0_1 ($a,$i) = if (($i >= $s))
174159 then $a
175160 else fold2($a, $l[$i])
176161
177162 func $f0_2 ($a,$i) = if (($i >= $s))
178163 then $a
179164 else throw("List size exceeds 7")
180165
181166 $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)
182167 }
183168
184169
185170 func userRewardBalance (reserve,user) = {
186- let $t049685108 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
187- let curTotalDeposit = $t049685108._1
188- let curTotalDebt = $t049685108._2
189- let userDeposit = $t049685108._3
190- let userDebt = $t049685108._4
171+ let $t047494889 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
172+ let curTotalDeposit = $t047494889._1
173+ let curTotalDebt = $t047494889._2
174+ let userDeposit = $t047494889._3
175+ let userDebt = $t047494889._4
191176 let totalDepositReward = currentReserveReward(reserve, actionDeposit)
192177 let totalBorrowReward = currentReserveReward(reserve, actionBorrow)
193178 let userDepositAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, actionDeposit, user)), 0)
194179 let userBorrowAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, actionBorrow, user)), 0)
195180 let accDeposit = (userDepositAdj + (if ((curTotalDeposit == 0))
196181 then 0
197182 else fraction(totalDepositReward, userDeposit, curTotalDeposit)))
198183 let accBorrow = (userBorrowAdj + (if ((curTotalDebt == 0))
199184 then 0
200185 else fraction(totalBorrowReward, userDebt, curTotalDebt)))
201186 let claimed = valueOrElse(getInteger(this, userClaimedStore(reserve, user)), 0)
202187 $Tuple3(accDeposit, accBorrow, claimed)
203188 }
204189
205190
206191 func evalUser (reserve,user) = {
207- let $t059326003 = userRewardBalance(reserve, user)
208- let accDeposit = $t059326003._1
209- let accBorrow = $t059326003._2
210- let claimed = $t059326003._3
192+ let $t057135784 = userRewardBalance(reserve, user)
193+ let accDeposit = $t057135784._1
194+ let accBorrow = $t057135784._2
195+ let claimed = $t057135784._3
211196 ((((("accumulated_deposit: " + toString(accDeposit)) + ", accumulated_borrow: ") + toString(accBorrow)) + ", claimed: ") + toString(claimed))
212197 }
213198
214199
215200 func borrowedValueAndTotalBorrow () = {
216201 func fold (acc,a) = {
217202 let address = valueOrErrorMessage(addressFromString(a), ("bad address " + a))
218203 let assetId = valueOrErrorMessage(getString(address, "assetId"), ("assetId not found in reserve " + a))
219204 let assetDecimals = if ((assetId == "WAVES"))
220205 then 8
221206 else valueOrErrorMessage(getInteger(address, "aTokenDecimals"), ("aTokenDecimals not found in reserve " + a))
222207 let assetDebt = valueOrElse(getInteger(address, "totalBorrow"), 0)
223208 let assetDebtUsd = fraction(assetDebt, oraclePrice(assetId), pow10(assetDecimals))
224- let $t067836803 = acc
225- let lst = $t067836803._1
226- let agg = $t067836803._2
209+ let $t065646584 = acc
210+ let lst = $t065646584._1
211+ let agg = $t065646584._2
227212 $Tuple2((lst ++ [assetDebtUsd]), (agg + assetDebtUsd))
228213 }
229214
230215 let $l = rewardReserves
231216 let $s = size($l)
232217 let $acc0 = $Tuple2(nil, 0)
233218 func $f0_1 ($a,$i) = if (($i >= $s))
234219 then $a
235220 else fold($a, $l[$i])
236221
237222 func $f0_2 ($a,$i) = if (($i >= $s))
238223 then $a
239224 else throw("List size exceeds 7")
240225
241226 $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)
242227 }
243228
244229
245230 @Callable(i)
246231 func adviseUser (reserve,user) = {
247- let $t069737044 = userRewardBalance(reserve, user)
248- let accDeposit = $t069737044._1
249- let accBorrow = $t069737044._2
250- let claimed = $t069737044._3
232+ let $t067546825 = userRewardBalance(reserve, user)
233+ let accDeposit = $t067546825._1
234+ let accBorrow = $t067546825._2
235+ let claimed = $t067546825._3
251236 let totalRewardsAccumulated = max([0, (accDeposit + accBorrow)])
252237 let rewardsAvailable = max([0, (totalRewardsAccumulated - claimed)])
253238 $Tuple2(nil, ((((("rewardsAccumulated: " + toString(totalRewardsAccumulated)) + ", rewardsAvailable: ") + toString(rewardsAvailable)) + ", rewardsClaimed: ") + toString(claimed)))
254239 }
255240
256241
257242
258243 @Callable(i)
259244 func syncHeight (reserve) = if (!(started))
260245 then nil
261246 else if ((HEIGHT == getInteger(syncHeightStore(reserve))))
262247 then nil
263248 else {
264249 let currentDepositReward = currentReserveReward(reserve, actionDeposit)
265250 let currentBorrowReward = currentReserveReward(reserve, actionBorrow)
266251 [IntegerEntry(rewardStore(reserve, actionDeposit), currentDepositReward), IntegerEntry(rewardStore(reserve, actionBorrow), currentBorrowReward), IntegerEntry(syncHeightStore(reserve), HEIGHT)]
267252 }
268253
269254
270255
271256 @Callable(i)
272257 func onAction (reserve,action,user,userChange,streamChange) = if (!(started))
273258 then nil
274259 else {
275260 let checks = if (mainOnly(i))
276261 then validAction(action)
277262 else false
278263 if ((checks == checks))
279264 then if (!(isDefined(indexOf(rewardReserves, reserve))))
280265 then nil
281266 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
282267 then throw("distributor: height not synced")
283268 else {
284- let $t083528492 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
285- let curTotalDeposit = $t083528492._1
286- let curTotalDebt = $t083528492._2
287- let userDeposit = $t083528492._3
288- let userDebt = $t083528492._4
269+ let $t081338273 = asInt4(invoke(addressFromStringValue(reserve), "getCurrentTotals", [user], nil))
270+ let curTotalDeposit = $t081338273._1
271+ let curTotalDebt = $t081338273._2
272+ let userDeposit = $t081338273._3
273+ let userDebt = $t081338273._4
289274 let newTotal = if ((action == actionDeposit))
290275 then curTotalDeposit
291276 else curTotalDebt
292277 let newUser = if ((action == actionDeposit))
293278 then userDeposit
294279 else userDebt
295280 let prevTotal = (newTotal - streamChange)
296281 let prevUser = (newUser - userChange)
297282 let prevReserveReward = currentReserveReward(reserve, action)
298283 let prevUserAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, user)), 0)
299284 let newReserveReward = if ((prevTotal == 0))
300285 then prevReserveReward
301286 else fraction(prevReserveReward, newTotal, prevTotal)
302287 let newUserRewardAdj = if ((newTotal == 0))
303288 then (prevUserAdj + prevReserveReward)
304289 else (prevUserAdj - fraction(newReserveReward, userChange, newTotal))
305290 [IntegerEntry(rewardStore(reserve, action), newReserveReward), IntegerEntry(userRewardAdjStore(reserve, action, user), newUserRewardAdj)]
306291 }
307292 else throw("Strict value is not equal to itself.")
308293 }
309294
310295
311296
312297 @Callable(i)
313298 func move (reserve,action,from,to,amount) = if (!(started))
314299 then nil
315300 else {
316301 let checks = if (mainOnly(i))
317302 then validAction(action)
318303 else false
319304 if ((checks == checks))
320305 then if (!(isDefined(indexOf(rewardReserves, reserve))))
321306 then nil
322307 else if ((getIntegerValue(syncHeightStore(reserve)) != HEIGHT))
323308 then throw("distributor: height not synced")
324309 else {
325- let $t0981510003 = asInt6(invoke(addressFromStringValue(reserve), "getCurrentTotals2", [from, to], nil))
326- let curTotalDeposit = $t0981510003._1
327- let curTotalDebt = $t0981510003._2
328- let userDepositFrom = $t0981510003._3
329- let userDebtFrom = $t0981510003._4
330- let userDepositTo = $t0981510003._5
331- let userDebtTo = $t0981510003._6
310+ let $t095969784 = asInt6(invoke(addressFromStringValue(reserve), "getCurrentTotals2", [from, to], nil))
311+ let curTotalDeposit = $t095969784._1
312+ let curTotalDebt = $t095969784._2
313+ let userDepositFrom = $t095969784._3
314+ let userDebtFrom = $t095969784._4
315+ let userDepositTo = $t095969784._5
316+ let userDebtTo = $t095969784._6
332317 let total = if ((action == actionDeposit))
333318 then curTotalDeposit
334319 else curTotalDebt
335320 let newFrom = if ((action == actionDeposit))
336321 then userDepositFrom
337322 else userDebtFrom
338323 let newTo = if ((action == actionDeposit))
339324 then userDepositTo
340325 else userDebtTo
341326 let reserveReward = currentReserveReward(reserve, action)
342327 let fromUserRewardAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, from)), 0)
343328 let toUserRewardAdj = valueOrElse(getInteger(this, userRewardAdjStore(reserve, action, to)), 0)
344329 let newFromUserRewardAdj = (fromUserRewardAdj - fraction(reserveReward, -(amount), total))
345330 let newToUserRewardAdj = (toUserRewardAdj - fraction(reserveReward, amount, total))
346331 [IntegerEntry(userRewardAdjStore(reserve, action, from), newFromUserRewardAdj), IntegerEntry(userRewardAdjStore(reserve, action, to), newToUserRewardAdj)]
347332 }
348333 else throw("Strict value is not equal to itself.")
349334 }
350335
351336
352337
353338 @Callable(i)
354339 func claimRewardFor (reserve,user,amount) = if ((amount != -1))
355340 then throw("distributor: claim all only")
356341 else if (!(started))
357342 then nil
358343 else {
359344 let checks = if (mainOnly(i))
360345 then opAllowed("claim_vires_distribution")
361346 else false
362347 if ((checks == checks))
363348 then {
364- let $t01117711248 = userRewardBalance(reserve, user)
365- let accDeposit = $t01117711248._1
366- let accBorrow = $t01117711248._2
367- let claimed = $t01117711248._3
349+ let $t01095811029 = userRewardBalance(reserve, user)
350+ let accDeposit = $t01095811029._1
351+ let accBorrow = $t01095811029._2
352+ let claimed = $t01095811029._3
368353 let accumulated = (accDeposit + accBorrow)
369354 let available = (accumulated - claimed)
370355 if ((0 >= available))
371356 then $Tuple2(nil, 0)
372357 else {
373358 let mint = invoke(viresMinter, "distributorMint", [toString(i.caller), available], nil)
374359 if ((mint == mint))
375360 then $Tuple2([IntegerEntry(userClaimedStore(reserve, user), (claimed + available))], available)
376361 else throw("Strict value is not equal to itself.")
377362 }
378363 }
379364 else throw("Strict value is not equal to itself.")
380365 }
381366
382367
383368
384369 @Callable(i)
385370 func realloc () = if (!(opAllowed("realloc")))
386371 then throw("realloc paused")
387372 else if (!(started))
388373 then nil
389374 else {
390375 let totalSpeed = valueOrErrorMessage(getInteger(config, "total_speed"), "no total allocation speed")
391376 let totalReserves = size(rewardReserves)
392- let $t01185711927 = borrowedValueAndTotalBorrow()
393- let borrowedValueByIndex = $t01185711927._1
394- let totalBorrow = $t01185711927._2
377+ let $t01163811708 = borrowedValueAndTotalBorrow()
378+ let borrowedValueByIndex = $t01163811708._1
379+ let totalBorrow = $t01163811708._2
395380 func fold (l,index) = if ((index >= totalReserves))
396381 then l
397382 else {
398383 let reserve = rewardReserves[index]
399384 let assetSpeed = if ((totalBorrow == 0))
400385 then 0
401386 else fraction(totalSpeed, borrowedValueByIndex[index], totalBorrow)
402387 let newDepositSpeed = fraction(assetSpeed, depositToBorrowRatio(reserve), factorsBase)
403388 let newBorrowSpeed = (assetSpeed - newDepositSpeed)
404389 let currentDepositReward = currentReserveReward(reserve, actionDeposit)
405390 let currentBorrowReward = currentReserveReward(reserve, actionBorrow)
406391 (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), newDepositSpeed), IntegerEntry(rewardStore(reserve, actionDeposit), currentDepositReward), IntegerEntry(speedStore(reserve, actionBorrow), newBorrowSpeed), IntegerEntry(rewardStore(reserve, actionBorrow), currentBorrowReward), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
407392 }
408393
409394 let $l = [0, 1, 2, 3, 4, 5, 6]
410395 let $s = size($l)
411396 let $acc0 = nil
412397 func $f0_1 ($a,$i) = if (($i >= $s))
413398 then $a
414399 else fold($a, $l[$i])
415400
416401 func $f0_2 ($a,$i) = if (($i >= $s))
417402 then $a
418403 else throw("List size exceeds 7")
419404
420405 $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)
421406 }
422407
423408
424409
425410 @Callable(i)
426411 func advise () = {
427412 let totalReserves = size(rewardReserves)
428413 func fold (l,index) = if ((index >= totalReserves))
429414 then l
430415 else {
431416 let reserve = rewardReserves[index]
432417 ((((((((l + ", [ ") + "reserveAddress: ") + reserve) + ", depositRewardSpeed: ") + toString(getIntegerValue(this, speedStore(reserve, actionDeposit)))) + ", borrowRewardSpeed: ") + toString(getIntegerValue(this, speedStore(reserve, actionBorrow)))) + " ] ")
433418 }
434419
435420 $Tuple2(nil, {
436421 let $l = [0, 1, 2, 3, 4, 5, 6]
437422 let $s = size($l)
438423 let $acc0 = ""
439424 func $f0_1 ($a,$i) = if (($i >= $s))
440425 then $a
441426 else fold($a, $l[$i])
442427
443428 func $f0_2 ($a,$i) = if (($i >= $s))
444429 then $a
445430 else throw("List size exceeds 7")
446431
447432 $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)
448433 })
449434 }
450435
451436
452437
453438 @Callable(i)
454-func init (configAddress,oracleAddr,rsrvs) = [StringEntry(oracleStore, oracleAddr), StringEntry(reservesStore, rsrvs), writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
439+func init (configAddress) = [writeConstString(configStore, configAddress)]
455440
456441
457442
458443 @Callable(i)
459-func start () = if ((i.caller != admin))
460- then throw("only admin can do")
461- else if (started)
462- then throw("already started")
463- else {
464- func fold (l,reserve) = (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), 0), IntegerEntry(rewardStore(reserve, actionDeposit), 0), IntegerEntry(speedStore(reserve, actionBorrow), 0), IntegerEntry(rewardStore(reserve, actionBorrow), 0), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
444+func start () = {
445+ let adminStore = "admin"
446+ let admin = addressFromStringValue(getStringValue(config, adminStore))
447+ if ((i.caller != admin))
448+ then throw("only admin can do")
449+ else if (started)
450+ then throw("already started")
451+ else {
452+ func fold (l,reserve) = (l ++ [IntegerEntry(speedStore(reserve, actionDeposit), 0), IntegerEntry(rewardStore(reserve, actionDeposit), 0), IntegerEntry(speedStore(reserve, actionBorrow), 0), IntegerEntry(rewardStore(reserve, actionBorrow), 0), IntegerEntry(syncHeightStore(reserve), HEIGHT)])
465453
466- let $l = rewardReserves
467- let $s = size($l)
468- let $acc0 = [IntegerEntry(startedKey, HEIGHT)]
469- func $f0_1 ($a,$i) = if (($i >= $s))
470- then $a
471- else fold($a, $l[$i])
454+ let $l = rewardReserves
455+ let $s = size($l)
456+ let $acc0 = [IntegerEntry(startedKey, HEIGHT)]
457+ func $f0_1 ($a,$i) = if (($i >= $s))
458+ then $a
459+ else fold($a, $l[$i])
472460
473- func $f0_2 ($a,$i) = if (($i >= $s))
474- then $a
475- else throw("List size exceeds 7")
461+ func $f0_2 ($a,$i) = if (($i >= $s))
462+ then $a
463+ else throw("List size exceeds 7")
476464
477- $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)
478- }
465+ $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)
466+ }
467+ }
479468
480469

github/deemru/w8io/786bc32 
83.49 ms