tx · H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA: -0.01400000 Waves 2021.01.05 16:03 [2403919] smart account 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA > SELF 0.00000000 Waves
{ "type": 13, "id": "H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS", "fee": 1400000, "feeAssetId": null, "timestamp": 1609851685812, "version": 1, "sender": "3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA", "senderPublicKey": "5gGSWjBNTQGAMZViHK3qbn35JUNmbzqboicpdMuweapK", "proofs": [ "4VnLFQ54vsnafCMeimmRo6WimJWAGM9o7aqHCszGDq8agyQoBNDUgDZonsdnSKdRG4LggbriqWje91z9aoscsJC", "46r9TPwCQqmUmHXUFFg5Mc6GhZuMWqaScgwrWbgKBWbDVPS4wE6xYW3EDBG9SxF92eRCvUZET9XRCqpPw59eGFkk" ], "script": "base64:AAIEAAAAAAAAABIIAhIAEgwKCgICAgICAgICAgIAAAAYAAAAAA1zY3JpcHRWZXJzaW9uAgAAABQyLjAuMS1hbHBoYV8yMDIxMDEwNQAAAAAHcGVyY2VudAAAAAAAAAAnEAAAAAAHdXNkTXVsdAAAAAAAAA9CQAAAAAAHZGVjTXVsdAAAAAAABfXhAAAAAAAMZm1haW5QZXJjZW50CQAAaAAAAAIAAAAAAAAAAB4JAABpAAAAAgUAAAAHcGVyY2VudAAAAAAAAAAAZAAAAAAOYWRtaW5QdWJsaWNLZXkBAAAAIP/NC/3G2n4jCJyZKr/tgHerMXx1hEQpwHytfVvaE1cDAAAAAA5yb2JvdFB1YmxpY0tleQEAAAAg/80L/cbafiMInJkqv+2Ad6sxfHWERCnAfK19W9oTVwMAAAAADndleGNoUHVibGljS2V5AQAAACCACra6DN4MXqyQbVM71eP03OIkL/vpzgO2ukOcv9V7bgAAAAAKZ3VhcmFudG9ycwkABE0AAAACCQAETAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQcAAAAAgUAAAAEdGhpcwIAAAAKZ3VhcmFudG9yMQEAAAAACQAETAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQcAAAAAgUAAAAEdGhpcwIAAAAKZ3VhcmFudG9yMgEAAAAACQAETAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQcAAAAAgUAAAAEdGhpcwIAAAAKZ3VhcmFudG9yMwEAAAAABQAAAANuaWwBAAAAAAAAAAAKYWN0dWFsU2l6ZQkBAAAABXZhbHVlAAAAAQkABE8AAAACBQAAAApndWFyYW50b3JzAQAAAAAAAAAADW1pblNpZ25hdHVyZXMJAABkAAAAAgkAAGkAAAACBQAAAAphY3R1YWxTaXplAAAAAAAAAAACCQAAagAAAAIFAAAACmFjdHVhbFNpemUAAAAAAAAAAAIAAAAACWZoZnNBc3NldAEAAAAgOpA4QURDH3TQ8OMyzh9QDAGNYZGTvafTNhiE40YFc4EAAAAACXJhdHNBc3NldAEAAAAgCDmBsVpSJYfvhi7sJMDwm11Ai3Bj3lpFk1n/Otrur7gAAAAACXhmZWVBc3NldAEAAAAgPtqpo25+ABHwB4wBPcXeLo1HMTudGEE43iw65h6utjcAAAAACXBvcnRmb2xpbwkABEwAAAACAQAAACAelAcTUnahJZX9yGGogl8Qf986Tym7/JpGP1r9Nk+fkQkABEwAAAACAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wkABEwAAAACAQAAACAuIMP26oqfiVG7v+iIERM27H7YwkIDcmUNWM1zJkJlggkABEwAAAACAQAAACAOsQJqDD6fR/fkRpTnTra3vEN8fmVp0OkYmyLmCfLozgkABEwAAAACAQAAACD2HjZC05fd8lpYFSDuLA/aLUYGioA2kq5ViVmesMUsoQkABEwAAAACAQAAACCVUyAXMsf3+DFtUqiNtVnTz+vyc+2UcVflnSbnzodq4AkABEwAAAACAQAAACBDGPQbdVIwj7v6ImS/BChOt6ShyZxuGIKd0Qa/y8AkAgkABEwAAAACAQAAACChUlrVSdZxusOvH4bJkn/qD4paHB+YpCtzBo7Mmv7VZwUAAAADbmlsAAAAAAlvdXJBc3NldHMJAARMAAAAAgUAAAAJZmhmc0Fzc2V0CQAETAAAAAIFAAAACXhmZWVBc3NldAkABEwAAAACBQAAAAlyYXRzQXNzZXQFAAAAA25pbAAAAAAFYWRtaW4JAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVfK8FMYnc+eIGLh09VaqNvL6A9/0AfaxDUAAAAABWZtYWluCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXiLucC1xbXl/s/fiQu0BncvWJiMciO2L/AAAAAAVmY29sZAkBAAAAB0FkZHJlc3MAAAABAQAAABoBV0ygump5UhpW60FMck0UN7q3M1g/l45MnwAAAAAFZnJhdHMJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVexf5Yr1VHZNvQXHjIVnOjDoJ9Kua8wUGkBAAAADnZhbHVlT3JNaW5pbXVtAAAAAgAAAAhpbnRWYWx1ZQAAAAhtaW5WYWx1ZQMJAABmAAAAAgUAAAAIbWluVmFsdWUFAAAACGludFZhbHVlBQAAAAhtaW5WYWx1ZQUAAAAIaW50VmFsdWUBAAAADnZhbHVlT3JNYXhpbXVtAAAAAgAAAAhpbnRWYWx1ZQAAAAhtYXhWYWx1ZQMJAABmAAAAAgUAAAAIaW50VmFsdWUFAAAACG1heFZhbHVlBQAAAAhtYXhWYWx1ZQUAAAAIaW50VmFsdWUBAAAADGV4Y2Vzc0Ftb3VudAAAAAEAAAAHYXNzZXRJZAQAAAAKZm1haW5GdW5kcwkAA/AAAAACBQAAAAVmbWFpbgUAAAAHYXNzZXRJZAQAAAAKdG90YWxGdW5kcwkAAGQAAAACBQAAAApmbWFpbkZ1bmRzCQAD8AAAAAIFAAAABWZjb2xkBQAAAAdhc3NldElkBAAAAAtmbWFpblN1cHBseQkAAGsAAAADBQAAAAp0b3RhbEZ1bmRzBQAAAAxmbWFpblBlcmNlbnQFAAAAB3BlcmNlbnQJAQAAAA52YWx1ZU9yTWluaW11bQAAAAIJAABlAAAAAgUAAAALZm1haW5TdXBwbHkFAAAACmZtYWluRnVuZHMAAAAAAAAAAAABAAAADmFpcmRyb3BCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAAROAAAAAgUAAAAJcG9ydGZvbGlvBQAAAAlvdXJBc3NldHMFAAAAB2Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAABlQbGVhc2UgZGVsZXRlIHRoZSBhc3NldDogCQACWAAAAAEFAAAAB2Fzc2V0SWQDCQAAAAAAAAIFAAAAB2Fzc2V0SWQBAAAAAAAAAAAAAAAAAAkAA/AAAAACBQAAAAR0aGlzBQAAAAdhc3NldElkAAAAAgAAAAFpAQAAAA1hdXRvUmViYWxhbmNlAAAAAAMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAADNEb24ndCBhdHRhY2ggcGF5bWVudCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAuLi4DAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5yb2JvdFB1YmxpY0tleQcJAAACAAAAAQIAAAA2VGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IGFuIGFkbWluaXN0cmF0b3IhBAAAAAlmaGZzRnVuZHMJAAPwAAAAAgUAAAAFZm1haW4FAAAACWZoZnNBc3NldAQAAAAKZmhmc1N1cHBseQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAFZm1haW4CAAAACmZoZnNTdXBwbHkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAABlAAAAAgUAAAAKZmhmc1N1cHBseQUAAAAJZmhmc0Z1bmRzBQAAAAlmaGZzQXNzZXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAAkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAgkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAwkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABAkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABgkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZm1haW4JAQAAAAxleGNlc3NBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABwkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAcFAAAAA25pbAAAAAFpAQAAAA1haXJkcm9wV2FzaGVyAAAACgAAAANpZDAAAAADaWQxAAAAA2lkMgAAAANpZDMAAAADaWQ0AAAAA2lkNQAAAANpZDYAAAADaWQ3AAAAA2lkOAAAAANpZDkDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAzRG9uJ3QgYXR0YWNoIHBheW1lbnQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gLi4uAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAADZUaGlzIGFjdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYnkgYW4gYWRtaW5pc3RyYXRvciEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkMAUAAAADaWQwCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDEFAAAAA2lkMQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQyBQAAAANpZDIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkMwUAAAADaWQzCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDQFAAAAA2lkNAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQ1BQAAAANpZDUJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkNgUAAAADaWQ2CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDcFAAAAA2lkNwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQ4BQAAAANpZDgJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkOQUAAAADaWQ5BQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABFpc1ZhbGlkR3VhcmFudG9ycwkAAGcAAAACCQAAZAAAAAIJAABkAAAAAgMJAAnGAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABCQABkQAAAAIFAAAACmd1YXJhbnRvcnMAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAJxgAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAZEAAAACBQAAAApndWFyYW50b3JzAAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkACcYAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAGRAAAAAgUAAAAKZ3VhcmFudG9ycwAAAAAAAAAAAgAAAAAAAAAAAQAAAAAAAAAAAAUAAAANbWluU2lnbmF0dXJlcwQAAAAMaXNWYWxpZE93bmVyCQAJxgAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQQAAAAMaXNWYWxpZEFkbWluAwUAAAAMaXNWYWxpZE93bmVyBgkACcYAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADmFkbWluUHVibGljS2V5BAAAAAxpc1ZhbGlkUm9ib3QDBQAAAAxpc1ZhbGlkT3duZXIGCQAJxgAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAOcm9ib3RQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9CdXJuVHJhbnNhY3Rpb24EAAAAAWIFAAAAByRtYXRjaDADAwUAAAAMaXNWYWxpZE93bmVyCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8IBQAAAAFiAAAAB2Fzc2V0SWQHCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlvdXJBc3NldHMIBQAAAAFiAAAAB2Fzc2V0SWQHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAWTGVhc2VDYW5jZWxUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAQTGVhc2VUcmFuc2FjdGlvbgQAAAABbAUAAAAHJG1hdGNoMAUAAAAMaXNWYWxpZE93bmVyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVPcmRlcgQAAAABbwUAAAAHJG1hdGNoMAMDAwMDBQAAAAxpc1ZhbGlkUm9ib3QJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkBwkAAAAAAAACCAUAAAABbwAAABBtYXRjaGVyUHVibGljS2V5BQAAAA53ZXhjaFB1YmxpY0tleQcDAwMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwYDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAAEU2VsbAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwYDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF01hc3NUcmFuc2ZlclRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAF0BQAAAAckbWF0Y2gwAwMDBQAAAAxpc1ZhbGlkQWRtaW4FAAAAEWlzVmFsaWRHdWFyYW50b3JzBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9EYXRhVHJhbnNhY3Rpb24FAAAADGlzVmFsaWRBZG1pbgdlih6A", "chainId": 87, "height": 2403919, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ Next: H2EgWAPxMQL6gX1dq7xm8u5pvCu8nzUpx1FRT3tMtd8v Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let scriptVersion = " | |
4 | + | let scriptVersion = "2.0.1-alpha_20210105" | |
5 | 5 | ||
6 | - | let percent = | |
6 | + | let percent = 10000 | |
7 | 7 | ||
8 | - | let | |
8 | + | let usdMult = 1000000 | |
9 | 9 | ||
10 | - | let | |
10 | + | let decMult = 100000000 | |
11 | 11 | ||
12 | - | let fdappPercent = 30000 | |
13 | - | ||
14 | - | let fmmtDecimal = 100000 | |
15 | - | ||
16 | - | let usdtDecimal = 1000000 | |
17 | - | ||
18 | - | let sTxFee = 500000 | |
19 | - | ||
20 | - | let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal) | |
21 | - | ||
22 | - | let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
12 | + | let fmainPercent = (30 * (percent / 100)) | |
23 | 13 | ||
24 | 14 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
25 | 15 | ||
26 | - | let | |
16 | + | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
27 | 17 | ||
28 | - | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58''), valueOrElse(getBinary(this, "guarantor4"), base58''), valueOrElse(getBinary(this, "guarantor5"), base58'')] :+ base58'') | |
18 | + | let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
19 | + | ||
20 | + | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'') | |
29 | 21 | ||
30 | 22 | let actualSize = value(indexOf(guarantors, base58'')) | |
31 | 23 | ||
32 | 24 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
33 | 25 | ||
34 | - | let | |
26 | + | let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn' | |
35 | 27 | ||
36 | - | let | |
28 | + | let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD' | |
37 | 29 | ||
38 | 30 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
39 | 31 | ||
40 | - | let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'] | |
41 | - | ||
42 | 32 | let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] | |
43 | 33 | ||
44 | - | let ourAssets = [fmmtAsset, xfeeAsset] | |
45 | - | ||
46 | - | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14] | |
47 | - | ||
48 | - | let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"] | |
49 | - | ||
50 | - | let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal] | |
34 | + | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
51 | 35 | ||
52 | 36 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
53 | 37 | ||
54 | - | let | |
38 | + | let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
55 | 39 | ||
56 | 40 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
57 | 41 | ||
58 | - | let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply" | |
59 | - | ||
60 | - | let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit" | |
61 | - | ||
62 | - | let testMode = getBooleanValue(fdapp, "testMode") | |
63 | - | ||
64 | - | let tradeSupply = getIntegerValue(admin, supplyDataKey) | |
65 | - | ||
66 | - | let spreadPercent = getIntegerValue(fdapp, "halfSpread") | |
67 | - | ||
68 | - | let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset)) | |
69 | - | ||
70 | - | let logEntryDataKey = "logEntry" | |
71 | - | ||
72 | - | let timestampDataKey = "timestamp" | |
73 | - | ||
74 | - | let tfeesDataKey = "teamPayouts" | |
75 | - | ||
76 | - | let statusDataKey = "tradeStatus" | |
77 | - | ||
78 | - | let versionDataKey = "scriptVersion" | |
79 | - | ||
80 | - | func validate (intValue,minValue) = if ((minValue > intValue)) | |
81 | - | then 0 | |
82 | - | else intValue | |
83 | - | ||
42 | + | let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi') | |
84 | 43 | ||
85 | 44 | func valueOrMinimum (intValue,minValue) = if ((minValue > intValue)) | |
86 | 45 | then minValue | |
92 | 51 | else intValue | |
93 | 52 | ||
94 | 53 | ||
95 | - | func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId))) | |
54 | + | func excessAmount (assetId) = { | |
55 | + | let fmainFunds = assetBalance(fmain, assetId) | |
56 | + | let totalFunds = (fmainFunds + assetBalance(fcold, assetId)) | |
57 | + | let fmainSupply = fraction(totalFunds, fmainPercent, percent) | |
58 | + | valueOrMinimum((fmainSupply - fmainFunds), 0) | |
59 | + | } | |
96 | 60 | ||
97 | 61 | ||
98 | - | func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId)) | |
99 | - | then true | |
100 | - | else containsElement(markets, quoteId) | |
101 | - | ||
102 | - | ||
103 | - | func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId)) | |
104 | - | then true | |
105 | - | else isAssetDisabled(quoteId)) | |
106 | - | then true | |
107 | - | else (baseId == quoteId) | |
108 | - | ||
109 | - | ||
110 | - | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", "))) | |
111 | - | ||
112 | - | ||
113 | - | func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset)) | |
114 | - | then getIntegerValue(admin, profitDataKey) | |
115 | - | else 0)) | |
116 | - | ||
117 | - | ||
118 | - | func getAttachment (payments) = if ((size(payments) != 1)) | |
119 | - | then $Tuple2(base58'', 0) | |
120 | - | else $Tuple2(payments[0].assetId, payments[0].amount) | |
121 | - | ||
122 | - | ||
123 | - | func getScriptTransfer (address,amount,assetId) = if ((0 >= amount)) | |
124 | - | then nil | |
125 | - | else [ScriptTransfer(address, amount, assetId)] | |
126 | - | ||
127 | - | ||
128 | - | func rebalancingAmount (assetId) = if (isAssetDisabled(assetId)) | |
129 | - | then 0 | |
130 | - | else { | |
131 | - | let fdappFunds = assetBalance(fdapp, assetId) | |
132 | - | let totalFunds = (fdappFunds + assetBalance(fcold, assetId)) | |
133 | - | validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100)) | |
134 | - | } | |
135 | - | ||
136 | - | ||
137 | - | func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId)) | |
138 | - | then throw(("Delete asset ID: " + toBase58String(assetId))) | |
62 | + | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
63 | + | then throw(("Please delete the asset: " + toBase58String(assetId))) | |
139 | 64 | else if ((assetId == base58'')) | |
140 | 65 | then 0 | |
141 | 66 | else assetBalance(this, assetId) | |
142 | 67 | ||
143 | 68 | ||
144 | - | func toFloatString (num,dec) = if ((num == 0)) | |
145 | - | then "0" | |
146 | - | else if ((num > 0)) | |
147 | - | then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))) | |
148 | - | else throw("Negative amounts are not allowed!") | |
149 | - | ||
150 | - | ||
151 | 69 | @Callable(i) | |
152 | - | func | |
153 | - | then ( | |
154 | - | else | |
155 | - | then | |
156 | - | else | |
157 | - | then throw(" | |
70 | + | func autoRebalance () = if ((size(i.payments) > 0)) | |
71 | + | then throw("Don't attach payment when calling this function ...") | |
72 | + | else if (if ((i.callerPublicKey != adminPublicKey)) | |
73 | + | then (i.callerPublicKey != robotPublicKey) | |
74 | + | else false) | |
75 | + | then throw("This action can only be performed by an administrator!") | |
158 | 76 | else { | |
159 | - | let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent)) | |
160 | - | let oldPayouts = getIntegerValue(fcold, tfeesDataKey) | |
161 | - | let outAmount = validate((newPayouts - oldPayouts), 0) | |
162 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ") | |
163 | - | if ((0 >= outAmount)) | |
164 | - | then throw("There are currently no payments available.") | |
165 | - | else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
77 | + | let fhfsFunds = assetBalance(fmain, fhfsAsset) | |
78 | + | let fhfsSupply = getIntegerValue(fmain, "fhfsSupply") | |
79 | + | [ScriptTransfer(fmain, (fhfsSupply - fhfsFunds), fhfsAsset), ScriptTransfer(fmain, excessAmount(portfolio[0]), portfolio[0]), ScriptTransfer(fmain, excessAmount(portfolio[1]), portfolio[1]), ScriptTransfer(fmain, excessAmount(portfolio[2]), portfolio[2]), ScriptTransfer(fmain, excessAmount(portfolio[3]), portfolio[3]), ScriptTransfer(fmain, excessAmount(portfolio[4]), portfolio[4]), ScriptTransfer(fmain, excessAmount(portfolio[5]), portfolio[5]), ScriptTransfer(fmain, excessAmount(portfolio[6]), portfolio[6]), ScriptTransfer(fmain, excessAmount(portfolio[7]), portfolio[7])] | |
166 | 80 | } | |
167 | 81 | ||
168 | 82 | ||
169 | 83 | ||
170 | 84 | @Callable(i) | |
171 | - | func feeExchange () = { | |
172 | - | let $t086618711 = getAttachment(i.payments) | |
173 | - | let assetId = $t086618711._1 | |
174 | - | let deposit = $t086618711._2 | |
175 | - | let oldProfit = getIntegerValue(admin, profitDataKey) | |
176 | - | let maxAmount = fraction(oldProfit, decimal, fmmtPrice) | |
177 | - | if (if ((i.callerPublicKey != adminPublicKey)) | |
178 | - | then (i.callerPublicKey != mmbotPublicKey) | |
179 | - | else false) | |
85 | + | func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0)) | |
86 | + | then throw("Don't attach payment when calling this function ...") | |
87 | + | else if ((i.callerPublicKey != adminPublicKey)) | |
180 | 88 | then throw("This action can only be performed by an administrator!") | |
181 | - | else if ((assetId == fmmtAsset)) | |
182 | - | then { | |
183 | - | let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))] | |
184 | - | let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult) | |
185 | - | let usdtFactor = fraction(usdtFunds, spreadPercent, percent) | |
186 | - | let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice) | |
187 | - | let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor) | |
188 | - | let refundAmount = validate((deposit - inAmount), 0) | |
189 | - | let outAmount = fraction(inAmount, usdtFactor, fmmtFactor) | |
190 | - | let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor)) | |
191 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimal), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimal), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimal), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimal), "USDT"], " ") | |
192 | - | if ((0 >= outAmount)) | |
193 | - | then throw(logEntryDataValue) | |
194 | - | else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))] | |
195 | - | } | |
196 | - | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " ")) | |
197 | - | } | |
198 | - | ||
199 | - | ||
200 | - | ||
201 | - | @Callable(i) | |
202 | - | func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey)) | |
203 | - | then (i.callerPublicKey != mmbotPublicKey) | |
204 | - | else false) | |
205 | - | then !(containsElement(guarantors, i.callerPublicKey)) | |
206 | - | else false) | |
207 | - | then throw("This action can only be performed by an administrator or guarantor!") | |
208 | - | else if ((size(i.payments) > 0)) | |
209 | - | then throw("Don't attach payment when calling this function ...") | |
210 | - | else { | |
211 | - | let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
212 | - | let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset)) | |
213 | - | let recipient = fdapp | |
214 | - | let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7])) | |
215 | - | let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId)) | |
216 | - | if ((size(scriptTransfers) == 0)) | |
217 | - | then throw("There are currently no transfers available.") | |
218 | - | else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
219 | - | } | |
220 | - | ||
221 | - | ||
222 | - | ||
223 | - | @Callable(i) | |
224 | - | func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey)) | |
225 | - | then throw("This action can only be performed by an administrator!") | |
226 | - | else if ((size(i.payments) > 0)) | |
227 | - | then throw("Don't attach payment when calling this function ...") | |
228 | - | else { | |
229 | - | let newVersion = scriptVersion | |
230 | - | let oldVersion = getStringValue(this, versionDataKey) | |
231 | - | let version = split(newVersion, "_") | |
232 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (version[0] + ";"), "updated:", makeString([take(version[1], 4), take(drop(version[1], 4), 2), drop(version[1], 6)], "-")], " ") | |
233 | - | if ((newVersion == oldVersion)) | |
234 | - | then throw(("The script version has already been updated. Version: " + oldVersion)) | |
235 | - | else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
236 | - | } | |
237 | - | ||
238 | - | ||
239 | - | ||
240 | - | @Callable(i) | |
241 | - | func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey)) | |
242 | - | then throw("This action can only be performed by an administrator!") | |
243 | - | else if ((size(i.payments) > 0)) | |
244 | - | then throw("Don't attach payment when calling this function ...") | |
245 | - | else { | |
246 | - | let scriptTransfers = (((((((((getScriptTransfer(admin, airdropBalance(id0), id0) ++ getScriptTransfer(admin, airdropBalance(id1), id1)) ++ getScriptTransfer(admin, airdropBalance(id2), id2)) ++ getScriptTransfer(admin, airdropBalance(id3), id3)) ++ getScriptTransfer(admin, airdropBalance(id4), id4)) ++ getScriptTransfer(admin, airdropBalance(id5), id5)) ++ getScriptTransfer(admin, airdropBalance(id6), id6)) ++ getScriptTransfer(admin, airdropBalance(id7), id7)) ++ getScriptTransfer(admin, airdropBalance(id8), id8)) ++ getScriptTransfer(admin, airdropBalance(id9), id9)) | |
247 | - | let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId)) | |
248 | - | if ((size(scriptTransfers) == 0)) | |
249 | - | then throw("There are currently no transfers available.") | |
250 | - | else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
251 | - | } | |
89 | + | else [ScriptTransfer(admin, airdropBalance(id0), id0), ScriptTransfer(admin, airdropBalance(id1), id1), ScriptTransfer(admin, airdropBalance(id2), id2), ScriptTransfer(admin, airdropBalance(id3), id3), ScriptTransfer(admin, airdropBalance(id4), id4), ScriptTransfer(admin, airdropBalance(id5), id5), ScriptTransfer(admin, airdropBalance(id6), id6), ScriptTransfer(admin, airdropBalance(id7), id7), ScriptTransfer(admin, airdropBalance(id8), id8), ScriptTransfer(admin, airdropBalance(id9), id9)] | |
252 | 90 | ||
253 | 91 | ||
254 | 92 | @Verifier(tx) | |
255 | 93 | func verify () = { | |
256 | - | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
257 | - | let isValidMMBot = if (isValidOwner) | |
258 | - | then true | |
259 | - | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey) | |
260 | - | let isValidAdmin = if (isValidOwner) | |
261 | - | then true | |
262 | - | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
263 | - | let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
94 | + | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
264 | 95 | then 1 | |
265 | 96 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
266 | 97 | then 1 | |
267 | 98 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
268 | 99 | then 1 | |
269 | - | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3])) | |
270 | - | then 1 | |
271 | - | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4])) | |
272 | - | then 1 | |
273 | 100 | else 0)) >= minSignatures) | |
274 | - | let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0) | |
101 | + | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
102 | + | let isValidAdmin = if (isValidOwner) | |
103 | + | then true | |
104 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
105 | + | let isValidRobot = if (isValidOwner) | |
106 | + | then true | |
107 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
275 | 108 | match tx { | |
276 | 109 | case b: BurnTransaction => | |
277 | 110 | if (if (isValidOwner) | |
111 | + | then !(containsElement(portfolio, b.assetId)) | |
112 | + | else false) | |
278 | 113 | then !(containsElement(ourAssets, b.assetId)) | |
279 | - | else false) | |
280 | - | then !(containsElement(portfolio, b.assetId)) | |
281 | 114 | else false | |
282 | 115 | case l: LeaseCancelTransaction|LeaseTransaction => | |
283 | 116 | isValidOwner | |
284 | 117 | case o: Order => | |
285 | - | if (if (if (if (if ( | |
286 | - | then (o. | |
118 | + | if (if (if (if (if (isValidRobot) | |
119 | + | then !(isDefined(o.matcherFeeAssetId)) | |
287 | 120 | else false) | |
288 | - | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
289 | - | else false) | |
290 | - | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
121 | + | then (o.matcherPublicKey == wexchPublicKey) | |
291 | 122 | else false) | |
292 | 123 | then if (if (if ((o.orderType == Buy)) | |
293 | 124 | then !(containsElement(portfolio, o.assetPair.priceAsset)) | |
301 | 132 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
302 | 133 | else false | |
303 | 134 | else false) | |
304 | - | then | |
305 | - | | |
306 | - | | |
135 | + | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
136 | + | else false) | |
137 | + | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
307 | 138 | else false | |
308 | - | case t: TransferTransaction => | |
309 | - | if (if (if ( | |
310 | - | then | |
139 | + | case t: MassTransferTransaction|TransferTransaction => | |
140 | + | if (if (if (isValidAdmin) | |
141 | + | then isValidGuarantors | |
311 | 142 | else false) | |
312 | 143 | then !(containsElement(portfolio, t.assetId)) | |
313 | 144 | else false) | |
314 | 145 | then !(containsElement(portfolio, t.feeAssetId)) | |
315 | - | else false) | |
316 | - | then true | |
317 | - | else if (if (if (isValidAdmin) | |
318 | - | then true | |
319 | - | else isValidGuarantors) | |
320 | - | then (addressFromRecipient(t.recipient) == fdapp) | |
321 | - | else false) | |
322 | - | then if ((t.assetId != fmmtAsset)) | |
323 | - | then true | |
324 | - | else (maxAmount >= t.amount) | |
325 | - | else false | |
326 | - | case m: MassTransferTransaction => | |
327 | - | if (if (isValidAdmin) | |
328 | - | then isValidGuarantors | |
329 | - | else false) | |
330 | - | then if ((m.assetId == usdtAsset)) | |
331 | - | then true | |
332 | - | else if ((m.assetId != fmmtAsset)) | |
333 | - | then !(containsElement(portfolio, m.assetId)) | |
334 | - | else false | |
335 | 146 | else false | |
336 | 147 | case _: SetScriptTransaction|DataTransaction => | |
337 | - | if (isValidAdmin) | |
338 | - | then isValidGuarantors | |
339 | - | else false | |
148 | + | isValidAdmin | |
340 | 149 | case _ => | |
341 | 150 | false | |
342 | 151 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let scriptVersion = " | |
4 | + | let scriptVersion = "2.0.1-alpha_20210105" | |
5 | 5 | ||
6 | - | let percent = | |
6 | + | let percent = 10000 | |
7 | 7 | ||
8 | - | let | |
8 | + | let usdMult = 1000000 | |
9 | 9 | ||
10 | - | let | |
10 | + | let decMult = 100000000 | |
11 | 11 | ||
12 | - | let fdappPercent = 30000 | |
13 | - | ||
14 | - | let fmmtDecimal = 100000 | |
15 | - | ||
16 | - | let usdtDecimal = 1000000 | |
17 | - | ||
18 | - | let sTxFee = 500000 | |
19 | - | ||
20 | - | let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal) | |
21 | - | ||
22 | - | let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
12 | + | let fmainPercent = (30 * (percent / 100)) | |
23 | 13 | ||
24 | 14 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
25 | 15 | ||
26 | - | let | |
16 | + | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
27 | 17 | ||
28 | - | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58''), valueOrElse(getBinary(this, "guarantor4"), base58''), valueOrElse(getBinary(this, "guarantor5"), base58'')] :+ base58'') | |
18 | + | let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
19 | + | ||
20 | + | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'') | |
29 | 21 | ||
30 | 22 | let actualSize = value(indexOf(guarantors, base58'')) | |
31 | 23 | ||
32 | 24 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
33 | 25 | ||
34 | - | let | |
26 | + | let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn' | |
35 | 27 | ||
36 | - | let | |
28 | + | let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD' | |
37 | 29 | ||
38 | 30 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
39 | 31 | ||
40 | - | let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'] | |
41 | - | ||
42 | 32 | let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] | |
43 | 33 | ||
44 | - | let ourAssets = [fmmtAsset, xfeeAsset] | |
45 | - | ||
46 | - | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14] | |
47 | - | ||
48 | - | let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"] | |
49 | - | ||
50 | - | let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal] | |
34 | + | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
51 | 35 | ||
52 | 36 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
53 | 37 | ||
54 | - | let | |
38 | + | let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
55 | 39 | ||
56 | 40 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
57 | 41 | ||
58 | - | let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply" | |
59 | - | ||
60 | - | let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit" | |
61 | - | ||
62 | - | let testMode = getBooleanValue(fdapp, "testMode") | |
63 | - | ||
64 | - | let tradeSupply = getIntegerValue(admin, supplyDataKey) | |
65 | - | ||
66 | - | let spreadPercent = getIntegerValue(fdapp, "halfSpread") | |
67 | - | ||
68 | - | let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset)) | |
69 | - | ||
70 | - | let logEntryDataKey = "logEntry" | |
71 | - | ||
72 | - | let timestampDataKey = "timestamp" | |
73 | - | ||
74 | - | let tfeesDataKey = "teamPayouts" | |
75 | - | ||
76 | - | let statusDataKey = "tradeStatus" | |
77 | - | ||
78 | - | let versionDataKey = "scriptVersion" | |
79 | - | ||
80 | - | func validate (intValue,minValue) = if ((minValue > intValue)) | |
81 | - | then 0 | |
82 | - | else intValue | |
83 | - | ||
42 | + | let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi') | |
84 | 43 | ||
85 | 44 | func valueOrMinimum (intValue,minValue) = if ((minValue > intValue)) | |
86 | 45 | then minValue | |
87 | 46 | else intValue | |
88 | 47 | ||
89 | 48 | ||
90 | 49 | func valueOrMaximum (intValue,maxValue) = if ((intValue > maxValue)) | |
91 | 50 | then maxValue | |
92 | 51 | else intValue | |
93 | 52 | ||
94 | 53 | ||
95 | - | func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId))) | |
54 | + | func excessAmount (assetId) = { | |
55 | + | let fmainFunds = assetBalance(fmain, assetId) | |
56 | + | let totalFunds = (fmainFunds + assetBalance(fcold, assetId)) | |
57 | + | let fmainSupply = fraction(totalFunds, fmainPercent, percent) | |
58 | + | valueOrMinimum((fmainSupply - fmainFunds), 0) | |
59 | + | } | |
96 | 60 | ||
97 | 61 | ||
98 | - | func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId)) | |
99 | - | then true | |
100 | - | else containsElement(markets, quoteId) | |
101 | - | ||
102 | - | ||
103 | - | func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId)) | |
104 | - | then true | |
105 | - | else isAssetDisabled(quoteId)) | |
106 | - | then true | |
107 | - | else (baseId == quoteId) | |
108 | - | ||
109 | - | ||
110 | - | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", "))) | |
111 | - | ||
112 | - | ||
113 | - | func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset)) | |
114 | - | then getIntegerValue(admin, profitDataKey) | |
115 | - | else 0)) | |
116 | - | ||
117 | - | ||
118 | - | func getAttachment (payments) = if ((size(payments) != 1)) | |
119 | - | then $Tuple2(base58'', 0) | |
120 | - | else $Tuple2(payments[0].assetId, payments[0].amount) | |
121 | - | ||
122 | - | ||
123 | - | func getScriptTransfer (address,amount,assetId) = if ((0 >= amount)) | |
124 | - | then nil | |
125 | - | else [ScriptTransfer(address, amount, assetId)] | |
126 | - | ||
127 | - | ||
128 | - | func rebalancingAmount (assetId) = if (isAssetDisabled(assetId)) | |
129 | - | then 0 | |
130 | - | else { | |
131 | - | let fdappFunds = assetBalance(fdapp, assetId) | |
132 | - | let totalFunds = (fdappFunds + assetBalance(fcold, assetId)) | |
133 | - | validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100)) | |
134 | - | } | |
135 | - | ||
136 | - | ||
137 | - | func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId)) | |
138 | - | then throw(("Delete asset ID: " + toBase58String(assetId))) | |
62 | + | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
63 | + | then throw(("Please delete the asset: " + toBase58String(assetId))) | |
139 | 64 | else if ((assetId == base58'')) | |
140 | 65 | then 0 | |
141 | 66 | else assetBalance(this, assetId) | |
142 | 67 | ||
143 | 68 | ||
144 | - | func toFloatString (num,dec) = if ((num == 0)) | |
145 | - | then "0" | |
146 | - | else if ((num > 0)) | |
147 | - | then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))) | |
148 | - | else throw("Negative amounts are not allowed!") | |
149 | - | ||
150 | - | ||
151 | 69 | @Callable(i) | |
152 | - | func | |
153 | - | then ( | |
154 | - | else | |
155 | - | then | |
156 | - | else | |
157 | - | then throw(" | |
70 | + | func autoRebalance () = if ((size(i.payments) > 0)) | |
71 | + | then throw("Don't attach payment when calling this function ...") | |
72 | + | else if (if ((i.callerPublicKey != adminPublicKey)) | |
73 | + | then (i.callerPublicKey != robotPublicKey) | |
74 | + | else false) | |
75 | + | then throw("This action can only be performed by an administrator!") | |
158 | 76 | else { | |
159 | - | let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent)) | |
160 | - | let oldPayouts = getIntegerValue(fcold, tfeesDataKey) | |
161 | - | let outAmount = validate((newPayouts - oldPayouts), 0) | |
162 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ") | |
163 | - | if ((0 >= outAmount)) | |
164 | - | then throw("There are currently no payments available.") | |
165 | - | else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
77 | + | let fhfsFunds = assetBalance(fmain, fhfsAsset) | |
78 | + | let fhfsSupply = getIntegerValue(fmain, "fhfsSupply") | |
79 | + | [ScriptTransfer(fmain, (fhfsSupply - fhfsFunds), fhfsAsset), ScriptTransfer(fmain, excessAmount(portfolio[0]), portfolio[0]), ScriptTransfer(fmain, excessAmount(portfolio[1]), portfolio[1]), ScriptTransfer(fmain, excessAmount(portfolio[2]), portfolio[2]), ScriptTransfer(fmain, excessAmount(portfolio[3]), portfolio[3]), ScriptTransfer(fmain, excessAmount(portfolio[4]), portfolio[4]), ScriptTransfer(fmain, excessAmount(portfolio[5]), portfolio[5]), ScriptTransfer(fmain, excessAmount(portfolio[6]), portfolio[6]), ScriptTransfer(fmain, excessAmount(portfolio[7]), portfolio[7])] | |
166 | 80 | } | |
167 | 81 | ||
168 | 82 | ||
169 | 83 | ||
170 | 84 | @Callable(i) | |
171 | - | func feeExchange () = { | |
172 | - | let $t086618711 = getAttachment(i.payments) | |
173 | - | let assetId = $t086618711._1 | |
174 | - | let deposit = $t086618711._2 | |
175 | - | let oldProfit = getIntegerValue(admin, profitDataKey) | |
176 | - | let maxAmount = fraction(oldProfit, decimal, fmmtPrice) | |
177 | - | if (if ((i.callerPublicKey != adminPublicKey)) | |
178 | - | then (i.callerPublicKey != mmbotPublicKey) | |
179 | - | else false) | |
85 | + | func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0)) | |
86 | + | then throw("Don't attach payment when calling this function ...") | |
87 | + | else if ((i.callerPublicKey != adminPublicKey)) | |
180 | 88 | then throw("This action can only be performed by an administrator!") | |
181 | - | else if ((assetId == fmmtAsset)) | |
182 | - | then { | |
183 | - | let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))] | |
184 | - | let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult) | |
185 | - | let usdtFactor = fraction(usdtFunds, spreadPercent, percent) | |
186 | - | let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice) | |
187 | - | let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor) | |
188 | - | let refundAmount = validate((deposit - inAmount), 0) | |
189 | - | let outAmount = fraction(inAmount, usdtFactor, fmmtFactor) | |
190 | - | let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor)) | |
191 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimal), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimal), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimal), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimal), "USDT"], " ") | |
192 | - | if ((0 >= outAmount)) | |
193 | - | then throw(logEntryDataValue) | |
194 | - | else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))] | |
195 | - | } | |
196 | - | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " ")) | |
197 | - | } | |
198 | - | ||
199 | - | ||
200 | - | ||
201 | - | @Callable(i) | |
202 | - | func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey)) | |
203 | - | then (i.callerPublicKey != mmbotPublicKey) | |
204 | - | else false) | |
205 | - | then !(containsElement(guarantors, i.callerPublicKey)) | |
206 | - | else false) | |
207 | - | then throw("This action can only be performed by an administrator or guarantor!") | |
208 | - | else if ((size(i.payments) > 0)) | |
209 | - | then throw("Don't attach payment when calling this function ...") | |
210 | - | else { | |
211 | - | let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
212 | - | let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset)) | |
213 | - | let recipient = fdapp | |
214 | - | let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7])) | |
215 | - | let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId)) | |
216 | - | if ((size(scriptTransfers) == 0)) | |
217 | - | then throw("There are currently no transfers available.") | |
218 | - | else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
219 | - | } | |
220 | - | ||
221 | - | ||
222 | - | ||
223 | - | @Callable(i) | |
224 | - | func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey)) | |
225 | - | then throw("This action can only be performed by an administrator!") | |
226 | - | else if ((size(i.payments) > 0)) | |
227 | - | then throw("Don't attach payment when calling this function ...") | |
228 | - | else { | |
229 | - | let newVersion = scriptVersion | |
230 | - | let oldVersion = getStringValue(this, versionDataKey) | |
231 | - | let version = split(newVersion, "_") | |
232 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (version[0] + ";"), "updated:", makeString([take(version[1], 4), take(drop(version[1], 4), 2), drop(version[1], 6)], "-")], " ") | |
233 | - | if ((newVersion == oldVersion)) | |
234 | - | then throw(("The script version has already been updated. Version: " + oldVersion)) | |
235 | - | else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
236 | - | } | |
237 | - | ||
238 | - | ||
239 | - | ||
240 | - | @Callable(i) | |
241 | - | func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey)) | |
242 | - | then throw("This action can only be performed by an administrator!") | |
243 | - | else if ((size(i.payments) > 0)) | |
244 | - | then throw("Don't attach payment when calling this function ...") | |
245 | - | else { | |
246 | - | let scriptTransfers = (((((((((getScriptTransfer(admin, airdropBalance(id0), id0) ++ getScriptTransfer(admin, airdropBalance(id1), id1)) ++ getScriptTransfer(admin, airdropBalance(id2), id2)) ++ getScriptTransfer(admin, airdropBalance(id3), id3)) ++ getScriptTransfer(admin, airdropBalance(id4), id4)) ++ getScriptTransfer(admin, airdropBalance(id5), id5)) ++ getScriptTransfer(admin, airdropBalance(id6), id6)) ++ getScriptTransfer(admin, airdropBalance(id7), id7)) ++ getScriptTransfer(admin, airdropBalance(id8), id8)) ++ getScriptTransfer(admin, airdropBalance(id9), id9)) | |
247 | - | let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId)) | |
248 | - | if ((size(scriptTransfers) == 0)) | |
249 | - | then throw("There are currently no transfers available.") | |
250 | - | else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
251 | - | } | |
89 | + | else [ScriptTransfer(admin, airdropBalance(id0), id0), ScriptTransfer(admin, airdropBalance(id1), id1), ScriptTransfer(admin, airdropBalance(id2), id2), ScriptTransfer(admin, airdropBalance(id3), id3), ScriptTransfer(admin, airdropBalance(id4), id4), ScriptTransfer(admin, airdropBalance(id5), id5), ScriptTransfer(admin, airdropBalance(id6), id6), ScriptTransfer(admin, airdropBalance(id7), id7), ScriptTransfer(admin, airdropBalance(id8), id8), ScriptTransfer(admin, airdropBalance(id9), id9)] | |
252 | 90 | ||
253 | 91 | ||
254 | 92 | @Verifier(tx) | |
255 | 93 | func verify () = { | |
256 | - | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
257 | - | let isValidMMBot = if (isValidOwner) | |
258 | - | then true | |
259 | - | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey) | |
260 | - | let isValidAdmin = if (isValidOwner) | |
261 | - | then true | |
262 | - | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
263 | - | let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
94 | + | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
264 | 95 | then 1 | |
265 | 96 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
266 | 97 | then 1 | |
267 | 98 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
268 | 99 | then 1 | |
269 | - | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3])) | |
270 | - | then 1 | |
271 | - | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4])) | |
272 | - | then 1 | |
273 | 100 | else 0)) >= minSignatures) | |
274 | - | let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0) | |
101 | + | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
102 | + | let isValidAdmin = if (isValidOwner) | |
103 | + | then true | |
104 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
105 | + | let isValidRobot = if (isValidOwner) | |
106 | + | then true | |
107 | + | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
275 | 108 | match tx { | |
276 | 109 | case b: BurnTransaction => | |
277 | 110 | if (if (isValidOwner) | |
111 | + | then !(containsElement(portfolio, b.assetId)) | |
112 | + | else false) | |
278 | 113 | then !(containsElement(ourAssets, b.assetId)) | |
279 | - | else false) | |
280 | - | then !(containsElement(portfolio, b.assetId)) | |
281 | 114 | else false | |
282 | 115 | case l: LeaseCancelTransaction|LeaseTransaction => | |
283 | 116 | isValidOwner | |
284 | 117 | case o: Order => | |
285 | - | if (if (if (if (if ( | |
286 | - | then (o. | |
118 | + | if (if (if (if (if (isValidRobot) | |
119 | + | then !(isDefined(o.matcherFeeAssetId)) | |
287 | 120 | else false) | |
288 | - | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
289 | - | else false) | |
290 | - | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
121 | + | then (o.matcherPublicKey == wexchPublicKey) | |
291 | 122 | else false) | |
292 | 123 | then if (if (if ((o.orderType == Buy)) | |
293 | 124 | then !(containsElement(portfolio, o.assetPair.priceAsset)) | |
294 | 125 | else false) | |
295 | 126 | then true | |
296 | 127 | else if ((o.orderType == Sell)) | |
297 | 128 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
298 | 129 | else false) | |
299 | 130 | then true | |
300 | 131 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
301 | 132 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
302 | 133 | else false | |
303 | 134 | else false) | |
304 | - | then | |
305 | - | | |
306 | - | | |
135 | + | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
136 | + | else false) | |
137 | + | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
307 | 138 | else false | |
308 | - | case t: TransferTransaction => | |
309 | - | if (if (if ( | |
310 | - | then | |
139 | + | case t: MassTransferTransaction|TransferTransaction => | |
140 | + | if (if (if (isValidAdmin) | |
141 | + | then isValidGuarantors | |
311 | 142 | else false) | |
312 | 143 | then !(containsElement(portfolio, t.assetId)) | |
313 | 144 | else false) | |
314 | 145 | then !(containsElement(portfolio, t.feeAssetId)) | |
315 | - | else false) | |
316 | - | then true | |
317 | - | else if (if (if (isValidAdmin) | |
318 | - | then true | |
319 | - | else isValidGuarantors) | |
320 | - | then (addressFromRecipient(t.recipient) == fdapp) | |
321 | - | else false) | |
322 | - | then if ((t.assetId != fmmtAsset)) | |
323 | - | then true | |
324 | - | else (maxAmount >= t.amount) | |
325 | - | else false | |
326 | - | case m: MassTransferTransaction => | |
327 | - | if (if (isValidAdmin) | |
328 | - | then isValidGuarantors | |
329 | - | else false) | |
330 | - | then if ((m.assetId == usdtAsset)) | |
331 | - | then true | |
332 | - | else if ((m.assetId != fmmtAsset)) | |
333 | - | then !(containsElement(portfolio, m.assetId)) | |
334 | - | else false | |
335 | 146 | else false | |
336 | 147 | case _: SetScriptTransaction|DataTransaction => | |
337 | - | if (isValidAdmin) | |
338 | - | then isValidGuarantors | |
339 | - | else false | |
148 | + | isValidAdmin | |
340 | 149 | case _ => | |
341 | 150 | false | |
342 | 151 | } | |
343 | 152 | } | |
344 | 153 |
github/deemru/w8io/6500d08 134.63 ms ◑