tx · 7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ

3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA:  -0.01400000 Waves

2020.12.26 20:53 [2389678] smart account 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA > SELF 0.00000000 Waves

{ "type": 13, "id": "7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ", "fee": 1400000, "feeAssetId": null, "timestamp": 1609005220391, "version": 1, "sender": "3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA", "senderPublicKey": "5gGSWjBNTQGAMZViHK3qbn35JUNmbzqboicpdMuweapK", "proofs": [ "481Wrt8D5etHFq6Q5mYUc9QtzfiHfDNvg5Ld22abVRY525SbgLA8L1kwa5MAupnehT5pz3tWf8Pr4JiTnTBwyegZ", "5FJDucoayoxv3a2f4MDsctyXyuRH2bf9jb7S2kcutRKoTLq7CYzUFuGJLHbwk7xHSWrpVzc76xQiXuGhL2mBvkBB" ], "script": "base64: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ck5hdGl2ZSgxMDUwKQAAAAIFAAAABWZkYXBwAgAAAApoYWxmU3ByZWFkAAAAAAtpbnZlc3RtZW50cwkAAGUAAAACCQAAZQAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAACWZtbXRBc3NldAAAAAhxdWFudGl0eQkAAGQAAAACCQAD8AAAAAIFAAAABWZkYXBwBQAAAAlmbW10QXNzZXQJAAPwAAAAAgUAAAAFZmNvbGQFAAAACWZtbXRBc3NldAkAA/AAAAACBQAAAAVhZG1pbgUAAAAJZm1tdEFzc2V0AAAAAA9sb2dFbnRyeURhdGFLZXkCAAAACGxvZ0VudHJ5AAAAABB0aW1lc3RhbXBEYXRhS2V5AgAAAAl0aW1lc3RhbXAAAAAADHRmZWVzRGF0YUtleQIAAAALdGVhbVBheW91dHMAAAAADXN0YXR1c0RhdGFLZXkCAAAAC3RyYWRlU3RhdHVzAAAAAA52ZXJzaW9uRGF0YUtleQIAAAANc2NyaXB0VmVyc2lvbgEAAAAIdmFsaWRhdGUAAAACAAAACGludFZhbHVlAAAACG1pblZhbHVlAwkAAGYAAAACBQAAAAhtaW5WYWx1ZQUAAAAIaW50VmFsdWUAAAAAAAAAAAAFAAAACGludFZhbHVlAQAAAA52YWx1ZU9yTWluaW11bQAAAAIAAAAIaW50VmFsdWUAAAAIbWluVmFsdWUDCQAAZgAAAAIFAAAACG1pblZhbHVlBQAAAAhpbnRWYWx1ZQUAAAAIbWluVmFsdWUFAAAACGludFZhbHVlAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIAAAAIaW50VmFsdWUAAAAIbWF4VmFsdWUDCQAAZgAAAAIFAAAACGludFZhbHVlBQAAAAhtYXhWYWx1ZQUAAAAIbWF4VmFsdWUFAAAACGludFZhbHVlAQAAAA9pc0Fzc2V0RGlzYWJsZWQAAAABAAAAB2Fzc2V0SWQJAQAAAAEhAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAFYWRtaW4JAAJYAAAAAQUAAAAHYXNzZXRJZAEAAAAPYW55QmFua2luZ0Fzc2V0AAAAAgAAAAZiYXNlSWQAAAAHcXVvdGVJZAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAdtYXJrZXRzBQAAAAZiYXNlSWQGCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAHbWFya2V0cwUAAAAHcXVvdGVJZAEAAAAQaXNNYXJrZXREaXNhYmxlZAAAAAIAAAAGYmFzZUlkAAAAB3F1b3RlSWQDAwkBAAAAD2lzQXNzZXREaXNhYmxlZAAAAAEFAAAABmJhc2VJZAYJAQAAAA9pc0Fzc2V0RGlzYWJsZWQAAAABBQAAAAdxdW90ZUlkBgkAAAAAAAACBQAAAAZiYXNlSWQFAAAAB3F1b3RlSWQBAAAACmFzc2V0SW5kZXgAAAABAAAABnRpY2tlcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAETwAAAAIFAAAADGFzc2V0VGlja2VycwUAAAAGdGlja2VyCQABLAAAAAICAAAAElN1cHBvcnRlZCBhc3NldHM6IAkABLkAAAACBQAAAAxhc3NldFRpY2tlcnMCAAAAAiwgAQAAAAphc3NldEZ1bmRzAAAAAQAAAAdhc3NldElkCQAAZQAAAAIJAABkAAAAAgkAA/AAAAACBQAAAAVmZGFwcAUAAAAHYXNzZXRJZAkAA/AAAAACBQAAAAVmY29sZAUAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAJdXNkdEFzc2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAVhZG1pbgUAAAANcHJvZml0RGF0YUtleQAAAAAAAAAAAAEAAAANZ2V0QXR0YWNobWVudAAAAAEAAAAIcGF5bWVudHMDCQEAAAACIT0AAAACCQABkAAAAAEFAAAACHBheW1lbnRzAAAAAAAAAAABCQAFFAAAAAIBAAAAAAAAAAAAAAAAAAkABRQAAAACCAkAAZEAAAACBQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkCAkAAZEAAAACBQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwAAAAdhZGRyZXNzAAAABmFtb3VudAAAAAdhc3NldElkAwkAAGcAAAACAAAAAAAAAAAABQAAAAZhbW91bnQFAAAAA25pbAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdhZGRyZXNzBQAAAAZhbW91bnQFAAAAB2Fzc2V0SWQFAAAAA25pbAEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABAAAAB2Fzc2V0SWQDCQEAAAAPaXNBc3NldERpc2FibGVkAAAAAQUAAAAHYXNzZXRJZAAAAAAAAAAAAAQAAAAKZmRhcHBGdW5kcwkAA/AAAAACBQAAAAVmZGFwcAUAAAAHYXNzZXRJZAQAAAAKdG90YWxGdW5kcwkAAGQAAAACBQAAAApmZGFwcEZ1bmRzCQAD8AAAAAIFAAAABWZjb2xkBQAAAAdhc3NldElkCQEAAAAIdmFsaWRhdGUAAAACCQAAZQAAAAIJAABrAAAAAwUAAAAKdG90YWxGdW5kcwUAAAAMZmRhcHBQZXJjZW50BQAAAAdwZXJjZW50BQAAAApmZGFwcEZ1bmRzCQAAaQAAAAIFAAAACnRvdGFsRnVuZHMAAAAAAAAAAGQBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAAROAAAAAgUAAAAJb3VyQXNzZXRzBQAAAAlwb3J0Zm9saW8FAAAAB2Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAABFEZWxldGUgYXNzZXQgSUQ6IAkAAlgAAAABBQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAQAAAAAAAAAAAAAAAAAJAAPwAAAAAgUAAAAEdGhpcwUAAAAHYXNzZXRJZAEAAAANdG9GbG9hdFN0cmluZwAAAAIAAAADbnVtAAAAA2RlYwMJAAAAAAAAAgUAAAADbnVtAAAAAAAAAAAAAgAAAAEwAwkAAGYAAAACBQAAAANudW0AAAAAAAAAAAAJAASwAAAAAQkAAMsAAAACCQAAywAAAAIJAAGbAAAAAQkAAaQAAAABCQAAaQAAAAIFAAAAA251bQUAAAADZGVjAQAAAAEuCQAAygAAAAIJAAGbAAAAAQkAAaQAAAABCQAAZAAAAAIJAABqAAAAAgUAAAADbnVtBQAAAANkZWMFAAAAA2RlYwAAAAAAAAAAAQkAAAIAAAABAgAAACFOZWdhdGl2ZSBhbW91bnRzIGFyZSBub3QgYWxsb3dlZCEAAAAFAAAAAWkBAAAACmdldFRlYW1GZWUAAAAAAwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAObW1ib3RQdWJsaWNLZXkHCQAAAgAAAAECAAAANlRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSBhbiBhZG1pbmlzdHJhdG9yIQMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAADNEb24ndCBhdHRhY2ggcGF5bWVudCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAuLi4EAAAACm5ld1BheW91dHMJAABrAAAAAwUAAAALaW52ZXN0bWVudHMFAAAAC3RmZWVQZXJjZW50CQAAZQAAAAIFAAAAB3BlcmNlbnQFAAAAC3RmZWVQZXJjZW50BAAAAApvbGRQYXlvdXRzCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAVmY29sZAUAAAAMdGZlZXNEYXRhS2V5BAAAAAlvdXRBbW91bnQJAQAAAAh2YWxpZGF0ZQAAAAIJAABlAAAAAgUAAAAKbmV3UGF5b3V0cwUAAAAKb2xkUGF5b3V0cwAAAAAAAAAAAAQAAAARbG9nRW50cnlEYXRhVmFsdWUJAAS5AAAAAgkABEwAAAACAgAAACZEZUZpIEZyYW5rbGluIChGTU1UKTogZ2V0VGVhbUZlZSAoKSA9PgkABEwAAAACAgAAAAdhbW91bnQ6CQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAJb3V0QW1vdW50BQAAAAtmbW10RGVjaW1hbAkABEwAAAACAgAAAARGTU1UBQAAAANuaWwCAAAAASADCQAAZwAAAAIAAAAAAAAAAAAFAAAACW91dEFtb3VudAkAAAIAAAABAgAAACpUaGVyZSBhcmUgY3VycmVudGx5IG5vIHBheW1lbnRzIGF2YWlsYWJsZS4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4FAAAACW91dEFtb3VudAUAAAAJZm1tdEFzc2V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAx0ZmVlc0RhdGFLZXkFAAAACm5ld1BheW91dHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPbG9nRW50cnlEYXRhS2V5BQAAABFsb2dFbnRyeURhdGFWYWx1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAAA25pbAAAAAFpAQAAAAtmZWVFeGNoYW5nZQAAAAAEAAAACyR0MDg2NjE4NzExCQEAAAANZ2V0QXR0YWNobWVudAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBAAAAAdhc3NldElkCAUAAAALJHQwODY2MTg3MTEAAAACXzEEAAAAB2RlcG9zaXQIBQAAAAskdDA4NjYxODcxMQAAAAJfMgQAAAAJb2xkUHJvZml0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAVhZG1pbgUAAAANcHJvZml0RGF0YUtleQQAAAAJbWF4QW1vdW50CQAAawAAAAMFAAAACW9sZFByb2ZpdAUAAAAHZGVjaW1hbAUAAAAJZm1tdFByaWNlAwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAObW1ib3RQdWJsaWNLZXkHCQAAAgAAAAECAAAANlRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSBhbiBhZG1pbmlzdHJhdG9yIQMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAJZm1tdEFzc2V0BAAAAAh1c2R0TXVsdAkAAZEAAAACBQAAAAphc3NldE11bHRzCQEAAAAFdmFsdWUAAAABCQAETwAAAAIFAAAACXBvcnRmb2xpbwUAAAAJdXNkdEFzc2V0BAAAAAl1c2R0RnVuZHMJAABpAAAAAgkAAGsAAAADBQAAAAtpbnZlc3RtZW50cwUAAAAJZm1tdFByaWNlBQAAAAdkZWNpbWFsBQAAAAh1c2R0TXVsdAQAAAAKdXNkdEZhY3RvcgkAAGsAAAADBQAAAAl1c2R0RnVuZHMFAAAADXNwcmVhZFBlcmNlbnQFAAAAB3BlcmNlbnQEAAAACmZtbXRGYWN0b3IJAABrAAAAAwUAAAAKdXNkdEZhY3RvcgUAAAAHZGVjaW1hbAUAAAAJZm1tdFByaWNlBAAAAAhpbkFtb3VudAkAAGgAAAACCQAAaQAAAAIJAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIFAAAAB2RlcG9zaXQFAAAACW1heEFtb3VudAUAAAAKZm1tdEZhY3RvcgUAAAAKZm1tdEZhY3RvcgQAAAAMcmVmdW5kQW1vdW50CQEAAAAIdmFsaWRhdGUAAAACCQAAZQAAAAIFAAAAB2RlcG9zaXQFAAAACGluQW1vdW50AAAAAAAAAAAABAAAAAlvdXRBbW91bnQJAABrAAAAAwUAAAAIaW5BbW91bnQFAAAACnVzZHRGYWN0b3IFAAAACmZtbXRGYWN0b3IEAAAACnByb2ZpdE11bHQJAABlAAAAAgkAAGkAAAACBQAAAAlvbGRQcm9maXQFAAAACnVzZHRGYWN0b3IJAABpAAAAAgUAAAAIaW5BbW91bnQFAAAACmZtbXRGYWN0b3IEAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQAEuQAAAAIJAARMAAAAAgIAAAAhRGVGaSBGcmFua2xpbiAoRk1NVCk6IGZlZUV4Y2hhbmdlCQAETAAAAAICAAAACShkZXBvc2l0OgkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACGluQW1vdW50BQAAAAtmbW10RGVjaW1hbAkABEwAAAACAgAAAAhGTU1UKSA9PgkABEwAAAACAgAAAAtvdXQgYW1vdW50OgkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACW91dEFtb3VudAUAAAALdXNkdERlY2ltYWwJAARMAAAAAgIAAAAEVVNEVAkABEwAAAACAgAAAAtuZXcgcHJvZml0OgkABEwAAAACCQABpAAAAAEFAAAACnByb2ZpdE11bHQJAARMAAAAAgIAAAACw5cJAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACBQAAAAp1c2R0RmFjdG9yBQAAAAt1c2R0RGVjaW1hbAkABEwAAAACAgAAAARVU0RUCQAETAAAAAICAAAAAT0JAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACCQAAaAAAAAIFAAAACnByb2ZpdE11bHQFAAAACnVzZHRGYWN0b3IFAAAAC3VzZHREZWNpbWFsCQAETAAAAAICAAAABFVTRFQFAAAAA25pbAIAAAABIAMJAABnAAAAAgAAAAAAAAAAAAUAAAAJb3V0QW1vdW50CQAAAgAAAAEFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluBQAAAAlvdXRBbW91bnQFAAAACXVzZHRBc3NldAkABE0AAAACCQAETQAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluBQAAAAxyZWZ1bmRBbW91bnQFAAAACWZtbXRBc3NldAkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPbG9nRW50cnlEYXRhS2V5BQAAABFsb2dFbnRyeURhdGFWYWx1ZQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEHRpbWVzdGFtcERhdGFLZXkIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAAAgAAAAEJAAS5AAAAAgkABEwAAAACAgAAACtQbGVhc2UgYXR0YWNoIHRoZSBGTU1UIHBheW1lbnQgKG1heCBhbW91bnQ6CQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAJbWF4QW1vdW50BQAAAAtmbW10RGVjaW1hbAkABEwAAAACAgAAAAZGTU1UKS4FAAAAA25pbAIAAAABIAAAAAFpAQAAAA1hdXRvUmViYWxhbmNlAAAAAAMDAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5tbWJvdFB1YmxpY0tleQcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACmd1YXJhbnRvcnMIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQcJAAACAAAAAQIAAABDVGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IGFuIGFkbWluaXN0cmF0b3Igb3IgZ3VhcmFudG9yIQMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAADNEb24ndCBhdHRhY2ggcGF5bWVudCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAuLi4EAAAACmZtbXRBbW91bnQJAABlAAAAAgUAAAALdHJhZGVTdXBwbHkJAAPwAAAAAgUAAAAFZmRhcHAFAAAACWZtbXRBc3NldAQAAAAKeGZlZUFtb3VudAkBAAAADnZhbHVlT3JNYXhpbXVtAAAAAgUAAAAGc1R4RmVlCQAD8AAAAAIFAAAABHRoaXMFAAAACXhmZWVBc3NldAQAAAAJcmVjaXBpZW50BQAAAAVmZGFwcAQAAAAPc2NyaXB0VHJhbnNmZXJzCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAACXJlY2lwaWVudAkBAAAAEXJlYmFsYW5jaW5nQW1vdW50AAAAAQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAAJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAAACQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAlyZWNpcGllbnQJAQAAABFyZWJhbGFuY2luZ0Ftb3VudAAAAAEJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAQkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50CQEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAAAgkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAACXJlY2lwaWVudAkBAAAAEXJlYmFsYW5jaW5nQW1vdW50AAAAAQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAMJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAADCQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAlyZWNpcGllbnQJAQAAABFyZWJhbGFuY2luZ0Ftb3VudAAAAAEJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAAECQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABAkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50CQEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAUJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAACXJlY2lwaWVudAkBAAAAEXJlYmFsYW5jaW5nQW1vdW50AAAAAQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAYJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAAGCQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAlyZWNpcGllbnQJAQAAABFyZWJhbGFuY2luZ0Ftb3VudAAAAAEJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAAHCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABwQAAAARbG9nRW50cnlEYXRhVmFsdWUJAAEsAAAAAgIAAAAuRGVGaSBGcmFua2xpbiAoRk1NVCk6IGF1dG9SZWJhbGFuY2UgKCkgPT4gdHg6IAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkAwkAAAAAAAACCQABkAAAAAEFAAAAD3NjcmlwdFRyYW5zZmVycwAAAAAAAAAAAAkAAAIAAAABAgAAACtUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRyYW5zZmVycyBhdmFpbGFibGUuCQAETQAAAAIJAARNAAAAAgkABE4AAAACCQAETgAAAAIFAAAAD3NjcmlwdFRyYW5zZmVycwkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAJcmVjaXBpZW50BQAAAApmbW10QW1vdW50BQAAAAlmbW10QXNzZXQJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKeGZlZUFtb3VudAUAAAAJeGZlZUFzc2V0CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9sb2dFbnRyeURhdGFLZXkFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAABaQEAAAAQc2V0U2NyaXB0VmVyc2lvbgAAAAADCQEAAAACIT0AAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAADmFkbWluUHVibGljS2V5CQAAAgAAAAECAAAANlRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSBhbiBhZG1pbmlzdHJhdG9yIQMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAADNEb24ndCBhdHRhY2ggcGF5bWVudCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAuLi4EAAAACm5ld1ZlcnNpb24FAAAADXNjcmlwdFZlcnNpb24EAAAACm9sZFZlcnNpb24JAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAADnZlcnNpb25EYXRhS2V5BAAAAAd2ZXJzaW9uCQAEtQAAAAIFAAAACm5ld1ZlcnNpb24CAAAAAV8EAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQAEuQAAAAIJAARMAAAAAgIAAAAsRGVGaSBGcmFua2xpbiAoRk1NVCk6IHNldFNjcmlwdFZlcnNpb24gKCkgPT4JAARMAAAAAgIAAAAIdmVyc2lvbjoJAARMAAAAAgkAASwAAAACCQABkQAAAAIFAAAAB3ZlcnNpb24AAAAAAAAAAAACAAAAATsJAARMAAAAAgIAAAAIdXBkYXRlZDoJAARMAAAAAgkABLkAAAACCQAETAAAAAIJAAEvAAAAAgkAAZEAAAACBQAAAAd2ZXJzaW9uAAAAAAAAAAABAAAAAAAAAAAECQAETAAAAAIJAAEvAAAAAgkAATAAAAACCQABkQAAAAIFAAAAB3ZlcnNpb24AAAAAAAAAAAEAAAAAAAAAAAQAAAAAAAAAAAIJAARMAAAAAgkAATAAAAACCQABkQAAAAIFAAAAB3ZlcnNpb24AAAAAAAAAAAEAAAAAAAAAAAYFAAAAA25pbAIAAAABLQUAAAADbmlsAgAAAAEgAwkAAAAAAAACBQAAAApuZXdWZXJzaW9uBQAAAApvbGRWZXJzaW9uCQAAAgAAAAEJAAEsAAAAAgIAAAA2VGhlIHNjcmlwdCB2ZXJzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZC4gVmVyc2lvbjogBQAAAApvbGRWZXJzaW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADnZlcnNpb25EYXRhS2V5BQAAAApuZXdWZXJzaW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2xvZ0VudHJ5RGF0YUtleQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEHRpbWVzdGFtcERhdGFLZXkIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAANuaWwAAAABaQEAAAANYWlyZHJvcFdhc2hlcgAAAAoAAAADaWQwAAAAA2lkMQAAAANpZDIAAAADaWQzAAAAA2lkNAAAAANpZDUAAAADaWQ2AAAAA2lkNwAAAANpZDgAAAADaWQ5AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA5hZG1pblB1YmxpY0tleQkAAAIAAAABAgAAADZUaGlzIGFjdGlvbiBjYW4gb25seSBiZSBwZXJmb3JtZWQgYnkgYW4gYWRtaW5pc3RyYXRvciEDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAzRG9uJ3QgYXR0YWNoIHBheW1lbnQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gLi4uBAAAAA9zY3JpcHRUcmFuc2ZlcnMJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDAFAAAAA2lkMAkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkMQUAAAADaWQxCQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQyBQAAAANpZDIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDMFAAAAA2lkMwkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkNAUAAAADaWQ0CQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQ1BQAAAANpZDUJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDYFAAAAA2lkNgkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFYWRtaW4JAQAAAA5haXJkcm9wQmFsYW5jZQAAAAEFAAAAA2lkNwUAAAADaWQ3CQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAVhZG1pbgkBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQUAAAADaWQ4BQAAAANpZDgJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWFkbWluCQEAAAAOYWlyZHJvcEJhbGFuY2UAAAABBQAAAANpZDkFAAAAA2lkOQQAAAARbG9nRW50cnlEYXRhVmFsdWUJAAEsAAAAAgIAAAAuRGVGaSBGcmFua2xpbiAoRk1NVCk6IGFpcmRyb3BXYXNoZXIgKCkgPT4gdHg6IAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkAwkAAAAAAAACCQABkAAAAAEFAAAAD3NjcmlwdFRyYW5zZmVycwAAAAAAAAAAAAkAAAIAAAABAgAAACtUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRyYW5zZmVycyBhdmFpbGFibGUuCQAETQAAAAIJAARNAAAAAgUAAAAPc2NyaXB0VHJhbnNmZXJzCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9sb2dFbnRyeURhdGFLZXkFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAxpc1ZhbGlkT3duZXIJAAnGAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAxpc1ZhbGlkTU1Cb3QDBQAAAAxpc1ZhbGlkT3duZXIGCQAJxgAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAObW1ib3RQdWJsaWNLZXkEAAAADGlzVmFsaWRBZG1pbgMFAAAADGlzVmFsaWRPd25lcgYJAAnGAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAA5hZG1pblB1YmxpY0tleQQAAAARaXNWYWxpZEd1YXJhbnRvcnMJAABnAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkACcYAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAGRAAAAAgUAAAAKZ3VhcmFudG9ycwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAMJAAnGAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAACCQABkQAAAAIFAAAACmd1YXJhbnRvcnMAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAJxgAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAZEAAAACBQAAAApndWFyYW50b3JzAAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkACcYAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAQJAAGRAAAAAgUAAAAKZ3VhcmFudG9ycwAAAAAAAAAAAwAAAAAAAAAAAQAAAAAAAAAAAAMJAAnGAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAFCQABkQAAAAIFAAAACmd1YXJhbnRvcnMAAAAAAAAAAAQAAAAAAAAAAAEAAAAAAAAAAAAFAAAADW1pblNpZ25hdHVyZXMEAAAACW1heEFtb3VudAkBAAAACHZhbGlkYXRlAAAAAgkAAGUAAAACBQAAAAt0cmFkZVN1cHBseQkAA/AAAAACBQAAAAVmZGFwcAUAAAAJZm1tdEFzc2V0AAAAAAAAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPQnVyblRyYW5zYWN0aW9uBAAAAAFiBQAAAAckbWF0Y2gwAwMFAAAADGlzVmFsaWRPd25lcgkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAUAAAABYgAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABYgAAAAdhc3NldElkBwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFkxlYXNlQ2FuY2VsVHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAEExlYXNlVHJhbnNhY3Rpb24EAAAAAWwFAAAAByRtYXRjaDAFAAAADGlzVmFsaWRPd25lcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFT3JkZXIEAAAAAW8FAAAAByRtYXRjaDADAwMDAwUAAAAMaXNWYWxpZE1NQm90CQAAAAAAAAIIBQAAAAFvAAAAEG1hdGNoZXJQdWJsaWNLZXkFAAAADHdhdmVzTWF0Y2hlcgcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwMDAwkAAAAAAAACCAUAAAABbwAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQHBgMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAARTZWxsCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHBgMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0CQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHBwMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkBgkAAAAAAAACCAUAAAABbwAAABFtYXRjaGVyRmVlQXNzZXRJZAgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAABdAUAAAAHJG1hdGNoMAMDAwMFAAAADGlzVmFsaWRPd25lcgkBAAAAAiE9AAAAAggFAAAAAXQAAAAHYXNzZXRJZAUAAAAJZm1tdEFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwYDAwMFAAAADGlzVmFsaWRBZG1pbgYFAAAAEWlzVmFsaWRHdWFyYW50b3JzCQAAAAAAAAIJAAQkAAAAAQgFAAAAAXQAAAAJcmVjaXBpZW50BQAAAAVmZGFwcAcDCQEAAAACIT0AAAACCAUAAAABdAAAAAdhc3NldElkBQAAAAlmbW10QXNzZXQGCQAAZwAAAAIFAAAACW1heEFtb3VudAgFAAAAAXQAAAAGYW1vdW50BwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXTWFzc1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAW0FAAAAByRtYXRjaDADAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcDCQAAAAAAAAIIBQAAAAFtAAAAB2Fzc2V0SWQFAAAACXVzZHRBc3NldAYDCQEAAAACIT0AAAACCAUAAAABbQAAAAdhc3NldElkBQAAAAlmbW10QXNzZXQJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgFAAAAAW0AAAAHYXNzZXRJZAcHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAD0RhdGFUcmFuc2FjdGlvbgMFAAAADGlzVmFsaWRBZG1pbgUAAAARaXNWYWxpZEd1YXJhbnRvcnMHByRjRUQ=", "chainId": 87, "height": 2389678, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5g8uVUu6vdEQxyiqgRACyw3Zx6yVVEkuy9iLXxcRxNAZ Next: H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "8.00_20201224"
4+let scriptVersion = "8.01_20201226"
55
66 let percent = 100000
77
1111
1212 let fdappPercent = 30000
1313
14-let fmmtDecimals = 100000
14+let fmmtDecimal = 100000
1515
16-let usdtDecimals = 1000000
16+let usdtDecimal = 1000000
1717
18-let fmmtSharePrice = fraction((10 * usdtDecimals), decimal, fmmtDecimals)
18+let sTxFee = 500000
19+
20+let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal)
1921
2022 let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2123
4143
4244 let ourAssets = [fmmtAsset, xfeeAsset]
4345
44-let assetMults = [14, 2, 14, 14, 14, 14, 14, 14, 1]
46+let assetMults = [14, 2, 14, 14, 14, 14, 14, 14]
4547
4648 let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"]
4749
48-let assetDecimals = [usdtDecimals, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
50+let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
4951
5052 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5153
5658 let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
5759
5860 let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
61+
62+let testMode = getBooleanValue(fdapp, "testMode")
5963
6064 let tradeSupply = getIntegerValue(admin, supplyDataKey)
6165
103107 else (baseId == quoteId)
104108
105109
106-func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), makeString(["The ", ticker, " asset is not supported!"], "\""))
110+func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", ")))
107111
108112
109113 func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset))
155159 let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent))
156160 let oldPayouts = getIntegerValue(fcold, tfeesDataKey)
157161 let outAmount = validate((newPayouts - oldPayouts), 0)
158- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimals), "FMMT"], " ")
162+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ")
159163 if ((0 >= outAmount))
160164 then throw("There are currently no payments available.")
161165 else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
165169
166170 @Callable(i)
167171 func feeExchange () = {
168- let $t083938443 = getAttachment(i.payments)
169- let assetId = $t083938443._1
170- let deposit = $t083938443._2
172+ let $t086618711 = getAttachment(i.payments)
173+ let assetId = $t086618711._1
174+ let deposit = $t086618711._2
171175 let oldProfit = getIntegerValue(admin, profitDataKey)
172- let maxAmount = fraction(oldProfit, decimal, fmmtSharePrice)
176+ let maxAmount = fraction(oldProfit, decimal, fmmtPrice)
173177 if (if ((i.callerPublicKey != adminPublicKey))
174178 then (i.callerPublicKey != mmbotPublicKey)
175179 else false)
177181 else if ((assetId == fmmtAsset))
178182 then {
179183 let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))]
180- let usdtFunds = (fraction(investments, fmmtSharePrice, decimal) / usdtMult)
184+ let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult)
181185 let usdtFactor = fraction(usdtFunds, spreadPercent, percent)
182- let fmmtFactor = fraction(usdtFactor, decimal, fmmtSharePrice)
186+ let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice)
183187 let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor)
184188 let refundAmount = validate((deposit - inAmount), 0)
185- let outAmount = fraction(inAmount, fmmtSharePrice, decimal)
189+ let outAmount = fraction(inAmount, usdtFactor, fmmtFactor)
186190 let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor))
187- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimals), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimals), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimals), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimals), "USDT"], " ")
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"], " ")
188192 if ((0 >= outAmount))
189193 then throw(logEntryDataValue)
190194 else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
191195 }
192- else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimals), "FMMT)."], " "))
196+ else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " "))
193197 }
194198
195199
204208 else if ((size(i.payments) > 0))
205209 then throw("Don't attach payment when calling this function ...")
206210 else {
207- let fmmtAmount = if (isAssetDisabled(fmmtAsset))
208- then 0
209- else (tradeSupply - assetBalance(fdapp, fmmtAsset))
210- let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset))
211+ let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset))
212+ let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset))
211213 let recipient = fdapp
212214 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]))
213215 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "8.00_20201224"
4+let scriptVersion = "8.01_20201226"
55
66 let percent = 100000
77
88 let decimal = 100000000
99
1010 let tfeePercent = 10000
1111
1212 let fdappPercent = 30000
1313
14-let fmmtDecimals = 100000
14+let fmmtDecimal = 100000
1515
16-let usdtDecimals = 1000000
16+let usdtDecimal = 1000000
1717
18-let fmmtSharePrice = fraction((10 * usdtDecimals), decimal, fmmtDecimals)
18+let sTxFee = 500000
19+
20+let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal)
1921
2022 let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2123
2224 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2325
2426 let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
2527
2628 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'')
2729
2830 let actualSize = value(indexOf(guarantors, base58''))
2931
3032 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3133
3234 let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
3335
3436 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3537
3638 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3739
3840 let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ']
3941
4042 let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
4143
4244 let ourAssets = [fmmtAsset, xfeeAsset]
4345
44-let assetMults = [14, 2, 14, 14, 14, 14, 14, 14, 1]
46+let assetMults = [14, 2, 14, 14, 14, 14, 14, 14]
4547
4648 let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"]
4749
48-let assetDecimals = [usdtDecimals, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
50+let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
4951
5052 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5153
5254 let fdapp = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
5355
5456 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
5557
5658 let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
5759
5860 let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
61+
62+let testMode = getBooleanValue(fdapp, "testMode")
5963
6064 let tradeSupply = getIntegerValue(admin, supplyDataKey)
6165
6266 let spreadPercent = getIntegerValue(fdapp, "halfSpread")
6367
6468 let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset))
6569
6670 let logEntryDataKey = "logEntry"
6771
6872 let timestampDataKey = "timestamp"
6973
7074 let tfeesDataKey = "teamPayouts"
7175
7276 let statusDataKey = "tradeStatus"
7377
7478 let versionDataKey = "scriptVersion"
7579
7680 func validate (intValue,minValue) = if ((minValue > intValue))
7781 then 0
7882 else intValue
7983
8084
8185 func valueOrMinimum (intValue,minValue) = if ((minValue > intValue))
8286 then minValue
8387 else intValue
8488
8589
8690 func valueOrMaximum (intValue,maxValue) = if ((intValue > maxValue))
8791 then maxValue
8892 else intValue
8993
9094
9195 func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId)))
9296
9397
9498 func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId))
9599 then true
96100 else containsElement(markets, quoteId)
97101
98102
99103 func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId))
100104 then true
101105 else isAssetDisabled(quoteId))
102106 then true
103107 else (baseId == quoteId)
104108
105109
106-func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), makeString(["The ", ticker, " asset is not supported!"], "\""))
110+func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", ")))
107111
108112
109113 func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset))
110114 then getIntegerValue(admin, profitDataKey)
111115 else 0))
112116
113117
114118 func getAttachment (payments) = if ((size(payments) != 1))
115119 then $Tuple2(base58'', 0)
116120 else $Tuple2(payments[0].assetId, payments[0].amount)
117121
118122
119123 func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
120124 then nil
121125 else [ScriptTransfer(address, amount, assetId)]
122126
123127
124128 func rebalancingAmount (assetId) = if (isAssetDisabled(assetId))
125129 then 0
126130 else {
127131 let fdappFunds = assetBalance(fdapp, assetId)
128132 let totalFunds = (fdappFunds + assetBalance(fcold, assetId))
129133 validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100))
130134 }
131135
132136
133137 func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId))
134138 then throw(("Delete asset ID: " + toBase58String(assetId)))
135139 else if ((assetId == base58''))
136140 then 0
137141 else assetBalance(this, assetId)
138142
139143
140144 func toFloatString (num,dec) = if ((num == 0))
141145 then "0"
142146 else if ((num > 0))
143147 then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1)))
144148 else throw("Negative amounts are not allowed!")
145149
146150
147151 @Callable(i)
148152 func getTeamFee () = if (if ((i.callerPublicKey != adminPublicKey))
149153 then (i.callerPublicKey != mmbotPublicKey)
150154 else false)
151155 then throw("This action can only be performed by an administrator!")
152156 else if ((size(i.payments) > 0))
153157 then throw("Don't attach payment when calling this function ...")
154158 else {
155159 let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent))
156160 let oldPayouts = getIntegerValue(fcold, tfeesDataKey)
157161 let outAmount = validate((newPayouts - oldPayouts), 0)
158- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimals), "FMMT"], " ")
162+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ")
159163 if ((0 >= outAmount))
160164 then throw("There are currently no payments available.")
161165 else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
162166 }
163167
164168
165169
166170 @Callable(i)
167171 func feeExchange () = {
168- let $t083938443 = getAttachment(i.payments)
169- let assetId = $t083938443._1
170- let deposit = $t083938443._2
172+ let $t086618711 = getAttachment(i.payments)
173+ let assetId = $t086618711._1
174+ let deposit = $t086618711._2
171175 let oldProfit = getIntegerValue(admin, profitDataKey)
172- let maxAmount = fraction(oldProfit, decimal, fmmtSharePrice)
176+ let maxAmount = fraction(oldProfit, decimal, fmmtPrice)
173177 if (if ((i.callerPublicKey != adminPublicKey))
174178 then (i.callerPublicKey != mmbotPublicKey)
175179 else false)
176180 then throw("This action can only be performed by an administrator!")
177181 else if ((assetId == fmmtAsset))
178182 then {
179183 let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))]
180- let usdtFunds = (fraction(investments, fmmtSharePrice, decimal) / usdtMult)
184+ let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult)
181185 let usdtFactor = fraction(usdtFunds, spreadPercent, percent)
182- let fmmtFactor = fraction(usdtFactor, decimal, fmmtSharePrice)
186+ let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice)
183187 let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor)
184188 let refundAmount = validate((deposit - inAmount), 0)
185- let outAmount = fraction(inAmount, fmmtSharePrice, decimal)
189+ let outAmount = fraction(inAmount, usdtFactor, fmmtFactor)
186190 let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor))
187- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimals), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimals), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimals), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimals), "USDT"], " ")
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"], " ")
188192 if ((0 >= outAmount))
189193 then throw(logEntryDataValue)
190194 else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
191195 }
192- else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimals), "FMMT)."], " "))
196+ else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " "))
193197 }
194198
195199
196200
197201 @Callable(i)
198202 func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey))
199203 then (i.callerPublicKey != mmbotPublicKey)
200204 else false)
201205 then !(containsElement(guarantors, i.callerPublicKey))
202206 else false)
203207 then throw("This action can only be performed by an administrator or guarantor!")
204208 else if ((size(i.payments) > 0))
205209 then throw("Don't attach payment when calling this function ...")
206210 else {
207- let fmmtAmount = if (isAssetDisabled(fmmtAsset))
208- then 0
209- else (tradeSupply - assetBalance(fdapp, fmmtAsset))
210- let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset))
211+ let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset))
212+ let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset))
211213 let recipient = fdapp
212214 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]))
213215 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
214216 if ((size(scriptTransfers) == 0))
215217 then throw("There are currently no transfers available.")
216218 else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
217219 }
218220
219221
220222
221223 @Callable(i)
222224 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
223225 then throw("This action can only be performed by an administrator!")
224226 else if ((size(i.payments) > 0))
225227 then throw("Don't attach payment when calling this function ...")
226228 else {
227229 let newVersion = scriptVersion
228230 let oldVersion = getStringValue(this, versionDataKey)
229231 let version = split(newVersion, "_")
230232 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)], "-")], " ")
231233 if ((newVersion == oldVersion))
232234 then throw(("The script version has already been updated. Version: " + oldVersion))
233235 else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
234236 }
235237
236238
237239
238240 @Callable(i)
239241 func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey))
240242 then throw("This action can only be performed by an administrator!")
241243 else if ((size(i.payments) > 0))
242244 then throw("Don't attach payment when calling this function ...")
243245 else {
244246 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))
245247 let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId))
246248 if ((size(scriptTransfers) == 0))
247249 then throw("There are currently no transfers available.")
248250 else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
249251 }
250252
251253
252254 @Verifier(tx)
253255 func verify () = {
254256 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
255257 let isValidMMBot = if (isValidOwner)
256258 then true
257259 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey)
258260 let isValidAdmin = if (isValidOwner)
259261 then true
260262 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
261263 let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
262264 then 1
263265 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
264266 then 1
265267 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
266268 then 1
267269 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
268270 then 1
269271 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
270272 then 1
271273 else 0)) >= minSignatures)
272274 let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0)
273275 match tx {
274276 case b: BurnTransaction =>
275277 if (if (isValidOwner)
276278 then !(containsElement(ourAssets, b.assetId))
277279 else false)
278280 then !(containsElement(portfolio, b.assetId))
279281 else false
280282 case l: LeaseCancelTransaction|LeaseTransaction =>
281283 isValidOwner
282284 case o: Order =>
283285 if (if (if (if (if (isValidMMBot)
284286 then (o.matcherPublicKey == wavesMatcher)
285287 else false)
286288 then !(containsElement(ourAssets, o.assetPair.priceAsset))
287289 else false)
288290 then !(containsElement(ourAssets, o.assetPair.amountAsset))
289291 else false)
290292 then if (if (if ((o.orderType == Buy))
291293 then !(containsElement(portfolio, o.assetPair.priceAsset))
292294 else false)
293295 then true
294296 else if ((o.orderType == Sell))
295297 then !(containsElement(portfolio, o.assetPair.amountAsset))
296298 else false)
297299 then true
298300 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
299301 then !(containsElement(portfolio, o.assetPair.amountAsset))
300302 else false
301303 else false)
302304 then if (!(isDefined(o.matcherFeeAssetId)))
303305 then true
304306 else (o.matcherFeeAssetId == o.assetPair.priceAsset)
305307 else false
306308 case t: TransferTransaction =>
307309 if (if (if (if (isValidOwner)
308310 then (t.assetId != fmmtAsset)
309311 else false)
310312 then !(containsElement(portfolio, t.assetId))
311313 else false)
312314 then !(containsElement(portfolio, t.feeAssetId))
313315 else false)
314316 then true
315317 else if (if (if (isValidAdmin)
316318 then true
317319 else isValidGuarantors)
318320 then (addressFromRecipient(t.recipient) == fdapp)
319321 else false)
320322 then if ((t.assetId != fmmtAsset))
321323 then true
322324 else (maxAmount >= t.amount)
323325 else false
324326 case m: MassTransferTransaction =>
325327 if (if (isValidAdmin)
326328 then isValidGuarantors
327329 else false)
328330 then if ((m.assetId == usdtAsset))
329331 then true
330332 else if ((m.assetId != fmmtAsset))
331333 then !(containsElement(portfolio, m.assetId))
332334 else false
333335 else false
334336 case _: SetScriptTransaction|DataTransaction =>
335337 if (isValidAdmin)
336338 then isValidGuarantors
337339 else false
338340 case _ =>
339341 false
340342 }
341343 }
342344

github/deemru/w8io/3ef1775 
73.51 ms