tx · 2PV7oTbZQGdmsb7rzXdoep7gryj7mYePZ9AH6r9xA7K2

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01500000 Waves

2023.07.17 17:53 [2670004] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "2PV7oTbZQGdmsb7rzXdoep7gryj7mYePZ9AH6r9xA7K2", "fee": 1500000, "feeAssetId": null, "timestamp": 1689605610347, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "2xreWcYpMV9K4csdmhFsAGCiHFxDXbhZmbPJ7PeL4t1exmH9mm7F8CbLShycrs8EnX3saDFTzVTZhGhPEicPJ5X5" ], "script": "base64:BgIbCAISBgoECAgICBIDCgEBEgMKAQESABIDCgEIVAACTTYAwIQ9AAJNOACAwtcvAAhNSUxMSU9ONgCAgOmDsd4WAA5NQVJLRVRJTkdTSEFSRQCgjQYACVRFQU1TSEFSRQDAmgwADUFDVElWSVRZU0hBUkUAoI0GAAtQTEFZRVJTSEFSRQCAtRgACllFQVJNSUxMSVMAgIbrx3UACUNIRUNLVElNRQCAyeCrsAEAEG1hcmtldGluZ0FkZHJLZXkCDW1hcmtldGluZ0FkZHIAC3RlYW1BZGRyS2V5Agh0ZWFtQWRkcgAUbGFzdE1hcmtldGluZ1RpbWVLZXkCGWxhc3RDbGFpbWVkVGltZV9tYXJrZXRpbmcAFm1hcmtldGluZ0Ftb3VudExlZnRLZXkCE21hcmtldGluZ0Ftb3VudExlZnQAD2xhc3RUZWFtVGltZUtleQIUbGFzdENsYWltZWRUaW1lX3RlYW0AEXRlYW1BbW91bnRMZWZ0S2V5Ag50ZWFtQW1vdW50TGVmdAAVbGFzdEFjdGl2aXRpZXNUaW1lS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwAQYWN0QW1vdW50TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyARRkaXN0cmlidXRpb25CeVBlcmlvZAEGcGVyaW9kCQBrAwUITUlMTElPTjYJAGgCBQtQTEFZRVJTSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQJNNgAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADGlkeFdsZ0Ftb3VudAAAAAtpZHhXbGdQcmljZQABAAtpZHhXbGdGdW5kcwACAA9pZHhXbGdJc3N1ZVRpbWUABwAVaWR4V2xnTWFya2V0aW5nQW1MZWZ0AAoAGWlkeFdsZ01hcmtldGluZ0FtQXZhaWxOb3cACwAQaWR4V2xnVGVhbUFtTGVmdAAOABRpZHhXbGdUZWFtQW1BdmFpbE5vdwAPAA9pZHhXbGdBY3RBbUxlZnQAEgATaWR4V2xnQWN0QW1BdmFpbE5vdwATABFpZHhXbGdBbUxlZnRUb3RhbAAWABRpZHhXbGdVc2VyQW1BdmFpbE5vdwAZAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAQACmRhcHBQdXp6bGUABQEJZ2V0UGllY2VzAhJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0BAVwcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAITcmVzVHlwZXNQcm9wb3J0aW9ucwILMF8wXzBfMF8wXzACAV8KAQVhZGRlcgIDYWNjBGl0ZW0JAGQCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQKdG90YWxQb3dlcgoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQp0b3RhbFBvd2VyCQDMCAIFCnVzZXJzUG93ZXIFA25pbAELZ2V0V2xnU3RhdHMEC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUSd2xnSXNzdWVkQW1vdW50S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQECmVjb25vbXlVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHBFY29ub215BQZ1c2R0SWQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCmRhcHBQdXp6bGUFBnVzZHRJZAQNdG90YWxGdW5kc1VzZAkAZAIFCmVjb25vbXlVc2QFBndsZ1VzZAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwILd2xnX2Fzc2V0SWQCE05vdCBpbml0aWFsaXplZCB5ZXQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ93bGdJc3N1ZVRpbWVLZXkCD05vdCBpbml0aWFsaXplZAQObWFya2V0aW5nVG90YWwJAGsDBQhNSUxMSU9ONgUOTUFSS0VUSU5HU0hBUkUFAk02BBNtYXJrZXRpbmdBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRZtYXJrZXRpbmdBbW91bnRMZWZ0S2V5BQ5tYXJrZXRpbmdUb3RhbAQRbGFzdE1hcmtldGluZ1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFGxhc3RNYXJrZXRpbmdUaW1lS2V5BQlpc3N1ZVRpbWUEDW1hcmtldGluZ0FkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEG1hcmtldGluZ0FkZHJLZXkEG21hcmtldGluZ0Ftb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQ5tYXJrZXRpbmdUb3RhbAkAZQIFA25vdwURbGFzdE1hcmtldGluZ1RpbWUFCllFQVJNSUxMSVMJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAUDbmlsBA9tYXJrZXRpbmdXbGdvbGQJAPAHAgUNbWFya2V0aW5nQWRkcgUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQYWN0QW1vdW50TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwkBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQpZRUFSTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFCllFQVJNSUxMSVMFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKWUVBUk1JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEJZ2V0UGllY2VzAgULdXNlckFkZHJPcHQJAJEDAgUJY29udHJhY3RzBQtkYXBwU3Rha2luZwQVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBBQljdXJQZXJpb2QECnVzZXJBbW91bnQJAGsDAwkAAAIFDmxhc3RVc2VyUGVyaW9kBQljdXJQZXJpb2QJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMDCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQkAZAIJAGsDCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGUCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTCQBkAgkAZAIJAGsDCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAIJAGUCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwkAZQIFCWN1clBlcmlvZAABBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMJAJEDAgUDZWZmAAEJAJEDAgUDZWZmAAAED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgkAawMFDXRvdGFsRnVuZHNVc2QFAk04BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgURbGFzdE1hcmtldGluZ1RpbWUJAMwIAgUObWFya2V0aW5nVG90YWwJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAkAzAgCBRttYXJrZXRpbmdBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUPbWFya2V0aW5nV2xnb2xkCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQp1c2VyQW1vdW50BQNuaWwADUtTQUxMT1dXTEdPTEQGAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAMDPJAMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAOTUlOU0hPUFBBWU1FTlQAoI0GAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgAUSWR4Q2ZnR292ZXJuYW5jZURhcHAAAwANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAA9lY29ub215Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdFY29ub215RGFwcAALZ292Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdHb3Zlcm5hbmNlRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJwdXp6bGVQb29sQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQITTm90IGluaXRpYWxpemVkIHlldAAKSWR4RWZmVXNlcgABARFrZXlSZXNQcm9wb3J0aW9ucwACE3Jlc1R5cGVzUHJvcG9ydGlvbnMBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhRzdGFrZWRQaWVjZXNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBDmdldFZvdGluZ1Bvd2VyARJ1c2VyQWRkclN0ck9yRW1wdHkEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAp0b3RhbFBvd2VyCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlcnNQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUSdXNlckFkZHJTdHJPckVtcHR5AAAJAMwIAgUKdG90YWxQb3dlcgkAzAgCBQp1c2Vyc1Bvd2VyBQNuaWwBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuCQCkAwEJAGoCBQN2YWwFBnRlblBvdwACQTYAgMLXLwACQjgAgOHrFwANcHJvZml0QWRkcktleQIKcHJvZml0QWRkcgAZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQIWc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbAEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQRhZGRyCQCsAgICFnN0YWtlcnNBbW91bnRQYWlkVXNlcl8FBGFkZHIBBnByb2xvZwAJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEMZ2V0U3dhcExpbWl0AQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUOYXJiaXRyYWdlRGVsYXkJAGUCBQNub3cFCGxhc3RUaW1lCQACAQkArAICCQCsAgICH0FyYml0cmFnZXMgYXJlIHBvc3NpYmxlIG9uY2UgYSAJAKQDAQkAaQIFDmFyYml0cmFnZURlbGF5AODUAwIDbWluBAZwaWVjZXMJAJEDAgkBDmdldFZvdGluZ1Bvd2VyAQUEYWRkcgUKSWR4RWZmVXNlcgQEcG93OAkAbAYFBnBpZWNlcwAABQJCOAAIAAgFB0NFSUxJTkcJAGsDBQJBNgUEcG93OAUFTVVMVDgBDWNsYWltSW50ZXJuYWwBBGFkZHIDCQEBIQEFDUtTQUxMT1dXTEdPTEQJAJQKAgUDbmlsAAAEBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwQFBGFkZHIJAMwIAgUMcmVzdENvbnRyYWN0CQDMCAIFD3N0YWtpbmdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgULZ292Q29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnSXNzdWVUaW1lBBNtYXJrZXRpbmdBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBRVpZHhXbGdNYXJrZXRpbmdBbUxlZnQED21hcmtldGluZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUZaWR4V2xnTWFya2V0aW5nQW1BdmFpbE5vdwQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFEGlkeFdsZ1RlYW1BbUxlZnQECnRlYW1BbW91bnQJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1RlYW1BbUF2YWlsTm93BA1hY3RBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ9pZHhXbGdBY3RBbUxlZnQECWFjdEFtb3VudAkAkQMCBQhjdXJTdGF0cwUTaWR4V2xnQWN0QW1BdmFpbE5vdwMJAGYCCQBlAgUDbm93BQlpc3N1ZVRpbWUFCUNIRUNLVElNRQkAAgECPVBsZWFzZSBtb2RpZnkgY29udHJhY3QgZm9yIG5leHQgMS41IHllYXJzLCBhY2NvcmRpbmcgdG8gc3RhdHMECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUQbWFya2V0aW5nQWRkcktleQUPbWFya2V0aW5nQW1vdW50BQp3bGdBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQp1c2VyQW1vdW50BQp3bGdBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdBbUxlZnRUb3RhbAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWbWFya2V0aW5nQW1vdW50TGVmdEtleQkAZQIFE21hcmtldGluZ0Ftb3VudExlZnQFD21hcmtldGluZ0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUbGFzdE1hcmtldGluZ1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgURdGVhbUFtb3VudExlZnRLZXkJAGUCBQ50ZWFtQW1vdW50TGVmdAUKdGVhbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbGFzdFRlYW1UaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFEGFjdEFtb3VudExlZnRLZXkJAGUCBQ1hY3RBbW91bnRMZWZ0BQlhY3RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQUEYWRkcgUDbm93BQNuaWwFCnVzZXJBbW91bnQFAWkBDWNvbnN0cnVjdG9yVjEECHJlc3RBZGRyDW1hcmtldGluZ0FkZHIIdGVhbUFkZHIKcHJvZml0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAwkBCWlzRGVmaW5lZAEJAKEIAQUNd2xnQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQEDGlzc3VlZEFtb3VudAUITUlMTElPTjYEBWlzc3VlCQDDCAcCBldMR09MRAIgV2F2ZXNMYW5kcyBHb2xkIGludmVzdG1lbnQgdG9rZW4FDGlzc3VlZEFtb3VudAAIBgUEdW5pdAAABAdhc3NldElkCQC4CAEFBWlzc3VlCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ93bGdJc3N1ZVRpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkFDGlzc3VlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAawMFCE1JTExJT042BQtQTEFZRVJTSEFSRQUFTVVMVDYJAMwIAgkBC0JpbmFyeUVudHJ5AgUNd2xnQXNzZXRJZEtleQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRBtYXJrZXRpbmdBZGRyS2V5BQ1tYXJrZXRpbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC3RlYW1BZGRyS2V5BQh0ZWFtQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1wcm9maXRBZGRyS2V5BQpwcm9maXRBZGRyBQNuaWwBaQEGYnV5V2xnAQltaW5BbW91bnQDCQEBIQEFDUtTQUxMT1dXTEdPTEQJAJQKAgUDbmlsAAAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAhNVU0RUIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEB21heFVzZHQJAQxnZXRTd2FwTGltaXQBBQRhZGRyAwkAZgIFB3VzZHRBbXQFB21heFVzZHQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFB21heFVzZHQABgIFIFVTRFQDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzBAIACQDMCAIFDHJlc3RDb250cmFjdAkAzAgCBQ9zdGFraW5nQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFC2dvdkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQxpZHhXbGdBbW91bnQECGZ1bmRzVXNkCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdGdW5kcwQId2xnUHJpY2UJAGsDBQhmdW5kc1VzZAUFTVVMVDgFDGN1cldsZ0Ftb3VudAQIYnV5UHJpY2UJAGsDBQh3bGdQcmljZQAGAAUECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQMJAGYCBQltaW5BbW91bnQFCXdsZ0Ftb3VudAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAGBApkZWx0YUZ1bmRzCQBlAgUHdXNkdEFtdAUMcHJvZml0QW1vdW50BAhyZWlzc3VlZAkAawMFDGN1cldsZ0Ftb3VudAUKZGVsdGFGdW5kcwUIZnVuZHNVc2QJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFCHJlaXNzdWVkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgUMY3VyV2xnQW1vdW50BQhyZWlzc3VlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJd2xnQW1vdW50BQp3bGdBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAFpAQdzZWxsV2xnAQltaW5BbW91bnQDCQEBIQEFDUtTQUxMT1dXTEdPTEQJAJQKAgUDbmlsAAAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCFVdMR09MRCBwYXltZW50cyBvbmx5IQMJAQIhPQIFCnBtdEFzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgQHbWF4VXNkdAkBDGdldFN3YXBMaW1pdAEFBGFkZHIECGN1clN0YXRzCQELZ2V0V2xnU3RhdHMEAgAJAMwIAgUMcmVzdENvbnRyYWN0CQDMCAIFD3N0YWtpbmdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgULZ292Q29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUMaWR4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGsDCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdQcmljZQAEAAUEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUHdXNkdEFtdAUHbWF4VXNkdAkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFB21heFVzZHQABgIFIFVTRFQDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAEBAZidXJuZWQJAGsDCQBkAgUHdXNkdEFtdAUMcHJvZml0QW1vdW50BQxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ0Z1bmRzCQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZidXJuZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGYnVybmVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQd1c2R0QW10BQt1c2R0QXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQBaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2FjdGlvbnMICQENY2xhaW1JbnRlcm5hbAEJAKUIAQgFAWkGY2FsbGVyAl8xCQCUCgIFB2FjdGlvbnMFDHByb2xvZ1Jlc3VsdAFpARJvblN0YWtlVW5zdGFrZUxhbmQBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQENY2xhaW1JbnRlcm5hbAEFBGFkZHIAQl5lvQ==", "height": 2670004, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8xfW3vHvw6chb1Jgo9W143hMK2BDWPX3eLptwEPVdXmS Next: FywMJp15gj6eWJnBSKmgf3Jrk3wedQUyTbyozTo2EDXe Diff:
OldNewDifferences
130130 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
131131 let teamWlgold = assetBalance(teamAddr, wlgId)
132132 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
133- let actAmountLeft = valueOrElse(getInteger(contracts[dappRest], actAmountLeftKey), actTotal)
134- let lastActivitiesTime = valueOrElse(getInteger(contracts[dappRest], lastActivitiesTimeKey), issueTime)
133+ let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
134+ let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
135135 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
136136 let actWlgold = assetBalance(contracts[dappRest], wlgId)
137137 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M6 = 1000000
55
66 let M8 = 100000000
77
88 let MILLION6 = 100000000000000
99
1010 let MARKETINGSHARE = 100000
1111
1212 let TEAMSHARE = 200000
1313
1414 let ACTIVITYSHARE = 100000
1515
1616 let PLAYERSHARE = 400000
1717
1818 let YEARMILLIS = 31557600000
1919
2020 let CHECKTIME = 47336400000
2121
2222 let marketingAddrKey = "marketingAddr"
2323
2424 let teamAddrKey = "teamAddr"
2525
2626 let lastMarketingTimeKey = "lastClaimedTime_marketing"
2727
2828 let marketingAmountLeftKey = "marketingAmountLeft"
2929
3030 let lastTeamTimeKey = "lastClaimedTime_team"
3131
3232 let teamAmountLeftKey = "teamAmountLeft"
3333
3434 let lastActivitiesTimeKey = "lastClaimedTime_activities"
3535
3636 let actAmountLeftKey = "activitiesAmountLeft"
3737
3838 let stakersAmountLeftKey = "stakersAmountLeft"
3939
4040 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
4141
4242
4343 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
4444
4545
4646 func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
4747
4848
4949 let wlgIssueTimeKey = "wlg_issueTime"
5050
5151 let wlgIssuedAmountKey = "wlg_issuedAmount"
5252
5353 let idxWlgAmount = 0
5454
5555 let idxWlgPrice = 1
5656
5757 let idxWlgFunds = 2
5858
5959 let idxWlgIssueTime = 7
6060
6161 let idxWlgMarketingAmLeft = 10
6262
6363 let idxWlgMarketingAmAvailNow = 11
6464
6565 let idxWlgTeamAmLeft = 14
6666
6767 let idxWlgTeamAmAvailNow = 15
6868
6969 let idxWlgActAmLeft = 18
7070
7171 let idxWlgActAmAvailNow = 19
7272
7373 let idxWlgAmLeftTotal = 22
7474
7575 let idxWlgUserAmAvailNow = 25
7676
7777 let dappRest = 0
7878
7979 let dappStaking = 1
8080
8181 let dappEconomy = 2
8282
8383 let dappWlg = 4
8484
8585 let dappPuzzle = 5
8686
8787 func getPieces (userAddrStrOrEmpty,stakingContract) = {
8888 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
8989 func adder (acc,item) = (acc + parseIntValue(item))
9090
9191 let totalPower = {
9292 let $l = props
9393 let $s = size($l)
9494 let $acc0 = 0
9595 func $f0_1 ($a,$i) = if (($i >= $s))
9696 then $a
9797 else adder($a, $l[$i])
9898
9999 func $f0_2 ($a,$i) = if (($i >= $s))
100100 then $a
101101 else throw("List size exceeds 6")
102102
103103 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
104104 }
105105 let usersPower = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
106106 [totalPower, usersPower]
107107 }
108108
109109
110110 func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
111111 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
112112 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
113113 let restUsd = assetBalance(contracts[dappRest], usdtId)
114114 let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
115115 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
116116 let totalFundsUsd = (economyUsd + wlgUsd)
117117 let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
118118 let now = lastBlock.timestamp
119119 let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
120120 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
121121 let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
122122 let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
123123 let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
124124 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
125125 let marketingWlgold = assetBalance(marketingAddr, wlgId)
126126 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
127127 let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
128128 let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
129129 let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
130130 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
131131 let teamWlgold = assetBalance(teamAddr, wlgId)
132132 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
133- let actAmountLeft = valueOrElse(getInteger(contracts[dappRest], actAmountLeftKey), actTotal)
134- let lastActivitiesTime = valueOrElse(getInteger(contracts[dappRest], lastActivitiesTimeKey), issueTime)
133+ let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
134+ let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
135135 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
136136 let actWlgold = assetBalance(contracts[dappRest], wlgId)
137137 let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
138138 let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
139139 let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
140140 let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
141141 let eff = getPieces(userAddrOpt, contracts[dappStaking])
142142 let curPeriodDistribution = distributionByPeriod(curPeriod)
143143 let userAmount = fraction(if ((lastUserPeriod == curPeriod))
144144 then fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
145145 else if ((lastUserPeriod == (curPeriod - 1)))
146146 then (fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS) + fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS))
147147 else ((fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS) + distributionByPeriod((curPeriod - 1))) + fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)), eff[1], eff[0])
148148 let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
149149 [issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount]
150150 }
151151
152152
153153 let KSALLOWWLGOLD = true
154154
155155 let chain = take(drop(this.bytes, 1), 1)
156156
157157 let usdtAssetId = match chain {
158158 case _ =>
159159 if ((base58'2W' == $match0))
160160 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
161161 else if ((base58'2T' == $match0))
162162 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
163163 else throw("Unknown chain")
164164 }
165165
166166 let defaultRestAddressStr = match chain {
167167 case _ =>
168168 if ((base58'2W' == $match0))
169169 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
170170 else if ((base58'2T' == $match0))
171171 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
172172 else throw("Unknown chain")
173173 }
174174
175175 let arbitrageDelay = match chain {
176176 case _ =>
177177 if ((base58'2W' == $match0))
178178 then 600000
179179 else if ((base58'2T' == $match0))
180180 then 60000
181181 else throw("Unknown chain")
182182 }
183183
184184 let SEP = "__"
185185
186186 let MULT6 = 1000000
187187
188188 let MULT8 = 100000000
189189
190190 let MINSHOPPAYMENT = 100000
191191
192192 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
193193
194194
195195 let IdxCfgStakingDapp = 1
196196
197197 let IdxCfgEconomyDapp = 2
198198
199199 let IdxCfgGovernanceDapp = 3
200200
201201 let IdxCfgWlgDapp = 4
202202
203203 let IdxCfgPuzzlePoolDapp = 5
204204
205205 func keyRestCfg () = "%s__restConfig"
206206
207207
208208 func keyRestAddress () = "%s__restAddr"
209209
210210
211211 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
212212
213213
214214 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
215215
216216
217217 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
218218
219219 let restCfg = readRestCfgOrFail(restContract)
220220
221221 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
222222
223223 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
224224
225225 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
226226
227227 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
228228
229229 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
230230
231231 let wlgAssetIdKey = "wlg_assetId"
232232
233233 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
234234
235235 let IdxEffUser = 1
236236
237237 func keyResProportions () = "resTypesProportions"
238238
239239
240240 func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
241241
242242
243243 func asInt (v) = match v {
244244 case n: Int =>
245245 n
246246 case _ =>
247247 throw("fail to cast into Int")
248248 }
249249
250250
251251 func getVotingPower (userAddrStrOrEmpty) = {
252252 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
253253 func adder (acc,item) = (acc + parseIntValue(item))
254254
255255 let totalPower = {
256256 let $l = props
257257 let $s = size($l)
258258 let $acc0 = 0
259259 func $f0_1 ($a,$i) = if (($i >= $s))
260260 then $a
261261 else adder($a, $l[$i])
262262
263263 func $f0_2 ($a,$i) = if (($i >= $s))
264264 then $a
265265 else throw("List size exceeds 6")
266266
267267 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
268268 }
269269 let usersPower = valueOrElse(getInteger(stakingContract, keyStakedPiecesByOwner(userAddrStrOrEmpty)), 0)
270270 [totalPower, usersPower]
271271 }
272272
273273
274274 func fixedPoint (val,decimals) = {
275275 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
276276 ((toString((val / tenPow)) + ".") + toString((val % tenPow)))
277277 }
278278
279279
280280 let A6 = 100000000
281281
282282 let B8 = 50000000
283283
284284 let profitAddrKey = "profitAddr"
285285
286286 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
287287
288288 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
289289
290290
291291 func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
292292
293293
294294 func getSwapLimit (addr) = {
295295 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
296296 let now = lastBlock.timestamp
297297 if ((arbitrageDelay > (now - lastTime)))
298298 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
299299 else {
300300 let pieces = getVotingPower(addr)[IdxEffUser]
301301 let pow8 = pow(pieces, 0, B8, 8, 8, CEILING)
302302 fraction(A6, pow8, MULT8)
303303 }
304304 }
305305
306306
307307 func claimInternal (addr) = if (!(KSALLOWWLGOLD))
308308 then $Tuple2(nil, 0)
309309 else {
310310 let caller = addressFromStringValue(addr)
311311 let curStats = getWlgStats(addr, [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId, 0)
312312 let now = lastBlock.timestamp
313313 let issueTime = curStats[idxWlgIssueTime]
314314 let marketingAmountLeft = curStats[idxWlgMarketingAmLeft]
315315 let marketingAmount = curStats[idxWlgMarketingAmAvailNow]
316316 let teamAmountLeft = curStats[idxWlgTeamAmLeft]
317317 let teamAmount = curStats[idxWlgTeamAmAvailNow]
318318 let actAmountLeft = curStats[idxWlgActAmLeft]
319319 let actAmount = curStats[idxWlgActAmAvailNow]
320320 if (((now - issueTime) > CHECKTIME))
321321 then throw("Please modify contract for next 1.5 years, according to stats")
322322 else {
323323 let userAmount = curStats[idxWlgUserAmAvailNow]
324324 let userKey = keyStakersAmountPaidUser(addr)
325325 $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId), ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), ScriptTransfer(caller, userAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[idxWlgAmLeftTotal] - userAmount)), IntegerEntry(marketingAmountLeftKey, (marketingAmountLeft - marketingAmount)), IntegerEntry(lastMarketingTimeKey, now), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUser(addr), now)], userAmount)
326326 }
327327 }
328328
329329
330330 @Callable(i)
331331 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
332332 then throw("Permission denied")
333333 else if (isDefined(getBinary(wlgAssetIdKey)))
334334 then throw("Already initialized")
335335 else {
336336 let issuedAmount = MILLION6
337337 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
338338 let assetId = calculateAssetId(issue)
339339 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
340340 }
341341
342342
343343
344344 @Callable(i)
345345 func buyWlg (minAmount) = if (!(KSALLOWWLGOLD))
346346 then $Tuple2(nil, 0)
347347 else {
348348 let prologResult = prolog()
349349 if ((size(i.payments) != 1))
350350 then throw("exactly 1 payment must be attached")
351351 else {
352352 let pmt = i.payments[0]
353353 let usdtAmt = pmt.amount
354354 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "USDT payments only!")
355355 if ((pmtAssetId != usdtAssetId))
356356 then throw("USDT payments only!")
357357 else {
358358 let caller = i.caller
359359 let addr = toString(caller)
360360 let maxUsdt = getSwapLimit(addr)
361361 if ((usdtAmt > maxUsdt))
362362 then throw((("You can spend max " + fixedPoint(maxUsdt, 6)) + " USDT"))
363363 else if ((MINSHOPPAYMENT > usdtAmt))
364364 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
365365 else {
366366 let curStats = getWlgStats("", [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId, usdtAmt)
367367 let curWlgAmount = curStats[idxWlgAmount]
368368 let fundsUsd = curStats[idxWlgFunds]
369369 let wlgPrice = fraction(fundsUsd, MULT8, curWlgAmount)
370370 let buyPrice = fraction(wlgPrice, 6, 5)
371371 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
372372 if ((minAmount > wlgAmount))
373373 then throw("Price changed during operation, please try again")
374374 else {
375375 let profitAmount = (usdtAmt / 6)
376376 let deltaFunds = (usdtAmt - profitAmount)
377377 let reissued = fraction(curWlgAmount, deltaFunds, fundsUsd)
378378 $Tuple2([Reissue(wlgAssetId, reissued, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + reissued)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
379379 }
380380 }
381381 }
382382 }
383383 }
384384
385385
386386
387387 @Callable(i)
388388 func sellWlg (minAmount) = if (!(KSALLOWWLGOLD))
389389 then $Tuple2(nil, 0)
390390 else {
391391 let prologResult = prolog()
392392 if ((size(i.payments) != 1))
393393 then throw("exactly 1 payment must be attached")
394394 else {
395395 let pmt = i.payments[0]
396396 let wlgAmt = pmt.amount
397397 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WLGOLD payments only!")
398398 if ((pmtAssetId != wlgAssetId))
399399 then throw("WLGOLD payments only!")
400400 else {
401401 let caller = i.caller
402402 let addr = toString(caller)
403403 let maxUsdt = getSwapLimit(addr)
404404 let curStats = getWlgStats("", [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId, 0)
405405 let curWlgAmount = curStats[idxWlgAmount]
406406 let sellPrice = fraction(curStats[idxWlgPrice], 4, 5)
407407 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
408408 if ((usdtAmt > maxUsdt))
409409 then throw((("You can get max " + fixedPoint(maxUsdt, 6)) + " USDT"))
410410 else if ((MINSHOPPAYMENT > usdtAmt))
411411 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
412412 else if ((minAmount > usdtAmt))
413413 then throw("Price changed during operation, please try again")
414414 else {
415415 let profitAmount = (usdtAmt / 4)
416416 let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
417417 $Tuple2([Burn(wlgAssetId, burned), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - burned)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
418418 }
419419 }
420420 }
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func claim () = {
427427 let prologResult = prolog()
428428 if ((size(i.payments) != 0))
429429 then throw("No payments required")
430430 else {
431431 let actions = claimInternal(toString(i.caller))._1
432432 $Tuple2(actions, prologResult)
433433 }
434434 }
435435
436436
437437
438438 @Callable(i)
439439 func onStakeUnstakeLand (addr) = if ((i.caller != stakingContract))
440440 then throw("Permission denied")
441441 else claimInternal(addr)
442442
443443

github/deemru/w8io/169f3d6 
56.08 ms