tx · Ebwf43j6xdgRqQhe7DHWynKN52YbqZKLNUeFFiSa2bhL

3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL:  -0.01400000 Waves

2020.11.19 18:33 [2336177] smart account 3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL > SELF 0.00000000 Waves

{ "type": 13, "id": "Ebwf43j6xdgRqQhe7DHWynKN52YbqZKLNUeFFiSa2bhL", "fee": 1400000, "feeAssetId": null, "timestamp": 1605799122122, "version": 2, "chainId": 87, "sender": "3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL", "senderPublicKey": "Df9CNxLc26KjvgeE9TYkcT1ooBayf5PUfxNdgmFzD2WK", "proofs": [ "4nv7JAxfwP9LiYVuG1BKxjaGQ8weyxPJfY2HPRbzi2aC899gr4umRpipGWLSkASRy5jC4haD5LnnppbP2ysHD8wh", "PsmvXESmrSPK4a5oxcwYUJjvkdCjJMnwwRH3yA7tZLiRcWeoFAaHNmJmgsgd2sdjp3R3nKCF1LNLT6pzf62kuFZ" ], "script": "base64:AAIEAAAAAAAAACMIAhIFCgMECAgSBAoCCAgSABIAEgwKCgICAgICAgICAgISAAAAADMAAAAADXNjcmlwdFZlcnNpb24CAAAAFHY2LjA2LWZpbmFsXzIwMjAxMTE5AAAAAAdwZXJjZW50AAAAAAAAAYagAAAAAAdkZWNpbWFsAAAAAAAF9eEAAAAAAAV0eEZlZQAAAAAAAAehIAAAAAAKZmVlUGVyY2VudAAAAAAAAAAAMgAAAAAMbGVhc2VQZXJjZW50AAAAAAAAAB9AAAAAAAxmZGFwcFBlcmNlbnQAAAAAAAAATiAAAAAADXNwcmVhZFBlcmNlbnQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAACmhhbGZTcHJlYWQAAAAADmFkbWluUHVibGljS2V5AQAAACD/zQv9xtp+IwicmSq/7YB3qzF8dYREKcB8rX1b2hNXAwAAAAAObW1ib3RQdWJsaWNLZXkBAAAAIEqgkw+zGUn3ol5We69ddjVnvmBgACO3KOUi2aj4AewvAAAAAA53eGNoZ1B1YmxpY0tleQEAAAAggAq2ugzeDF6skG1TO9Xj9NziJC/76c4DtrpDnL/Ve24AAAAACmd1YXJhbnRvcnMJAARNAAAAAgkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHAAAAAIFAAAABHRoaXMCAAAACmd1YXJhbnRvcjEBAAAAAAkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHAAAAAIFAAAABHRoaXMCAAAACmd1YXJhbnRvcjIBAAAAAAkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHAAAAAIFAAAABHRoaXMCAAAACmd1YXJhbnRvcjMBAAAAAAkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHAAAAAIFAAAABHRoaXMCAAAACmd1YXJhbnRvcjQBAAAAAAkABEwAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHAAAAAIFAAAABHRoaXMCAAAACmd1YXJhbnRvcjUBAAAAAAUAAAADbmlsAQAAAAAAAAAACmFjdHVhbFNpemUJAQAAAAV2YWx1ZQAAAAEJAARPAAAAAgUAAAAKZ3VhcmFudG9ycwEAAAAAAAAAAA1taW5TaWduYXR1cmVzCQAAZAAAAAIJAABpAAAAAgUAAAAKYWN0dWFsU2l6ZQAAAAAAAAAAAgkAAGoAAAACBQAAAAphY3R1YWxTaXplAAAAAAAAAAACAAAAAAhidGNBc3NldAEAAAAgbPpq/8XtqowLf7Uqk9KiDC+Cgtt0egSMU/v9Ex9zoP8AAAAACGV0aEFzc2V0AQAAACAuIMP26oqfiVG7v+iIERM27H7YwkIDcmUNWM1zJkJlggAAAAAJdXNkdEFzc2V0AQAAACAelAcTUnahJZX9yGGogl8Qf986Tym7/JpGP1r9Nk+fkQAAAAAJZm1tdEFzc2V0AQAAACBmK/HcPEw2p7k6qPr7NUPcTbgHhadTdmU/dV6M63849AAAAAAJeGZlZUFzc2V0AQAAACA+2qmjbn4AEfAHjAE9xd4ujUcxO50YQTjeLDrmHq62NwAAAAAJcG9ydGZvbGlvCQAETQAAAAIJAARMAAAAAgUAAAAJdXNkdEFzc2V0CQAETAAAAAIFAAAACGJ0Y0Fzc2V0CQAETAAAAAIFAAAABHVuaXQJAARMAAAAAgUAAAAIZXRoQXNzZXQJAARMAAAAAgEAAAAgDrECagw+n0f35EaU5062t7xDfH5ladDpGJsi5gny6M4JAARMAAAAAgEAAAAg9h42QtOX3fJaWBUg7iwP2i1GBoqANpKuVYlZnrDFLKEJAARMAAAAAgEAAAAglVMgFzLH9/gxbVKojbVZ08/r8nPtlHFX5Z0m586HauAJAARMAAAAAgEAAAAgQxj0G3VSMI+7+iJkvwQoTrekocmcbhiCndEGv8vAJAIJAARMAAAAAgEAAAAgoVJa1UnWcbrDrx+GyZJ/6g+KWhwfmKQrcwaOzJr+1WcFAAAAA25pbAUAAAAJZm1tdEFzc2V0AAAAAAphc3NldE11bHRzCQAETAAAAAIAAAAAAAAAABAJAARMAAAAAgAAAAAAAAAAAgkABEwAAAACAAAAAAAAAAAQCQAETAAAAAIAAAAAAAAAABAJAARMAAAAAgAAAAAAAAAAEAkABEwAAAACAAAAAAAAAAAQCQAETAAAAAIAAAAAAAAAABAJAARMAAAAAgAAAAAAAAAAEAkABEwAAAACAAAAAAAAAAAQCQAETAAAAAIAAAAAAAAAAAEFAAAAA25pbAAAAAANYXNzZXREZWNpbWFscwkABEwAAAACAAAAAAAAD0JACQAETAAAAAIFAAAAB2RlY2ltYWwJAARMAAAAAgUAAAAHZGVjaW1hbAkABEwAAAACBQAAAAdkZWNpbWFsCQAETAAAAAIFAAAAB2RlY2ltYWwJAARMAAAAAgUAAAAHZGVjaW1hbAkABEwAAAACBQAAAAdkZWNpbWFsCQAETAAAAAIFAAAAB2RlY2ltYWwJAARMAAAAAgUAAAAHZGVjaW1hbAkABEwAAAACAAAAAAAAAYagBQAAAANuaWwAAAAADGFzc2V0VGlja2VycwkABEwAAAACAgAAAARVU0RUCQAETAAAAAICAAAAA0JUQwkABEwAAAACAgAAAAVXQVZFUwkABEwAAAACAgAAAANFVEgJAARMAAAAAgIAAAADQkNICQAETAAAAAICAAAAA0xUQwkABEwAAAACAgAAAAREQVNICQAETAAAAAICAAAAA1hNUgkABEwAAAACAgAAAANaRUMJAARMAAAAAgIAAAAERk1NVAUAAAADbmlsAAAAAAVmc2FsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVzH+TcJTZYdZOVRWRMzZ9v4BZeuaJV8zCQAAAAAFZmRhcHAJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVeUGM4qgYZsQxeQti8+oFzAKUNnZKGyBg0AAAAABWZjb2xkCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXfrQO6junAFCxuOluw3d6H+swlUUGkddsAAAAAAVhZG1pbgkBAAAAB0FkZHJlc3MAAAABAQAAABoBV8rwUxidz54gYuHT1Vqo28voD3/QB9rENQAAAAAFZnRlYW0JAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVcQuxlHOiTpd3q4b4Qfpy/dkXxJLp2SbpcAAAAACnNhbGVTdXBwbHkJAABoAAAAAgAAAAAAAAAnEAAAAAAAAAGGoAAAAAAKY2lyY1N1cHBseQkAAGUAAAACCQAAZQAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAACWZtbXRBc3NldAAAAAhxdWFudGl0eQkAAGQAAAACCQAD8AAAAAIFAAAABHRoaXMFAAAACWZtbXRBc3NldAkAA/AAAAACBQAAAAVmY29sZAUAAAAJZm1tdEFzc2V0BQAAAApzYWxlU3VwcGx5AAAAAApmdGVhbUZ1bmRzCQAD8AAAAAIFAAAABWZ0ZWFtBQAAAAlmbW10QXNzZXQAAAAAC3RyYWRlU3VwcGx5CQABlgAAAAEJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACCQAAZQAAAAIFAAAACmNpcmNTdXBwbHkFAAAACmZ0ZWFtRnVuZHMFAAAAA25pbAAAAAAPbG9nRW50cnlEYXRhS2V5AgAAAAhsb2dFbnRyeQAAAAAQdGltZXN0YW1wRGF0YUtleQIAAAAJdGltZXN0YW1wAAAAAA52ZXJzaW9uRGF0YUtleQIAAAANc2NyaXB0VmVyc2lvbgEAAAAIdmFsaWRhdGUAAAABAAAACHBvc1ZhbHVlCQABlgAAAAEJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACBQAAAAhwb3NWYWx1ZQUAAAADbmlsAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIAAAAIaW50VmFsdWUAAAAIbWF4VmFsdWUJAAGXAAAAAQkABEwAAAACBQAAAAhpbnRWYWx1ZQkABEwAAAACBQAAAAhtYXhWYWx1ZQUAAAADbmlsAQAAAAl0b0RhdGFLZXkAAAABAAAAB2Fzc2V0SWQJAAJYAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgUAAAAHYXNzZXRJZAEAAAAEE6vZMwEAAAAPaXNBc3NldERpc2FibGVkAAAAAQAAAAdhc3NldElkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABWFkbWluCQEAAAAJdG9EYXRhS2V5AAAAAQUAAAAHYXNzZXRJZAcBAAAADXRvRmxvYXRTdHJpbmcAAAACAAAAA251bQAAAANkZWMDCQAAAAAAAAIFAAAAA251bQAAAAAAAAAAAAIAAAABMAMJAABmAAAAAgUAAAADbnVtAAAAAAAAAAAACQAEsAAAAAEJAADLAAAAAgkAAMsAAAACCQABmwAAAAEJAAGkAAAAAQkAAGkAAAACBQAAAANudW0FAAAAA2RlYwEAAAABLgkAAMoAAAACCQABmwAAAAEJAAGkAAAAAQkAAGQAAAACCQAAagAAAAIFAAAAA251bQUAAAADZGVjBQAAAANkZWMAAAAAAAAAAAEJAAACAAAAAQIAAAAhTmVnYXRpdmUgYW1vdW50cyBhcmUgbm90IGFsbG93ZWQhAQAAAApkaWZmZXJlbmNlAAAAAgAAAApmZGFwcEZ1bmRzAAAACmZjb2xkRnVuZHMEAAAABXRvdGFsCQAAZAAAAAIFAAAACmZkYXBwRnVuZHMFAAAACmZjb2xkRnVuZHMEAAAABmFtb3VudAkAAGUAAAACBQAAAApmZGFwcEZ1bmRzCQAAawAAAAMFAAAABXRvdGFsBQAAAAxmZGFwcFBlcmNlbnQFAAAAB3BlcmNlbnQDCQAAZgAAAAIJAABpAAAAAgUAAAAFdG90YWwAAAAAAAAAAGQFAAAABmFtb3VudAAAAAAAAAAAAAUAAAAGYW1vdW50AQAAABFyZWJhbGFuY2luZ0Ftb3VudAAAAAEAAAAHYXNzZXRJZAkBAAAACmRpZmZlcmVuY2UAAAACCQAD8AAAAAIFAAAABHRoaXMFAAAAB2Fzc2V0SWQJAAPwAAAAAgUAAAAFZmNvbGQFAAAAB2Fzc2V0SWQBAAAADmFpcmRyb3BCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwUAAAAHYXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAEURlbGV0ZSBhc3NldCBJRDogCQACWAAAAAEFAAAAB2Fzc2V0SWQDCQAAAAAAAAIFAAAAB2Fzc2V0SWQBAAAAAAAAAAAAAAAAAAkAA/AAAAACBQAAAAR0aGlzBQAAAAdhc3NldElkAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMAAAAHYWRkcmVzcwAAAAZhbW91bnQAAAAHYXNzZXRJZAMJAABnAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50BQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHYWRkcmVzcwUAAAAGYW1vdW50BQAAAAdhc3NldElkBQAAAANuaWwBAAAAEGlzTWFya2V0RGlzYWJsZWQAAAACAAAABmJhc2VJZAAAAAdxdW90ZUlkAwMJAQAAAAIhPQAAAAIFAAAABmJhc2VJZAUAAAAJZm1tdEFzc2V0CQEAAAAPaXNBc3NldERpc2FibGVkAAAAAQUAAAAGYmFzZUlkBwYDCQEAAAACIT0AAAACBQAAAAdxdW90ZUlkBQAAAAlmbW10QXNzZXQJAQAAAA9pc0Fzc2V0RGlzYWJsZWQAAAABBQAAAAdxdW90ZUlkBwEAAAAKYXNzZXRJbmRleAAAAAEAAAAGdGlja2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAARPAAAAAgUAAAAMYXNzZXRUaWNrZXJzBQAAAAZ0aWNrZXIJAAS5AAAAAgkABEwAAAACAgAAAARUaGUgCQAETAAAAAIFAAAABnRpY2tlcgkABEwAAAACAgAAABggYXNzZXQgaXMgbm90IHN1cHBvcnRlZCEFAAAAA25pbAIAAAABIgEAAAAKYXNzZXRGdW5kcwAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDADCQAAAAAAAAIFAAAAAmlkBQAAAAlmbW10QXNzZXQFAAAAC3RyYWRlU3VwcGx5CQAAZAAAAAIJAAPwAAAAAgUAAAAEdGhpcwUAAAACaWQJAAPwAAAAAgUAAAAFZmNvbGQFAAAAAmlkCQAAZAAAAAIICQAD7wAAAAEFAAAABHRoaXMAAAAHcmVndWxhcggJAAPvAAAAAQUAAAAFZmNvbGQAAAAHcmVndWxhcgEAAAANZ2V0QXR0YWNobWVudAAAAAEAAAAIcGF5bWVudHMDCQEAAAACIT0AAAACCQABkAAAAAEFAAAACHBheW1lbnRzAAAAAAAAAAABCQAFFAAAAAIAAAAAAAAAAAABAAAAAAkABRQAAAACCAkAAZEAAAACBQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIFAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQBAAAADm1heFRyYWRlQW1vdW50AAAAAgAAAAt4QXNzZXRGdW5kcwAAAAptYXJrZXRNdWx0CQAAawAAAAMFAAAAC3hBc3NldEZ1bmRzBQAAAA1zcHJlYWRQZXJjZW50CQAAaAAAAAIFAAAAB3BlcmNlbnQFAAAACm1hcmtldE11bHQBAAAAEGF2YWlsYWJsZU9yRXJyb3IAAAACAAAABmFtb3VudAAAAAlhdmFpbGFibGUDCQAAZwAAAAIFAAAACWF2YWlsYWJsZQUAAAAGYW1vdW50BQAAAAZhbW91bnQJAAACAAAAAQIAAABFSW5zdWZmaWNpZW50IGJhbGFuY2UhIFNlbmQgYSBQTSB0byB0aGUgYWRtaW5pc3RyYXRvciBvciBndWFyYW50b3IgLi4uAQAAABB3aXRoZHJhd2FsQW1vdW50AAAAAgAAAAdhc3NldElkAAAACmZtbXRBbW91bnQJAQAAABBhdmFpbGFibGVPckVycm9yAAAAAgkAAGsAAAADCQAAZAAAAAIJAAPwAAAAAgUAAAAEdGhpcwUAAAAHYXNzZXRJZAkAA/AAAAACBQAAAAVmY29sZAUAAAAHYXNzZXRJZAUAAAAKZm1tdEFtb3VudAUAAAALdHJhZGVTdXBwbHkJAAPwAAAAAgUAAAAEdGhpcwUAAAAHYXNzZXRJZAAAAAYAAAABaQEAAAALb3RjRXhjaGFuZ2UAAAADAAAABHN3YXAAAAAHYnNBc3NldAAAAAdxdEFzc2V0BAAAAAliYXNlSW5kZXgJAQAAAAphc3NldEluZGV4AAAAAQUAAAAHYnNBc3NldAQAAAAKcXVvdGVJbmRleAkBAAAACmFzc2V0SW5kZXgAAAABBQAAAAdxdEFzc2V0BAAAAAZiYXNlSWQJAAGRAAAAAgUAAAAJcG9ydGZvbGlvBQAAAAliYXNlSW5kZXgEAAAACmJhc2VUaWNrZXIJAAGRAAAAAgUAAAAMYXNzZXRUaWNrZXJzBQAAAAliYXNlSW5kZXgEAAAAB3F1b3RlSWQJAAGRAAAAAgUAAAAJcG9ydGZvbGlvBQAAAApxdW90ZUluZGV4BAAAAAtxdW90ZVRpY2tlcgkAAZEAAAACBQAAAAxhc3NldFRpY2tlcnMFAAAACnF1b3RlSW5kZXgDCQEAAAAQaXNNYXJrZXREaXNhYmxlZAAAAAIFAAAABmJhc2VJZAUAAAAHcXVvdGVJZAkAAAIAAAABCQAEuQAAAAIJAARMAAAAAgIAAAADVGhlCQAETAAAAAIFAAAACmJhc2VUaWNrZXIJAARMAAAAAgIAAAABLwkABEwAAAACBQAAAAtxdW90ZVRpY2tlcgkABEwAAAACAgAAACYgbWFya2V0IHBhaXIgaXMgdGVtcG9yYXJpbHkgc3VzcGVuZGVkLgUAAAADbmlsAgAAAAEgBAAAAAhiYXNlTXVsdAkAAZEAAAACBQAAAAphc3NldE11bHRzBQAAAAliYXNlSW5kZXgEAAAACXF1b3RlTXVsdAkAAZEAAAACBQAAAAphc3NldE11bHRzBQAAAApxdW90ZUluZGV4BAAAAAptYXJrZXRNdWx0CQABlgAAAAEJAARMAAAAAgUAAAAIYmFzZU11bHQJAARMAAAAAgUAAAAJcXVvdGVNdWx0BQAAAANuaWwEAAAACWJhc2VGdW5kcwkBAAAACmFzc2V0RnVuZHMAAAABBQAAAAZiYXNlSWQEAAAACnhCYXNlRnVuZHMJAABoAAAAAgUAAAAIYmFzZU11bHQFAAAACWJhc2VGdW5kcwQAAAAKcXVvdGVGdW5kcwkBAAAACmFzc2V0RnVuZHMAAAABBQAAAAdxdW90ZUlkBAAAAAt4UXVvdGVGdW5kcwkAAGgAAAACBQAAAAlxdW90ZU11bHQFAAAACnF1b3RlRnVuZHMEAAAAC2Jhc2VEZWNpbWFsCQABkQAAAAIFAAAADWFzc2V0RGVjaW1hbHMFAAAACWJhc2VJbmRleAQAAAAMcXVvdGVEZWNpbWFsCQABkQAAAAIFAAAADWFzc2V0RGVjaW1hbHMFAAAACnF1b3RlSW5kZXgEAAAADHByaWNlRGVjaW1hbAkAAGsAAAADBQAAAAxxdW90ZURlY2ltYWwFAAAAB2RlY2ltYWwFAAAAC2Jhc2VEZWNpbWFsBAAAAAxyb3VuZERlY2ltYWwJAABpAAAAAgUAAAAHZGVjaW1hbAkAAZYAAAABCQAETAAAAAIAAAAAAAAAAAEJAARMAAAAAgkAAGkAAAACBQAAAAxwcmljZURlY2ltYWwFAAAAB2RlY2ltYWwFAAAAA25pbAQAAAALJHQwOTAxNTkwODcJAQAAAA1nZXRBdHRhY2htZW50AAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAAB2RlcG9zaXQIBQAAAAskdDA5MDE1OTA4NwAAAAJfMQQAAAAHYXNzZXRJZAgFAAAACyR0MDkwMTU5MDg3AAAAAl8yAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAAdxdW90ZUlkBAAAAAlhc2tBbW91bnQJAQAAAA5tYXhUcmFkZUFtb3VudAAAAAIFAAAAC3hRdW90ZUZ1bmRzBQAAAAptYXJrZXRNdWx0BAAAAAhpbkFtb3VudAkBAAAADnZhbHVlT3JNYXhpbXVtAAAA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Z0VudHJ5RGF0YUtleQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0aW1lc3RhbXBEYXRhS2V5CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAGYmFzZUlkBAAAAAliaWRBbW91bnQJAQAAAA5tYXhUcmFkZUFtb3VudAAAAAIFAAAACnhCYXNlRnVuZHMFAAAACm1hcmtldE11bHQEAAAACGluQW1vdW50CQEAAAAOdmFsdWVPck1heGltdW0AAAACBQAAAAdkZXBvc2l0BQAAAAliaWRBbW91bnQEAAAACmJhc2VBbW91bnQFAAAACGluQW1vdW50BAAAAAt4QmFzZUFtb3VudAkAAGgAAAACBQAAAAptYXJrZXRNdWx0BQAAAApiYXNlQW1vdW50BAAAAAx4UXVvdGVBbW91bnQJAABrAAAAAwUAAAALeFF1b3RlRnVuZHMFAAAAC3hCYXNlQW1vdW50CQAAZAAAAAIFAAAACnhCYXNlRnVuZHMFAAAAC3hCYXNlQW1vdW50BAAAAAtxdW90ZUFtb3VudAkAAGkAAAACBQAAAAx4UXVvdGVBbW91bnQFAAAACm1hcmtldE11bHQEAAAACWZlZUFtb3VudAkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAKZmVlUGVyY2VudAUAAAAHcGVyY2VudAQAAAAKdGVhbVJld2FyZAkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAKZmVlUGVyY2VudAkAAGgAAAACAAAAAAAAAAAKBQAAAAdwZXJjZW50BAAAAAlvdXRBbW91bnQJAQAAAAh2YWxpZGF0ZQAAAAEJAABlAAAAAgUAAAALcXVvdGVBbW91bnQFAAAACWZlZUFtb3VudAQAAAAGcmVmdW5kCQEAAAAIdmFsaWRhdGUAAAABCQAAZQAAAAIFAAAAB2RlcG9zaXQFAAAACGluQW1vdW50BAAAAAxwcmljZVBlclVuaXQDCQAAAAAAAAIFAAAACmJhc2VBbW91bnQAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAALcXVvdGVBbW91bnQFAAAADHJvdW5kRGVjaW1hbAUAAAAKYmFzZUFtb3VudAQA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c0Z1bmRzBQAAAAxsZWFzZVBlcmNlbnQFAAAAB3BlcmNlbnQFAAAACndhdmVzTGVhc2UEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVPcmRlcgQAAAABbwUAAAAHJG1hdGNoMAMDAwUAAAAMaXNWYWxpZE1NQm90AwMDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAADQnV5CQEAAAACIT0AAAACCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQFAAAACXhmZWVBc3NldAcJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHBgMDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAAEU2VsbAkBAAAAAiE9AAAAAggIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAUAAAAJeGZlZUFzc2V0BwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwcJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkBwkAAAAAAAACCAUAAAABbwAAABBtYXRjaGVyUHVibGljS2V5BQAAAA53eGNoZ1B1YmxpY0tleQcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADAwMFAAAADGlzVmFsaWRPd25lcgkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwYDAwMFAAAADGlzVmFsaWRBZG1pbgkAAAAAAAACCAUAAAABdAAAAAdhc3NldElkBQAAAAlmbW10QXNzZXQHCQAAZwAAAAIFAAAADW1heFNhbGVBbW91bnQIBQAAAAF0AAAABmFtb3VudAcJAAAAAAAAAgkABCQAAAABCAUAAAABdAAAAAlyZWNpcGllbnQFAAAABWZzYWxlBwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAQTGVhc2VUcmFuc2FjdGlvbgQAAAABbAUAAAAHJG1hdGNoMAMFAAAADGlzVmFsaWRNTUJvdAkAAGcAAAACBQAAAA5tYXhMZWFzZUFtb3VudAgFAAAAAWwAAAAGYW1vdW50BwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAWTGVhc2VDYW5jZWxUcmFuc2FjdGlvbgMFAAAADGlzVmFsaWRNTUJvdAYFAAAAEWFueVZhbGlkR3VhcmFudG9yAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAD0RhdGFUcmFuc2FjdGlvbgMFAAAADGlzVmFsaWRBZG1pbgUAAAARaXNWYWxpZEd1YXJhbnRvcnMHB/cRo6U=", "height": 2336177, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3Y3FesZRPJwJgU8DWERgCc3FnZjgQ7WpqA52zpBfme3K Next: 9y1v5rNERriQDPDmDWMhbE6ntszdM6CeUrwSvRQmojXL Diff:
OldNewDifferences
102102 func rebalancingAmount (assetId) = difference(assetBalance(this, assetId), assetBalance(fcold, assetId))
103103
104104
105-func airdropBalance (assetId) = if (if ((32 > size(assetId)))
106- then true
107- else containsElement(portfolio, assetId))
108- then 0
109- else assetBalance(this, assetId)
105+func airdropBalance (assetId) = if (containsElement(portfolio, assetId))
106+ then throw(("Delete asset ID: " + toBase58String(assetId)))
107+ else if ((assetId == base58''))
108+ then 0
109+ else assetBalance(this, assetId)
110110
111111
112112 func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
174174 let quoteDecimal = assetDecimals[quoteIndex]
175175 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
176176 let roundDecimal = (decimal / max([1, (priceDecimal / decimal)]))
177- let $t089499021 = getAttachment(i.payments)
178- let deposit = $t089499021._1
179- let assetId = $t089499021._2
177+ let $t090159087 = getAttachment(i.payments)
178+ let deposit = $t090159087._1
179+ let assetId = $t090159087._2
180180 if ((assetId == quoteId))
181181 then {
182182 let askAmount = maxTradeAmount(xQuoteFunds, marketMult)
264264
265265 @Callable(i)
266266 func quickWithdrawal () = {
267- let $t01476714817 = getAttachment(i.payments)
268- let deposit = $t01476714817._1
269- let assetId = $t01476714817._2
267+ let $t01483314883 = getAttachment(i.payments)
268+ let deposit = $t01483314883._1
269+ let assetId = $t01483314883._2
270270 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
271271 if ((assetId == fmmtAsset))
272272 then {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scriptVersion = "v6.06-final_20201119"
55
66 let percent = 100000
77
88 let decimal = 100000000
99
1010 let txFee = 500000
1111
1212 let feePercent = 50
1313
1414 let leasePercent = 8000
1515
1616 let fdappPercent = 20000
1717
1818 let spreadPercent = getIntegerValue(this, "halfSpread")
1919
2020 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2121
2222 let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
2323
2424 let wxchgPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2525
2626 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'')
2727
2828 let actualSize = value(indexOf(guarantors, base58''))
2929
3030 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3131
3232 let btcAsset = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
3333
3434 let ethAsset = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
3535
3636 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3737
3838 let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
3939
4040 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
4141
4242 let portfolio = ([usdtAsset, btcAsset, unit, ethAsset, base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] :+ fmmtAsset)
4343
4444 let assetMults = [16, 2, 16, 16, 16, 16, 16, 16, 16, 1]
4545
4646 let assetDecimals = [1000000, decimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal, 100000]
4747
4848 let assetTickers = ["USDT", "BTC", "WAVES", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC", "FMMT"]
4949
5050 let fsale = Address(base58'3P6VEUyoBE1qdNuhUzbnFRLThuoe1pzS4B2')
5151
5252 let fdapp = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
5353
5454 let fcold = Address(base58'3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7')
5555
5656 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5757
5858 let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
5959
6060 let saleSupply = (10000 * 100000)
6161
6262 let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(this, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleSupply)
6363
6464 let fteamFunds = assetBalance(fteam, fmmtAsset)
6565
6666 let tradeSupply = max([0, (circSupply - fteamFunds)])
6767
6868 let logEntryDataKey = "logEntry"
6969
7070 let timestampDataKey = "timestamp"
7171
7272 let versionDataKey = "scriptVersion"
7373
7474 func validate (posValue) = max([0, posValue])
7575
7676
7777 func valueOrMaximum (intValue,maxValue) = min([intValue, maxValue])
7878
7979
8080 func toDataKey (assetId) = toBase58String(valueOrElse(assetId, base58'WAVES'))
8181
8282
8383 func isAssetDisabled (assetId) = valueOrElse(getBoolean(admin, toDataKey(assetId)), false)
8484
8585
8686 func toFloatString (num,dec) = if ((num == 0))
8787 then "0"
8888 else if ((num > 0))
8989 then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1)))
9090 else throw("Negative amounts are not allowed!")
9191
9292
9393 func difference (fdappFunds,fcoldFunds) = {
9494 let total = (fdappFunds + fcoldFunds)
9595 let amount = (fdappFunds - fraction(total, fdappPercent, percent))
9696 if (((total / 100) > amount))
9797 then 0
9898 else amount
9999 }
100100
101101
102102 func rebalancingAmount (assetId) = difference(assetBalance(this, assetId), assetBalance(fcold, assetId))
103103
104104
105-func airdropBalance (assetId) = if (if ((32 > size(assetId)))
106- then true
107- else containsElement(portfolio, assetId))
108- then 0
109- else assetBalance(this, assetId)
105+func airdropBalance (assetId) = if (containsElement(portfolio, assetId))
106+ then throw(("Delete asset ID: " + toBase58String(assetId)))
107+ else if ((assetId == base58''))
108+ then 0
109+ else assetBalance(this, assetId)
110110
111111
112112 func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
113113 then nil
114114 else [ScriptTransfer(address, amount, assetId)]
115115
116116
117117 func isMarketDisabled (baseId,quoteId) = if (if ((baseId != fmmtAsset))
118118 then isAssetDisabled(baseId)
119119 else false)
120120 then true
121121 else if ((quoteId != fmmtAsset))
122122 then isAssetDisabled(quoteId)
123123 else false
124124
125125
126126 func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), makeString(["The ", ticker, " asset is not supported!"], "\""))
127127
128128
129129 func assetFunds (assetId) = match assetId {
130130 case id: ByteVector =>
131131 if ((id == fmmtAsset))
132132 then tradeSupply
133133 else (assetBalance(this, id) + assetBalance(fcold, id))
134134 case _ =>
135135 (wavesBalance(this).regular + wavesBalance(fcold).regular)
136136 }
137137
138138
139139 func getAttachment (payments) = if ((size(payments) != 1))
140140 then $Tuple2(0, base58'')
141141 else $Tuple2(payments[0].amount, payments[0].assetId)
142142
143143
144144 func maxTradeAmount (xAssetFunds,marketMult) = fraction(xAssetFunds, spreadPercent, (percent * marketMult))
145145
146146
147147 func availableOrError (amount,available) = if ((available >= amount))
148148 then amount
149149 else throw("Insufficient balance! Send a PM to the administrator or guarantor ...")
150150
151151
152152 func withdrawalAmount (assetId,fmmtAmount) = availableOrError(fraction((assetBalance(this, assetId) + assetBalance(fcold, assetId)), fmmtAmount, tradeSupply), assetBalance(this, assetId))
153153
154154
155155 @Callable(i)
156156 func otcExchange (swap,bsAsset,qtAsset) = {
157157 let baseIndex = assetIndex(bsAsset)
158158 let quoteIndex = assetIndex(qtAsset)
159159 let baseId = portfolio[baseIndex]
160160 let baseTicker = assetTickers[baseIndex]
161161 let quoteId = portfolio[quoteIndex]
162162 let quoteTicker = assetTickers[quoteIndex]
163163 if (isMarketDisabled(baseId, quoteId))
164164 then throw(makeString(["The", baseTicker, "/", quoteTicker, " market pair is temporarily suspended."], " "))
165165 else {
166166 let baseMult = assetMults[baseIndex]
167167 let quoteMult = assetMults[quoteIndex]
168168 let marketMult = max([baseMult, quoteMult])
169169 let baseFunds = assetFunds(baseId)
170170 let xBaseFunds = (baseMult * baseFunds)
171171 let quoteFunds = assetFunds(quoteId)
172172 let xQuoteFunds = (quoteMult * quoteFunds)
173173 let baseDecimal = assetDecimals[baseIndex]
174174 let quoteDecimal = assetDecimals[quoteIndex]
175175 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
176176 let roundDecimal = (decimal / max([1, (priceDecimal / decimal)]))
177- let $t089499021 = getAttachment(i.payments)
178- let deposit = $t089499021._1
179- let assetId = $t089499021._2
177+ let $t090159087 = getAttachment(i.payments)
178+ let deposit = $t090159087._1
179+ let assetId = $t090159087._2
180180 if ((assetId == quoteId))
181181 then {
182182 let askAmount = maxTradeAmount(xQuoteFunds, marketMult)
183183 let inAmount = valueOrMaximum(deposit, askAmount)
184184 let feeAmount = fraction(inAmount, feePercent, percent)
185185 let teamReward = fraction(inAmount, feePercent, (10 * percent))
186186 let quoteAmount = validate((inAmount - feeAmount))
187187 let xQuoteAmount = (marketMult * quoteAmount)
188188 let xBaseAmount = fraction(xBaseFunds, xQuoteAmount, (xQuoteFunds + xQuoteAmount))
189189 let baseAmount = (xBaseAmount / marketMult)
190190 let outAmount = baseAmount
191191 let refund = validate((deposit - inAmount))
192192 let pricePerUnit = if ((baseAmount == 0))
193193 then 0
194194 else -(fraction(quoteAmount, -(roundDecimal), baseAmount))
195195 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseTicker, "/", (quoteTicker + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseTicker, "×", "ask price", toFloatString(pricePerUnit, valueOrMaximum(priceDecimal, decimal)), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteTicker, "−", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
196196 if (if (!(swap))
197197 then true
198198 else (0 >= outAmount))
199199 then throw(logEntryDataValue)
200200 else if ((outAmount > baseFunds))
201201 then throw("Insufficient balance! Send a PM to the administrator or guarantor ...")
202202 else [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
203203 }
204204 else if ((assetId == baseId))
205205 then {
206206 let bidAmount = maxTradeAmount(xBaseFunds, marketMult)
207207 let inAmount = valueOrMaximum(deposit, bidAmount)
208208 let baseAmount = inAmount
209209 let xBaseAmount = (marketMult * baseAmount)
210210 let xQuoteAmount = fraction(xQuoteFunds, xBaseAmount, (xBaseFunds + xBaseAmount))
211211 let quoteAmount = (xQuoteAmount / marketMult)
212212 let feeAmount = fraction(quoteAmount, feePercent, percent)
213213 let teamReward = fraction(quoteAmount, feePercent, (10 * percent))
214214 let outAmount = validate((quoteAmount - feeAmount))
215215 let refund = validate((deposit - inAmount))
216216 let pricePerUnit = if ((baseAmount == 0))
217217 then 0
218218 else fraction(quoteAmount, roundDecimal, baseAmount)
219219 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseTicker, "/", (quoteTicker + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseTicker, "×", "bid price", toFloatString(pricePerUnit, valueOrMaximum(priceDecimal, decimal)), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteTicker, "+", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
220220 if (if (!(swap))
221221 then true
222222 else (0 >= outAmount))
223223 then throw(logEntryDataValue)
224224 else if ((outAmount > quoteFunds))
225225 then throw("Insufficient balance! Send a PM to the administrator or guarantor ...")
226226 else [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
227227 }
228228 else throw(makeString(["Please attach one of the", baseTicker, "or", quoteTicker, "assets."], " "))
229229 }
230230 }
231231
232232
233233
234234 @Callable(i)
235235 func getMarketData (bsAsset,qtAsset) = {
236236 let baseIndex = assetIndex(bsAsset)
237237 let quoteIndex = assetIndex(qtAsset)
238238 let baseId = portfolio[baseIndex]
239239 let baseTicker = assetTickers[baseIndex]
240240 let quoteId = portfolio[quoteIndex]
241241 let quoteTicker = assetTickers[quoteIndex]
242242 if (isMarketDisabled(baseId, quoteId))
243243 then throw(makeString(["The", baseTicker, "/", quoteTicker, " market pair is temporarily suspended."], " "))
244244 else {
245245 let baseMult = assetMults[baseIndex]
246246 let quoteMult = assetMults[quoteIndex]
247247 let marketMult = max([baseMult, quoteMult])
248248 let baseFunds = assetFunds(baseId)
249249 let xBaseFunds = (baseMult * baseFunds)
250250 let quoteFunds = assetFunds(quoteId)
251251 let xQuoteFunds = (quoteMult * quoteFunds)
252252 let baseDecimal = assetDecimals[baseIndex]
253253 let quoteDecimal = assetDecimals[quoteIndex]
254254 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
255255 let roundDecimal = (decimal / max([1, (priceDecimal / decimal)]))
256256 let askAmount = maxTradeAmount(xQuoteFunds, marketMult)
257257 let bidAmount = maxTradeAmount(xBaseFunds, marketMult)
258258 let avgPrice = ((fraction(xQuoteFunds, (2 * roundDecimal), xBaseFunds) + 1) / 2)
259259 throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseTicker, "/", (quoteTicker + ") =>"), "ask amount:", toFloatString(askAmount, quoteDecimal), (quoteTicker + ";"), "bid amount:", toFloatString(bidAmount, baseDecimal), (baseTicker + ";"), "avg price:", toFloatString(avgPrice, valueOrMaximum(priceDecimal, decimal)), "±", (toFloatString((spreadPercent / 10), (percent / 1000)) + "%;"), "trade fee:", (toFloatString((feePercent / 10), (percent / 1000)) + "% in"), quoteTicker], " "))
260260 }
261261 }
262262
263263
264264
265265 @Callable(i)
266266 func quickWithdrawal () = {
267- let $t01476714817 = getAttachment(i.payments)
268- let deposit = $t01476714817._1
269- let assetId = $t01476714817._2
267+ let $t01483314883 = getAttachment(i.payments)
268+ let deposit = $t01483314883._1
269+ let assetId = $t01483314883._2
270270 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
271271 if ((assetId == fmmtAsset))
272272 then {
273273 let inAmount = valueOrMaximum(deposit, halfFunds)
274274 let wavesWithdrawalAmount = availableOrError(fraction((wavesBalance(this).regular + wavesBalance(fcold).regular), inAmount, tradeSupply), wavesBalance(this).available)
275275 let refund = validate((deposit - inAmount))
276276 let scriptTransfers = ((((((((getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[0]), inAmount), portfolio[0]) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[1]), inAmount), portfolio[1])) ++ getScriptTransfer(i.caller, wavesWithdrawalAmount, portfolio[2])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[3]), inAmount), portfolio[3])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[4]), inAmount), portfolio[4])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[5]), inAmount), portfolio[5])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[6]), inAmount), portfolio[6])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[7]), inAmount), portfolio[7])) ++ getScriptTransfer(i.caller, withdrawalAmount(value(portfolio[8]), inAmount), portfolio[8]))
277277 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
278278 if ((size(scriptTransfers) == 0))
279279 then throw("There are currently no transfers available.")
280280 else (((scriptTransfers ++ getScriptTransfer(i.caller, refund, fmmtAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
281281 }
282282 else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
283283 }
284284
285285
286286
287287 @Callable(i)
288288 func autoRebalance () = {
289289 let wavesRebalancingAmount = difference(wavesBalance(this).regular, wavesBalance(fcold).regular)
290290 if (if (if ((i.callerPublicKey != adminPublicKey))
291291 then (i.callerPublicKey != mmbotPublicKey)
292292 else false)
293293 then !(containsElement(guarantors, i.callerPublicKey))
294294 else false)
295295 then throw("This action can only be performed by an administrator or guarantor!")
296296 else if ((wavesRebalancingAmount > wavesBalance(this).available))
297297 then throw("Insufficient balance! Send a PM to the administrator or cancel the lease.")
298298 else if ((size(i.payments) > 0))
299299 then throw("Don't attach payment when calling this function ...")
300300 else {
301301 let fmmtRebalancingAmount = if (isAssetDisabled(fmmtAsset))
302302 then assetBalance(this, fmmtAsset)
303303 else (assetBalance(this, fmmtAsset) - saleSupply)
304304 let sponsorship = valueOrMaximum(txFee, assetBalance(this, xfeeAsset))
305305 let scriptTransfers = (((((((((getScriptTransfer(fcold, rebalancingAmount(value(portfolio[0])), portfolio[0]) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[1])), portfolio[1])) ++ getScriptTransfer(fcold, wavesRebalancingAmount, portfolio[2])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[3])), portfolio[3])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[4])), portfolio[4])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[5])), portfolio[5])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[6])), portfolio[6])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[7])), portfolio[7])) ++ getScriptTransfer(fcold, rebalancingAmount(value(portfolio[8])), portfolio[8])) ++ getScriptTransfer(fcold, fmmtRebalancingAmount, portfolio[9]))
306306 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
307307 if ((size(scriptTransfers) == 0))
308308 then throw("There are currently no transfers available.")
309309 else (((scriptTransfers ++ getScriptTransfer(i.caller, sponsorship, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
310310 }
311311 }
312312
313313
314314
315315 @Callable(i)
316316 func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey))
317317 then throw("This action can only be performed by an administrator!")
318318 else if ((size(i.payments) > 0))
319319 then throw("Don't attach payment when calling this function ...")
320320 else {
321321 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))
322322 let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId))
323323 if ((size(scriptTransfers) == 0))
324324 then throw("There are currently no transfers available.")
325325 else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
326326 }
327327
328328
329329
330330 @Callable(i)
331331 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
332332 then throw("This action can only be performed by an administrator!")
333333 else if ((size(i.payments) > 0))
334334 then throw("Don't attach payment when calling this function ...")
335335 else {
336336 let oldVersion = valueOrElse(getString(this, versionDataKey), "")
337337 let versionList = split(drop(scriptVersion, 1), "_")
338338 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (versionList[0] + ";"), "updated:", makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-")], " ")
339339 if ((oldVersion == scriptVersion))
340340 then throw(("The script version has already been updated: " + scriptVersion))
341341 else [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
342342 }
343343
344344
345345 @Verifier(tx)
346346 func verify () = {
347347 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
348348 let isValidMMBot = if (isValidOwner)
349349 then true
350350 else sigVerify_8Kb(tx.bodyBytes, tx.proofs[1], mmbotPublicKey)
351351 let isValidAdmin = if (isValidOwner)
352352 then true
353353 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], adminPublicKey)
354354 let validGuarantors = (((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
355355 then 1
356356 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
357357 then 1
358358 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
359359 then 1
360360 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
361361 then 1
362362 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
363363 then 1
364364 else 0))
365365 let anyValidGuarantor = (validGuarantors > 0)
366366 let isValidGuarantors = (validGuarantors >= minSignatures)
367367 let balance = wavesBalance(this).regular
368368 let wavesLease = validate((balance - wavesBalance(this).available))
369369 let wavesFunds = validate(((balance + wavesBalance(fcold).regular) - txFee))
370370 let maxSaleAmount = validate((saleSupply - assetBalance(this, fmmtAsset)))
371371 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
372372 match tx {
373373 case o: Order =>
374374 if (if (if (isValidMMBot)
375375 then if (if (if ((o.orderType == Buy))
376376 then (o.assetPair.priceAsset != xfeeAsset)
377377 else false)
378378 then containsElement(portfolio, o.assetPair.amountAsset)
379379 else false)
380380 then true
381381 else if (if ((o.orderType == Sell))
382382 then (o.assetPair.amountAsset != xfeeAsset)
383383 else false)
384384 then containsElement(portfolio, o.assetPair.priceAsset)
385385 else false
386386 else false)
387387 then !(isDefined(o.matcherFeeAssetId))
388388 else false)
389389 then (o.matcherPublicKey == wxchgPublicKey)
390390 else false
391391 case t: TransferTransaction =>
392392 if (if (if (isValidOwner)
393393 then !(containsElement(portfolio, t.assetId))
394394 else false)
395395 then !(containsElement(portfolio, t.feeAssetId))
396396 else false)
397397 then true
398398 else if (if (if (isValidAdmin)
399399 then (t.assetId == fmmtAsset)
400400 else false)
401401 then (maxSaleAmount >= t.amount)
402402 else false)
403403 then (addressFromRecipient(t.recipient) == fsale)
404404 else false
405405 case l: LeaseTransaction =>
406406 if (isValidMMBot)
407407 then (maxLeaseAmount >= l.amount)
408408 else false
409409 case _: LeaseCancelTransaction =>
410410 if (isValidMMBot)
411411 then true
412412 else anyValidGuarantor
413413 case _: SetScriptTransaction|DataTransaction =>
414414 if (isValidAdmin)
415415 then isValidGuarantors
416416 else false
417417 case _ =>
418418 false
419419 }
420420 }
421421

github/deemru/w8io/3ef1775 
85.60 ms