tx · G1pV52N1z7QqxYVYtun2utbbnWZcCguKSv8ZGyt1wgMa 3N5ecXT7MHB6z33Ms2Pvy6thNVBMeacaACo: -0.01500000 Waves 2023.08.17 11:16 [2714341] smart account 3N5ecXT7MHB6z33Ms2Pvy6thNVBMeacaACo > SELF 0.00000000 Waves
{ "type": 13, "id": "G1pV52N1z7QqxYVYtun2utbbnWZcCguKSv8ZGyt1wgMa", "fee": 1500000, "feeAssetId": null, "timestamp": 1692260184105, "version": 2, "chainId": 84, "sender": "3N5ecXT7MHB6z33Ms2Pvy6thNVBMeacaACo", "senderPublicKey": "3WPc9rDre1YBs13teGnzt1PnEEQZXaaSTRU1tVuqLa4Z", "proofs": [ "49ZBKCYbABVUFoGcmD4KQ4Prz2xgJeYXQqk8FpADbfUmay1u9X5YGPXPH9XomDAHgGuJ1BWBmg5rCp9uj9h5dRnP", "2VDAaZdPyoiJ2TjLeDaW1ph4fnVbZdnNjGS6HbcSDEnngosNs33RyyVQ6mQXdiunxFQERYnwYTgkLs6t5JW1AAVj" ], "script": "base64:BgI/CAISDQoLGBgBAQEBAQEBCAgSABIAEgQKAgEIEgQKAgEIEgQKAgEIEgQKAgEIEgQKAgEIEgQKAgEIEgQKAgEIMQAUSU5JVElBTF9UT0tFTl9BTU9VTlQAgICapuqv4wEADVBFUkNFTlRfU0NBTEUA6AcADGtXRGFvQWRkcmVzcwILd0Rhb0FkZHJlc3MAC2tXRGFvQW1vdW50Agp3RGFvQW1vdW50AAlrV0Rhb0xvY2sCDndEYW9Mb2NrUGVyaW9kAAxrV0Rhb1Zlc3RpbmcCEXdEYW9WZXN0aW5nUGVyaW9kAA9rV0Rhb1dpdGhkcmF3ZWQCDndEYW9XaXRoZHJhd2VkAAxrVGVhbUFkZHJlc3MCC3RlYW1BZGRyZXNzAAtrVGVhbUFtb3VudAIKdGVhbUFtb3VudAAJa1RlYW1Mb2NrAg50ZWFtTG9ja1BlcmlvZAAMa1RlYW1WZXN0aW5nAhF0ZWFtVmVzdGluZ1BlcmlvZAAPa1RlYW1XaXRoZHJhd2VkAg50ZWFtV2l0aGRyYXdlZAAQa01hcmtldGluZ0Ftb3VudAIMbWFya2V0QW1vdW50ABRrTWFya2V0aW5nV2l0aGRyYXdlZAITbWFya2V0aW5nV2l0aGRyYXdlZAAOa1BhcnRuZXJBbW91bnQCDXBhcnRuZXJBbW91bnQAE2tQYXJ0bmVyc1dpdGhkcmF3ZWQCEnBhcnRuZXJzV2l0aGRyYXdlZAAQa1JldHJvRHJvcEFtb3VudAIPcmV0cm9Ecm9wQW1vdW50ABRrUmV0cm9Ecm9wV2l0aGRyYXdlZAITcmV0cm9Ecm9wV2l0aGRyYXdlZAARa0xlbmRSZXdhcmRBbW91bnQCEWxlbmRSZXdhcmRzQW1vdW50ABVrTGVuZFJld2FyZFdpdGhkcmF3ZWQCFGxlbmRSZXdhcmRXaXRoZHJhd2VkAA9rTFBSZXdhcmRBbW91bnQCDmxwUmV3YXJkQW1vdW50ABNrTFBSZXdhcmRXaXRoZHJhd2VkAhJscFJld2FyZFdpdGhkcmF3ZWQAD2tQb29sSW5pdEFtb3VudAIOcG9vbEluaXRBbW91bnQAE2tQb29sSW5pdFdpdGhkcmF3ZWQCEnBvb2xJbml0V2l0aGRyYXdlZAAQa0xhdW5jaHBhZEFtb3VudAIPbGF1bmNocGFkQW1vdW50ABRrTGF1bmNocGFkV2l0aGRyYXdlZAITbGF1bmNocGFkV2l0aGRyYXdlZAAMa0FYTFlUb2tlbklkAgtheGx5VG9rZW5JZAAMa1N0YXJ0SGVpZ2h0AgtzdGFydEhlaWdodAAJa0FkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkACWtBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AAlrQWRtaW4zUEsCFWdyb3VwMV9hZG1pbjNfcHViX2tleQARa0F4bHlNYWluQ29udHJhY3QCDG1haW5Db250cmFjdAAMa0F4bHlGYXJtaW5nAg5mYXJtaW5nQWRkcmVzcwAMbWFpbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwURa0F4bHlNYWluQ29udHJhY3QCGUNhbid0IGdldCBtYWluQ29udGFjdCBrZXkADmZhcm1pbmdBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa0F4bHlGYXJtaW5nAhxDYW4ndCBnZXQgZmFybWluZ0FkZHJlc3Mga2V5AAhhZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUMbWFpbkNvbnRyYWN0BQlrQWRtaW4xUEsCEkNhbid0IGdldCBhZG1pbjFQSwAIYWRtaW4yUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDG1haW5Db250cmFjdAUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQxtYWluQ29udHJhY3QFCWtBZG1pbjNQSwISQ2FuJ3QgZ2V0IGFkbWluM1BLAAZBWExZSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUMa0FYTFlUb2tlbklkAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFkbWluMVBLCQDMCAIFCGFkbWluMlBLCQDMCAIFCGFkbWluM1BLBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECKE9ubHkgYWRtaW4gZ3JvdXAxIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgENaXNGYXJtaW5nQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFDmZhcm1pbmdBZGRyZXNzBQR1bml0CQACAQIsT25seSBmYXJtaW5nIGNvbnRyYWN0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BGXBhcnNlUGVyY2VudFBhcmFtVG9BbW91bnQBBXBhcmFtBAdwZXJjZW50BAckbWF0Y2gwBQVwYXJhbQMJAAECBQckbWF0Y2gwAgNJbnQEAXAFByRtYXRjaDAFAXADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFwBQckbWF0Y2gwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUBcAIdQ2FuJ3QgcGFyc2UgcGVyY2VudCBpbiBwYXJhbXMJAAIBAgtNYXRjaCBlcnJvcgMDCQBnAgAABQdwZXJjZW50BgkAZwIFB3BlcmNlbnQFDVBFUkNFTlRfU0NBTEUJAAIBAjNwZXJjZW50IG11c3QgYmUgbnVtYmVyIGJldHdlZW4gMSgwLjEpIGFuZCA5OTkoOTkuOSkEBmFtb3VudAkAawMFFElOSVRJQUxfVE9LRU5fQU1PVU5UBQdwZXJjZW50BQ1QRVJDRU5UX1NDQUxFBQZhbW91bnQBFnBhcnNlTG9ja1Zlc3RpbmdQZXJpb2QCB2xvY2tTdHIHdmVzdFN0cgQKbG9ja1BlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFB2xvY2tTdHICF0Nhbid0IHBhcnNlIGxvY2sgcGVyaW9kBA12ZXN0aW5nUGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQUHdmVzdFN0cgIaQ2FuJ3QgcGFyc2UgdmVzdGluZyBwZXJpb2QDAwkAZwIAAAUKbG9ja1BlcmlvZAYJAGcCAAAFDXZlc3RpbmdQZXJpb2QJAAIBAjNsb2NrUGVyaW9kIGFuZCB2ZXN0aW5nUGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUKbG9ja1BlcmlvZAUNdmVzdGluZ1BlcmlvZAkAAgECLXZlc3RpbmdQZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gbG9ja1BlcmlvZAkAlAoCBQpsb2NrUGVyaW9kBQ12ZXN0aW5nUGVyaW9kAQ92YWxpZGF0ZUFkZHJlc3MBBGFTdHIJAKUIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBGFTdHICF1dyb25nIGFkZHJlc3MgaW4gcGFyYW1zARNwYXJzZVdEQU9UZWFtUGFyYW1zAQZwYXJhbXMEB2FkZHJlc3MJAQ92YWxpZGF0ZUFkZHJlc3MBCQCRAwIFBnBhcmFtcwAABAZhbW91bnQJARlwYXJzZVBlcmNlbnRQYXJhbVRvQW1vdW50AQkAkQMCBQZwYXJhbXMAAQQLJHQwNDU0MTQ2MTkJARZwYXJzZUxvY2tWZXN0aW5nUGVyaW9kAgkAkQMCBQZwYXJhbXMAAgkAkQMCBQZwYXJhbXMAAwQKbG9ja1BlcmlvZAgFCyR0MDQ1NDE0NjE5Al8xBA12ZXN0aW5nUGVyaW9kCAULJHQwNDU0MTQ2MTkCXzIJAJYKBAUHYWRkcmVzcwUGYW1vdW50BQpsb2NrUGVyaW9kBQ12ZXN0aW5nUGVyaW9kAQtwYXJzZVBhcmFtcwEGcGFyYW1zBAdhZGRyZXNzCQEPdmFsaWRhdGVBZGRyZXNzAQkAkQMCBQZwYXJhbXMAAAQGYW1vdW50CQEZcGFyc2VQZXJjZW50UGFyYW1Ub0Ftb3VudAEJAJEDAgUGcGFyYW1zAAEJAJQKAgUHYWRkcmVzcwUGYW1vdW50AQ93aXRoZHJhd1RlYW1EYW8GC3RvdGFsQW1vdW50CmxvY2tQZXJpb2QNdmVzdGluZ1BlcmlvZAp3aXRoZHJhd2VkB2FkZHJlc3MEd0tleQQLc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDGtTdGFydEhlaWdodAQIbG9ja1RpbGwJAGQCBQtzdGFydEhlaWdodAUKbG9ja1BlcmlvZAQLdmVzdGluZ1RpbGwJAGQCCQBkAgULc3RhcnRIZWlnaHQFCmxvY2tQZXJpb2QFDXZlc3RpbmdQZXJpb2QEC2NhbldpdGhkcmF3CQBlAgkAawMFC3RvdGFsQW1vdW50CQCXAwEJAMwIAgkAZQIFBmhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQpsb2NrUGVyaW9kCQDMCAIFC3Zlc3RpbmdUaWxsBQNuaWwFDXZlc3RpbmdQZXJpb2QFCndpdGhkcmF3ZWQDCQBnAgUIbG9ja1RpbGwFBmhlaWdodAkAAgECFkxvY2sgcGVyaW9kIGlzIG5vdCBlbmQDCQBnAgAABQtjYW5XaXRoZHJhdwkAAgECE05vdGhpbmcgdG8gd2l0aGRyYXcJAMwIAgkBDEludGVnZXJFbnRyeQIFBHdLZXkJAGQCBQp3aXRoZHJhd2VkBQtjYW5XaXRoZHJhdwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzBQtjYW5XaXRoZHJhdwUGQVhMWUlkBQNuaWwBD3dpdGhkcmF3VG9PdGhlcgUGYW1vdW50C3RvdGFsQW1vdW50CndpdGhkcmF3ZWQHYWRkcmVzcwR3S2V5AwkAZgIJAGQCBQp3aXRoZHJhd2VkBQZhbW91bnQFC3RvdGFsQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIdWW91IGNhbid0IHdpdGhkcmF3IG1vcmUgdGhhbiAJAKQDAQULdG90YWxBbW91bnQCFSBhbHJlYWR5IHdpdGhkcmF3ZWQ6IAkApAMBBQp3aXRoZHJhd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQR3S2V5CQBkAgUKd2l0aGRyYXdlZAUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MFBmFtb3VudAUGQVhMWUlkBQNuaWwKAWkBBGluaXQLCndEYW9QYXJhbXMKdGVhbVBhcmFtcxBtYXJrZXRpbmdQZXJjZW50DnBhcnRuZXJQZXJjZW50EHJldHJvRHJvcFBlcmNlbnQRbGVuZFJld2FyZFBlcmNlbnQPbHBSZXdhcmRQZXJjZW50D3Bvb2xJbml0UGVyY2VudBBsYXVuY2hwYWRQZXJjZW50EG1haW5Db250cmFjdEFkZHILZmFybWluZ0FkZHIJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQIhPQIJAJADAQUKd0Rhb1BhcmFtcwAECQACAQIbd0Rhb1BhcmFtcyBtdXN0IGhhdmUgNCBhcmdzAwkBAiE9AgkAkAMBBQp0ZWFtUGFyYW1zAAQJAAIBAht0ZWFtUGFyYW1zIG11c3QgaGF2ZSA0IGFyZ3MDCQBnAgAABRBtYXJrZXRpbmdQZXJjZW50CQACAQIcbWFya2V0aW5nUGVyY2VudCBtdXN0IGJlID4gMAMJAGcCAAAFDnBhcnRuZXJQZXJjZW50CQACAQIacGFydG5lclBlcmNlbnQgbXVzdCBiZSA+IDADCQBnAgAABRByZXRyb0Ryb3BQZXJjZW50CQACAQIccmV0cm9Ecm9wUGVyY2VudCBtdXN0IGJlID4gMAMJAGcCAAAFEWxlbmRSZXdhcmRQZXJjZW50CQACAQIcbGVuZFJld2FyZFBhcmFtcyBtdXN0IGJlID4gMAMJAGcCAAAFD2xwUmV3YXJkUGVyY2VudAkAAgECGmxwUmV3YXJkUGFyYW1zIG11c3QgYmUgPiAwAwkAZwIAAAUPcG9vbEluaXRQZXJjZW50CQACAQIacG9vbEluaXRQYXJhbXMgbXVzdCBiZSA+IDADCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFC2Zhcm1pbmdBZGRyCQACAQIVV3JvbmcgZmFybWluZyBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBRBtYWluQ29udHJhY3RBZGRyCQACAQIbV3JvbmcgbWFpbiBjb250cmFjdCBhZGRyZXNzBAskdDA3MjUyNzM1MAkBE3BhcnNlV0RBT1RlYW1QYXJhbXMBBQp3RGFvUGFyYW1zBAt3RGFvQWRkcmVzcwgFCyR0MDcyNTI3MzUwAl8xBAp3RGFvQW1vdW50CAULJHQwNzI1MjczNTACXzIEDndEYW9Mb2NrUGVyaW9kCAULJHQwNzI1MjczNTACXzMEEXdEYW9WZXN0aW5nUGVyaW9kCAULJHQwNzI1MjczNTACXzQECyR0MDczNTM3NDUxCQETcGFyc2VXREFPVGVhbVBhcmFtcwEFCnRlYW1QYXJhbXMEC3RlYW1BZGRyZXNzCAULJHQwNzM1Mzc0NTECXzEECnRlYW1BbW91bnQIBQskdDA3MzUzNzQ1MQJfMgQOdGVhbUxvY2tQZXJpb2QIBQskdDA3MzUzNzQ1MQJfMwQRdGVhbVZlc3RpbmdQZXJpb2QIBQskdDA3MzUzNzQ1MQJfNAQHbUFtb3VudAkBGXBhcnNlUGVyY2VudFBhcmFtVG9BbW91bnQBBRBtYXJrZXRpbmdQZXJjZW50BAdwQW1vdW50CQEZcGFyc2VQZXJjZW50UGFyYW1Ub0Ftb3VudAEFDnBhcnRuZXJQZXJjZW50BAdyQW1vdW50CQEZcGFyc2VQZXJjZW50UGFyYW1Ub0Ftb3VudAEFEHJldHJvRHJvcFBlcmNlbnQEB2xBbW91bnQJARlwYXJzZVBlcmNlbnRQYXJhbVRvQW1vdW50AQURbGVuZFJld2FyZFBlcmNlbnQECGxwQW1vdW50CQEZcGFyc2VQZXJjZW50UGFyYW1Ub0Ftb3VudAEFD2xwUmV3YXJkUGVyY2VudAQIcGlBbW91bnQJARlwYXJzZVBlcmNlbnRQYXJhbVRvQW1vdW50AQUPcG9vbEluaXRQZXJjZW50BAhsYUFtb3VudAkBGXBhcnNlUGVyY2VudFBhcmFtVG9BbW91bnQBBRBsYXVuY2hwYWRQZXJjZW50BANzdW0JAGQCCQBkAgkAZAIJAGQCCQBkAgkAZAIJAGQCBQp3RGFvQW1vdW50BQp0ZWFtQW1vdW50BQdtQW1vdW50BQdwQW1vdW50BQdyQW1vdW50BQdsQW1vdW50BQhscEFtb3VudAUIcGlBbW91bnQDCQBmAgUDc3VtBRRJTklUSUFMX1RPS0VOX0FNT1VOVAkAAgECF1dyb25nIHBlcmNlbnRzKCA+IDEwMCUpBAVpc3N1ZQkAwggFAgRBWExZAhNBWExZIHByb3RvY29sIHRva2VuBRRJTklUSUFMX1RPS0VOX0FNT1VOVAAIBwQFaWRTdHIJANgEAQkAuAgBBQVpc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQxrV0Rhb0FkZHJlc3MFC3dEYW9BZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrV0Rhb0Ftb3VudAUKd0Rhb0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa1dEYW9Mb2NrBQ53RGFvTG9ja1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1dEYW9WZXN0aW5nBRF3RGFvVmVzdGluZ1BlcmlvZAkAzAgCCQELU3RyaW5nRW50cnkCBQxrVGVhbUFkZHJlc3MFC3RlYW1BZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVGVhbUFtb3VudAUKdGVhbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa1RlYW1Mb2NrBQ50ZWFtTG9ja1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1RlYW1WZXN0aW5nBRF0ZWFtVmVzdGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa01hcmtldGluZ0Ftb3VudAUHbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa1BhcnRuZXJBbW91bnQFB3BBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtSZXRyb0Ryb3BBbW91bnQFB3JBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtMZW5kUmV3YXJkQW1vdW50BQdsQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rTFBSZXdhcmRBbW91bnQFCGxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rUG9vbEluaXRBbW91bnQFCHBpQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrTGF1bmNocGFkQW1vdW50BQhsYUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1N0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgURa0F4bHlNYWluQ29udHJhY3QFEG1haW5Db250cmFjdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMa0F4bHlGYXJtaW5nBQtmYXJtaW5nQWRkcgkAzAgCBQVpc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQxrQVhMWVRva2VuSWQFBWlkU3RyBQNuaWwBaQEMd2l0aGRyYXdXRGFvAAQGYW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQtrV0Rhb0Ftb3VudAQKbG9ja1BlcmlvZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa1dEYW9Mb2NrBA12ZXN0aW5nUGVyaW9kCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQxrV0Rhb1Zlc3RpbmcEB2FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFDGtXRGFvQWRkcmVzcwQKd2l0aGRyYXdlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rV0Rhb1dpdGhkcmF3ZWQAAAkBD3dpdGhkcmF3VGVhbURhbwYFBmFtb3VudAUKbG9ja1BlcmlvZAUNdmVzdGluZ1BlcmlvZAUKd2l0aGRyYXdlZAUHYWRkcmVzcwUPa1dEYW9XaXRoZHJhd2VkAWkBDHdpdGhkcmF3VGVhbQAEBmFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwULa1RlYW1BbW91bnQECmxvY2tQZXJpb2QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFCWtUZWFtTG9jawQNdmVzdGluZ1BlcmlvZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUMa1RlYW1WZXN0aW5nBAdhZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQxrVGVhbUFkZHJlc3MECndpdGhkcmF3ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa1RlYW1XaXRoZHJhd2VkAAAJAQ93aXRoZHJhd1RlYW1EYW8GBQZhbW91bnQFCmxvY2tQZXJpb2QFDXZlc3RpbmdQZXJpb2QFCndpdGhkcmF3ZWQFB2FkZHJlc3MFD2tUZWFtV2l0aGRyYXdlZAFpARF3aXRoZHJhd01hcmtldGluZwIGYW1vdW50CmFkZHJlc3NTdHIJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQLdG90YWxBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEGtNYXJrZXRpbmdBbW91bnQECndpdGhkcmF3ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa01hcmtldGluZ1dpdGhkcmF3ZWQAAAQHYWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKYWRkcmVzc1N0cgkBD3dpdGhkcmF3VG9PdGhlcgUFBmFtb3VudAULdG90YWxBbW91bnQFCndpdGhkcmF3ZWQFB2FkZHJlc3MFFGtNYXJrZXRpbmdXaXRoZHJhd2VkAWkBEHdpdGhkcmF3UGFydG5lcnMCBmFtb3VudAphZGRyZXNzU3RyCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEC3RvdGFsQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ5rUGFydG5lckFtb3VudAQKd2l0aGRyYXdlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrUGFydG5lcnNXaXRoZHJhd2VkAAAEB2FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmFkZHJlc3NTdHIJAQ93aXRoZHJhd1RvT3RoZXIFBQZhbW91bnQFC3RvdGFsQW1vdW50BQp3aXRoZHJhd2VkBQdhZGRyZXNzBRNrUGFydG5lcnNXaXRoZHJhd2VkAWkBEndpdGhkcmF3UmV0cm9EcmFvcAIGYW1vdW50CmFkZHJlc3NTdHIJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQLdG90YWxBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEGtSZXRyb0Ryb3BBbW91bnQECndpdGhkcmF3ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa1JldHJvRHJvcFdpdGhkcmF3ZWQAAAQHYWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKYWRkcmVzc1N0cgkBD3dpdGhkcmF3VG9PdGhlcgUFBmFtb3VudAULdG90YWxBbW91bnQFCndpdGhkcmF3ZWQFB2FkZHJlc3MFFGtSZXRyb0Ryb3BXaXRoZHJhd2VkAWkBEHdpdGhkcmF3UG9sbEluaXQCBmFtb3VudAphZGRyZXNzU3RyCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEC3RvdGFsQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ9rUG9vbEluaXRBbW91bnQECndpdGhkcmF3ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa1Bvb2xJbml0V2l0aGRyYXdlZAAABAdhZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyCQEPd2l0aGRyYXdUb090aGVyBQUGYW1vdW50BQt0b3RhbEFtb3VudAUKd2l0aGRyYXdlZAUHYWRkcmVzcwUTa1Bvb2xJbml0V2l0aGRyYXdlZAFpARJ3aXRoZHJhd0xlbmRSZXdhcmQCBmFtb3VudAxhZGRyZXNzVG9TdHIJAQt2YWx1ZU9yRWxzZQIJAQ1pc0Zhcm1pbmdDYWxsAQUBaQQLdG90YWxBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtMZW5kUmV3YXJkQW1vdW50BAp3aXRoZHJhd2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWtMZW5kUmV3YXJkV2l0aGRyYXdlZAAABAdhZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQxhZGRyZXNzVG9TdHIJAQ93aXRoZHJhd1RvT3RoZXIFBQZhbW91bnQFC3RvdGFsQW1vdW50BQp3aXRoZHJhd2VkBQdhZGRyZXNzBRVrTGVuZFJld2FyZFdpdGhkcmF3ZWQBaQEQd2l0aGRyYXdMcFJld2FyZAIGYW1vdW50DGFkZHJlc3NUb1N0cgkBC3ZhbHVlT3JFbHNlAgkBDWlzRmFybWluZ0NhbGwBBQFpBAt0b3RhbEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUPa0xQUmV3YXJkQW1vdW50BAp3aXRoZHJhd2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tMUFJld2FyZFdpdGhkcmF3ZWQAAAQHYWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUMYWRkcmVzc1RvU3RyCQEPd2l0aGRyYXdUb090aGVyBQUGYW1vdW50BQt0b3RhbEFtb3VudAUKd2l0aGRyYXdlZAUHYWRkcmVzcwUTa0xQUmV3YXJkV2l0aGRyYXdlZAFpARF3aXRoZHJhd0xhdW5jaHBhZAIGYW1vdW50DGFkZHJlc3NUb1N0cgkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpBAt0b3RhbEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUQa0xhdW5jaHBhZEFtb3VudAQKd2l0aGRyYXdlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRrTGF1bmNocGFkV2l0aGRyYXdlZAAABAdhZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQxhZGRyZXNzVG9TdHIJAQ93aXRoZHJhd1RvT3RoZXIFBQZhbW91bnQFC3RvdGFsQW1vdW50BQp3aXRoZHJhd2VkBQdhZGRyZXNzBRRrTGF1bmNocGFkV2l0aGRyYXdlZAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCGFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUIYWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQhhZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKC5jjAJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHBAppc0luaXRDYWxsCQAAAggFA2ludghmdW5jdGlvbgIEaW5pdAQMaXNub1BheW1lbnRzCQAAAgkAkAMBCAUDaW52CHBheW1lbnRzAAADAwMDBQppc1JpZ2h0RmVlBQppc0luaXRDYWxsBwUGaXNTZWxmBwUMaXNub1BheW1lbnRzBwYFE211bHRpU2lnbmVkQnlBZG1pbnMFE211bHRpU2lnbmVkQnlBZG1pbnOUG08I", "height": 2714341, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3hMEWSW212rKCDSJyXx2F4zxnjzhXQDf7yozAe43cjV3 Next: EmXYdeHoPaaskeoD2m5thsGD2SG6Nt1YJQKL8Dyd5Gbi Diff:
Old | New | Differences | |
---|---|---|---|
243 | 243 | @Callable(i) | |
244 | 244 | func withdrawMarketing (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
245 | 245 | let totalAmount = getIntegerValue(this, kMarketingAmount) | |
246 | - | let withdrawed = | |
246 | + | let withdrawed = valueOrElse(getInteger(this, kMarketingWithdrawed), 0) | |
247 | 247 | let address = addressFromStringValue(addressStr) | |
248 | 248 | withdrawToOther(amount, totalAmount, withdrawed, address, kMarketingWithdrawed) | |
249 | 249 | }) | |
253 | 253 | @Callable(i) | |
254 | 254 | func withdrawPartners (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
255 | 255 | let totalAmount = getIntegerValue(this, kPartnerAmount) | |
256 | - | let withdrawed = | |
256 | + | let withdrawed = valueOrElse(getInteger(this, kPartnersWithdrawed), 0) | |
257 | 257 | let address = addressFromStringValue(addressStr) | |
258 | 258 | withdrawToOther(amount, totalAmount, withdrawed, address, kPartnersWithdrawed) | |
259 | 259 | }) | |
263 | 263 | @Callable(i) | |
264 | 264 | func withdrawRetroDraop (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
265 | 265 | let totalAmount = getIntegerValue(this, kRetroDropAmount) | |
266 | - | let withdrawed = | |
266 | + | let withdrawed = valueOrElse(getInteger(this, kRetroDropWithdrawed), 0) | |
267 | 267 | let address = addressFromStringValue(addressStr) | |
268 | 268 | withdrawToOther(amount, totalAmount, withdrawed, address, kRetroDropWithdrawed) | |
269 | 269 | }) | |
273 | 273 | @Callable(i) | |
274 | 274 | func withdrawPollInit (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
275 | 275 | let totalAmount = getIntegerValue(this, kPoolInitAmount) | |
276 | - | let withdrawed = | |
276 | + | let withdrawed = valueOrElse(getInteger(this, kPoolInitWithdrawed), 0) | |
277 | 277 | let address = addressFromStringValue(addressStr) | |
278 | 278 | withdrawToOther(amount, totalAmount, withdrawed, address, kPoolInitWithdrawed) | |
279 | 279 | }) | |
283 | 283 | @Callable(i) | |
284 | 284 | func withdrawLendReward (amount,addressToStr) = valueOrElse(isFarmingCall(i), { | |
285 | 285 | let totalAmount = getIntegerValue(this, kLendRewardAmount) | |
286 | - | let withdrawed = | |
286 | + | let withdrawed = valueOrElse(getInteger(this, kLendRewardWithdrawed), 0) | |
287 | 287 | let address = addressFromStringValue(addressToStr) | |
288 | 288 | withdrawToOther(amount, totalAmount, withdrawed, address, kLendRewardWithdrawed) | |
289 | 289 | }) | |
293 | 293 | @Callable(i) | |
294 | 294 | func withdrawLpReward (amount,addressToStr) = valueOrElse(isFarmingCall(i), { | |
295 | 295 | let totalAmount = getIntegerValue(this, kLPRewardAmount) | |
296 | - | let withdrawed = | |
296 | + | let withdrawed = valueOrElse(getInteger(this, kLPRewardWithdrawed), 0) | |
297 | 297 | let address = addressFromStringValue(addressToStr) | |
298 | 298 | withdrawToOther(amount, totalAmount, withdrawed, address, kLPRewardWithdrawed) | |
299 | 299 | }) | |
303 | 303 | @Callable(i) | |
304 | 304 | func withdrawLaunchpad (amount,addressToStr) = valueOrElse(isSelfCall(i), { | |
305 | 305 | let totalAmount = getIntegerValue(this, kLaunchpadAmount) | |
306 | - | let withdrawed = | |
306 | + | let withdrawed = valueOrElse(getInteger(this, kLaunchpadWithdrawed), 0) | |
307 | 307 | let address = addressFromStringValue(addressToStr) | |
308 | 308 | withdrawToOther(amount, totalAmount, withdrawed, address, kLaunchpadWithdrawed) | |
309 | 309 | }) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let INITIAL_TOKEN_AMOUNT = 1000000000000000 | |
5 | 5 | ||
6 | 6 | let PERCENT_SCALE = 1000 | |
7 | 7 | ||
8 | 8 | let kWDaoAddress = "wDaoAddress" | |
9 | 9 | ||
10 | 10 | let kWDaoAmount = "wDaoAmount" | |
11 | 11 | ||
12 | 12 | let kWDaoLock = "wDaoLockPeriod" | |
13 | 13 | ||
14 | 14 | let kWDaoVesting = "wDaoVestingPeriod" | |
15 | 15 | ||
16 | 16 | let kWDaoWithdrawed = "wDaoWithdrawed" | |
17 | 17 | ||
18 | 18 | let kTeamAddress = "teamAddress" | |
19 | 19 | ||
20 | 20 | let kTeamAmount = "teamAmount" | |
21 | 21 | ||
22 | 22 | let kTeamLock = "teamLockPeriod" | |
23 | 23 | ||
24 | 24 | let kTeamVesting = "teamVestingPeriod" | |
25 | 25 | ||
26 | 26 | let kTeamWithdrawed = "teamWithdrawed" | |
27 | 27 | ||
28 | 28 | let kMarketingAmount = "marketAmount" | |
29 | 29 | ||
30 | 30 | let kMarketingWithdrawed = "marketingWithdrawed" | |
31 | 31 | ||
32 | 32 | let kPartnerAmount = "partnerAmount" | |
33 | 33 | ||
34 | 34 | let kPartnersWithdrawed = "partnersWithdrawed" | |
35 | 35 | ||
36 | 36 | let kRetroDropAmount = "retroDropAmount" | |
37 | 37 | ||
38 | 38 | let kRetroDropWithdrawed = "retroDropWithdrawed" | |
39 | 39 | ||
40 | 40 | let kLendRewardAmount = "lendRewardsAmount" | |
41 | 41 | ||
42 | 42 | let kLendRewardWithdrawed = "lendRewardWithdrawed" | |
43 | 43 | ||
44 | 44 | let kLPRewardAmount = "lpRewardAmount" | |
45 | 45 | ||
46 | 46 | let kLPRewardWithdrawed = "lpRewardWithdrawed" | |
47 | 47 | ||
48 | 48 | let kPoolInitAmount = "poolInitAmount" | |
49 | 49 | ||
50 | 50 | let kPoolInitWithdrawed = "poolInitWithdrawed" | |
51 | 51 | ||
52 | 52 | let kLaunchpadAmount = "launchpadAmount" | |
53 | 53 | ||
54 | 54 | let kLaunchpadWithdrawed = "launchpadWithdrawed" | |
55 | 55 | ||
56 | 56 | let kAXLYTokenId = "axlyTokenId" | |
57 | 57 | ||
58 | 58 | let kStartHeight = "startHeight" | |
59 | 59 | ||
60 | 60 | let kAdmin1PK = "group1_admin1_pub_key" | |
61 | 61 | ||
62 | 62 | let kAdmin2PK = "group1_admin2_pub_key" | |
63 | 63 | ||
64 | 64 | let kAdmin3PK = "group1_admin3_pub_key" | |
65 | 65 | ||
66 | 66 | let kAxlyMainContract = "mainContract" | |
67 | 67 | ||
68 | 68 | let kAxlyFarming = "farmingAddress" | |
69 | 69 | ||
70 | 70 | let mainContract = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyMainContract), "Can't get mainContact key")) | |
71 | 71 | ||
72 | 72 | let farmingAddress = addressFromStringValue(valueOrErrorMessage(getString(this, kAxlyFarming), "Can't get farmingAddress key")) | |
73 | 73 | ||
74 | 74 | let admin1PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin1PK), "Can't get admin1PK")) | |
75 | 75 | ||
76 | 76 | let admin2PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin2PK), "Can't get admin2PK")) | |
77 | 77 | ||
78 | 78 | let admin3PK = fromBase58String(valueOrErrorMessage(getString(mainContract, kAdmin3PK), "Can't get admin3PK")) | |
79 | 79 | ||
80 | 80 | let AXLYId = fromBase58String(getStringValue(this, kAXLYTokenId)) | |
81 | 81 | ||
82 | 82 | func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey)) | |
83 | 83 | then unit | |
84 | 84 | else throw("Only admin group1 can call this function") | |
85 | 85 | ||
86 | 86 | ||
87 | 87 | func isSelfCall (i) = if ((i.caller == this)) | |
88 | 88 | then unit | |
89 | 89 | else throw("Only contract itself can call this function") | |
90 | 90 | ||
91 | 91 | ||
92 | 92 | func isFarmingCall (i) = if ((i.caller == farmingAddress)) | |
93 | 93 | then unit | |
94 | 94 | else throw("Only farming contract can call this function") | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | func parsePercentParamToAmount (param) = { | |
98 | 98 | let percent = match param { | |
99 | 99 | case p: Int => | |
100 | 100 | p | |
101 | 101 | case p: String => | |
102 | 102 | valueOrErrorMessage(parseInt(p), "Can't parse percent in params") | |
103 | 103 | case _ => | |
104 | 104 | throw("Match error") | |
105 | 105 | } | |
106 | 106 | if (if ((0 >= percent)) | |
107 | 107 | then true | |
108 | 108 | else (percent >= PERCENT_SCALE)) | |
109 | 109 | then throw("percent must be number between 1(0.1) and 999(99.9)") | |
110 | 110 | else { | |
111 | 111 | let amount = fraction(INITIAL_TOKEN_AMOUNT, percent, PERCENT_SCALE) | |
112 | 112 | amount | |
113 | 113 | } | |
114 | 114 | } | |
115 | 115 | ||
116 | 116 | ||
117 | 117 | func parseLockVestingPeriod (lockStr,vestStr) = { | |
118 | 118 | let lockPeriod = valueOrErrorMessage(parseInt(lockStr), "Can't parse lock period") | |
119 | 119 | let vestingPeriod = valueOrErrorMessage(parseInt(vestStr), "Can't parse vesting period") | |
120 | 120 | if (if ((0 >= lockPeriod)) | |
121 | 121 | then true | |
122 | 122 | else (0 >= vestingPeriod)) | |
123 | 123 | then throw("lockPeriod and vestingPeriod must be greater than 0") | |
124 | 124 | else if ((lockPeriod > vestingPeriod)) | |
125 | 125 | then throw("vestingPeriod must be greater than lockPeriod") | |
126 | 126 | else $Tuple2(lockPeriod, vestingPeriod) | |
127 | 127 | } | |
128 | 128 | ||
129 | 129 | ||
130 | 130 | func validateAddress (aStr) = toString(valueOrErrorMessage(addressFromString(aStr), "Wrong address in params")) | |
131 | 131 | ||
132 | 132 | ||
133 | 133 | func parseWDAOTeamParams (params) = { | |
134 | 134 | let address = validateAddress(params[0]) | |
135 | 135 | let amount = parsePercentParamToAmount(params[1]) | |
136 | 136 | let $t045414619 = parseLockVestingPeriod(params[2], params[3]) | |
137 | 137 | let lockPeriod = $t045414619._1 | |
138 | 138 | let vestingPeriod = $t045414619._2 | |
139 | 139 | $Tuple4(address, amount, lockPeriod, vestingPeriod) | |
140 | 140 | } | |
141 | 141 | ||
142 | 142 | ||
143 | 143 | func parseParams (params) = { | |
144 | 144 | let address = validateAddress(params[0]) | |
145 | 145 | let amount = parsePercentParamToAmount(params[1]) | |
146 | 146 | $Tuple2(address, amount) | |
147 | 147 | } | |
148 | 148 | ||
149 | 149 | ||
150 | 150 | func withdrawTeamDao (totalAmount,lockPeriod,vestingPeriod,withdrawed,address,wKey) = { | |
151 | 151 | let startHeight = getIntegerValue(this, kStartHeight) | |
152 | 152 | let lockTill = (startHeight + lockPeriod) | |
153 | 153 | let vestingTill = ((startHeight + lockPeriod) + vestingPeriod) | |
154 | 154 | let canWithdraw = (fraction(totalAmount, min([(height - (startHeight + lockPeriod)), vestingTill]), vestingPeriod) - withdrawed) | |
155 | 155 | if ((lockTill >= height)) | |
156 | 156 | then throw("Lock period is not end") | |
157 | 157 | else if ((0 >= canWithdraw)) | |
158 | 158 | then throw("Nothing to withdraw") | |
159 | 159 | else [IntegerEntry(wKey, (withdrawed + canWithdraw)), ScriptTransfer(address, canWithdraw, AXLYId)] | |
160 | 160 | } | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func withdrawToOther (amount,totalAmount,withdrawed,address,wKey) = if (((withdrawed + amount) > totalAmount)) | |
164 | 164 | then throw(((("You can't withdraw more than " + toString(totalAmount)) + " already withdrawed: ") + toString(withdrawed))) | |
165 | 165 | else [IntegerEntry(wKey, (withdrawed + amount)), ScriptTransfer(address, amount, AXLYId)] | |
166 | 166 | ||
167 | 167 | ||
168 | 168 | @Callable(i) | |
169 | 169 | func init (wDaoParams,teamParams,marketingPercent,partnerPercent,retroDropPercent,lendRewardPercent,lpRewardPercent,poolInitPercent,launchpadPercent,mainContractAddr,farmingAddr) = valueOrElse(isSelfCall(i), if ((size(wDaoParams) != 4)) | |
170 | 170 | then throw("wDaoParams must have 4 args") | |
171 | 171 | else if ((size(teamParams) != 4)) | |
172 | 172 | then throw("teamParams must have 4 args") | |
173 | 173 | else if ((0 >= marketingPercent)) | |
174 | 174 | then throw("marketingPercent must be > 0") | |
175 | 175 | else if ((0 >= partnerPercent)) | |
176 | 176 | then throw("partnerPercent must be > 0") | |
177 | 177 | else if ((0 >= retroDropPercent)) | |
178 | 178 | then throw("retroDropPercent must be > 0") | |
179 | 179 | else if ((0 >= lendRewardPercent)) | |
180 | 180 | then throw("lendRewardParams must be > 0") | |
181 | 181 | else if ((0 >= lpRewardPercent)) | |
182 | 182 | then throw("lpRewardParams must be > 0") | |
183 | 183 | else if ((0 >= poolInitPercent)) | |
184 | 184 | then throw("poolInitParams must be > 0") | |
185 | 185 | else if (!(isDefined(addressFromString(farmingAddr)))) | |
186 | 186 | then throw("Wrong farming address") | |
187 | 187 | else if (!(isDefined(addressFromString(mainContractAddr)))) | |
188 | 188 | then throw("Wrong main contract address") | |
189 | 189 | else { | |
190 | 190 | let $t072527350 = parseWDAOTeamParams(wDaoParams) | |
191 | 191 | let wDaoAddress = $t072527350._1 | |
192 | 192 | let wDaoAmount = $t072527350._2 | |
193 | 193 | let wDaoLockPeriod = $t072527350._3 | |
194 | 194 | let wDaoVestingPeriod = $t072527350._4 | |
195 | 195 | let $t073537451 = parseWDAOTeamParams(teamParams) | |
196 | 196 | let teamAddress = $t073537451._1 | |
197 | 197 | let teamAmount = $t073537451._2 | |
198 | 198 | let teamLockPeriod = $t073537451._3 | |
199 | 199 | let teamVestingPeriod = $t073537451._4 | |
200 | 200 | let mAmount = parsePercentParamToAmount(marketingPercent) | |
201 | 201 | let pAmount = parsePercentParamToAmount(partnerPercent) | |
202 | 202 | let rAmount = parsePercentParamToAmount(retroDropPercent) | |
203 | 203 | let lAmount = parsePercentParamToAmount(lendRewardPercent) | |
204 | 204 | let lpAmount = parsePercentParamToAmount(lpRewardPercent) | |
205 | 205 | let piAmount = parsePercentParamToAmount(poolInitPercent) | |
206 | 206 | let laAmount = parsePercentParamToAmount(launchpadPercent) | |
207 | 207 | let sum = (((((((wDaoAmount + teamAmount) + mAmount) + pAmount) + rAmount) + lAmount) + lpAmount) + piAmount) | |
208 | 208 | if ((sum > INITIAL_TOKEN_AMOUNT)) | |
209 | 209 | then throw("Wrong percents( > 100%)") | |
210 | 210 | else { | |
211 | 211 | let issue = Issue("AXLY", "AXLY protocol token", INITIAL_TOKEN_AMOUNT, 8, false) | |
212 | 212 | let idStr = toBase58String(calculateAssetId(issue)) | |
213 | 213 | [StringEntry(kWDaoAddress, wDaoAddress), IntegerEntry(kWDaoAmount, wDaoAmount), IntegerEntry(kWDaoLock, wDaoLockPeriod), IntegerEntry(kWDaoVesting, wDaoVestingPeriod), StringEntry(kTeamAddress, teamAddress), IntegerEntry(kTeamAmount, teamAmount), IntegerEntry(kTeamLock, teamLockPeriod), IntegerEntry(kTeamVesting, teamVestingPeriod), IntegerEntry(kMarketingAmount, mAmount), IntegerEntry(kPartnerAmount, pAmount), IntegerEntry(kRetroDropAmount, rAmount), IntegerEntry(kLendRewardAmount, lAmount), IntegerEntry(kLPRewardAmount, lpAmount), IntegerEntry(kPoolInitAmount, piAmount), IntegerEntry(kLaunchpadAmount, laAmount), IntegerEntry(kStartHeight, height), StringEntry(kAxlyMainContract, mainContractAddr), StringEntry(kAxlyFarming, farmingAddr), issue, StringEntry(kAXLYTokenId, idStr)] | |
214 | 214 | } | |
215 | 215 | }) | |
216 | 216 | ||
217 | 217 | ||
218 | 218 | ||
219 | 219 | @Callable(i) | |
220 | 220 | func withdrawWDao () = { | |
221 | 221 | let amount = getIntegerValue(this, kWDaoAmount) | |
222 | 222 | let lockPeriod = getIntegerValue(this, kWDaoLock) | |
223 | 223 | let vestingPeriod = getIntegerValue(this, kWDaoVesting) | |
224 | 224 | let address = addressFromStringValue(getStringValue(this, kWDaoAddress)) | |
225 | 225 | let withdrawed = valueOrElse(getInteger(this, kWDaoWithdrawed), 0) | |
226 | 226 | withdrawTeamDao(amount, lockPeriod, vestingPeriod, withdrawed, address, kWDaoWithdrawed) | |
227 | 227 | } | |
228 | 228 | ||
229 | 229 | ||
230 | 230 | ||
231 | 231 | @Callable(i) | |
232 | 232 | func withdrawTeam () = { | |
233 | 233 | let amount = getIntegerValue(this, kTeamAmount) | |
234 | 234 | let lockPeriod = getIntegerValue(this, kTeamLock) | |
235 | 235 | let vestingPeriod = getIntegerValue(this, kTeamVesting) | |
236 | 236 | let address = addressFromStringValue(getStringValue(this, kTeamAddress)) | |
237 | 237 | let withdrawed = valueOrElse(getInteger(this, kTeamWithdrawed), 0) | |
238 | 238 | withdrawTeamDao(amount, lockPeriod, vestingPeriod, withdrawed, address, kTeamWithdrawed) | |
239 | 239 | } | |
240 | 240 | ||
241 | 241 | ||
242 | 242 | ||
243 | 243 | @Callable(i) | |
244 | 244 | func withdrawMarketing (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
245 | 245 | let totalAmount = getIntegerValue(this, kMarketingAmount) | |
246 | - | let withdrawed = | |
246 | + | let withdrawed = valueOrElse(getInteger(this, kMarketingWithdrawed), 0) | |
247 | 247 | let address = addressFromStringValue(addressStr) | |
248 | 248 | withdrawToOther(amount, totalAmount, withdrawed, address, kMarketingWithdrawed) | |
249 | 249 | }) | |
250 | 250 | ||
251 | 251 | ||
252 | 252 | ||
253 | 253 | @Callable(i) | |
254 | 254 | func withdrawPartners (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
255 | 255 | let totalAmount = getIntegerValue(this, kPartnerAmount) | |
256 | - | let withdrawed = | |
256 | + | let withdrawed = valueOrElse(getInteger(this, kPartnersWithdrawed), 0) | |
257 | 257 | let address = addressFromStringValue(addressStr) | |
258 | 258 | withdrawToOther(amount, totalAmount, withdrawed, address, kPartnersWithdrawed) | |
259 | 259 | }) | |
260 | 260 | ||
261 | 261 | ||
262 | 262 | ||
263 | 263 | @Callable(i) | |
264 | 264 | func withdrawRetroDraop (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
265 | 265 | let totalAmount = getIntegerValue(this, kRetroDropAmount) | |
266 | - | let withdrawed = | |
266 | + | let withdrawed = valueOrElse(getInteger(this, kRetroDropWithdrawed), 0) | |
267 | 267 | let address = addressFromStringValue(addressStr) | |
268 | 268 | withdrawToOther(amount, totalAmount, withdrawed, address, kRetroDropWithdrawed) | |
269 | 269 | }) | |
270 | 270 | ||
271 | 271 | ||
272 | 272 | ||
273 | 273 | @Callable(i) | |
274 | 274 | func withdrawPollInit (amount,addressStr) = valueOrElse(isSelfCall(i), { | |
275 | 275 | let totalAmount = getIntegerValue(this, kPoolInitAmount) | |
276 | - | let withdrawed = | |
276 | + | let withdrawed = valueOrElse(getInteger(this, kPoolInitWithdrawed), 0) | |
277 | 277 | let address = addressFromStringValue(addressStr) | |
278 | 278 | withdrawToOther(amount, totalAmount, withdrawed, address, kPoolInitWithdrawed) | |
279 | 279 | }) | |
280 | 280 | ||
281 | 281 | ||
282 | 282 | ||
283 | 283 | @Callable(i) | |
284 | 284 | func withdrawLendReward (amount,addressToStr) = valueOrElse(isFarmingCall(i), { | |
285 | 285 | let totalAmount = getIntegerValue(this, kLendRewardAmount) | |
286 | - | let withdrawed = | |
286 | + | let withdrawed = valueOrElse(getInteger(this, kLendRewardWithdrawed), 0) | |
287 | 287 | let address = addressFromStringValue(addressToStr) | |
288 | 288 | withdrawToOther(amount, totalAmount, withdrawed, address, kLendRewardWithdrawed) | |
289 | 289 | }) | |
290 | 290 | ||
291 | 291 | ||
292 | 292 | ||
293 | 293 | @Callable(i) | |
294 | 294 | func withdrawLpReward (amount,addressToStr) = valueOrElse(isFarmingCall(i), { | |
295 | 295 | let totalAmount = getIntegerValue(this, kLPRewardAmount) | |
296 | - | let withdrawed = | |
296 | + | let withdrawed = valueOrElse(getInteger(this, kLPRewardWithdrawed), 0) | |
297 | 297 | let address = addressFromStringValue(addressToStr) | |
298 | 298 | withdrawToOther(amount, totalAmount, withdrawed, address, kLPRewardWithdrawed) | |
299 | 299 | }) | |
300 | 300 | ||
301 | 301 | ||
302 | 302 | ||
303 | 303 | @Callable(i) | |
304 | 304 | func withdrawLaunchpad (amount,addressToStr) = valueOrElse(isSelfCall(i), { | |
305 | 305 | let totalAmount = getIntegerValue(this, kLaunchpadAmount) | |
306 | - | let withdrawed = | |
306 | + | let withdrawed = valueOrElse(getInteger(this, kLaunchpadWithdrawed), 0) | |
307 | 307 | let address = addressFromStringValue(addressToStr) | |
308 | 308 | withdrawToOther(amount, totalAmount, withdrawed, address, kLaunchpadWithdrawed) | |
309 | 309 | }) | |
310 | 310 | ||
311 | 311 | ||
312 | 312 | @Verifier(tx) | |
313 | 313 | func verify () = { | |
314 | 314 | let multiSignedByAdmins = { | |
315 | 315 | let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK)) | |
316 | 316 | then 1 | |
317 | 317 | else 0 | |
318 | 318 | let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK)) | |
319 | 319 | then 1 | |
320 | 320 | else 0 | |
321 | 321 | let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK)) | |
322 | 322 | then 1 | |
323 | 323 | else 0 | |
324 | 324 | (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2) | |
325 | 325 | } | |
326 | 326 | match tx { | |
327 | 327 | case inv: InvokeScriptTransaction => | |
328 | 328 | let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
329 | 329 | let isRightFee = if ((inv.fee == 100900000)) | |
330 | 330 | then (inv.feeAssetId == unit) | |
331 | 331 | else false | |
332 | 332 | let isInitCall = (inv.function == "init") | |
333 | 333 | let isnoPayments = (size(inv.payments) == 0) | |
334 | 334 | if (if (if (if (isRightFee) | |
335 | 335 | then isInitCall | |
336 | 336 | else false) | |
337 | 337 | then isSelf | |
338 | 338 | else false) | |
339 | 339 | then isnoPayments | |
340 | 340 | else false) | |
341 | 341 | then true | |
342 | 342 | else multiSignedByAdmins | |
343 | 343 | case _ => | |
344 | 344 | multiSignedByAdmins | |
345 | 345 | } | |
346 | 346 | } | |
347 | 347 |
github/deemru/w8io/026f985 54.49 ms ◑