tx · XPeLieLgFx5Htg62rhiuVn2b6WPxHBUJ2Qa2Gf8uZEc

3N2PjXqef29HexCE7PeGZa9eRjS2jVeaFe4:  -0.01500000 Waves

2023.09.11 14:38 [2750687] smart account 3N2PjXqef29HexCE7PeGZa9eRjS2jVeaFe4 > SELF 0.00000000 Waves

{ "type": 13, "id": "XPeLieLgFx5Htg62rhiuVn2b6WPxHBUJ2Qa2Gf8uZEc", "fee": 1500000, "feeAssetId": null, "timestamp": 1694432305992, "version": 2, "chainId": 84, "sender": "3N2PjXqef29HexCE7PeGZa9eRjS2jVeaFe4", "senderPublicKey": "DU1U4j8FqHUMRr9WgfF3yo67ULEFkjp7dtMWMpjBK1ar", "proofs": [ "jCZz663jbGCvWjwd3T7zewKMC31Vv2ZdvbFnUwnjsKh3pJpjUrPXTcL2h6HwCePBp69zJy2MC57wMspNED83AwB", "4uSgp5rnVnL3aX7azSrxUAQBagK2BQv77AqdQyH9G2nUAovvQKYYg9tP6YhMUY6erzdVjq6yUC88pWNWSdumziqz" ], "script": "base64:BgItCAISAwoBCBIHCgUICAgIARIAEgMKAQESABIAEgMKAQgSBQoDCAgIEgASABIAIgAGU0NBTEU4AIDC1y8ADVBFUkNFTlRfU0NBTEUAkE4ACVNFUEFSQVRPUgICX18ACWtJbnRlcmVzdAIIaW50ZXJlc3QADWtVc2VySW50ZXJlc3QCDV91c2VySW50ZXJlc3QADmtVc2VyQXZhaWxhYmxlAhNfdXNlckF2YWlsYWJsZUNsYWltABBrVXNlclRva2VuU3Rha2VkAhBfdXNlclRva2VuU3Rha2VkABFrVG90YWxUb2tlblN0YWtlZAIQdG90YWxUb2tlblN0YWtlZAAMa05GVEludGVyZXN0AgtORlRJbnRlcmVzdAAQa05GVFVzZXJJbnRlcmVzdAIQX05GVFVzZXJJbnRlcmVzdAAWa05GVFVzZXJBdmFpbGFibGVDbGFpbQIWX05GVFVzZXJBdmFpbGFibGVDbGFpbQAPa05GVFRvdGFsU3Rha2VkAg5ORlRUb3RhbFN0YWtlZAAOa3VzZXJORlRTdGFrZWQCDl91c2VyTkZUU3Rha2VkABBrdXNlck5GVFN0YWtlZElkAhBfdXNlck5GVFN0YWtlZElkAAtrTkZUQ3JlYXRlZAILX05GVENyZWF0ZWQADGtMYXN0QWlyZHJvcAIMX2xhc3RBaXJkcm9wAAhrVG9rZW5pZAIHdG9rZW5JZAAOa1BlcnNlbnRGb3JORlQCDXBlcmNlbnRGb3JORlQAD2tORlRDcmVhdGVkTGlzdAIObmZ0Q3JlYXRlZExpc3QAB2tBY3RpdmUCBmFjdGl2ZQAJa0FkbWluMVBLAgthZG1pbl9wdWJfMQAJa0FkbWluMlBLAgthZG1pbl9wdWJfMgAJa0FkbWluM1BLAgthZG1pbl9wdWJfMwAIYWRtaW4xUEsJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtBZG1pbjFQSwISQ2FuJ3QgZ2V0IGFkbWluMVBLAAhhZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa0FkbWluMlBLAhJDYW4ndCBnZXQgYWRtaW4yUEsACGFkbWluM1BLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQlrQWRtaW4zUEsCFENhbid0IGdldCBvcGVyYXRvclBLAAd0b2tlbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUIa1Rva2VuaWQCF0Nhbid0IGdldCBzdGFraW5nIHRva2VuAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFkbWluMVBLCQDMCAIFCGFkbWluMlBLCQDMCAIFCGFkbWluM1BLBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEJY2xhaW1DYWxjAQR1c2VyBBB0b3RhbFRva2VuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEWtUb3RhbFRva2VuU3Rha2VkAAAEC2N1ckludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCWtJbnRlcmVzdAAABBFhdmFpbGFibGVGb3JDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFDmtVc2VyQXZhaWxhYmxlAAAEDHVzZXJJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFDWtVc2VySW50ZXJlc3QFC2N1ckludGVyZXN0BA91c2VyVG9rZW5TdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRBrVXNlclRva2VuU3Rha2VkAAAEC2NsYWltQW1vdW50CQBrAwUPdXNlclRva2VuU3Rha2VkCQBlAgULY3VySW50ZXJlc3QFDHVzZXJJbnRlcmVzdAUGU0NBTEU4CQCWCgQFC2N1ckludGVyZXN0CQBkAgULY2xhaW1BbW91bnQFEWF2YWlsYWJsZUZvckNsYWltBQ91c2VyVG9rZW5TdGFrZWQFEHRvdGFsVG9rZW5TdGFrZWQBDGNsYWltQ2FsY05mdAEEdXNlcgQOdG90YWxOZnRTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa05GVFRvdGFsU3Rha2VkAAAEC2N1ckludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtORlRJbnRlcmVzdAAABBFhdmFpbGFibGVGb3JDbGFpbQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFmtORlRVc2VyQXZhaWxhYmxlQ2xhaW0AAAQMdXNlckludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa05GVFVzZXJJbnRlcmVzdAULY3VySW50ZXJlc3QEDXVzZXJOZnRTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBQ5rdXNlck5GVFN0YWtlZAAABAtjbGFpbUFtb3VudAkAaAIFDXVzZXJOZnRTdGFrZWQJAGUCBQtjdXJJbnRlcmVzdAUMdXNlckludGVyZXN0CQCWCgQFC2N1ckludGVyZXN0CQBkAgULY2xhaW1BbW91bnQFEWF2YWlsYWJsZUZvckNsYWltBQ11c2VyTmZ0U3Rha2VkBQ50b3RhbE5mdFN0YWtlZAEMY2FsY1Rva2VuQXByAAQLbGFzdEFpcmRyb3AJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa0xhc3RBaXJkcm9wAAAEEHRvdGFsVG9rZW5TdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwURa1RvdGFsVG9rZW5TdGFrZWQAAAQOdG90YWxORlRTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa05GVFRvdGFsU3Rha2VkAAAEDXBlcmNlbnRGb3JORlQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDmtQZXJzZW50Rm9yTkZUBAx0b2tlbkFpcmRyb3ADCQAAAgUOdG90YWxORlRTdGFrZWQAAAULbGFzdEFpcmRyb3AJAGsDBQtsYXN0QWlyZHJvcAkAlwMBCQDMCAIFDXBlcmNlbnRGb3JORlQJAMwIAgkAaAIFDnRvdGFsTkZUU3Rha2VkAAoFA25pbABkCQBoAgkAawMFDHRva2VuQWlyZHJvcAUNUEVSQ0VOVF9TQ0FMRQUQdG90YWxUb2tlblN0YWtlZAA0CwFpARRnZXRVc2VyU3RhdHNSRUFET05MWQEEdXNlcgQDYXByCQEMY2FsY1Rva2VuQXByAAQLJHQwMzYyOTQyMjgDCQAAAgUEdXNlcgIACQCWCgQAAAAAAAAAAAQIdXNlckFkZHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQR1c2VyAhJXcm9uZyB1c2VyIGFkZHJlc3MECyR0MDM4NjYzOTYyCQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAULJHQwMzg2NjM5NjICXzEEFGNsYWltQW1vdW50QXZhaWxhYmxlCAULJHQwMzg2NjM5NjICXzIED3VzZXJUb2tlblN0YWtlZAgFCyR0MDM4NjYzOTYyAl8zBBB0b3RhbFRva2VuU3Rha2VkCAULJHQwMzg2NjM5NjICXzQECyR0MDM5Njk0MDcwCQEMY2xhaW1DYWxjTmZ0AQUEdXNlcgQSdXNlck5ld0ludGVyZXN0TkZUCAULJHQwMzk2OTQwNzACXzEEF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUCAULJHQwMzk2OTQwNzACXzIEDXVzZXJORlRTdGFrZWQIBQskdDAzOTY5NDA3MAJfMwQOdG90YWxORlRTdGFrZWQIBQskdDAzOTY5NDA3MAJfNAQLdXNlckJhbGFuY2UJAPAHAgUIdXNlckFkZHIJANkEAQUHdG9rZW5JZAkAlgoEBQt1c2VyQmFsYW5jZQUPdXNlclRva2VuU3Rha2VkBRRjbGFpbUFtb3VudEF2YWlsYWJsZQUXY2xhaW1BbW91bnRBdmFpbGFibGVORlQEEHVzZXJUb2tlbkJhbGFuY2UIBQskdDAzNjI5NDIyOAJfMQQPdXNlclRva2VuU3Rha2VkCAULJHQwMzYyOTQyMjgCXzIEFGNsYWltQW1vdW50QXZhaWxhYmxlCAULJHQwMzYyOTQyMjgCXzMEF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUCAULJHQwMzYyOTQyMjgCXzQJAJQKAgUDbmlsCQC5CQIJAMwIAgIKJWQlZCVkJWQlZAkAzAgCCQCkAwEFA2FwcgkAzAgCCQCkAwEFEHVzZXJUb2tlbkJhbGFuY2UJAMwIAgkApAMBBQ91c2VyVG9rZW5TdGFrZWQJAMwIAgkApAMBBRRjbGFpbUFtb3VudEF2YWlsYWJsZQkAzAgCCQCkAwEFF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUBQNuaWwFCVNFUEFSQVRPUgFpAQRpbml0BQd0b2tlbklkB2FkbTFQdWIHYWRtMlB1YgdhZG0zUHViDHRvTkZUUGVyY2VudAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUIa1Rva2VuaWQJAAIBAhNEQXBwIGFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFB3Rva2VuSWQJAAIBAiBhc3NldCBpZCBpcyBub3QgY29ycmVjdCBhc3NldCBpZAMJAQIhPQIJAMgBAQkA2QQBBQdhZG0xUHViACAJAAIBAiFncm91cDFBZG1pbjFQdWJLZXkgaXMgbm90IGNvcnJlY3QDCQECIT0CCQDIAQEJANkEAQUHYWRtMlB1YgAgCQACAQIhZ3JvdXAxQWRtaW4xUHViS2V5IGlzIG5vdCBjb3JyZWN0AwkBAiE9AgkAyAEBCQDZBAEFB2FkbTNQdWIAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQhrVG9rZW5pZAUHdG9rZW5JZAkAzAgCCQELU3RyaW5nRW50cnkCBQlrQWRtaW4xUEsFB2FkbTFQdWIJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0FkbWluMlBLBQdhZG0yUHViCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBZG1pbjNQSwUHYWRtM1B1YgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa1BlcnNlbnRGb3JORlQFDHRvTkZUUGVyY2VudAUDbmlsAWkBBXN0YWtlAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFE9uZSBwYXltZW50IGV4cGVjdGVkBAskdDA1NDMxNTUwNgkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAlwbXRBbW91bnQIBQskdDA1NDMxNTUwNgJfMQQKcG10QXNzZXRJZAgFCyR0MDU0MzE1NTA2Al8yAwkBAiE9AgUKcG10QXNzZXRJZAkA2QQBBQd0b2tlbklkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQEdXNlcgkApQgBCAUBaQZjYWxsZXIECyR0MDU2Mjc1NzIzCQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAULJHQwNTYyNzU3MjMCXzEEFGNsYWltQW1vdW50QXZhaWxhYmxlCAULJHQwNTYyNzU3MjMCXzIED3VzZXJUb2tlblN0YWtlZAgFCyR0MDU2Mjc1NzIzAl8zBBB0b3RhbFRva2VuU3Rha2VkCAULJHQwNTYyNzU3MjMCXzQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUNa1VzZXJJbnRlcmVzdAUPdXNlck5ld0ludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFDmtVc2VyQXZhaWxhYmxlBRRjbGFpbUFtb3VudEF2YWlsYWJsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclRva2VuU3Rha2VkCQBkAgUPdXNlclRva2VuU3Rha2VkBQlwbXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtUb3RhbFRva2VuU3Rha2VkCQBkAgUQdG90YWxUb2tlblN0YWtlZAUJcG10QW1vdW50BQNuaWwBaQEHdW5zdGFrZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAR1c2VyCQClCAEIBQFpBmNhbGxlcgMJAGcCAAAFBmFtb3VudAkAAgECHUFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwBAskdDA2MTYxNjI1NwkBCWNsYWltQ2FsYwEFBHVzZXIED3VzZXJOZXdJbnRlcmVzdAgFCyR0MDYxNjE2MjU3Al8xBBRjbGFpbUFtb3VudEF2YWlsYWJsZQgFCyR0MDYxNjE2MjU3Al8yBA91c2VyVG9rZW5TdGFrZWQIBQskdDA2MTYxNjI1NwJfMwQQdG90YWxUb2tlblN0YWtlZAgFCyR0MDYxNjE2MjU3Al80AwkAZgIFBmFtb3VudAUPdXNlclRva2VuU3Rha2VkCQACAQIiWW91IGNhbid0IHVuc3Rha2UgbW9yZSB0aGFuIHN0YWtlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ1rVXNlckludGVyZXN0BQ91c2VyTmV3SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUOa1VzZXJBdmFpbGFibGUFFGNsYWltQW1vdW50QXZhaWxhYmxlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyVG9rZW5TdGFrZWQJAGUCBQ91c2VyVG9rZW5TdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1RvdGFsVG9rZW5TdGFrZWQJAGUCBRB0b3RhbFRva2VuU3Rha2VkBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHdG9rZW5JZAUDbmlsAWkBBWNsYWltAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIECyR0MDY3NjM2ODU5CQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAULJHQwNjc2MzY4NTkCXzEEFGNsYWltQW1vdW50QXZhaWxhYmxlCAULJHQwNjc2MzY4NTkCXzIED3VzZXJUb2tlblN0YWtlZAgFCyR0MDY3NjM2ODU5Al8zBBB0b3RhbFRva2VuU3Rha2VkCAULJHQwNjc2MzY4NTkCXzQECyR0MDY4NjI2OTYzCQEMY2xhaW1DYWxjTmZ0AQUEdXNlcgQSdXNlck5ld0ludGVyZXN0TkZUCAULJHQwNjg2MjY5NjMCXzEEF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUCAULJHQwNjg2MjY5NjMCXzIEDXVzZXJORlRTdGFrZWQIBQskdDA2ODYyNjk2MwJfMwQOdG90YWxORlRTdGFrZWQIBQskdDA2ODYyNjk2MwJfNAMJAAACCQBkAgUUY2xhaW1BbW91bnRBdmFpbGFibGUFF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUAAAJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFDWtVc2VySW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ5rVXNlckF2YWlsYWJsZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtORlRVc2VySW50ZXJlc3QFEnVzZXJOZXdJbnRlcmVzdE5GVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRZrTkZUVXNlckF2YWlsYWJsZUNsYWltAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBkAgUUY2xhaW1BbW91bnRBdmFpbGFibGUFF2NsYWltQW1vdW50QXZhaWxhYmxlTkZUCQDZBAEFB3Rva2VuSWQFA25pbAFpAQhzdGFrZU5GVAAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhRPbmUgcGF5bWVudCBleHBlY3RlZAQLJHQwNzUxOTc1OTQJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNzUxOTc1OTQCXzEECnBtdEFzc2V0SWQIBQskdDA3NTE5NzU5NAJfMgQNcG10QXNzZXRJZFN0cgkBDGFzc2V0SWRUb1N0cgEFCnBtdEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUNcG10QXNzZXRJZFN0cgULa05GVENyZWF0ZWQJAAIBAg9Xcm9uZyBuZnQgYXNzZXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAskdDA3Nzc1Nzg3MAkBDGNsYWltQ2FsY05mdAEFBHVzZXIED3VzZXJOZXdJbnRlcmVzdAgFCyR0MDc3NzU3ODcwAl8xBBRjbGFpbUFtb3VudEF2YWlsYWJsZQgFCyR0MDc3NzU3ODcwAl8yBA11c2VyTkZUU3Rha2VkCAULJHQwNzc3NTc4NzACXzMEDnRvdGFsTkZUU3Rha2VkCAULJHQwNzc3NTc4NzACXzQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUQa05GVFVzZXJJbnRlcmVzdAUPdXNlck5ld0ludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFFmtORlRVc2VyQXZhaWxhYmxlQ2xhaW0FFGNsYWltQW1vdW50QXZhaWxhYmxlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFDmt1c2VyTkZUU3Rha2VkCQBkAgUNdXNlck5GVFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rTkZUVG90YWxTdGFrZWQJAGQCBQ50b3RhbE5GVFN0YWtlZAABCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQ1wbXRBc3NldElkU3RyBRBrdXNlck5GVFN0YWtlZElkBgUDbmlsAWkBCnVuc3Rha2VORlQBAmlkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAR1c2VyCQClCAEIBQFpBmNhbGxlcgMJAQlpc0RlZmluZWQBCQCbCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FAmlkBRBrdXNlck5GVFN0YWtlZElkCQACAQIRWW91IGRpZG4ndCBzdGFrZWQECyR0MDg0MDc4NTAyCQEMY2xhaW1DYWxjTmZ0AQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAULJHQwODQwNzg1MDICXzEEFGNsYWltQW1vdW50QXZhaWxhYmxlCAULJHQwODQwNzg1MDICXzIEDXVzZXJORlRTdGFrZWQIBQskdDA4NDA3ODUwMgJfMwQOdG90YWxORlRTdGFrZWQIBQskdDA4NDA3ODUwMgJfNAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrTkZUVXNlckludGVyZXN0BQ91c2VyTmV3SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUWa05GVFVzZXJBdmFpbGFibGVDbGFpbQUUY2xhaW1BbW91bnRBdmFpbGFibGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUOa3VzZXJORlRTdGFrZWQJAGUCBQ11c2VyTkZUU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tORlRUb3RhbFN0YWtlZAkAZQIFDnRvdGFsTkZUU3Rha2VkAAEJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUCaWQFEGt1c2VyTkZUU3Rha2VkSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQUCaWQFA25pbAFpAQhpc3N1ZU5GVAMIdXNlckFkZHIEbmFtZQVkZXNjcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQFdUFkZHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQh1c2VyQWRkcgISV3JvbmcgdXNlciBhZGRyZXNzBAVpc3N1ZQkAwggFBQRuYW1lBQVkZXNjcgABAAAHBAVuZnRJZAkAuAgBBQVpc3N1ZQQHbmZ0TGlzdAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ9rTkZUQ3JlYXRlZExpc3QCAAQKbmV3TmZ0TGlzdAkArAICBQduZnRMaXN0AwkBAiE9AgUHbmZ0TGlzdAIABQlTRVBBUkFUT1IJAKwCAgIACQDYBAEFBW5mdElkCQDMCAIFBWlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkA2AQBBQVuZnRJZAULa05GVENyZWF0ZWQFCHVzZXJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tORlRDcmVhdGVkTGlzdAUKbmV3TmZ0TGlzdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQV1QWRkcgABBQVuZnRJZAUDbmlsAWkBB2FpcmRyb3AACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIUT25lIHBheW1lbnQgZXhwZWN0ZWQECyR0MDk2NDc5NzIyCQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFCyR0MDk2NDc5NzIyAl8xBApwbXRBc3NldElkCAULJHQwOTY0Nzk3MjICXzIDCQECIT0CBQpwbXRBc3NldElkCQDZBAEFB3Rva2VuSWQJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0BA1wZXJjZW50Rm9yTkZUCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ5rUGVyc2VudEZvck5GVAQQdG90YWxUb2tlblN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrVG90YWxUb2tlblN0YWtlZAAABA50b3RhbE5GVFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rTkZUVG90YWxTdGFrZWQAAAQLY3VySW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUJa0ludGVyZXN0AAAEDmN1ck5GVEludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDGtORlRJbnRlcmVzdAAABA0kdDAxMDE0NTEwMzQ5AwkAAAIFDnRvdGFsTkZUU3Rha2VkAAAJAJQKAgAABQlwbXRBbW91bnQEBG5mdFAJAGsDBQlwbXRBbW91bnQJAJcDAQkAzAgCBQ1wZXJjZW50Rm9yTkZUCQDMCAIJAGgCBQ50b3RhbE5GVFN0YWtlZAAKBQNuaWwAZAkAlAoCBQRuZnRQCQBlAgUJcG10QW1vdW50BQRuZnRQBAZwbXRORlQIBQ0kdDAxMDE0NTEwMzQ5Al8xBAhwbXRUb2tlbggFDSR0MDEwMTQ1MTAzNDkCXzIEC2ludGVyZXN0TmV3AwkAZgIFEHRvdGFsVG9rZW5TdGFrZWQAAAkAZAIFC2N1ckludGVyZXN0CQBrAwUIcG10VG9rZW4FBlNDQUxFOAUQdG90YWxUb2tlblN0YWtlZAULY3VySW50ZXJlc3QEDmludGVyZXN0TkZUTmV3AwkAZgIFDnRvdGFsTkZUU3Rha2VkAAAJAGQCBQ5jdXJORlRJbnRlcmVzdAkAaQIFBnBtdE5GVAUOdG90YWxORlRTdGFrZWQFDmN1ck5GVEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrSW50ZXJlc3QFC2ludGVyZXN0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrTkZUSW50ZXJlc3QFDmludGVyZXN0TkZUTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrTGFzdEFpcmRyb3AFCXBtdEFtb3VudAUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhNkQXBwIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgkAAgECFWRBcHAgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcFA25pbAECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCGFkbWluMVBLAAEAAAQSYWRtaW5QdWJLZXkyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAQUIYWRtaW4yUEsAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQhhZG1pbjNQSwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAQGaXNTZWxmCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAppc1JpZ2h0RmVlAwkAAAIIBQNpbnYDZmVlAKD3NgkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcECmlzSW5pdENhbGwJAAACCAUDaW52CGZ1bmN0aW9uAgRpbml0BAxpc25vUGF5bWVudHMJAAACCQCQAwEIBQNpbnYIcGF5bWVudHMAAAMDAwMFCmlzUmlnaHRGZWUFCmlzSW5pdENhbGwHBQZpc1NlbGYHBQxpc25vUGF5bWVudHMHBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluc+rjKAo=", "height": 2750687, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CoSnShRbEYaTKsKRLMDT9vzqAy66izyZHP62wyt21Tci Next: 4ipPRY1tfDjXYHf3RgACkpV6xWnLcAF4ihmfxhQifYmQ Diff:
OldNewDifferences
3636 let kTokenid = "tokenId"
3737
3838 let kPersentForNFT = "percentForNFT"
39+
40+let kNFTCreatedList = "nftCreatedList"
3941
4042 let kActive = "active"
4143
107109 let percentForNFT = getIntegerValue(this, kPersentForNFT)
108110 let tokenAirdrop = if ((totalNFTStaked == 0))
109111 then lastAirdrop
110- else fraction(lastAirdrop, percentForNFT, 100)
112+ else fraction(lastAirdrop, min([percentForNFT, (totalNFTStaked * 10)]), 100)
111113 (fraction(tokenAirdrop, PERCENT_SCALE, totalTokenStaked) * 52)
112114 }
113115
115117 @Callable(i)
116118 func getUserStatsREADONLY (user) = {
117119 let apr = calcTokenApr()
118- let $t035603998 = if ((user == ""))
119- then $Tuple3(0, 0, 0)
120+ let $t036294228 = if ((user == ""))
121+ then $Tuple4(0, 0, 0, 0)
120122 else {
121123 let userAddr = valueOrErrorMessage(addressFromString(user), "Wrong user address")
122- let $t037693865 = claimCalc(user)
123- let userNewInterest = $t037693865._1
124- let claimAmountAvailable = $t037693865._2
125- let userTokenStaked = $t037693865._3
126- let totalTokenStaked = $t037693865._4
124+ let $t038663962 = claimCalc(user)
125+ let userNewInterest = $t038663962._1
126+ let claimAmountAvailable = $t038663962._2
127+ let userTokenStaked = $t038663962._3
128+ let totalTokenStaked = $t038663962._4
129+ let $t039694070 = claimCalcNft(user)
130+ let userNewInterestNFT = $t039694070._1
131+ let claimAmountAvailableNFT = $t039694070._2
132+ let userNFTStaked = $t039694070._3
133+ let totalNFTStaked = $t039694070._4
127134 let userBalance = assetBalance(userAddr, fromBase58String(tokenId))
128- $Tuple3(userBalance, userTokenStaked, claimAmountAvailable)
135+ $Tuple4(userBalance, userTokenStaked, claimAmountAvailable, claimAmountAvailableNFT)
129136 }
130- let userTokenBalance = $t035603998._1
131- let userTokenStaked = $t035603998._2
132- let claimAmountAvailable = $t035603998._3
133- $Tuple2(nil, makeString(["%d%d%d%d", toString(apr), toString(userTokenBalance), toString(userTokenStaked), toString(claimAmountAvailable)], SEPARATOR))
137+ let userTokenBalance = $t036294228._1
138+ let userTokenStaked = $t036294228._2
139+ let claimAmountAvailable = $t036294228._3
140+ let claimAmountAvailableNFT = $t036294228._4
141+ $Tuple2(nil, makeString(["%d%d%d%d%d", toString(apr), toString(userTokenBalance), toString(userTokenStaked), toString(claimAmountAvailable), toString(claimAmountAvailableNFT)], SEPARATOR))
134142 }
135143
136144
154162 func stake () = valueOrElse(isActive(), if ((size(i.payments) != 1))
155163 then throw("One payment expected")
156164 else {
157- let $t051575232 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
158- let pmtAmount = $t051575232._1
159- let pmtAssetId = $t051575232._2
165+ let $t054315506 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
166+ let pmtAmount = $t054315506._1
167+ let pmtAssetId = $t054315506._2
160168 if ((pmtAssetId != fromBase58String(tokenId)))
161169 then throw("Wrong payment asset")
162170 else {
163171 let user = toString(i.caller)
164- let $t053535449 = claimCalc(user)
165- let userNewInterest = $t053535449._1
166- let claimAmountAvailable = $t053535449._2
167- let userTokenStaked = $t053535449._3
168- let totalTokenStaked = $t053535449._4
172+ let $t056275723 = claimCalc(user)
173+ let userNewInterest = $t056275723._1
174+ let claimAmountAvailable = $t056275723._2
175+ let userTokenStaked = $t056275723._3
176+ let totalTokenStaked = $t056275723._4
169177 [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), claimAmountAvailable), IntegerEntry((user + kUserTokenStaked), (userTokenStaked + pmtAmount)), IntegerEntry(kTotalTokenStaked, (totalTokenStaked + pmtAmount))]
170178 }
171179 })
178186 if ((0 >= amount))
179187 then throw("Amount must be greater than 0")
180188 else {
181- let $t058875983 = claimCalc(user)
182- let userNewInterest = $t058875983._1
183- let claimAmountAvailable = $t058875983._2
184- let userTokenStaked = $t058875983._3
185- let totalTokenStaked = $t058875983._4
189+ let $t061616257 = claimCalc(user)
190+ let userNewInterest = $t061616257._1
191+ let claimAmountAvailable = $t061616257._2
192+ let userTokenStaked = $t061616257._3
193+ let totalTokenStaked = $t061616257._4
186194 if ((amount > userTokenStaked))
187195 then throw("You can't unstake more than staked")
188196 else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), claimAmountAvailable), IntegerEntry((user + kUserTokenStaked), (userTokenStaked - amount)), IntegerEntry(kTotalTokenStaked, (totalTokenStaked - amount)), ScriptTransfer(i.caller, amount, fromBase58String(tokenId))]
194202 @Callable(i)
195203 func claim () = valueOrElse(isActive(), {
196204 let user = toString(i.caller)
197- let $t064896585 = claimCalc(user)
198- let userNewInterest = $t064896585._1
199- let claimAmountAvailable = $t064896585._2
200- let userTokenStaked = $t064896585._3
201- let totalTokenStaked = $t064896585._4
202- if ((claimAmountAvailable == 0))
205+ let $t067636859 = claimCalc(user)
206+ let userNewInterest = $t067636859._1
207+ let claimAmountAvailable = $t067636859._2
208+ let userTokenStaked = $t067636859._3
209+ let totalTokenStaked = $t067636859._4
210+ let $t068626963 = claimCalcNft(user)
211+ let userNewInterestNFT = $t068626963._1
212+ let claimAmountAvailableNFT = $t068626963._2
213+ let userNFTStaked = $t068626963._3
214+ let totalNFTStaked = $t068626963._4
215+ if (((claimAmountAvailable + claimAmountAvailableNFT) == 0))
203216 then throw("Nothing to claim")
204- else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), 0), ScriptTransfer(i.caller, claimAmountAvailable, fromBase58String(tokenId))]
217+ else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), 0), IntegerEntry((user + kNFTUserInterest), userNewInterestNFT), IntegerEntry((user + kNFTUserAvailableClaim), 0), ScriptTransfer(i.caller, (claimAmountAvailable + claimAmountAvailableNFT), fromBase58String(tokenId))]
205218 })
206219
207220
210223 func stakeNFT () = valueOrElse(isActive(), if ((size(i.payments) != 1))
211224 then throw("One payment expected")
212225 else {
213- let $t069747049 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
214- let pmtAmount = $t069747049._1
215- let pmtAssetId = $t069747049._2
226+ let $t075197594 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
227+ let pmtAmount = $t075197594._1
228+ let pmtAssetId = $t075197594._2
216229 let pmtAssetIdStr = assetIdToStr(pmtAssetId)
217230 if (!(isDefined(getString(this, (pmtAssetIdStr + kNFTCreated)))))
218231 then throw("Wrong nft asset")
219232 else {
220233 let user = toString(i.caller)
221- let $t072307325 = claimCalcNft(user)
222- let userNewInterest = $t072307325._1
223- let claimAmountAvailable = $t072307325._2
224- let userNFTStaked = $t072307325._3
225- let totalNFTStaked = $t072307325._4
226-[IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked + pmtAmount)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked + pmtAmount)), IntegerEntry((((user + "_") + pmtAssetIdStr) + kuserNFTStakedId), 1)]
234+ let $t077757870 = claimCalcNft(user)
235+ let userNewInterest = $t077757870._1
236+ let claimAmountAvailable = $t077757870._2
237+ let userNFTStaked = $t077757870._3
238+ let totalNFTStaked = $t077757870._4
239+[IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked + 1)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked + 1)), BooleanEntry((((user + "_") + pmtAssetIdStr) + kuserNFTStakedId), true)]
227240 }
228241 })
229242
232245 @Callable(i)
233246 func unstakeNFT (id) = valueOrElse(isActive(), {
234247 let user = toString(i.caller)
235- if (isDefined(getString(this, (((user + id) + "_") + kuserNFTStakedId))))
248+ if (isDefined(getBoolean(this, (((user + "_") + id) + kuserNFTStakedId))))
236249 then throw("You didn't staked")
237250 else {
238- let $t078747969 = claimCalcNft(user)
239- let userNewInterest = $t078747969._1
240- let claimAmountAvailable = $t078747969._2
241- let userNFTStaked = $t078747969._3
242- let totalNFTStaked = $t078747969._4
251+ let $t084078502 = claimCalcNft(user)
252+ let userNewInterest = $t084078502._1
253+ let claimAmountAvailable = $t084078502._2
254+ let userNFTStaked = $t084078502._3
255+ let totalNFTStaked = $t084078502._4
243256 [IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked - 1)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked - 1)), DeleteEntry((((user + "_") + id) + kuserNFTStakedId)), ScriptTransfer(i.caller, 1, fromBase58String(id))]
244257 }
245- })
246-
247-
248-
249-@Callable(i)
250-func claimNFT () = valueOrElse(isActive(), {
251- let user = toString(i.caller)
252- let $t084278522 = claimCalcNft(user)
253- let userNewInterest = $t084278522._1
254- let claimAmountAvailable = $t084278522._2
255- let userNFTStaked = $t084278522._3
256- let totalNFTStaked = $t084278522._4
257- if ((claimAmountAvailable == 0))
258- then throw("Nothing to claim")
259- else [IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), 0), ScriptTransfer(i.caller, claimAmountAvailable, fromBase58String(tokenId))]
260258 })
261259
262260
266264 let uAddr = valueOrErrorMessage(addressFromString(userAddr), "Wrong user address")
267265 let issue = Issue(name, descr, 1, 0, false)
268266 let nftId = calculateAssetId(issue)
269-[issue, StringEntry((toBase58String(nftId) + kNFTCreated), userAddr), ScriptTransfer(uAddr, 1, nftId)]
267+ let nftList = valueOrElse(getString(this, kNFTCreatedList), "")
268+ let newNftList = (nftList + (if ((nftList != ""))
269+ then SEPARATOR
270+ else ("" + toBase58String(nftId))))
271+[issue, StringEntry((toBase58String(nftId) + kNFTCreated), userAddr), StringEntry(kNFTCreatedList, newNftList), ScriptTransfer(uAddr, 1, nftId)]
270272 }))
271273
272274
275277 func airdrop () = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if ((size(i.payments) != 1))
276278 then throw("One payment expected")
277279 else {
278- let $t093709445 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
279- let pmtAmount = $t093709445._1
280- let pmtAssetId = $t093709445._2
280+ let $t096479722 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
281+ let pmtAmount = $t096479722._1
282+ let pmtAssetId = $t096479722._2
281283 if ((pmtAssetId != fromBase58String(tokenId)))
282284 then throw("Wrong payment asset")
283285 else {
286288 let totalNFTStaked = valueOrElse(getInteger(this, kNFTTotalStaked), 0)
287289 let curInterest = valueOrElse(getInteger(this, kInterest), 0)
288290 let curNFTInterest = valueOrElse(getInteger(this, kNFTInterest), 0)
289- let $t0986810043 = if ((totalNFTStaked == 0))
291+ let $t01014510349 = if ((totalNFTStaked == 0))
290292 then $Tuple2(0, pmtAmount)
291293 else {
292- let nftP = fraction(pmtAmount, percentForNFT, 100)
294+ let nftP = fraction(pmtAmount, min([percentForNFT, (totalNFTStaked * 10)]), 100)
293295 $Tuple2(nftP, (pmtAmount - nftP))
294296 }
295- let pmtNFT = $t0986810043._1
296- let pmtToken = $t0986810043._2
297+ let pmtNFT = $t01014510349._1
298+ let pmtToken = $t01014510349._2
297299 let interestNew = if ((totalTokenStaked > 0))
298300 then (curInterest + fraction(pmtToken, SCALE8, totalTokenStaked))
299301 else curInterest
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 100000000
55
66 let PERCENT_SCALE = 10000
77
88 let SEPARATOR = "__"
99
1010 let kInterest = "interest"
1111
1212 let kUserInterest = "_userInterest"
1313
1414 let kUserAvailable = "_userAvailableClaim"
1515
1616 let kUserTokenStaked = "_userTokenStaked"
1717
1818 let kTotalTokenStaked = "totalTokenStaked"
1919
2020 let kNFTInterest = "NFTInterest"
2121
2222 let kNFTUserInterest = "_NFTUserInterest"
2323
2424 let kNFTUserAvailableClaim = "_NFTUserAvailableClaim"
2525
2626 let kNFTTotalStaked = "NFTTotalStaked"
2727
2828 let kuserNFTStaked = "_userNFTStaked"
2929
3030 let kuserNFTStakedId = "_userNFTStakedId"
3131
3232 let kNFTCreated = "_NFTCreated"
3333
3434 let kLastAirdrop = "_lastAirdrop"
3535
3636 let kTokenid = "tokenId"
3737
3838 let kPersentForNFT = "percentForNFT"
39+
40+let kNFTCreatedList = "nftCreatedList"
3941
4042 let kActive = "active"
4143
4244 let kAdmin1PK = "admin_pub_1"
4345
4446 let kAdmin2PK = "admin_pub_2"
4547
4648 let kAdmin3PK = "admin_pub_3"
4749
4850 let admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kAdmin1PK), "Can't get admin1PK"))
4951
5052 let admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kAdmin2PK), "Can't get admin2PK"))
5153
5254 let admin3PK = fromBase58String(valueOrErrorMessage(getString(this, kAdmin3PK), "Can't get operatorPK"))
5355
5456 let tokenId = valueOrErrorMessage(getString(this, kTokenid), "Can't get staking token")
5557
5658 func isAdminCall (i) = if (containsElement([admin1PK, admin2PK, admin3PK], i.callerPublicKey))
5759 then unit
5860 else throw("Only admin can call this function")
5961
6062
6163 func isSelfCall (i) = if ((i.caller == this))
6264 then unit
6365 else throw("Only contract itself can call this function")
6466
6567
6668 func isActive () = if (valueOrElse(getBoolean(this, kActive), true))
6769 then unit
6870 else throw("DApp is inactive at this moment")
6971
7072
7173 func assetIdToStr (assetId) = match assetId {
7274 case id: ByteVector =>
7375 toBase58String(id)
7476 case waves: Unit =>
7577 "WAVES"
7678 case _ =>
7779 throw("Not Asset id")
7880 }
7981
8082
8183 func claimCalc (user) = {
8284 let totalTokenStaked = valueOrElse(getInteger(this, kTotalTokenStaked), 0)
8385 let curInterest = valueOrElse(getInteger(this, kInterest), 0)
8486 let availableForClaim = valueOrElse(getInteger(this, (user + kUserAvailable)), 0)
8587 let userInterest = valueOrElse(getInteger(this, (user + kUserInterest)), curInterest)
8688 let userTokenStaked = valueOrElse(getInteger(this, (user + kUserTokenStaked)), 0)
8789 let claimAmount = fraction(userTokenStaked, (curInterest - userInterest), SCALE8)
8890 $Tuple4(curInterest, (claimAmount + availableForClaim), userTokenStaked, totalTokenStaked)
8991 }
9092
9193
9294 func claimCalcNft (user) = {
9395 let totalNftStaked = valueOrElse(getInteger(this, kNFTTotalStaked), 0)
9496 let curInterest = valueOrElse(getInteger(this, kNFTInterest), 0)
9597 let availableForClaim = valueOrElse(getInteger(this, (user + kNFTUserAvailableClaim)), 0)
9698 let userInterest = valueOrElse(getInteger(this, (user + kNFTUserInterest)), curInterest)
9799 let userNftStaked = valueOrElse(getInteger(this, (user + kuserNFTStaked)), 0)
98100 let claimAmount = (userNftStaked * (curInterest - userInterest))
99101 $Tuple4(curInterest, (claimAmount + availableForClaim), userNftStaked, totalNftStaked)
100102 }
101103
102104
103105 func calcTokenApr () = {
104106 let lastAirdrop = valueOrElse(getInteger(this, kLastAirdrop), 0)
105107 let totalTokenStaked = valueOrElse(getInteger(this, kTotalTokenStaked), 0)
106108 let totalNFTStaked = valueOrElse(getInteger(this, kNFTTotalStaked), 0)
107109 let percentForNFT = getIntegerValue(this, kPersentForNFT)
108110 let tokenAirdrop = if ((totalNFTStaked == 0))
109111 then lastAirdrop
110- else fraction(lastAirdrop, percentForNFT, 100)
112+ else fraction(lastAirdrop, min([percentForNFT, (totalNFTStaked * 10)]), 100)
111113 (fraction(tokenAirdrop, PERCENT_SCALE, totalTokenStaked) * 52)
112114 }
113115
114116
115117 @Callable(i)
116118 func getUserStatsREADONLY (user) = {
117119 let apr = calcTokenApr()
118- let $t035603998 = if ((user == ""))
119- then $Tuple3(0, 0, 0)
120+ let $t036294228 = if ((user == ""))
121+ then $Tuple4(0, 0, 0, 0)
120122 else {
121123 let userAddr = valueOrErrorMessage(addressFromString(user), "Wrong user address")
122- let $t037693865 = claimCalc(user)
123- let userNewInterest = $t037693865._1
124- let claimAmountAvailable = $t037693865._2
125- let userTokenStaked = $t037693865._3
126- let totalTokenStaked = $t037693865._4
124+ let $t038663962 = claimCalc(user)
125+ let userNewInterest = $t038663962._1
126+ let claimAmountAvailable = $t038663962._2
127+ let userTokenStaked = $t038663962._3
128+ let totalTokenStaked = $t038663962._4
129+ let $t039694070 = claimCalcNft(user)
130+ let userNewInterestNFT = $t039694070._1
131+ let claimAmountAvailableNFT = $t039694070._2
132+ let userNFTStaked = $t039694070._3
133+ let totalNFTStaked = $t039694070._4
127134 let userBalance = assetBalance(userAddr, fromBase58String(tokenId))
128- $Tuple3(userBalance, userTokenStaked, claimAmountAvailable)
135+ $Tuple4(userBalance, userTokenStaked, claimAmountAvailable, claimAmountAvailableNFT)
129136 }
130- let userTokenBalance = $t035603998._1
131- let userTokenStaked = $t035603998._2
132- let claimAmountAvailable = $t035603998._3
133- $Tuple2(nil, makeString(["%d%d%d%d", toString(apr), toString(userTokenBalance), toString(userTokenStaked), toString(claimAmountAvailable)], SEPARATOR))
137+ let userTokenBalance = $t036294228._1
138+ let userTokenStaked = $t036294228._2
139+ let claimAmountAvailable = $t036294228._3
140+ let claimAmountAvailableNFT = $t036294228._4
141+ $Tuple2(nil, makeString(["%d%d%d%d%d", toString(apr), toString(userTokenBalance), toString(userTokenStaked), toString(claimAmountAvailable), toString(claimAmountAvailableNFT)], SEPARATOR))
134142 }
135143
136144
137145
138146 @Callable(i)
139147 func init (tokenId,adm1Pub,adm2Pub,adm3Pub,toNFTPercent) = valueOrElse(isSelfCall(i), if (isDefined(getString(this, kTokenid)))
140148 then throw("DApp already inited")
141149 else if (!(isDefined(assetInfo(fromBase58String(tokenId)))))
142150 then throw("asset id is not correct asset id")
143151 else if ((size(fromBase58String(adm1Pub)) != 32))
144152 then throw("group1Admin1PubKey is not correct")
145153 else if ((size(fromBase58String(adm2Pub)) != 32))
146154 then throw("group1Admin1PubKey is not correct")
147155 else if ((size(fromBase58String(adm3Pub)) != 32))
148156 then throw("group1Admin1PubKey is not correct")
149157 else [StringEntry(kTokenid, tokenId), StringEntry(kAdmin1PK, adm1Pub), StringEntry(kAdmin2PK, adm2Pub), StringEntry(kAdmin3PK, adm3Pub), IntegerEntry(kPersentForNFT, toNFTPercent)])
150158
151159
152160
153161 @Callable(i)
154162 func stake () = valueOrElse(isActive(), if ((size(i.payments) != 1))
155163 then throw("One payment expected")
156164 else {
157- let $t051575232 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
158- let pmtAmount = $t051575232._1
159- let pmtAssetId = $t051575232._2
165+ let $t054315506 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
166+ let pmtAmount = $t054315506._1
167+ let pmtAssetId = $t054315506._2
160168 if ((pmtAssetId != fromBase58String(tokenId)))
161169 then throw("Wrong payment asset")
162170 else {
163171 let user = toString(i.caller)
164- let $t053535449 = claimCalc(user)
165- let userNewInterest = $t053535449._1
166- let claimAmountAvailable = $t053535449._2
167- let userTokenStaked = $t053535449._3
168- let totalTokenStaked = $t053535449._4
172+ let $t056275723 = claimCalc(user)
173+ let userNewInterest = $t056275723._1
174+ let claimAmountAvailable = $t056275723._2
175+ let userTokenStaked = $t056275723._3
176+ let totalTokenStaked = $t056275723._4
169177 [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), claimAmountAvailable), IntegerEntry((user + kUserTokenStaked), (userTokenStaked + pmtAmount)), IntegerEntry(kTotalTokenStaked, (totalTokenStaked + pmtAmount))]
170178 }
171179 })
172180
173181
174182
175183 @Callable(i)
176184 func unstake (amount) = valueOrElse(isActive(), {
177185 let user = toString(i.caller)
178186 if ((0 >= amount))
179187 then throw("Amount must be greater than 0")
180188 else {
181- let $t058875983 = claimCalc(user)
182- let userNewInterest = $t058875983._1
183- let claimAmountAvailable = $t058875983._2
184- let userTokenStaked = $t058875983._3
185- let totalTokenStaked = $t058875983._4
189+ let $t061616257 = claimCalc(user)
190+ let userNewInterest = $t061616257._1
191+ let claimAmountAvailable = $t061616257._2
192+ let userTokenStaked = $t061616257._3
193+ let totalTokenStaked = $t061616257._4
186194 if ((amount > userTokenStaked))
187195 then throw("You can't unstake more than staked")
188196 else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), claimAmountAvailable), IntegerEntry((user + kUserTokenStaked), (userTokenStaked - amount)), IntegerEntry(kTotalTokenStaked, (totalTokenStaked - amount)), ScriptTransfer(i.caller, amount, fromBase58String(tokenId))]
189197 }
190198 })
191199
192200
193201
194202 @Callable(i)
195203 func claim () = valueOrElse(isActive(), {
196204 let user = toString(i.caller)
197- let $t064896585 = claimCalc(user)
198- let userNewInterest = $t064896585._1
199- let claimAmountAvailable = $t064896585._2
200- let userTokenStaked = $t064896585._3
201- let totalTokenStaked = $t064896585._4
202- if ((claimAmountAvailable == 0))
205+ let $t067636859 = claimCalc(user)
206+ let userNewInterest = $t067636859._1
207+ let claimAmountAvailable = $t067636859._2
208+ let userTokenStaked = $t067636859._3
209+ let totalTokenStaked = $t067636859._4
210+ let $t068626963 = claimCalcNft(user)
211+ let userNewInterestNFT = $t068626963._1
212+ let claimAmountAvailableNFT = $t068626963._2
213+ let userNFTStaked = $t068626963._3
214+ let totalNFTStaked = $t068626963._4
215+ if (((claimAmountAvailable + claimAmountAvailableNFT) == 0))
203216 then throw("Nothing to claim")
204- else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), 0), ScriptTransfer(i.caller, claimAmountAvailable, fromBase58String(tokenId))]
217+ else [IntegerEntry((user + kUserInterest), userNewInterest), IntegerEntry((user + kUserAvailable), 0), IntegerEntry((user + kNFTUserInterest), userNewInterestNFT), IntegerEntry((user + kNFTUserAvailableClaim), 0), ScriptTransfer(i.caller, (claimAmountAvailable + claimAmountAvailableNFT), fromBase58String(tokenId))]
205218 })
206219
207220
208221
209222 @Callable(i)
210223 func stakeNFT () = valueOrElse(isActive(), if ((size(i.payments) != 1))
211224 then throw("One payment expected")
212225 else {
213- let $t069747049 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
214- let pmtAmount = $t069747049._1
215- let pmtAssetId = $t069747049._2
226+ let $t075197594 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
227+ let pmtAmount = $t075197594._1
228+ let pmtAssetId = $t075197594._2
216229 let pmtAssetIdStr = assetIdToStr(pmtAssetId)
217230 if (!(isDefined(getString(this, (pmtAssetIdStr + kNFTCreated)))))
218231 then throw("Wrong nft asset")
219232 else {
220233 let user = toString(i.caller)
221- let $t072307325 = claimCalcNft(user)
222- let userNewInterest = $t072307325._1
223- let claimAmountAvailable = $t072307325._2
224- let userNFTStaked = $t072307325._3
225- let totalNFTStaked = $t072307325._4
226-[IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked + pmtAmount)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked + pmtAmount)), IntegerEntry((((user + "_") + pmtAssetIdStr) + kuserNFTStakedId), 1)]
234+ let $t077757870 = claimCalcNft(user)
235+ let userNewInterest = $t077757870._1
236+ let claimAmountAvailable = $t077757870._2
237+ let userNFTStaked = $t077757870._3
238+ let totalNFTStaked = $t077757870._4
239+[IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked + 1)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked + 1)), BooleanEntry((((user + "_") + pmtAssetIdStr) + kuserNFTStakedId), true)]
227240 }
228241 })
229242
230243
231244
232245 @Callable(i)
233246 func unstakeNFT (id) = valueOrElse(isActive(), {
234247 let user = toString(i.caller)
235- if (isDefined(getString(this, (((user + id) + "_") + kuserNFTStakedId))))
248+ if (isDefined(getBoolean(this, (((user + "_") + id) + kuserNFTStakedId))))
236249 then throw("You didn't staked")
237250 else {
238- let $t078747969 = claimCalcNft(user)
239- let userNewInterest = $t078747969._1
240- let claimAmountAvailable = $t078747969._2
241- let userNFTStaked = $t078747969._3
242- let totalNFTStaked = $t078747969._4
251+ let $t084078502 = claimCalcNft(user)
252+ let userNewInterest = $t084078502._1
253+ let claimAmountAvailable = $t084078502._2
254+ let userNFTStaked = $t084078502._3
255+ let totalNFTStaked = $t084078502._4
243256 [IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), claimAmountAvailable), IntegerEntry((user + kuserNFTStaked), (userNFTStaked - 1)), IntegerEntry(kNFTTotalStaked, (totalNFTStaked - 1)), DeleteEntry((((user + "_") + id) + kuserNFTStakedId)), ScriptTransfer(i.caller, 1, fromBase58String(id))]
244257 }
245- })
246-
247-
248-
249-@Callable(i)
250-func claimNFT () = valueOrElse(isActive(), {
251- let user = toString(i.caller)
252- let $t084278522 = claimCalcNft(user)
253- let userNewInterest = $t084278522._1
254- let claimAmountAvailable = $t084278522._2
255- let userNFTStaked = $t084278522._3
256- let totalNFTStaked = $t084278522._4
257- if ((claimAmountAvailable == 0))
258- then throw("Nothing to claim")
259- else [IntegerEntry((user + kNFTUserInterest), userNewInterest), IntegerEntry((user + kNFTUserAvailableClaim), 0), ScriptTransfer(i.caller, claimAmountAvailable, fromBase58String(tokenId))]
260258 })
261259
262260
263261
264262 @Callable(i)
265263 func issueNFT (userAddr,name,descr) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
266264 let uAddr = valueOrErrorMessage(addressFromString(userAddr), "Wrong user address")
267265 let issue = Issue(name, descr, 1, 0, false)
268266 let nftId = calculateAssetId(issue)
269-[issue, StringEntry((toBase58String(nftId) + kNFTCreated), userAddr), ScriptTransfer(uAddr, 1, nftId)]
267+ let nftList = valueOrElse(getString(this, kNFTCreatedList), "")
268+ let newNftList = (nftList + (if ((nftList != ""))
269+ then SEPARATOR
270+ else ("" + toBase58String(nftId))))
271+[issue, StringEntry((toBase58String(nftId) + kNFTCreated), userAddr), StringEntry(kNFTCreatedList, newNftList), ScriptTransfer(uAddr, 1, nftId)]
270272 }))
271273
272274
273275
274276 @Callable(i)
275277 func airdrop () = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if ((size(i.payments) != 1))
276278 then throw("One payment expected")
277279 else {
278- let $t093709445 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
279- let pmtAmount = $t093709445._1
280- let pmtAssetId = $t093709445._2
280+ let $t096479722 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
281+ let pmtAmount = $t096479722._1
282+ let pmtAssetId = $t096479722._2
281283 if ((pmtAssetId != fromBase58String(tokenId)))
282284 then throw("Wrong payment asset")
283285 else {
284286 let percentForNFT = getIntegerValue(this, kPersentForNFT)
285287 let totalTokenStaked = valueOrElse(getInteger(this, kTotalTokenStaked), 0)
286288 let totalNFTStaked = valueOrElse(getInteger(this, kNFTTotalStaked), 0)
287289 let curInterest = valueOrElse(getInteger(this, kInterest), 0)
288290 let curNFTInterest = valueOrElse(getInteger(this, kNFTInterest), 0)
289- let $t0986810043 = if ((totalNFTStaked == 0))
291+ let $t01014510349 = if ((totalNFTStaked == 0))
290292 then $Tuple2(0, pmtAmount)
291293 else {
292- let nftP = fraction(pmtAmount, percentForNFT, 100)
294+ let nftP = fraction(pmtAmount, min([percentForNFT, (totalNFTStaked * 10)]), 100)
293295 $Tuple2(nftP, (pmtAmount - nftP))
294296 }
295- let pmtNFT = $t0986810043._1
296- let pmtToken = $t0986810043._2
297+ let pmtNFT = $t01014510349._1
298+ let pmtToken = $t01014510349._2
297299 let interestNew = if ((totalTokenStaked > 0))
298300 then (curInterest + fraction(pmtToken, SCALE8, totalTokenStaked))
299301 else curInterest
300302 let interestNFTNew = if ((totalNFTStaked > 0))
301303 then (curNFTInterest + (pmtNFT / totalNFTStaked))
302304 else curNFTInterest
303305 [IntegerEntry(kInterest, interestNew), IntegerEntry(kNFTInterest, interestNFTNew), IntegerEntry(kLastAirdrop, pmtAmount)]
304306 }
305307 }))
306308
307309
308310
309311 @Callable(i)
310312 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
311313 then throw("dApp already active")
312314 else [BooleanEntry(kActive, true)])
313315
314316
315317
316318 @Callable(i)
317319 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
318320 then throw("dApp already shutdown")
319321 else [BooleanEntry(kActive, false)])
320322
321323
322324 @Verifier(tx)
323325 func verify () = {
324326 let multiSignedByAdmins = {
325327 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], admin1PK))
326328 then 1
327329 else 0
328330 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], admin2PK))
329331 then 1
330332 else 0
331333 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], admin3PK))
332334 then 1
333335 else 0
334336 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
335337 }
336338 match tx {
337339 case inv: InvokeScriptTransaction =>
338340 let isSelf = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
339341 let isRightFee = if ((inv.fee == 900000))
340342 then (inv.feeAssetId == unit)
341343 else false
342344 let isInitCall = (inv.function == "init")
343345 let isnoPayments = (size(inv.payments) == 0)
344346 if (if (if (if (isRightFee)
345347 then isInitCall
346348 else false)
347349 then isSelf
348350 else false)
349351 then isnoPayments
350352 else false)
351353 then true
352354 else multiSignedByAdmins
353355 case _ =>
354356 multiSignedByAdmins
355357 }
356358 }
357359

github/deemru/w8io/03bedc9 
64.87 ms