tx · CUnzAXUvS9JxJBRmDTXopqyNbDDYmfB5rNe7NGuT57ky

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01200000 Waves

2023.07.02 20:03 [2648566] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "CUnzAXUvS9JxJBRmDTXopqyNbDDYmfB5rNe7NGuT57ky", "fee": 1200000, "feeAssetId": null, "timestamp": 1688317454262, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "25H6ZvV97FeUYfi6n534mB9TYjvtENudSGpoQtdAMBHB2VAZ4ivA3aQCA2oQaZmtTPa8UTrEjH8rghz2tyJDgNhF" ], "script": "base64:BgIgCAISBgoECAgICBIDCgEBEgMKAQESABIDCgEIEgMKAQhFAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAALSWR4RWZmVG90YWwAAAAKSWR4RWZmVXNlcgABAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkdEFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDABIITaerIIAz9O0bvKju6Lk7zJgt0LXfoHlqjUI/moD/+5AwkAAAIBAVQFByRtYXRjaDABIFWx2J9yh4Lv5eNbjawFq2XemkOhLxa7BfMat4el8cUYCQACAQINVW5rbm93biBjaGFpbgAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAMDPJAMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIADUlkeENmZ1dsZ0RhcHAABAAUSWR4Q2ZnUHV6emxlUG9vbERhcHAABQEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPZWNvbm9teUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnRWNvbm9teURhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUUSWR4Q2ZnUHV6emxlUG9vbERhcHAAC3JlY0xhbmRTaXplAAEBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCE05vdCBpbml0aWFsaXplZCB5ZXQADGlkeFdsZ0Ftb3VudAAAAAtpZHhXbGdQcmljZQABAAtpZHhXbGdGdW5kcwACAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAFBVNTSVpFAwkAAAICAU0FByRtYXRjaDAFBU1TSVpFAwkAAAICAUwFByRtYXRjaDAFBUxTSVpFAwkAAAICAlhMBQckbWF0Y2gwBQZYTFNJWkUDCQAAAgIDWFhMBQckbWF0Y2gwBQdYWExTSVpFCQACAQIRVW5rbm93biBsYW5kIHNpemUBDmdldFZvdGluZ1Bvd2VyARJ1c2VyQWRkclN0ck9yRW1wdHkEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAp0b3RhbFBvd2VyCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlcnNQb3dlcgMJAAACBRJ1c2VyQWRkclN0ck9yRW1wdHkCAAAABAhsYW5kc1N0cgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlTdGFrZWRMYW5kc0J5T3du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BAlwdXp6bGVVc2QJAPAHAgUScHV6emxlUG9vbENvbnRyYWN0BQt1c2R0QXNzZXRJZAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCCQBkAgUKZWNvbm9teVVzZAUHcmVzdFVzZAUGd2xnVXNkBQlwdXp6bGVVc2QJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQVNVUxUOAUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUKZWNvbm9teVVzZAkAzAgCBQdyZXN0VXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QFA25pbAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4JAKQDAQkAagIFA3ZhbAUGdGVuUG93AAZNVUxUMTQAgIDpg7HeFgAOTUFSS0VUSU5HU0hBUkUAoI0GAAlURUFNU0hBUkUAwJoMAA1BQ1RJVklUWVNIQVJFAKCNBgALUExBWUVSU0hBUkUAgLUYAApZRUFSTUlMTElTAICG68d1AApXRUVLTUlMTElTAICIsqACAAlNQVhQRVJJT0QAnAEAAkE2AIDC1y8AAkI4AIDh6xcAD3dsZ0lzc3VlVGltZUtleQINd2xnX2lzc3VlVGltZQAQbWFya2V0aW5nQWRkcktleQINbWFya2V0aW5nQWRkcgALdGVhbUFkZHJLZXkCCHRlYW1BZGRyAA1wcm9maXRBZGRyS2V5Agpwcm9maXRBZGRyABRsYXN0TWFya2V0aW5nVGltZUtleQIZbGFzdENsYWltZWRUaW1lX21hcmtldGluZwAPbGFzdFRlYW1UaW1lS2V5AhRsYXN0Q2xhaW1lZFRpbWVfdGVhbQAVbGFzdEFjdGl2aXRpZXNUaW1lS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQRhZGRyCQCsAgICFGxhc3RDbGFpbWVkVGltZVVzZXJfBQRhZGRyARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyABRzdGFrZXJzQW1vdW50TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAQZwcm9sb2cAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlCQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwBDGdldFN3YXBMaW1pdAEEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQUEYWRkcgAABANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkAZgIFDmFyYml0cmFnZURlbGF5CQBlAgUDbm93BQhsYXN0VGltZQkAAgEJAKwCAgkArAICAh9BcmJpdHJhZ2VzIGFyZSBwb3NzaWJsZSBvbmNlIGEgCQCkAwEJAGkCBQ5hcmJpdHJhZ2VEZWxheQDg1AMCA21pbgQGcGllY2VzCQCRAwIJAQ5nZXRWb3RpbmdQb3dlcgEFBGFkZHIFCklkeEVmZlVzZXIEBHBvdzgJAGwGBQZwaWVjZXMAAAUCQjgACAAIBQdDRUlMSU5HCQBrAwUCQTYFBHBvdzgFBU1VTFQ4AQ1jbGFpbUludGVybmFsAQZjYWxsZXIECmNhbGxlckFkZHIJAKUIAQUGY2FsbGVyBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ93bGdJc3N1ZVRpbWVLZXkCD05vdCBpbml0aWFsaXplZAQRbGFzdE1hcmtldGluZ1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUUbGFzdE1hcmtldGluZ1RpbWVLZXkFCWlzc3VlVGltZQQNbWFya2V0aW5nQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBRBtYXJrZXRpbmdBZGRyS2V5BA9tYXJrZXRpbmdBbW91bnQJAGsDCQBrAwUGTVVMVDE0BQ5NQVJLRVRJTkdTSEFSRQUFTVVMVDYJAGUCBQNub3cFEWxhc3RNYXJrZXRpbmdUaW1lBQpZRUFSTUlMTElTBAxsYXN0VGVhbVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPbGFzdFRlYW1UaW1lS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFC3RlYW1BZGRyS2V5BAp0ZWFtQW1vdW50CQBrAwkAawMFBk1VTFQxNAUJVEVBTVNIQVJFBQVNVUxUNgkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUECWFjdEFtb3VudAkAawMJAGsDBQZNVUxUMTQFDUFDVElWSVRZU0hBUkUFBU1VTFQ2CQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFCllFQVJNSUxMSVMECWN1clBlcmlvZAkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKV0VFS01JTExJUwMJAGYCBQljdXJQZXJpb2QJAGkCBQlNQVhQRVJJT0QAAgkAAgECPVBsZWFzZSBtb2RpZnkgY29udHJhY3QgZm9yIG5leHQgMS41IHllYXJzLCBhY2NvcmRpbmcgdG8gc3RhdHMEA2VmZgkBDmdldFZvdGluZ1Bvd2VyAQUKY2FsbGVyQWRkcgQLdG90YWxQaWVjZXMJAJEDAgUDZWZmBQtJZHhFZmZUb3RhbAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFFHN0YWtlcnNBbW91bnRMZWZ0S2V5AAAEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAawMFD2Ftb3VudExlZnRUb3RhbAkAaAIAAgULdG90YWxQaWVjZXMJAGQCBQt0b3RhbFBpZWNlcwkAaAIJAJYDAQkAzAgCAKCNBgkAzAgCBQt0b3RhbFBpZWNlcwUDbmlsCQBlAgUJTUFYUEVSSU9EBQljdXJQZXJpb2QEC3VzZXJUaW1lS2V5CQEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQUKY2FsbGVyQWRkcgQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFC3VzZXJUaW1lS2V5BQlpc3N1ZVRpbWUECnVzZXJBbW91bnQJAGsDCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCRAwIFA2VmZgUKSWR4RWZmVXNlcgULdG90YWxQaWVjZXMJAGUCBQNub3cFDGxhc3RVc2VyVGltZQkAaAIAAwUKWUVBUk1JTExJUwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFCmNhbGxlckFkZHIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1tYXJrZXRpbmdBZGRyBQ9tYXJrZXRpbmdBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdGVhbUFkZHIFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQp1c2VyQW1vdW50BQp3bGdBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCBQ9hbW91bnRMZWZ0VG90YWwFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFGxhc3RNYXJrZXRpbmdUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgULdXNlclRpbWVLZXkFA25vdwUDbmlsBQp1c2VyQW1vdW50BgFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFBk1VTFQxNAQFaXNzdWUJAMMIBwIGV0xHT0xEAiBXYXZlc0xhbmRzIEdvbGQgaW52ZXN0bWVudCB0b2tlbgUMaXNzdWVkQW1vdW50AAgGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFD3dsZ0lzc3VlVGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUMaXNzdWVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBrAwUGTVVMVDE0BQtQTEFZRVJTSEFSRQUFTVVMVDYJAMwIAgkBC0JpbmFyeUVudHJ5AgUNd2xnQXNzZXRJZEtleQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MABQhyZXN0QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBRBtYXJrZXRpbmdBZGRyS2V5BQ1tYXJrZXRpbmdBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC3RlYW1BZGRyS2V5BQh0ZWFtQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ1wcm9maXRBZGRyS2V5BQpwcm9maXRBZGRyBQNuaWwBaQEGYnV5V2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgQHbWF4VXNkdAkBDGdldFN3YXBMaW1pdAEFBGFkZHIDCQBmAgUHdXNkdEFtdAUHbWF4VXNkdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHNwZW5kIG1heCAJAQpmaXhlZFBvaW50AgUHbWF4VXNkdAAGAgUgVVNEVAQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUMaWR4V2xnQW1vdW50BAtvbGRGdW5kc1VzZAkAZQIJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ0Z1bmRzBQd1c2R0QW10BAh3bGdQcmljZQkAawMFC29sZEZ1bmRzVXNkBQVNVUxUOAUMY3VyV2xnQW1vdW50BAhidXlQcmljZQkAawMFCHdsZ1ByaWNlAAYABQQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlAwkAZgIFCW1pbkFtb3VudAUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYECmRlbHRhRnVuZHMJAGUCBQd1c2R0QW10BQxwcm9maXRBbW91bnQECHJlaXNzdWVkCQBrAwUMY3VyV2xnQW1vdW50BQpkZWx0YUZ1bmRzBQtvbGRGdW5kc1VzZAkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUIcmVpc3N1ZWQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCBQxjdXJXbGdBbW91bnQFCHJlaXNzdWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQl3bGdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUMcHJvbG9nUmVzdWx0AWkBB3NlbGxXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAdtYXhVc2R0CQEMZ2V0U3dhcExpbWl0AQUEYWRkcgQIY3VyU3RhdHMJAQtnZXRXbGdTdGF0cwAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwUMaWR4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGsDCQCRAwIFCGN1clN0YXRzBQtpZHhXbGdQcmljZQAEAAUEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUHdXNkdEFtdAUHbWF4VXNkdAkAAgEJAKwCAgkArAICAhBZb3UgY2FuIGdldCBtYXggCQEKZml4ZWRQb2ludAIFB21heFVzZHQABgIFIFVTRFQDCQBmAgUJbWluQW1vdW50BQd1c2R0QW10CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAQEBmJ1cm5lZAkAawMJAGQCBQd1c2R0QW10BQxwcm9maXRBbW91bnQFDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaWR4V2xnRnVuZHMJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBmJ1cm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBlAgUMY3VyV2xnQW1vdW50BQZidXJuZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAFpAQVjbGFpbQAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEB2FjdGlvbnMICQENY2xhaW1JbnRlcm5hbAEIBQFpBmNhbGxlcgJfMQkAlAoCBQdhY3Rpb25zBQxwcm9sb2dSZXN1bHQBaQELb25TdGFrZUxhbmQBBGFkZHIDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQENY2xhaW1JbnRlcm5hbAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIBaQENb25VbnN0YWtlTGFuZAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAQ1jbGFpbUludGVybmFsAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgDow4U9", "height": 2648566, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 35Z36AT5VfLXJ5FB19VsrV2o1EZ4SWLja7GZ2EFMY4Qt Next: 7Nmyx2ejU8RmZafCARMcsek3GbywJiMwt4MqqeBFfyLa Diff:
OldNewDifferences
253253 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
254254 let now = lastBlock.timestamp
255255 if ((arbitrageDelay > (now - lastTime)))
256- then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "ms"))
256+ then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
257257 else {
258258 let pieces = getVotingPower(addr)[IdxEffUser]
259259 let pow8 = pow(pieces, 0, B8, 8, 8, CEILING)
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
5555
5656 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5757
5858
5959 let IdxCfgStakingDapp = 1
6060
6161 let IdxCfgEconomyDapp = 2
6262
6363 let IdxCfgWlgDapp = 4
6464
6565 let IdxCfgPuzzlePoolDapp = 5
6666
6767 func keyRestCfg () = "%s__restConfig"
6868
6969
7070 func keyRestAddress () = "%s__restAddr"
7171
7272
7373 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7474
7575
7676 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7777
7878
7979 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
8080
8181 let restCfg = readRestCfgOrFail(restContract)
8282
8383 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
8484
8585 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
8686
8787 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8888
8989 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
9090
9191 let recLandSize = 1
9292
9393 func keyResProportions () = "resTypesProportions"
9494
9595
9696 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
9797
9898
9999 let wlgIssuedAmountKey = "wlg_issuedAmount"
100100
101101 let wlgAssetIdKey = "wlg_assetId"
102102
103103 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
104104
105105 let idxWlgAmount = 0
106106
107107 let idxWlgPrice = 1
108108
109109 let idxWlgFunds = 2
110110
111111 func asInt (v) = match v {
112112 case n: Int =>
113113 n
114114 case _ =>
115115 throw("fail to cast into Int")
116116 }
117117
118118
119119 func numPiecesBySize (landSize) = match landSize {
120120 case _ =>
121121 if (("S" == $match0))
122122 then SSIZE
123123 else if (("M" == $match0))
124124 then MSIZE
125125 else if (("L" == $match0))
126126 then LSIZE
127127 else if (("XL" == $match0))
128128 then XLSIZE
129129 else if (("XXL" == $match0))
130130 then XXLSIZE
131131 else throw("Unknown land size")
132132 }
133133
134134
135135 func getVotingPower (userAddrStrOrEmpty) = {
136136 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
137137 func adder (acc,item) = (acc + parseIntValue(item))
138138
139139 let totalPower = {
140140 let $l = props
141141 let $s = size($l)
142142 let $acc0 = 0
143143 func $f0_1 ($a,$i) = if (($i >= $s))
144144 then $a
145145 else adder($a, $l[$i])
146146
147147 func $f0_2 ($a,$i) = if (($i >= $s))
148148 then $a
149149 else throw("List size exceeds 6")
150150
151151 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
152152 }
153153 let usersPower = if ((userAddrStrOrEmpty == ""))
154154 then 0
155155 else {
156156 let landsStr = getString(stakingContract, keyStakedLandsByOwner(userAddrStrOrEmpty))
157157 let lands = if (isDefined(landsStr))
158158 then split_51C(value(landsStr), "_")
159159 else nil
160160 func oneLand (acc,landAssetId) = {
161161 let asset = value(assetInfo(fromBase58String(landAssetId)))
162162 let landSize = split(asset.description, "_")[recLandSize]
163163 (acc + numPiecesBySize(landSize))
164164 }
165165
166166 let $l = lands
167167 let $s = size($l)
168168 let $acc0 = 0
169169 func $f1_1 ($a,$i) = if (($i >= $s))
170170 then $a
171171 else oneLand($a, $l[$i])
172172
173173 func $f1_2 ($a,$i) = if (($i >= $s))
174174 then $a
175175 else throw("List size exceeds 100")
176176
177177 $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)
178178 }
179179 [totalPower, usersPower]
180180 }
181181
182182
183183 func getWlgStats () = {
184184 let issuedAmount = valueOrErrorMessage(getInteger(wlgContract, wlgIssuedAmountKey), "WLGOLD is not issued yet")
185185 let economyUsd = assetBalance(economyContract, usdtAssetId)
186186 let restUsd = assetBalance(restContract, usdtAssetId)
187187 let wlgUsd = assetBalance(wlgContract, usdtAssetId)
188188 let puzzleUsd = assetBalance(puzzlePoolContract, usdtAssetId)
189189 let totalFundsUsd = (((economyUsd + restUsd) + wlgUsd) + puzzleUsd)
190190 [issuedAmount, fraction(totalFundsUsd, MULT8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd]
191191 }
192192
193193
194194 func fixedPoint (val,decimals) = {
195195 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
196196 ((toString((val / tenPow)) + ".") + toString((val % tenPow)))
197197 }
198198
199199
200200 let MULT14 = 100000000000000
201201
202202 let MARKETINGSHARE = 100000
203203
204204 let TEAMSHARE = 200000
205205
206206 let ACTIVITYSHARE = 100000
207207
208208 let PLAYERSHARE = 400000
209209
210210 let YEARMILLIS = 31557600000
211211
212212 let WEEKMILLIS = 604800000
213213
214214 let MAXPERIOD = 156
215215
216216 let A6 = 100000000
217217
218218 let B8 = 50000000
219219
220220 let wlgIssueTimeKey = "wlg_issueTime"
221221
222222 let marketingAddrKey = "marketingAddr"
223223
224224 let teamAddrKey = "teamAddr"
225225
226226 let profitAddrKey = "profitAddr"
227227
228228 let lastMarketingTimeKey = "lastClaimedTime_marketing"
229229
230230 let lastTeamTimeKey = "lastClaimedTime_team"
231231
232232 let lastActivitiesTimeKey = "lastClaimedTime_activities"
233233
234234 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
235235
236236
237237 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
238238
239239
240240 let stakersAmountLeftKey = "stakersAmountLeft"
241241
242242 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
243243
244244 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
245245
246246
247247 func prolog () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
248248 then throw("Contracts are under maintenance")
249249 else asInt(invoke(stakingContract, "saveLastTx", nil, nil))
250250
251251
252252 func getSwapLimit (addr) = {
253253 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
254254 let now = lastBlock.timestamp
255255 if ((arbitrageDelay > (now - lastTime)))
256- then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "ms"))
256+ then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
257257 else {
258258 let pieces = getVotingPower(addr)[IdxEffUser]
259259 let pow8 = pow(pieces, 0, B8, 8, 8, CEILING)
260260 fraction(A6, pow8, MULT8)
261261 }
262262 }
263263
264264
265265 func claimInternal (caller) = {
266266 let callerAddr = toString(caller)
267267 let now = lastBlock.timestamp
268268 let issueTime = valueOrErrorMessage(getInteger(wlgIssueTimeKey), "Not initialized")
269269 let lastMarketingTime = valueOrElse(getInteger(lastMarketingTimeKey), issueTime)
270270 let marketingAddr = addressFromStringValue(value(getString(marketingAddrKey)))
271271 let marketingAmount = fraction(fraction(MULT14, MARKETINGSHARE, MULT6), (now - lastMarketingTime), YEARMILLIS)
272272 let lastTeamTime = valueOrElse(getInteger(lastTeamTimeKey), issueTime)
273273 let teamAddr = addressFromStringValue(value(getString(teamAddrKey)))
274274 let teamAmount = fraction(fraction(MULT14, TEAMSHARE, MULT6), (now - lastTeamTime), (3 * YEARMILLIS))
275275 let lastActivitiesTime = valueOrElse(getInteger(lastActivitiesTimeKey), issueTime)
276276 let actAmount = fraction(fraction(MULT14, ACTIVITYSHARE, MULT6), (now - lastActivitiesTime), (3 * YEARMILLIS))
277277 let curPeriod = ((now - issueTime) / WEEKMILLIS)
278278 if ((curPeriod > (MAXPERIOD / 2)))
279279 then throw("Please modify contract for next 1.5 years, according to stats")
280280 else {
281281 let eff = getVotingPower(callerAddr)
282282 let totalPieces = eff[IdxEffTotal]
283283 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
284284 let curPeriodDistribution = fraction(amountLeftTotal, (2 * totalPieces), (totalPieces + (max([100000, totalPieces]) * (MAXPERIOD - curPeriod))))
285285 let userTimeKey = keyLastClaimedTimeByUser(callerAddr)
286286 let lastUserTime = valueOrElse(getInteger(userTimeKey), issueTime)
287287 let userAmount = fraction(fraction(curPeriodDistribution, eff[IdxEffUser], totalPieces), (now - lastUserTime), (3 * YEARMILLIS))
288288 let userKey = keyStakersAmountPaidUser(callerAddr)
289289 $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)
290290 }
291291 }
292292
293293
294294 @Callable(i)
295295 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
296296 then throw("Permission denied")
297297 else if (isDefined(getBinary(wlgAssetIdKey)))
298298 then throw("Already initialized")
299299 else {
300300 let issuedAmount = MULT14
301301 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
302302 let assetId = calculateAssetId(issue)
303303 [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)]
304304 }
305305
306306
307307
308308 @Callable(i)
309309 func buyWlg (minAmount) = {
310310 let prologResult = prolog()
311311 if ((size(i.payments) != 1))
312312 then throw("exactly 1 payment must be attached")
313313 else {
314314 let pmt = i.payments[0]
315315 let usdtAmt = pmt.amount
316316 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
317317 if ((pmtAssetId != usdtAssetId))
318318 then throw("USDT payments only!")
319319 else {
320320 let caller = i.caller
321321 let addr = toString(caller)
322322 let maxUsdt = getSwapLimit(addr)
323323 if ((usdtAmt > maxUsdt))
324324 then throw((("You can spend max " + fixedPoint(maxUsdt, 6)) + " USDT"))
325325 else {
326326 let curStats = getWlgStats()
327327 let curWlgAmount = curStats[idxWlgAmount]
328328 let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
329329 let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
330330 let buyPrice = fraction(wlgPrice, 6, 5)
331331 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
332332 if ((minAmount > wlgAmount))
333333 then throw("Price changed during operation, please try again")
334334 else {
335335 let profitAmount = (usdtAmt / 6)
336336 let deltaFunds = (usdtAmt - profitAmount)
337337 let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
338338 $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)
339339 }
340340 }
341341 }
342342 }
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func sellWlg (minAmount) = {
349349 let prologResult = prolog()
350350 if ((size(i.payments) != 1))
351351 then throw("exactly 1 payment must be attached")
352352 else {
353353 let pmt = i.payments[0]
354354 let wlgAmt = pmt.amount
355355 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
356356 if ((pmtAssetId != wlgAssetId))
357357 then throw("WLGOLD payments only!")
358358 else {
359359 let caller = i.caller
360360 let addr = toString(caller)
361361 let maxUsdt = getSwapLimit(addr)
362362 let curStats = getWlgStats()
363363 let curWlgAmount = curStats[idxWlgAmount]
364364 let sellPrice = fraction(curStats[idxWlgPrice], 4, 5)
365365 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
366366 if ((usdtAmt > maxUsdt))
367367 then throw((("You can get max " + fixedPoint(maxUsdt, 6)) + " USDT"))
368368 else if ((minAmount > usdtAmt))
369369 then throw("Price changed during operation, please try again")
370370 else {
371371 let profitAmount = (usdtAmt / 4)
372372 let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
373373 $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)
374374 }
375375 }
376376 }
377377 }
378378
379379
380380
381381 @Callable(i)
382382 func claim () = {
383383 let prologResult = prolog()
384384 let actions = claimInternal(i.caller)._1
385385 $Tuple2(actions, prologResult)
386386 }
387387
388388
389389
390390 @Callable(i)
391391 func onStakeLand (addr) = if ((i.caller != stakingContract))
392392 then throw("Permission denied")
393393 else claimInternal(addressFromStringValue(addr))
394394
395395
396396
397397 @Callable(i)
398398 func onUnstakeLand (addr) = if ((i.caller != stakingContract))
399399 then throw("Permission denied")
400400 else claimInternal(addressFromStringValue(addr))
401401
402402

github/deemru/w8io/873ac7e 
71.28 ms