tx · 7Nmyx2ejU8RmZafCARMcsek3GbywJiMwt4MqqeBFfyLa

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01200000 Waves

2023.07.03 12:03 [2649521] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "7Nmyx2ejU8RmZafCARMcsek3GbywJiMwt4MqqeBFfyLa", "fee": 1200000, "feeAssetId": null, "timestamp": 1688375013093, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "2BU9cZfPYWYgv2Ss19bbKD6imug2ZMkmxdQZfZMTZ4aCipEcmH8JqCscdxMpM6PX52G6a7Mxf2oyLufzKUB7LyXC" ], "script": "base64:BgIgCAISBgoECAgICBIDCgEBEgMKAQESABIDCgEIEgMKAQhGAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAALSWR4RWZmVG90YWwAAAAKSWR4RWZmVXNlcgABAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAMDPJAMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAAOTUlOU0hPUFBBWU1FTlQAoI0GAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgANSWR4Q2ZnV2xnRGFwcAAEABRJZHhDZmdQdXp6bGVQb29sRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAA9lY29ub215Q29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdFY29ub215RGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwABJwdXp6bGVQb29sQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdQdXp6bGVQb29sRGFwcAALcmVjTGFuZFNpemUAAQERa2V5UmVzUHJvcG9ydGlvbnMAAhNyZXNUeXBlc1Byb3BvcnRpb25zARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhNzdGFrZWRMYW5kc0J5T3duZXJfBQlvd25lckFkZHIAEndsZ0lzc3VlZEFtb3VudEtleQIQd2xnX2lzc3VlZEFtb3VudAANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQITTm90IGluaXRpYWxpemVkIHlldAAMaWR4V2xnQW1vdW50AAAAC2lkeFdsZ1ByaWNlAAEAC2lkeFdsZ0Z1bmRzAAIBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAUFU1NJWkUDCQAAAgIBTQUHJG1hdGNoMAUFTVNJWkUDCQAAAgIBTAUHJG1hdGNoMAUFTFNJWkUDCQAAAgICWEwFByRtYXRjaDAFBlhMU0laRQMJAAACAgNYWEwFByRtYXRjaDAFB1hYTFNJWkUJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQEOZ2V0Vm90aW5nUG93ZXIBEnVzZXJBZGRyU3RyT3JFbXB0eQQFcHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlSZXNQcm9wb3J0aW9ucwACCzBfMF8wXzBfMF8wAgFfCgEFYWRkZXICA2FjYwRpdGVtCQBkAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0ECnRvdGFsUG93ZXIKAAIkbAUFcHJvcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAp1c2Vyc1Bvd2VyAwkAAAIFEnVzZXJBZGRyU3RyT3JFbXB0eQIAAAAECGxhbmRzU3RyCQCdCAIFD3N0YWtpbmdDb250cmFjdAkB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b250cmFjdAULdXNkdEFzc2V0SWQECXB1enpsZVVzZAkA8AcCBRJwdXp6bGVQb29sQ29udHJhY3QFC3VzZHRBc3NldElkBA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIJAGQCBQplY29ub215VXNkBQdyZXN0VXNkBQZ3bGdVc2QFCXB1enpsZVVzZAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgkAawMFDXRvdGFsRnVuZHNVc2QFBU1VTFQ4BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAUDbmlsAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04JAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cABk1VTFQxNACAgOmDsd4WAA5NQVJLRVRJTkdTSEFSRQCgjQYACVRFQU1TSEFSRQDAmgwADUFDVElWSVRZU0hBUkUAoI0GAAtQTEFZRVJTSEFSRQCAtRgACllFQVJNSUxMSVMAgIbrx3UACldFRUtNSUxMSVMAgIiyoAIACU1BWFBFUklPRACcAQACQTYAgMLXLwACQjgAgOHrFwAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAt0ZWFtQWRkcktleQIIdGVhbUFkZHIADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAFGxhc3RNYXJrZXRpbmdUaW1lS2V5AhlsYXN0Q2xhaW1lZFRpbWVfbWFya2V0aW5nAA9sYXN0VGVhbVRpbWVLZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtABVsYXN0QWN0aXZpdGllc1RpbWVLZXkCGmxhc3RDbGFpbWVkVGltZV9hY3Rpdml0aWVzARhrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUbGFzdENsYWltZWRUaW1lVXNlcl8FBGFkZHIBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAFHN0YWtlcnNBbW91bnRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAAZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQIWc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbAEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQRhZGRyCQCsAgICFnN0YWtlcnNBbW91bnRQYWlkVXNlcl8FBGFkZHIBBnByb2xvZwADCQELdmFsdWVPckVsc2UCCQCbCAIFD3N0YWtpbmdDb250cmFjdAkBCmtleUJsb2NrZWQABwkAAgECH0NvbnRyYWN0cyBhcmUgdW5kZXIgbWFpbnRlbmFuY2UJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEMZ2V0U3dhcExpbWl0AQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUOYXJiaXRyYWdlRGVsYXkJAGUCBQNub3cFCGxhc3RUaW1lCQACAQkArAICCQCsAgICH0FyYml0cmFnZXMgYXJlIHBvc3NpYmxlIG9uY2UgYSAJAKQDAQkAaQIFDmFyYml0cmFnZURlbGF5AODUAwIDbWluBAZwaWVjZXMJAJEDAgkBDmdldFZvdGluZ1Bvd2VyAQUEYWRkcgUKSWR4RWZmVXNlcgQEcG93OAkAbAYFBnBpZWNlcwAABQJCOAAIAAgFB0NFSUxJTkcJAGsDBQJBNgUEcG93OAUFTVVMVDgBDWNsYWltSW50ZXJuYWwBBmNhbGxlcgQKY2FsbGVyQWRkcgkApQgBBQZjYWxsZXIEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFD3dsZ0lzc3VlVGltZUtleQIPTm90IGluaXRpYWxpemVkBBFsYXN0TWFya2V0aW5nVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRsYXN0TWFya2V0aW5nVGltZUtleQUJaXNzdWVUaW1lBA1tYXJrZXRpbmdBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFEG1hcmtldGluZ0FkZHJLZXkED21hcmtldGluZ0Ftb3VudAkAawMJAGsDBQZNVUxUMTQFDk1BUktFVElOR1NIQVJFBQVNVUxUNgkAZQIFA25vdwURbGFzdE1hcmtldGluZ1RpbWUFCllFQVJNSUxMSVMEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkECnRlYW1BbW91bnQJAGsDCQBrAwUGTVVMVDE0BQlURUFNU0hBUkUFBU1VTFQ2CQBlAgUDbm93BQxsYXN0VGVhbVRpbWUJAGgCAAMFCllFQVJNSUxMSVMEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFCWlzc3VlVGltZQQJYWN0QW1vdW50CQBrAwkAawMFBk1VTFQxNAUNQUNUSVZJVFlTSEFSRQUFTVVMVDYJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwUKWUVBUk1JTExJUwQJY3VyUGVyaW9kCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQpXRUVLTUlMTElTAwkAZgIFCWN1clBlcmlvZAkAaQIFCU1BWFBFUklPRAACCQACAQI9UGxlYXNlIG1vZGlmeSBjb250cmFjdCBmb3IgbmV4dCAxLjUgeWVhcnMsIGFjY29yZGluZyB0byBzdGF0cwQDZWZmCQEOZ2V0Vm90aW5nUG93ZXIBBQpjYWxsZXJBZGRyBAt0b3RhbFBpZWNlcwkAkQMCBQNlZmYFC0lkeEVmZlRvdGFsBA9hbW91bnRMZWZ0VG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBrAwUPYW1vdW50TGVmdFRvdGFsCQBoAgACBQt0b3RhbFBpZWNlcwkAZAIFC3RvdGFsUGllY2VzCQBoAgkAlgMBCQDMCAIAoI0GCQDMCAIFC3RvdGFsUGllY2VzBQNuaWwJAGUCBQlNQVhQRVJJT0QFCWN1clBlcmlvZAQLdXNlclRpbWVLZXkJARhrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXIBBQpjYWxsZXJBZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkFCWlzc3VlVGltZQQKdXNlckFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJEDAgUDZWZmBQpJZHhFZmZVc2VyBQt0b3RhbFBpZWNlcwkAZQIFA25vdwUMbGFzdFVzZXJUaW1lCQBoAgADBQpZRUFSTUlMTElTBAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUKY2FsbGVyQWRkcgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDW1hcmtldGluZ0FkZHIFD21hcmtldGluZ0Ftb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh0ZWFtQWRkcgUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCnVzZXJBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3VzZXJLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFB3VzZXJLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZQIFD2Ftb3VudExlZnRUb3RhbAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUbGFzdE1hcmtldGluZ1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbGFzdFRlYW1UaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt1c2VyVGltZUtleQUDbm93BQNuaWwFCnVzZXJBbW91bnQGAWkBDWNvbnN0cnVjdG9yVjEECHJlc3RBZGRyDW1hcmtldGluZ0FkZHIIdGVhbUFkZHIKcHJvZml0QWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAwkBCWlzRGVmaW5lZAEJAKEIAQUNd2xnQXNzZXRJZEtleQkAAgECE0FscmVhZHkgaW5pdGlhbGl6ZWQEDGlzc3VlZEFtb3VudAUGTVVMVDE0BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQZNVUxUMTQFC1BMQVlFUlNIQVJFBQVNVUxUNgkAzAgCCQELQmluYXJ5RW50cnkCBQ13bGdBc3NldElkS2V5BQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFEG1hcmtldGluZ0FkZHJLZXkFDW1hcmtldGluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULdGVhbUFkZHJLZXkFCHRlYW1BZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDXByb2ZpdEFkZHJLZXkFCnByb2ZpdEFkZHIFA25pbAFpAQZidXlXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAd1c2R0QW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZHRBc3NldElkCQACAQITVVNEVCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAdtYXhVc2R0CQEMZ2V0U3dhcExpbWl0AQUEYWRkcgMJAGYCBQd1c2R0QW10BQdtYXhVc2R0CQACAQkArAICCQCsAgICEllvdSBjYW4gc3BlbmQgbWF4IAkBCmZpeGVkUG9pbnQCBQdtYXhVc2R0AAYCBSBVU0RUAwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUMaWR4V2xnQW1vdW50BAtvbGRGdW5kc1VzZAkAZQIJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ0Z1bmRzBQd1c2R0QW10BAh3bGdQcmljZQkAawMFC29sZEZ1bmRzVXNkBQVNVUxUOAUMY3VyV2xnQW1vdW50BAhidXlQcmljZQkAawMFCHdsZ1ByaWNlAAYABQQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlAwkAZgIFCW1pbkFtb3VudAUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYECmRlbHRhRnVuZHMJAGUCBQd1c2R0QW10BQxwcm9maXRBbW91bnQECHJlaXNzdWVkCQBrAwUMY3VyV2xnQW1vdW50BQpkZWx0YUZ1bmRzBQtvbGRGdW5kc1VzZAkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUIcmVpc3N1ZWQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCBQxjdXJXbGdBbW91bnQFCHJlaXNzdWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQl3bGdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0AWkBB3NlbGxXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAdtYXhVc2R0CQEMZ2V0U3dhcExpbWl0AQUEYWRkcgQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUMaWR4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGsDCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdQcmljZQAEAAUEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUHdXNkdEFtdAUHbWF4VXNkdAkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFB21heFVzZHQABgIFIFVTRFQDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAEBAZidXJuZWQJAGsDCQBkAgUHdXNkdEFtdAUMcHJvZml0QW1vdW50BQxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ0Z1bmRzCQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZidXJuZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGYnVybmVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQd1c2R0QW10BQt1c2R0QXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQBaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAdhY3Rpb25zCAkBDWNsYWltSW50ZXJuYWwBCAUBaQZjYWxsZXICXzEJAJQKAgUHYWN0aW9ucwUMcHJvbG9nUmVzdWx0AWkBC29uU3Rha2VMYW5kAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkBDWNsYWltSW50ZXJuYWwBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyAWkBDW9uVW5zdGFrZUxhbmQBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQENY2xhaW1JbnRlcm5hbAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIAe28g6Q==", "height": 2649521, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CUnzAXUvS9JxJBRmDTXopqyNbDDYmfB5rNe7NGuT57ky Next: 4pvsduSPPvkq6HsBcFiGA9Gzbw1pTbTHKadj2MupEw9c Diff:
OldNewDifferences
5252 let XLSIZE = 400
5353
5454 let XXLSIZE = 625
55+
56+let MINSHOPPAYMENT = 100000
5557
5658 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5759
322324 let maxUsdt = getSwapLimit(addr)
323325 if ((usdtAmt > maxUsdt))
324326 then throw((("You can spend max " + fixedPoint(maxUsdt, 6)) + " USDT"))
325- else {
326- let curStats = getWlgStats()
327- let curWlgAmount = curStats[idxWlgAmount]
328- let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
329- let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
330- let buyPrice = fraction(wlgPrice, 6, 5)
331- let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
332- if ((minAmount > wlgAmount))
333- then throw("Price changed during operation, please try again")
334- else {
335- let profitAmount = (usdtAmt / 6)
336- let deltaFunds = (usdtAmt - profitAmount)
337- let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
338- $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)
339- }
340- }
327+ else if ((MINSHOPPAYMENT > usdtAmt))
328+ then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
329+ else {
330+ let curStats = getWlgStats()
331+ let curWlgAmount = curStats[idxWlgAmount]
332+ let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
333+ let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
334+ let buyPrice = fraction(wlgPrice, 6, 5)
335+ let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
336+ if ((minAmount > wlgAmount))
337+ then throw("Price changed during operation, please try again")
338+ else {
339+ let profitAmount = (usdtAmt / 6)
340+ let deltaFunds = (usdtAmt - profitAmount)
341+ let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
342+ $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)
343+ }
344+ }
341345 }
342346 }
343347 }
365369 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
366370 if ((usdtAmt > maxUsdt))
367371 then throw((("You can get max " + fixedPoint(maxUsdt, 6)) + " USDT"))
368- else if ((minAmount > usdtAmt))
369- then throw("Price changed during operation, please try again")
370- else {
371- let profitAmount = (usdtAmt / 4)
372- let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
373- $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)
374- }
372+ else if ((MINSHOPPAYMENT > usdtAmt))
373+ then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
374+ else if ((minAmount > usdtAmt))
375+ then throw("Price changed during operation, please try again")
376+ else {
377+ let profitAmount = (usdtAmt / 4)
378+ let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
379+ $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)
380+ }
375381 }
376382 }
377383 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func keyBlocked () = "contractsBlocked"
55
66
77 let IdxEffTotal = 0
88
99 let IdxEffUser = 1
1010
1111 let chain = take(drop(this.bytes, 1), 1)
1212
1313 let usdtAssetId = match chain {
1414 case _ =>
1515 if ((base58'2W' == $match0))
1616 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1717 else if ((base58'2T' == $match0))
1818 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
1919 else throw("Unknown chain")
2020 }
2121
2222 let defaultRestAddressStr = match chain {
2323 case _ =>
2424 if ((base58'2W' == $match0))
2525 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2626 else if ((base58'2T' == $match0))
2727 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2828 else throw("Unknown chain")
2929 }
3030
3131 let arbitrageDelay = match chain {
3232 case _ =>
3333 if ((base58'2W' == $match0))
3434 then 600000
3535 else if ((base58'2T' == $match0))
3636 then 60000
3737 else throw("Unknown chain")
3838 }
3939
4040 let SEP = "__"
4141
4242 let MULT6 = 1000000
4343
4444 let MULT8 = 100000000
4545
4646 let SSIZE = 25
4747
4848 let MSIZE = 100
4949
5050 let LSIZE = 225
5151
5252 let XLSIZE = 400
5353
5454 let XXLSIZE = 625
55+
56+let MINSHOPPAYMENT = 100000
5557
5658 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5759
5860
5961 let IdxCfgStakingDapp = 1
6062
6163 let IdxCfgEconomyDapp = 2
6264
6365 let IdxCfgWlgDapp = 4
6466
6567 let IdxCfgPuzzlePoolDapp = 5
6668
6769 func keyRestCfg () = "%s__restConfig"
6870
6971
7072 func keyRestAddress () = "%s__restAddr"
7173
7274
7375 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7476
7577
7678 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7779
7880
7981 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
8082
8183 let restCfg = readRestCfgOrFail(restContract)
8284
8385 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
8486
8587 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
8688
8789 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8890
8991 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
9092
9193 let recLandSize = 1
9294
9395 func keyResProportions () = "resTypesProportions"
9496
9597
9698 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
9799
98100
99101 let wlgIssuedAmountKey = "wlg_issuedAmount"
100102
101103 let wlgAssetIdKey = "wlg_assetId"
102104
103105 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
104106
105107 let idxWlgAmount = 0
106108
107109 let idxWlgPrice = 1
108110
109111 let idxWlgFunds = 2
110112
111113 func asInt (v) = match v {
112114 case n: Int =>
113115 n
114116 case _ =>
115117 throw("fail to cast into Int")
116118 }
117119
118120
119121 func numPiecesBySize (landSize) = match landSize {
120122 case _ =>
121123 if (("S" == $match0))
122124 then SSIZE
123125 else if (("M" == $match0))
124126 then MSIZE
125127 else if (("L" == $match0))
126128 then LSIZE
127129 else if (("XL" == $match0))
128130 then XLSIZE
129131 else if (("XXL" == $match0))
130132 then XXLSIZE
131133 else throw("Unknown land size")
132134 }
133135
134136
135137 func getVotingPower (userAddrStrOrEmpty) = {
136138 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
137139 func adder (acc,item) = (acc + parseIntValue(item))
138140
139141 let totalPower = {
140142 let $l = props
141143 let $s = size($l)
142144 let $acc0 = 0
143145 func $f0_1 ($a,$i) = if (($i >= $s))
144146 then $a
145147 else adder($a, $l[$i])
146148
147149 func $f0_2 ($a,$i) = if (($i >= $s))
148150 then $a
149151 else throw("List size exceeds 6")
150152
151153 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
152154 }
153155 let usersPower = if ((userAddrStrOrEmpty == ""))
154156 then 0
155157 else {
156158 let landsStr = getString(stakingContract, keyStakedLandsByOwner(userAddrStrOrEmpty))
157159 let lands = if (isDefined(landsStr))
158160 then split_51C(value(landsStr), "_")
159161 else nil
160162 func oneLand (acc,landAssetId) = {
161163 let asset = value(assetInfo(fromBase58String(landAssetId)))
162164 let landSize = split(asset.description, "_")[recLandSize]
163165 (acc + numPiecesBySize(landSize))
164166 }
165167
166168 let $l = lands
167169 let $s = size($l)
168170 let $acc0 = 0
169171 func $f1_1 ($a,$i) = if (($i >= $s))
170172 then $a
171173 else oneLand($a, $l[$i])
172174
173175 func $f1_2 ($a,$i) = if (($i >= $s))
174176 then $a
175177 else throw("List size exceeds 100")
176178
177179 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
178180 }
179181 [totalPower, usersPower]
180182 }
181183
182184
183185 func getWlgStats () = {
184186 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmountKey), "WLGOLD is not issued yet")
185187 let economyUsd = assetBalance(economyContract, usdtAssetId)
186188 let restUsd = assetBalance(restContract, usdtAssetId)
187189 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
188190 let puzzleUsd = assetBalance(puzzlePoolContract, usdtAssetId)
189191 let totalFundsUsd = (((economyUsd + restUsd) + wlgUsd) + puzzleUsd)
190192 [issuedAmount, fraction(totalFundsUsd, MULT8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd]
191193 }
192194
193195
194196 func fixedPoint (val,decimals) = {
195197 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
196198 ((toString((val / tenPow)) + ".") + toString((val % tenPow)))
197199 }
198200
199201
200202 let MULT14 = 100000000000000
201203
202204 let MARKETINGSHARE = 100000
203205
204206 let TEAMSHARE = 200000
205207
206208 let ACTIVITYSHARE = 100000
207209
208210 let PLAYERSHARE = 400000
209211
210212 let YEARMILLIS = 31557600000
211213
212214 let WEEKMILLIS = 604800000
213215
214216 let MAXPERIOD = 156
215217
216218 let A6 = 100000000
217219
218220 let B8 = 50000000
219221
220222 let wlgIssueTimeKey = "wlg_issueTime"
221223
222224 let marketingAddrKey = "marketingAddr"
223225
224226 let teamAddrKey = "teamAddr"
225227
226228 let profitAddrKey = "profitAddr"
227229
228230 let lastMarketingTimeKey = "lastClaimedTime_marketing"
229231
230232 let lastTeamTimeKey = "lastClaimedTime_team"
231233
232234 let lastActivitiesTimeKey = "lastClaimedTime_activities"
233235
234236 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
235237
236238
237239 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
238240
239241
240242 let stakersAmountLeftKey = "stakersAmountLeft"
241243
242244 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
243245
244246 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
245247
246248
247249 func prolog () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
248250 then throw("Contracts are under maintenance")
249251 else asInt(invoke(stakingContract, "saveLastTx", nil, nil))
250252
251253
252254 func getSwapLimit (addr) = {
253255 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
254256 let now = lastBlock.timestamp
255257 if ((arbitrageDelay > (now - lastTime)))
256258 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
257259 else {
258260 let pieces = getVotingPower(addr)[IdxEffUser]
259261 let pow8 = pow(pieces, 0, B8, 8, 8, CEILING)
260262 fraction(A6, pow8, MULT8)
261263 }
262264 }
263265
264266
265267 func claimInternal (caller) = {
266268 let callerAddr = toString(caller)
267269 let now = lastBlock.timestamp
268270 let issueTime = valueOrErrorMessage(getInteger(wlgIssueTimeKey), "Not initialized")
269271 let lastMarketingTime = valueOrElse(getInteger(lastMarketingTimeKey), issueTime)
270272 let marketingAddr = addressFromStringValue(value(getString(marketingAddrKey)))
271273 let marketingAmount = fraction(fraction(MULT14, MARKETINGSHARE, MULT6), (now - lastMarketingTime), YEARMILLIS)
272274 let lastTeamTime = valueOrElse(getInteger(lastTeamTimeKey), issueTime)
273275 let teamAddr = addressFromStringValue(value(getString(teamAddrKey)))
274276 let teamAmount = fraction(fraction(MULT14, TEAMSHARE, MULT6), (now - lastTeamTime), (3 * YEARMILLIS))
275277 let lastActivitiesTime = valueOrElse(getInteger(lastActivitiesTimeKey), issueTime)
276278 let actAmount = fraction(fraction(MULT14, ACTIVITYSHARE, MULT6), (now - lastActivitiesTime), (3 * YEARMILLIS))
277279 let curPeriod = ((now - issueTime) / WEEKMILLIS)
278280 if ((curPeriod > (MAXPERIOD / 2)))
279281 then throw("Please modify contract for next 1.5 years, according to stats")
280282 else {
281283 let eff = getVotingPower(callerAddr)
282284 let totalPieces = eff[IdxEffTotal]
283285 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
284286 let curPeriodDistribution = fraction(amountLeftTotal, (2 * totalPieces), (totalPieces + (max([100000, totalPieces]) * (MAXPERIOD - curPeriod))))
285287 let userTimeKey = keyLastClaimedTimeByUser(callerAddr)
286288 let lastUserTime = valueOrElse(getInteger(userTimeKey), issueTime)
287289 let userAmount = fraction(fraction(curPeriodDistribution, eff[IdxEffUser], totalPieces), (now - lastUserTime), (3 * YEARMILLIS))
288290 let userKey = keyStakersAmountPaidUser(callerAddr)
289291 $Tuple2([ScriptTransfer(marketingAddr, marketingAmount, wlgAssetId), ScriptTransfer(teamAddr, 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, (amountLeftTotal - userAmount)), IntegerEntry(lastMarketingTimeKey, now), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, now)], userAmount)
290292 }
291293 }
292294
293295
294296 @Callable(i)
295297 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
296298 then throw("Permission denied")
297299 else if (isDefined(getBinary(wlgAssetIdKey)))
298300 then throw("Already initialized")
299301 else {
300302 let issuedAmount = MULT14
301303 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
302304 let assetId = calculateAssetId(issue)
303305 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MULT14, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
304306 }
305307
306308
307309
308310 @Callable(i)
309311 func buyWlg (minAmount) = {
310312 let prologResult = prolog()
311313 if ((size(i.payments) != 1))
312314 then throw("exactly 1 payment must be attached")
313315 else {
314316 let pmt = i.payments[0]
315317 let usdtAmt = pmt.amount
316318 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
317319 if ((pmtAssetId != usdtAssetId))
318320 then throw("USDT payments only!")
319321 else {
320322 let caller = i.caller
321323 let addr = toString(caller)
322324 let maxUsdt = getSwapLimit(addr)
323325 if ((usdtAmt > maxUsdt))
324326 then throw((("You can spend max " + fixedPoint(maxUsdt, 6)) + " USDT"))
325- else {
326- let curStats = getWlgStats()
327- let curWlgAmount = curStats[idxWlgAmount]
328- let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
329- let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
330- let buyPrice = fraction(wlgPrice, 6, 5)
331- let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
332- if ((minAmount > wlgAmount))
333- then throw("Price changed during operation, please try again")
334- else {
335- let profitAmount = (usdtAmt / 6)
336- let deltaFunds = (usdtAmt - profitAmount)
337- let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
338- $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)
339- }
340- }
327+ else if ((MINSHOPPAYMENT > usdtAmt))
328+ then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
329+ else {
330+ let curStats = getWlgStats()
331+ let curWlgAmount = curStats[idxWlgAmount]
332+ let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
333+ let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
334+ let buyPrice = fraction(wlgPrice, 6, 5)
335+ let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
336+ if ((minAmount > wlgAmount))
337+ then throw("Price changed during operation, please try again")
338+ else {
339+ let profitAmount = (usdtAmt / 6)
340+ let deltaFunds = (usdtAmt - profitAmount)
341+ let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
342+ $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)
343+ }
344+ }
341345 }
342346 }
343347 }
344348
345349
346350
347351 @Callable(i)
348352 func sellWlg (minAmount) = {
349353 let prologResult = prolog()
350354 if ((size(i.payments) != 1))
351355 then throw("exactly 1 payment must be attached")
352356 else {
353357 let pmt = i.payments[0]
354358 let wlgAmt = pmt.amount
355359 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
356360 if ((pmtAssetId != wlgAssetId))
357361 then throw("WLGOLD payments only!")
358362 else {
359363 let caller = i.caller
360364 let addr = toString(caller)
361365 let maxUsdt = getSwapLimit(addr)
362366 let curStats = getWlgStats()
363367 let curWlgAmount = curStats[idxWlgAmount]
364368 let sellPrice = fraction(curStats[idxWlgPrice], 4, 5)
365369 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
366370 if ((usdtAmt > maxUsdt))
367371 then throw((("You can get max " + fixedPoint(maxUsdt, 6)) + " USDT"))
368- else if ((minAmount > usdtAmt))
369- then throw("Price changed during operation, please try again")
370- else {
371- let profitAmount = (usdtAmt / 4)
372- let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
373- $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)
374- }
372+ else if ((MINSHOPPAYMENT > usdtAmt))
373+ then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
374+ else if ((minAmount > usdtAmt))
375+ then throw("Price changed during operation, please try again")
376+ else {
377+ let profitAmount = (usdtAmt / 4)
378+ let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
379+ $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)
380+ }
375381 }
376382 }
377383 }
378384
379385
380386
381387 @Callable(i)
382388 func claim () = {
383389 let prologResult = prolog()
384390 let actions = claimInternal(i.caller)._1
385391 $Tuple2(actions, prologResult)
386392 }
387393
388394
389395
390396 @Callable(i)
391397 func onStakeLand (addr) = if ((i.caller != stakingContract))
392398 then throw("Permission denied")
393399 else claimInternal(addressFromStringValue(addr))
394400
395401
396402
397403 @Callable(i)
398404 func onUnstakeLand (addr) = if ((i.caller != stakingContract))
399405 then throw("Permission denied")
400406 else claimInternal(addressFromStringValue(addr))
401407
402408

github/deemru/w8io/c3f4982 
55.56 ms