tx · Dheq9Gk5fXDhVgC4STbA5oqVKC1Wxaurk1Vz4yK8Et7Y

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.02200000 Waves

2024.11.12 23:55 [3368710] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "Dheq9Gk5fXDhVgC4STbA5oqVKC1Wxaurk1Vz4yK8Et7Y", "fee": 2200000, "feeAssetId": null, "timestamp": 1731444994458, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "3hiCUpLaynMiA6DCMA6jMivfA3bauNZUUC4Y67vXQ5XBZ6RvKv69uW3XarDECvYxZ2o8uKR2YBFYnWycddqNNTpT" ], "script": "base64:BgJCCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgMKAQgSAwoBARIDCgEBEgASAwoBCBIDCgEIggEACkRBWV9NSUxMSVMAgLiZKQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZHRBc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASCE2nqyCAM/TtG7yo7ui5O8yYLdC136B5ao1CP5qA//uQMJAAACAQFUBQckbWF0Y2gwASBVsdifcoeC7+XjW42sBatl3ppDoS8WuwXzGreHpfHFGAkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluABBhY3JlczJBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUDRVSDNUOW5YcE1OcFVtU21RalBtRXozRzg1dDN6bjZlQQMJAAACAQFUBQckbWF0Y2gwAiMzTkJQeDFGY2l1M0pRTkVHWjIxalNuVGR1dExOR0dCVVNYaAkAAgECDVVua25vd24gY2hhaW4ADmFyYml0cmFnZURlbGF5BAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwBQpEQVlfTUlMTElTAwkAAAIBAVQFByRtYXRjaDAA4NQDCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAA5NSU5TSE9QUEFZTUVOVACgjQYBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABFJZHhDZmdTdGFraW5nRGFwcAABAA1JZHhDZmdXbGdEYXBwAAQAFElkeENmZ1B1enpsZVBvb2xEYXBwAAUAFElkeENmZ0ludmVzdEZ1bmREYXBwAAYAD0lkeENmZ0FjcmVzRGFwcAAIAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyAQ9rZXlSZXN0MkFkZHJlc3MAAg0lc19fcmVzdDJBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1B1enpsZVBvb2xEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRRJZHhDZmdJbnZlc3RGdW5kRGFwcAANYWNyZXNDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFD0lkeENmZ0FjcmVzRGFwcAANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQIYV0xHT0xEIGlzIG5vdCBpc3N1ZWQgeWV0AQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AAZTQ0FMRTgAgMLXLwAMeHBMZXZlbFNjYWxlAIAZAA94cExldmVsUmVjaXBQb3cAoB8AEm51bVBvaW50c09uTGV2ZWxVcAADAA93bGdCYXNlQW1vdW50WHAAgNDbw/QCAQlrZXlVc2VyWFABBGFkZHIJAKwCAgIHdXNlclhQXwUEYWRkcgEMa2V5VXNlckxldmVsAQRhZGRyCQCsAgICCnVzZXJMZXZlbF8FBGFkZHIABXhwV2xnAJBOAQlsZXZlbEJ5WFABAnhwCQBrAwUMeHBMZXZlbFNjYWxlCQBsBgUCeHAABAUPeHBMZXZlbFJlY2lwUG93AAQABAUERE9XTgUGU0NBTEU4AQdsZXZlbFVwAgljdXJyTGV2ZWwFbmV3WFAECG5ld0xldmVsCQEJbGV2ZWxCeVhQAQUFbmV3WFAJAMwIAgUIbmV3TGV2ZWwJAMwIAgkAaAIFEm51bVBvaW50c09uTGV2ZWxVcAkAZQIFCG5ld0xldmVsBQljdXJyTGV2ZWwFA25pbAAITUlMTElPTjYAgIDpg7HeFgALUExBWUVSU0hBUkUAgLUYAAlEQVlNSUxMSVMAgLiZKQALdGVhbUFkZHJLZXkCCHRlYW1BZGRyAA9sYXN0VGVhbVRpbWVLZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtABF0ZWFtQW1vdW50TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFWxhc3RBY3Rpdml0aWVzVGltZUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMAEGFjdEFtb3VudExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABRzdGFrZXJzQW1vdW50TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBFGtleUxhc3RBcmJUaW1lQnlVc2VyAQRhZGRyCQCsAgICEGxhc3RBcmJUaW1lVXNlcl8FBGFkZHIAD3dsZ0lzc3VlVGltZUtleQINd2xnX2lzc3VlVGltZQASd2xnSXNzdWVkQW1vdW50S2V5AhB3bGdfaXNzdWVkQW1vdW50ARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhZ3bGdTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABF3bGdTdGFrZWRUb3RhbEtleQIUd2xnU3Rha2VkQW1vdW50VG90YWwBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUd2xnU3Rha2VkVGltZUJ5VXNlcl8FBGFkZHIAA002XwDAhD0AA004XwCAwtcvAApURUFNX1NIQVJFAMCaDAAOQUNUSVZJVFlfU0hBUkUAoI0GAAxQTEFZRVJfU0hBUkUAgLUYAAtZRUFSX01JTExJUwCAhuvHdQAGREFZX01TAIC4mSkACkRBWV9CTE9DS1MAoAsAB0lTU1VFMTAAgJTr3AMAD1BMQVlFUlMxMF9TSEFSRQCA6jAAEU1BUktFVElORzEwX1NIQVJFAKCNBgAMVEVBTTEwX1NIQVJFAKCNBgARTkVXX1NUQUtJTkdfU1RBUlQAgPO4wrEyABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAp0ZWFtQWRyS2V5Agh0ZWFtQWRkcgAObGFzdFRlYW1UaW1LZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtAA50ZWFtQW10TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFGxhc3RBY3Rpdml0aWVzVGltS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwANYWN0QW10TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAEXN0YWtlcnNBbXRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgENZGlzdHJCeVBlcmlvZAIMaXNzdWVkQW1vdW50BnBlcmlvZAkAawMFDGlzc3VlZEFtb3VudAkAaAIFDFBMQVlFUl9TSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQNNNl8AEXdsZ0lzc3VlMTBUaW1lS2V5Ag93bGdfaXNzdWUxMFRpbWUADndsZ0lzc3VlVGltS2V5Ag13bGdfaXNzdWVUaW1lAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgAUdG90YWxGYXJtaW5nUG93ZXJLZXkCEXRvdGFsRmFybWluZ1Bvd2VyAAlkYXBwMlJlc3QAAAAMZGFwcDJTdGFraW5nAAEACGRhcHAyV2xnAAIAC2RhcHAyUHV6emxlAAMAD2RhcHAySW52ZXN0RnVuZAAEAApsZXZlbEFjcmVzCQDMCAIAAAkAzAgCAAoJAMwIAgAUCQDMCAIAKAkAzAgCAFAJAMwIAgCWAQkAzAgCAPoBCQDMCAIAkAMJAMwIAgC8BQkAzAgCAOgHBQNuaWwBD2dldExldmVsQnlBY3JlcwEFYWNyZXMEA2FjcgkAaQIJAGQCBQVhY3JlcwD/wdcvBQNNOF8KAQdjaGVja2VyAgNhY2MEaXRlbQMJAGcCBQRpdGVtBQNhY3IFA2FjYwkAZAIFA2FjYwABCgACJGwFCmxldmVsQWNyZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBFmdldEZhcm1pbmdQb3dlckJ5QWNyZXMBBWFjcmVzCQBoAgkAaAIFBWFjcmVzABQJAGQCCQEPZ2V0TGV2ZWxCeUFjcmVzAQUFYWNyZXMABAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5DmFjcmVzMkNvbnRyYWN0BAd0b3RhbEZQCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAZ1c2VyRlAJARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQUJdXNlckFjcmVzCQDMCAIFB3RvdGFsRlAJAMwIAgUGdXNlckZQBQNuaWwBCmtleVVzZXJCZXQBBGFkZHIJAKwCAgIIdXNlckJldF8FBGFkZHIBDmtleVVzZXJUaWNrZXRzAQRhZGRyCQCsAgICDHVzZXJUaWNrZXRzXwUEYWRkcgAPa2V5VG90YWxUaWNrZXRzAgx0b3RhbFRpY2tldHMBCndpbm5pbmdCZXQBA2RheQkAagIJALEJAQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQkAaAIFA2RheQUKREFZX0JMT0NLUwN2cmYABAAKaWR4VG90YWxGUAAAAAlpZHhVc2VyRlAAAQALaXhXbGdBbW91bnQAAAAIaXhXbGdXbGcAAQAKaXhXbGdQcmljZQACAA5peFdsZ0lzc3VlVGltZQAIAA9peFdsZ1RlYW1BbUxlZnQACwATaXhXbGdUZWFtQW1BdmFpbE5vdwAMAA5peFdsZ0FjdEFtTGVmdAAPABJpeFdsZ0FjdEFtQXZhaWxOb3cAEAAQaXhXbGdBbUxlZnRUb3RhbAATABNpeFdsZ1VzZXJBbUF2YWlsTm93ABcAEGl4V2xnRWZmVXNlclRpbWUAGAASaXhXbGdJc3N1ZTEwQW1vdW50ABkAG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAAaABZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50ABsAD2l4V2xnVXNlcjEwcGFydAAcABBpeFdsZ0lzc3VlMTBUaW1lAB0BDGdldFdsZ1N0YXRzMgQLdXNlckFkZHJPcHQJY29udHJhY3RzBnVzZHRJZBV1c2R0QmFsYW5jZUNvcnJlY3Rpb24EDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUPd2xnSXNzdWVkQW10S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCWRhcHAyUmVzdAUGdXNkdElkBAZ3bGdVc2QJAGUCCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUGdXNkdElkBRV1c2R0QmFsYW5jZUNvcnJlY3Rpb24ECXB1enpsZVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwULZGFwcDJQdXp6bGUFBnVzZHRJZAQJYWNyZXMyVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFBnVzZHRJZAQRaW52ZXN0Rm5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ9kYXBwMkludmVzdEZ1bmQED2ludmVzdEZ1bmRUb3RhbAkAZAIJAPAHAgURaW52ZXN0Rm5kQ29udHJhY3QFBnVzZHRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRFpbnZlc3RGbmRDb250cmFjdAUOemJJc3N1ZWRBbXRLZXkAAAQNdG90YWxGdW5kc1VzZAkAZAIJAGQCBQlhY3JlczJVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwILd2xnX2Fzc2V0SWQCE05vdCBpbml0aWFsaXplZCB5ZXQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOd2xnSXNzdWVUaW1LZXkCD05vdCBpbml0aWFsaXplZAQGd2xnV2xnCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUFd2xnSWQECXRlYW1Ub3RhbAkAawMFDGlzc3VlZEFtb3VudAUKVEVBTV9TSEFSRQUDTTZfBA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDnRlYW1BbXRMZWZ0S2V5BQl0ZWFtVG90YWwEDGxhc3RUZWFtVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFDmxhc3RUZWFtVGltS2V5BQlpc3N1ZVRpbWUECHRlYW1BZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCdCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUKdGVhbUFkcktleQQWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwULWUVBUl9NSUxMSVMJAMwIAgUOdGVhbUFtb3VudExlZnQFA25pbAQKdGVhbVdsZ29sZAkA8AcCBQh0ZWFtQWRkcgUFd2xnSWQECGFjdFRvdGFsCQBrAwUMaXNzdWVkQW1vdW50BQ5BQ1RJVklUWV9TSEFSRQUDTTZfBA1hY3RBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUNYWN0QW10TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFFGxhc3RBY3Rpdml0aWVzVGltS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ1hY3RBbW91bnRMZWZ0BQNuaWwECWFjdFdsZ29sZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQV3bGdJZAQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQt1c2VyQWRkck9wdAUJaXNzdWVUaW1lBA5sYXN0VXNlclBlcmlvZAkAaQIJAGUCBQxsYXN0VXNlclRpbWUFCWlzc3VlVGltZQULWUVBUl9NSUxMSVMECm5vd0xpbWl0ZWQJAJcDAQkAzAgCBQNub3cJAMwIAgkAZAIFCWlzc3VlVGltZQkAaAIAAwULWUVBUl9NSUxMSVMFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQULWUVBUl9NSUxMSVMJAMwIAgACBQNuaWwEA2VmZgkBEGdldEZhcm1pbmdQb3dlcnMCBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwQVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAUJY3VyUGVyaW9kBA1wcmV2UGVyaW9kRW5kCQBkAgUJaXNzdWVUaW1lCQBoAgULWUVBUl9NSUxMSVMFCWN1clBlcmlvZAQRcHJldlByZXZQZXJpb2RFbmQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEDXVzZXJBdmFpbGFibGUDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAUCYTADCQAAAgUObGFzdFVzZXJQZXJpb2QJAGUCBQljdXJQZXJpb2QAAQQCYTEJAGsDCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAABCQBlAgUNcHJldlBlcmlvZEVuZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwkAZAIFAmExBQJhMAQCYTIJAGsDCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAACCQBlAgURcHJldlByZXZQZXJpb2RFbmQFDGxhc3RVc2VyVGltZQULWUVBUl9NSUxMSVMEAmExCQENZGlzdHJCeVBlcmlvZAIFDGlzc3VlZEFtb3VudAkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFAmEyBQJhMQUCYTAED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcDJXbGcFEXN0YWtlcnNBbXRMZWZ0S2V5AAAECnVzZXJBbW91bnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwUNdXNlckF2YWlsYWJsZQkAkQMCBQNlZmYFCWlkeFVzZXJGUAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAQPbGFzdElzc3VlMTBUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURd2xnSXNzdWUxMFRpbWVLZXkFEU5FV19TVEFLSU5HX1NUQVJUBA1pc3N1ZTEwQW1vdW50CQBrAwUHSVNTVUUxMAkAlgMBCQDMCAIJAGUCBQNub3cFD2xhc3RJc3N1ZTEwVGltZQkAzAgCAAAFA25pbAUGREFZX01TBBZtYXJrZXRpbmdJc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAURTUFSS0VUSU5HMTBfU0hBUkUFA002XwQRdGVhbUlzc3VlMTBBbW91bnQJAGsDBQ1pc3N1ZTEwQW1vdW50BQxURUFNMTBfU0hBUkUFA002XwQOdXNlcjEwSW50ZXJ2YWwJAJYDAQkAzAgCCQBlAgUDbm93CQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUMbGFzdFVzZXJUaW1lBQNuaWwJAMwIAgAABQNuaWwECnVzZXIxMHBhcnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwkAawMJAGsDBQdJU1NVRTEwBQ51c2VyMTBJbnRlcnZhbAUGREFZX01TCQCRAwIFA2VmZgUJaWR4VXNlckZQCQCRAwIFA2VmZgUKaWR4VG90YWxGUAUPUExBWUVSUzEwX1NIQVJFBQNNNl8AAAQObmV3SXNzdWUxMFRpbWUJAJYDAQkAzAgCBRFORVdfU1RBS0lOR19TVEFSVAkAzAgCBQNub3cFA25pbAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgUGd2xnV2xnCQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQNNOF8FDGlzc3VlZEFtb3VudAkAzAgCBQ10b3RhbEZ1bmRzVXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUJYWNyZXMyVXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFDGxhc3RUZWFtVGltZQkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFCnVzZXJBbW91bnQJAMwIAgUKbm93TGltaXRlZAkAzAgCBQ1pc3N1ZTEwQW1vdW50CQDMCAIFFm1hcmtldGluZ0lzc3VlMTBBbW91bnQJAMwIAgURdGVhbUlzc3VlMTBBbW91bnQJAMwIAgUKdXNlcjEwcGFydAkAzAgCBQ5uZXdJc3N1ZTEwVGltZQkAzAgCCQCRAwIFA2VmZgUKaWR4VG90YWxGUAUDbmlsAANuZXQJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAFmRlZmF1bHRSZXN0MkFkZHJlc3NTdHIEByRtYXRjaDAFA25ldAMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4ADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAA5hY3JlczJDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUQYWNyZXMyQWRkcmVzc1N0cgEHcHJvbG9nMgAJAQVhc0ludAEJAP0HBAUOYWNyZXMyQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQ9nZXRTd2FwTGltaXRXbGcBBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQ5hcmJpdHJhZ2VEZWxheQkAZQIFA25vdwUIbGFzdFRpbWUJAAIBCQCsAgIJAKwCAgIfQXJiaXRyYWdlcyBhcmUgcG9zc2libGUgb25jZSBhIAkApAMBCQBpAgUOYXJiaXRyYWdlRGVsYXkA4NQDAgNtaW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIAAAEOY2xhaW1JbnRlcm5hbDIBBGFkZHIECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAUEYWRkcgkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQLdXNlclRpbWVLZXkJARZrZXlMYXN0Q2xhaW1UaW1lQnlVc2VyAQUEYWRkcgQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFC3VzZXJUaW1lS2V5AAAEC3VzZXJFZmZUaW1lCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0VmZlVzZXJUaW1lAwkAAAIFDGxhc3RVc2VyVGltZQULdXNlckVmZlRpbWUJAJQKAgUDbmlsAAAEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkAkQMCBQhjdXJTdGF0cwUOaXhXbGdJc3N1ZVRpbWUEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ9peFdsZ1RlYW1BbUxlZnQECnRlYW1BbW91bnQJAGQCCQCRAwIFCGN1clN0YXRzBRNpeFdsZ1RlYW1BbUF2YWlsTm93CQCRAwIFCGN1clN0YXRzBRZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50BAx0ZWFtVHJhbnNmZXIDCQBmAgUKdGVhbUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQULdGVhbUFkZHJLZXkFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA1hY3RBbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBQ5peFdsZ0FjdEFtTGVmdAQJYWN0QW1vdW50CQCRAwIFCGN1clN0YXRzBRJpeFdsZ0FjdEFtQXZhaWxOb3cEC2FjdFRyYW5zZmVyAwkAZgIFCWFjdEFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDHJlc3RDb250cmFjdAUJYWN0QW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQPbWFya2V0aW5nQW1vdW50CQCRAwIFCGN1clN0YXRzBRtpeFdsZ01hcmtldGluZ0lzc3VlMTBBbW91bnQEEW1hcmtldGluZ1RyYW5zZmVyAwkAZgIFD21hcmtldGluZ0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUQbWFya2V0aW5nQWRkcktleQUPbWFya2V0aW5nQW1vdW50BQp3bGdBc3NldElkBQNuaWwFA25pbAQKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUTaXhXbGdVc2VyQW1BdmFpbE5vdwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFBGFkZHIECXVzZXJUb3RhbAkAZAIFCnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVXNlcjEwcGFydAQOaXNzdWVkMTBBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnSXNzdWUxMEFtb3VudAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUOaXNzdWVkMTBBbW91bnQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGQCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUOaXNzdWVkMTBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXdsZ0lzc3VlMTBUaW1lS2V5CQCRAwIFCGN1clN0YXRzBRBpeFdsZ0lzc3VlMTBUaW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRBpeFdsZ0FtTGVmdFRvdGFsBQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQkAZAIJAGUCBQ50ZWFtQW1vdW50TGVmdAUKdGVhbUFtb3VudAkAkQMCBQhjdXJTdGF0cwUWaXhXbGdUZWFtSXNzdWUxMEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPbGFzdFRlYW1UaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFEGFjdEFtb3VudExlZnRLZXkJAGUCBQ1hY3RBbW91bnRMZWZ0BQlhY3RBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQt1c2VyVGltZUtleQULdXNlckVmZlRpbWUFA25pbAUMdGVhbVRyYW5zZmVyBQthY3RUcmFuc2ZlcgURbWFya2V0aW5nVHJhbnNmZXIFCXVzZXJUb3RhbAEOdGFrZVhwSW50ZXJuYWwCBGFkZHIFZGVsdGEEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEB3RpbWVLZXkJARZrZXlXbGdTdGFrZWRUaW1lQnlVc2VyAQUEYWRkcgQJYW1vdW50S2V5CQEYa2V5V2xnU3Rha2VkQW1vdW50QnlVc2VyAQUEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdGltZUtleQAABAdvbGRVc2VyCQELdmFsdWVPckVsc2UCCQCfCAEFCWFtb3VudEtleQAABAhvbGRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF3bGdTdGFrZWRUb3RhbEtleQAABAJ4cAkAawMJAGsDBQV4cFdsZwUHb2xkVXNlcgUPd2xnQmFzZUFtb3VudFhwCQBlAgUIbGFzdFRpbWUFA25vdwUJREFZTUlMTElTCQCVCgMJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUJYW1vdW50S2V5CQBkAgUHb2xkVXNlcgUFZGVsdGEJAMwIAgkBDEludGVnZXJFbnRyeQIFEXdsZ1N0YWtlZFRvdGFsS2V5CQBkAgUIb2xkVG90YWwFBWRlbHRhBQNuaWwFAnhwBQdvbGRVc2VyARRjbGFpbVRpY2tldHNJbnRlcm5hbAIEYWRkcgp1c2VyQmV0U3RyBA90b3RhbFRpY2tldHNLZXkFD2tleVRvdGFsVGlja2V0cwQKdGlja2V0c0tleQkBDmtleVVzZXJUaWNrZXRzAQUEYWRkcgQGYmV0S2V5CQEKa2V5VXNlckJldAEFBGFkZHIEBmRheUJldAkAtQkCBQp1c2VyQmV0U3RyAgFfBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPdG90YWxUaWNrZXRzS2V5AAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABAxkZWx0YVRpY2tldHMDCQAAAgkBCndpbm5pbmdCZXQBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZkYXlCZXQAAQABAAAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKdGlja2V0c0tleQkAZAIFCm9sZFRpY2tldHMFDGRlbHRhVGlja2V0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPdG90YWxUaWNrZXRzS2V5CQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGYmV0S2V5BQNuaWwFDGRlbHRhVGlja2V0cw0BaQENY29uc3RydWN0b3JWMQQIcmVzdEFkZHINbWFya2V0aW5nQWRkcgh0ZWFtQWRkcgpwcm9maXRBZGRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQDCQEJaXNEZWZpbmVkAQkAoQgBBQ13bGdBc3NldElkS2V5CQACAQITQWxyZWFkeSBpbml0aWFsaXplZAQMaXNzdWVkQW1vdW50BQhNSUxMSU9ONgQFaXNzdWUJAMMIBwIGV0xHT0xEAiBXYXZlc0xhbmRzIEdvbGQgaW52ZXN0bWVudCB0b2tlbgUMaXNzdWVkQW1vdW50AAgGBQR1bml0AAAEB2Fzc2V0SWQJALgIAQUFaXNzdWUJAMwIAgUFaXNzdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFD3dsZ0lzc3VlVGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUMaXNzdWVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFFHN0YWtlcnNBbW91bnRMZWZ0S2V5CQBrAwUITUlMTElPTjYFC1BMQVlFUlNIQVJFBQVNVUxUNgkAzAgCCQELQmluYXJ5RW50cnkCBQ13bGdBc3NldElkS2V5BQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlSZXN0QWRkcmVzcwAFCHJlc3RBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFEG1hcmtldGluZ0FkZHJLZXkFDW1hcmtldGluZ0FkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgULdGVhbUFkZHJLZXkFCHRlYW1BZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDXByb2ZpdEFkZHJLZXkFCnByb2ZpdEFkZHIFA25pbAFpAQ1jb25zdHJ1Y3RvclYyAQlyZXN0MkFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5UmVzdDJBZGRyZXNzAAUJcmVzdDJBZGRyBQNuaWwBaQEGYnV5V2xnAQltaW5BbW91bnQEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEB3VzZHRBbXQIBQNwbXQGYW1vdW50AwMJAQEhAQkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAYJAQIhPQIJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECHdsZ1ByaWNlCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlBAhidXlQcmljZQkAawMFCHdsZ1ByaWNlAAYABQQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJAQ9nZXRTd2FwTGltaXRXbGcBBQRhZGRyAwkAZgIFCXdsZ0Ftb3VudAUGbWF4V2xnCQACAQkArAICCQCsAgICEFlvdSBjYW4gZ2V0IG1heCAJAQpmaXhlZFBvaW50AgUGbWF4V2xnAAgCByBXTEdPTEQDCQBmAgUJbWluQW1vdW50BQl3bGdBbW91bnQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCCQDMCAIJAQdSZWlzc3VlAwUKd2xnQXNzZXRJZAUJd2xnQW1vdW50BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBkAgUMY3VyV2xnQW1vdW50BQl3bGdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXdsZ0Ftb3VudAUKd2xnQXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOYnV5V2xnUkVBRE9OTFkCB2FkZHJlc3MHdXNkdEFtdAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkBQd1c2R0QW10BAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAh3bGdQcmljZQkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQQIYnV5UHJpY2UJAGsDBQh3bGdQcmljZQAGAAUECXdsZ0Ftb3VudAkAawMFB3VzZHRBbXQFBU1VTFQ4BQhidXlQcmljZQQGbWF4V2xnCQEPZ2V0U3dhcExpbWl0V2xnAQUHYWRkcmVzcwQHbWF4VXNkdAkAawMFBm1heFdsZwUIYnV5UHJpY2UFBU1VTFQ4BAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYJAJQKAgUDbmlsCQDMCAIFCXdsZ0Ftb3VudAkAzAgCBQ5NSU5TSE9QUEFZTUVOVAkAzAgCBQdtYXhVc2R0CQDMCAIFDHByb2ZpdEFtb3VudAUDbmlsAWkBB3NlbGxXbGcBCW1pbkFtb3VudAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQGY2FsbGVyCAUBaQZjYWxsZXIEBGFkZHIJAKUIAQUGY2FsbGVyBAZtYXhXbGcJAQ9nZXRTd2FwTGltaXRXbGcBBQRhZGRyAwkAZgIFBndsZ0FtdAUGbWF4V2xnCQACAQkArAICCQCsAgICEllvdSBjYW4gc3BlbmQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIHIFdMR09MRAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAxjdXJXbGdBbW91bnQJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BAlzZWxsUHJpY2UJAGkCCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlAAIEB3VzZHRBbXQJAGsDBQZ3bGdBbXQFCXNlbGxQcmljZQUFTVVMVDgDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUAwkAZgIFCW1pbkFtb3VudAUHdXNkdEFtdAkAAgECMFByaWNlIGNoYW5nZWQgZHVyaW5nIG9wZXJhdGlvbiwgcGxlYXNlIHRyeSBhZ2FpbgQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZQIFDGN1cldsZ0Ftb3VudAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFDXByb2ZpdEFkZHJLZXkFDHByb2ZpdEFtb3VudAULdXNkdEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQd1c2R0QW10BQt1c2R0QXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPc2VsbFdsZ1JFQURPTkxZAgdhZGRyZXNzBndsZ0FtdAQGbWF4V2xnCQEPZ2V0U3dhcExpbWl0V2xnAQUHYWRkcmVzcwQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAAEDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaXhXbGdBbW91bnQECXNlbGxQcmljZQkAaQIJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UAAgQHdXNkdEFtdAkAawMFBndsZ0FtdAUJc2VsbFByaWNlBQVNVUxUOAQGbWluV2xnCQBrAwUOTUlOU0hPUFBBWU1FTlQFBU1VTFQ4BQlzZWxsUHJpY2UEDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABQkAlAoCBQNuaWwJAMwIAgUHdXNkdEFtdAkAzAgCBQZtaW5XbGcJAMwIAgUGbWF4V2xnCQDMCAIFDHByb2ZpdEFtb3VudAUDbmlsAWkBBWNsYWltAAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQNJHQwMTEyNzQxMTM0MwkBDmNsYWltSW50ZXJuYWwyAQkApQgBCAUBaQZjYWxsZXIEB2FjdGlvbnMIBQ0kdDAxMTI3NDExMzQzAl8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTEyNzQxMTM0MwJfMgkAlAoCCQDNCAIFB2FjdGlvbnMJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUQd2xnQ2xhaW1lZEFtb3VudAUKd2xnQXNzZXRJZAUMcHJvbG9nUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEm9uU3Rha2VVbnN0YWtlTGFuZAEEYWRkcgMDAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAQIhPQIIBQFpBmNhbGxlcgUNYWNyZXNDb250cmFjdAcJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QHCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDExNjYyMTE3MTYJAQ5jbGFpbUludGVybmFsMgEFBGFkZHIEB2FjdGlvbnMIBQ0kdDAxMTY2MjExNzE2Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTE2NjIxMTcxNgJfMgkAlAoCAwkAZgIFEHdsZ0NsYWltZWRBbW91bnQAAAkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQdhY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCmJ1cm5XbGdvbGQBBndsZ0FtdAMJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAADCQBmAgUGd2xnQW10CQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwkAAgEJAKwCAgkArAICCQCsAgICBU9ubHkgCQEKZml4ZWRQb2ludAIJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnAAgCJSBXTEdPTEQgbGVmdCBvbiBjb250cmFjdCwgY2FuJ3QgYnVybiAJAQpmaXhlZFBvaW50AgUGd2xnQW10AAgEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBDGJldEZvclRpY2tldAEDYmV0BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkAwkBAiE9AgkAaQIFA2JldAAEAAAJAAIBAhtJbnZhbGlkIGJldDogc2hvdWxkIGJlIDAuLjMEBm1vbWVudAkAagIFBmhlaWdodAUKREFZX0JMT0NLUwMJAGYCBQZtb21lbnQJAGUCBQpEQVlfQkxPQ0tTAAMJAAIBCQCsAgIJAKwCAgIxQ2Fubm90IGJldDogdGhlIGRheSBpcyBhbG1vc3QgZW5kZWQsIHBsZWFzZSB3YWl0IAkApAMBCQBlAgUKREFZX0JMT0NLUwUGbW9tZW50AgcgYmxvY2tzBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLc3Rha2VkQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFBGFkZHIAAAQDbHZsCQEPZ2V0TGV2ZWxCeUFjcmVzAQULc3Rha2VkQWNyZXMDCQAAAgUDbHZsAAAJAAIBAiNZb3UgbmVlZCB0byBzdGFrZSBzb21lIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBAp1c2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFCnVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFCnVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzAgCCQCRAwIIBQFyAl8xAAAJAMwIAgkAkQMCCAUBcgJfMQABCQDMCAIFC25ld0JldEVudHJ5BQNuaWwIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGNsYWltVGlja2V0cwAEDHByb2xvZ1Jlc3VsdAkBB3Byb2xvZzIAAwkAAAIFDHByb2xvZ1Jlc3VsdAUMcHJvbG9nUmVzdWx0AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAp1c2VyQmV0U3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBCmtleVVzZXJCZXQBBQRhZGRyAhxZb3UgaGF2ZSBubyB0aWNrZXRzIHRvIGNsYWltCQEUY2xhaW1UaWNrZXRzSW50ZXJuYWwCBQRhZGRyBQp1c2VyQmV0U3RyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE5Nzk0MTk4MzcJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDE5Nzk0MTk4MzcCXzEEAnhwCAUNJHQwMTk3OTQxOTgzNwJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDE5OTE0MTk5NjIJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDE5OTE0MTk5NjICXzEEB2RlbHRhWFAIBQ0kdDAxOTkxNDE5OTYyAl8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAGeHcdQ=", "height": 3368710, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HufQu1DVfAEaEuuLoxtc6rQ1qUonBdJXMiXcidcbEtsP Next: none Diff:
OldNewDifferences
549549 let buyPrice = fraction(wlgPrice, 6, 5)
550550 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
551551 let maxWlg = getSwapLimitWlg(address)
552+ let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
552553 let profitAmount = (usdtAmt / 6)
553- $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxWlg, profitAmount])
554+ $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
554555 }
555556
556557
614615 then if ((size(i.payments) != 0))
615616 then throw("No payments required")
616617 else {
617- let $t01122111290 = claimInternal2(toString(i.caller))
618- let actions = $t01122111290._1
619- let wlgClaimedAmount = $t01122111290._2
618+ let $t01127411343 = claimInternal2(toString(i.caller))
619+ let actions = $t01127411343._1
620+ let wlgClaimedAmount = $t01127411343._2
620621 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
621622 }
622623 else throw("Strict value is not equal to itself.")
632633 else false)
633634 then throw("Permission denied")
634635 else {
635- let $t01160911663 = claimInternal2(addr)
636- let actions = $t01160911663._1
637- let wlgClaimedAmount = $t01160911663._2
636+ let $t01166211716 = claimInternal2(addr)
637+ let actions = $t01166211716._1
638+ let wlgClaimedAmount = $t01166211716._2
638639 $Tuple2(if ((wlgClaimedAmount > 0))
639640 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
640641 else actions, wlgClaimedAmount)
719720 func takeWlgXp (addr) = if ((i.caller != stakingContract))
720721 then throw("Permission denied")
721722 else {
722- let $t01974119784 = takeXpInternal(addr, 0)
723- let actions = $t01974119784._1
724- let xp = $t01974119784._2
723+ let $t01979419837 = takeXpInternal(addr, 0)
724+ let actions = $t01979419837._1
725+ let xp = $t01979419837._2
725726 $Tuple2(actions, xp)
726727 }
727728
729730
730731 @Callable(i)
731732 func checkWlgXpREADONLY (addr) = {
732- let $t01986119909 = takeXpInternal(addr, 0)
733- let ignored = $t01986119909._1
734- let deltaXP = $t01986119909._2
733+ let $t01991419962 = takeXpInternal(addr, 0)
734+ let ignored = $t01991419962._1
735+ let deltaXP = $t01991419962._2
735736 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
736737 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
737738 $Tuple2(nil, (lvlPoints :+ newXP))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let DAY_MILLIS = 86400000
55
66 let chain = take(drop(this.bytes, 1), 1)
77
88 let usdtAssetId = match chain {
99 case _ =>
1010 if ((base58'2W' == $match0))
1111 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1212 else if ((base58'2T' == $match0))
1313 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
1414 else throw("Unknown chain")
1515 }
1616
1717 let defaultRestAddressStr = match chain {
1818 case _ =>
1919 if ((base58'2W' == $match0))
2020 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
2121 else if ((base58'2T' == $match0))
2222 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
2323 else throw("Unknown chain")
2424 }
2525
2626 let acres2AddressStr = match chain {
2727 case _ =>
2828 if ((base58'2W' == $match0))
2929 then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
3030 else if ((base58'2T' == $match0))
3131 then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
3232 else throw("Unknown chain")
3333 }
3434
3535 let arbitrageDelay = match chain {
3636 case _ =>
3737 if ((base58'2W' == $match0))
3838 then DAY_MILLIS
3939 else if ((base58'2T' == $match0))
4040 then 60000
4141 else throw("Unknown chain")
4242 }
4343
4444 let SEP = "__"
4545
4646 let MULT6 = 1000000
4747
4848 let MULT8 = 100000000
4949
5050 let MINSHOPPAYMENT = 100000
5151
5252 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
5353
5454
5555 let IdxCfgStakingDapp = 1
5656
5757 let IdxCfgWlgDapp = 4
5858
5959 let IdxCfgPuzzlePoolDapp = 5
6060
6161 let IdxCfgInvestFundDapp = 6
6262
6363 let IdxCfgAcresDapp = 8
6464
6565 func keyRestCfg () = "%s__restConfig"
6666
6767
6868 func keyRestAddress () = "%s__restAddr"
6969
7070
7171 func keyRest2Address () = "%s__rest2Addr"
7272
7373
7474 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
7575
7676
7777 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
7878
7979
8080 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
8181
8282 let restCfg = readRestCfgOrFail(restContract)
8383
8484 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
8585
8686 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
8787
8888 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
8989
9090 let investFundContract = getContractAddressOrFail(restCfg, IdxCfgInvestFundDapp)
9191
9292 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
9393
9494 let wlgAssetIdKey = "wlg_assetId"
9595
9696 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
9797
9898 func asInt (v) = match v {
9999 case n: Int =>
100100 n
101101 case _ =>
102102 throw("fail to cast into Int")
103103 }
104104
105105
106106 func fixedPoint (val,decimals) = {
107107 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
108108 let lowPart = toString((val % tenPow))
109109 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
110110 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
111111 }
112112
113113
114114 let SCALE8 = 100000000
115115
116116 let xpLevelScale = 3200
117117
118118 let xpLevelRecipPow = 4000
119119
120120 let numPointsOnLevelUp = 3
121121
122122 let wlgBaseAmountXp = 100000000000
123123
124124 func keyUserXP (addr) = ("userXP_" + addr)
125125
126126
127127 func keyUserLevel (addr) = ("userLevel_" + addr)
128128
129129
130130 let xpWlg = 10000
131131
132132 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
133133
134134
135135 func levelUp (currLevel,newXP) = {
136136 let newLevel = levelByXP(newXP)
137137 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
138138 }
139139
140140
141141 let MILLION6 = 100000000000000
142142
143143 let PLAYERSHARE = 400000
144144
145145 let DAYMILLIS = 86400000
146146
147147 let teamAddrKey = "teamAddr"
148148
149149 let lastTeamTimeKey = "lastClaimedTime_team"
150150
151151 let teamAmountLeftKey = "teamAmountLeft"
152152
153153 let lastActivitiesTimeKey = "lastClaimedTime_activities"
154154
155155 let actAmountLeftKey = "activitiesAmountLeft"
156156
157157 let stakersAmountLeftKey = "stakersAmountLeft"
158158
159159 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
160160
161161
162162 let wlgIssueTimeKey = "wlg_issueTime"
163163
164164 let wlgIssuedAmountKey = "wlg_issuedAmount"
165165
166166 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
167167
168168
169169 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
170170
171171
172172 let wlgStakedTotalKey = "wlgStakedAmountTotal"
173173
174174 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
175175
176176
177177 let M6_ = 1000000
178178
179179 let M8_ = 100000000
180180
181181 let TEAM_SHARE = 200000
182182
183183 let ACTIVITY_SHARE = 100000
184184
185185 let PLAYER_SHARE = 400000
186186
187187 let YEAR_MILLIS = 31557600000
188188
189189 let DAY_MS = 86400000
190190
191191 let DAY_BLOCKS = 1440
192192
193193 let ISSUE10 = 1000000000
194194
195195 let PLAYERS10_SHARE = 800000
196196
197197 let MARKETING10_SHARE = 100000
198198
199199 let TEAM10_SHARE = 100000
200200
201201 let NEW_STAKING_START = 1731279600000
202202
203203 let marketingAddrKey = "marketingAddr"
204204
205205 let teamAdrKey = "teamAddr"
206206
207207 let lastTeamTimKey = "lastClaimedTime_team"
208208
209209 let teamAmtLeftKey = "teamAmountLeft"
210210
211211 let lastActivitiesTimKey = "lastClaimedTime_activities"
212212
213213 let actAmtLeftKey = "activitiesAmountLeft"
214214
215215 let stakersAmtLeftKey = "stakersAmountLeft"
216216
217217 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
218218
219219
220220 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
221221
222222
223223 let wlgIssue10TimeKey = "wlg_issue10Time"
224224
225225 let wlgIssueTimKey = "wlg_issueTime"
226226
227227 let wlgIssuedAmtKey = "wlg_issuedAmount"
228228
229229 let zbIssuedAmtKey = "zbill_issuedAmount"
230230
231231 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
232232
233233
234234 let totalFarmingPowerKey = "totalFarmingPower"
235235
236236 let dapp2Rest = 0
237237
238238 let dapp2Staking = 1
239239
240240 let dapp2Wlg = 2
241241
242242 let dapp2Puzzle = 3
243243
244244 let dapp2InvestFund = 4
245245
246246 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
247247
248248 func getLevelByAcres (acres) = {
249249 let acr = ((acres + 99999999) / M8_)
250250 func checker (acc,item) = if ((item >= acr))
251251 then acc
252252 else (acc + 1)
253253
254254 let $l = levelAcres
255255 let $s = size($l)
256256 let $acc0 = 0
257257 func $f0_1 ($a,$i) = if (($i >= $s))
258258 then $a
259259 else checker($a, $l[$i])
260260
261261 func $f0_2 ($a,$i) = if (($i >= $s))
262262 then $a
263263 else throw("List size exceeds 10")
264264
265265 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
266266 }
267267
268268
269269 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
270270
271271
272272 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
273273 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
274274 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
275275 let userFP = getFarmingPowerByAcres(userAcres)
276276 [totalFP, userFP]
277277 }
278278
279279
280280 func keyUserBet (addr) = ("userBet_" + addr)
281281
282282
283283 func keyUserTickets (addr) = ("userTickets_" + addr)
284284
285285
286286 let keyTotalTickets = "totalTickets"
287287
288288 func winningBet (day) = (toInt(value(value(blockInfoByHeight((day * DAY_BLOCKS))).vrf)) % 4)
289289
290290
291291 let idxTotalFP = 0
292292
293293 let idxUserFP = 1
294294
295295 let ixWlgAmount = 0
296296
297297 let ixWlgWlg = 1
298298
299299 let ixWlgPrice = 2
300300
301301 let ixWlgIssueTime = 8
302302
303303 let ixWlgTeamAmLeft = 11
304304
305305 let ixWlgTeamAmAvailNow = 12
306306
307307 let ixWlgActAmLeft = 15
308308
309309 let ixWlgActAmAvailNow = 16
310310
311311 let ixWlgAmLeftTotal = 19
312312
313313 let ixWlgUserAmAvailNow = 23
314314
315315 let ixWlgEffUserTime = 24
316316
317317 let ixWlgIssue10Amount = 25
318318
319319 let ixWlgMarketingIssue10Amount = 26
320320
321321 let ixWlgTeamIssue10Amount = 27
322322
323323 let ixWlgUser10part = 28
324324
325325 let ixWlgIssue10Time = 29
326326
327327 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
328328 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
329329 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
330330 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
331331 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
332332 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
333333 let investFndContract = contracts[dapp2InvestFund]
334334 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
335335 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
336336 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
337337 let now = lastBlock.timestamp
338338 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
339339 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
340340 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
341341 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
342342 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
343343 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
344344 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
345345 let teamWlgold = assetBalance(teamAddr, wlgId)
346346 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
347347 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
348348 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
349349 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
350350 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
351351 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
352352 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
353353 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
354354 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
355355 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
356356 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
357357 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
358358 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
359359 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
360360 let userAvailable = if ((lastUserPeriod == curPeriod))
361361 then a0
362362 else if ((lastUserPeriod == (curPeriod - 1)))
363363 then {
364364 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
365365 (a1 + a0)
366366 }
367367 else {
368368 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
369369 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
370370 ((a2 + a1) + a0)
371371 }
372372 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
373373 let userAmount = if ((eff[idxTotalFP] != 0))
374374 then fraction(userAvailable, eff[idxUserFP], eff[idxTotalFP])
375375 else 0
376376 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
377377 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
378378 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
379379 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
380380 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
381381 let user10part = if ((eff[idxTotalFP] != 0))
382382 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFP], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
383383 else 0
384384 let newIssue10Time = max([NEW_STAKING_START, now])
385385 [issuedAmount, wlgWlg, fraction(totalFundsUsd, M8_, issuedAmount), totalFundsUsd, restUsd, acres2Usd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, userAmount, nowLimited, issue10Amount, marketingIssue10Amount, teamIssue10Amount, user10part, newIssue10Time, eff[idxTotalFP]]
386386 }
387387
388388
389389 let net = take(drop(this.bytes, 1), 1)
390390
391391 let defaultRest2AddressStr = match net {
392392 case _ =>
393393 if ((base58'2W' == $match0))
394394 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
395395 else if ((base58'2T' == $match0))
396396 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
397397 else throw("Unknown chain")
398398 }
399399
400400 let profitAddrKey = "profitAddr"
401401
402402 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
403403
404404 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
405405
406406
407407 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
408408
409409 let acres2Contract = addressFromStringValue(acres2AddressStr)
410410
411411 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
412412
413413
414414 func getSwapLimitWlg (addr) = {
415415 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
416416 let now = lastBlock.timestamp
417417 if ((arbitrageDelay > (now - lastTime)))
418418 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
419419 else valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
420420 }
421421
422422
423423 func claimInternal2 (addr) = {
424424 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
425425 let userTimeKey = keyLastClaimTimeByUser(addr)
426426 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
427427 let userEffTime = curStats[ixWlgEffUserTime]
428428 if ((lastUserTime == userEffTime))
429429 then $Tuple2(nil, 0)
430430 else {
431431 let now = lastBlock.timestamp
432432 let issueTime = curStats[ixWlgIssueTime]
433433 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
434434 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
435435 let teamTransfer = if ((teamAmount > 0))
436436 then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
437437 else nil
438438 let actAmountLeft = curStats[ixWlgActAmLeft]
439439 let actAmount = curStats[ixWlgActAmAvailNow]
440440 let actTransfer = if ((actAmount > 0))
441441 then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
442442 else nil
443443 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
444444 let marketingTransfer = if ((marketingAmount > 0))
445445 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
446446 else nil
447447 let userAmount = curStats[ixWlgUserAmAvailNow]
448448 let userKey = keyStakersAmountPaidUser(addr)
449449 let userTotal = (userAmount + curStats[ixWlgUser10part])
450450 let issued10Amount = curStats[ixWlgIssue10Amount]
451451 $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, userEffTime)] ++ teamTransfer) ++ actTransfer) ++ marketingTransfer), userTotal)
452452 }
453453 }
454454
455455
456456 func takeXpInternal (addr,delta) = {
457457 let now = lastBlock.timestamp
458458 let timeKey = keyWlgStakedTimeByUser(addr)
459459 let amountKey = keyWlgStakedAmountByUser(addr)
460460 let lastTime = valueOrElse(getInteger(timeKey), 0)
461461 let oldUser = valueOrElse(getInteger(amountKey), 0)
462462 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
463463 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
464464 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
465465 }
466466
467467
468468 func claimTicketsInternal (addr,userBetStr) = {
469469 let totalTicketsKey = keyTotalTickets
470470 let ticketsKey = keyUserTickets(addr)
471471 let betKey = keyUserBet(addr)
472472 let dayBet = split(userBetStr, "_")
473473 let oldTotalTickets = valueOrElse(getInteger(totalTicketsKey), 0)
474474 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
475475 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
476476 then 1
477477 else 0
478478 $Tuple2([IntegerEntry(ticketsKey, (oldTickets + deltaTickets)), IntegerEntry(totalTicketsKey, (oldTotalTickets + deltaTickets)), DeleteEntry(betKey)], deltaTickets)
479479 }
480480
481481
482482 @Callable(i)
483483 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
484484 then throw("Permission denied")
485485 else if (isDefined(getBinary(wlgAssetIdKey)))
486486 then throw("Already initialized")
487487 else {
488488 let issuedAmount = MILLION6
489489 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
490490 let assetId = calculateAssetId(issue)
491491 [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)]
492492 }
493493
494494
495495
496496 @Callable(i)
497497 func constructorV2 (rest2Addr) = if ((i.caller != this))
498498 then throw("Permission denied")
499499 else [StringEntry(keyRest2Address(), rest2Addr)]
500500
501501
502502
503503 @Callable(i)
504504 func buyWlg (minAmount) = {
505505 let prologResult = prolog2()
506506 if ((prologResult == prologResult))
507507 then if ((size(i.payments) != 1))
508508 then throw("exactly 1 payment must be attached")
509509 else {
510510 let pmt = i.payments[0]
511511 let usdtAmt = pmt.amount
512512 if (if (!(isDefined(pmt.assetId)))
513513 then true
514514 else (value(pmt.assetId) != usdtAssetId))
515515 then throw("USDT payments only!")
516516 else {
517517 let caller = i.caller
518518 let addr = toString(caller)
519519 if ((MINSHOPPAYMENT > usdtAmt))
520520 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
521521 else {
522522 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
523523 let curWlgAmount = curStats[ixWlgAmount]
524524 let wlgPrice = curStats[ixWlgPrice]
525525 let buyPrice = fraction(wlgPrice, 6, 5)
526526 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
527527 let maxWlg = getSwapLimitWlg(addr)
528528 if ((wlgAmount > maxWlg))
529529 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
530530 else if ((minAmount > wlgAmount))
531531 then throw("Price changed during operation, please try again")
532532 else {
533533 let profitAmount = (usdtAmt / 6)
534534 $Tuple2([Reissue(wlgAssetId, wlgAmount, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + wlgAmount)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
535535 }
536536 }
537537 }
538538 }
539539 else throw("Strict value is not equal to itself.")
540540 }
541541
542542
543543
544544 @Callable(i)
545545 func buyWlgREADONLY (address,usdtAmt) = {
546546 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
547547 let curWlgAmount = curStats[ixWlgAmount]
548548 let wlgPrice = curStats[ixWlgPrice]
549549 let buyPrice = fraction(wlgPrice, 6, 5)
550550 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
551551 let maxWlg = getSwapLimitWlg(address)
552+ let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
552553 let profitAmount = (usdtAmt / 6)
553- $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxWlg, profitAmount])
554+ $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
554555 }
555556
556557
557558
558559 @Callable(i)
559560 func sellWlg (minAmount) = {
560561 let prologResult = prolog2()
561562 if ((prologResult == prologResult))
562563 then if ((size(i.payments) != 1))
563564 then throw("exactly 1 payment must be attached")
564565 else {
565566 let pmt = i.payments[0]
566567 let wlgAmt = pmt.amount
567568 let caller = i.caller
568569 let addr = toString(caller)
569570 let maxWlg = getSwapLimitWlg(addr)
570571 if ((wlgAmt > maxWlg))
571572 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD"))
572573 else if (if (!(isDefined(pmt.assetId)))
573574 then true
574575 else (value(pmt.assetId) != wlgAssetId))
575576 then throw("WLGOLD payments only!")
576577 else {
577578 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
578579 let curWlgAmount = curStats[ixWlgAmount]
579580 let sellPrice = (curStats[ixWlgPrice] / 2)
580581 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
581582 if ((MINSHOPPAYMENT > usdtAmt))
582583 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
583584 else if ((minAmount > usdtAmt))
584585 then throw("Price changed during operation, please try again")
585586 else {
586587 let profitAmount = (usdtAmt / 5)
587588 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastArbTimeByUser(addr), lastBlock.timestamp), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
588589 }
589590 }
590591 }
591592 else throw("Strict value is not equal to itself.")
592593 }
593594
594595
595596
596597 @Callable(i)
597598 func sellWlgREADONLY (address,wlgAmt) = {
598599 let maxWlg = getSwapLimitWlg(address)
599600 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
600601 let curWlgAmount = curStats[ixWlgAmount]
601602 let sellPrice = (curStats[ixWlgPrice] / 2)
602603 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
603604 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
604605 let profitAmount = (usdtAmt / 5)
605606 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
606607 }
607608
608609
609610
610611 @Callable(i)
611612 func claim () = {
612613 let prologResult = prolog2()
613614 if ((prologResult == prologResult))
614615 then if ((size(i.payments) != 0))
615616 then throw("No payments required")
616617 else {
617- let $t01122111290 = claimInternal2(toString(i.caller))
618- let actions = $t01122111290._1
619- let wlgClaimedAmount = $t01122111290._2
618+ let $t01127411343 = claimInternal2(toString(i.caller))
619+ let actions = $t01127411343._1
620+ let wlgClaimedAmount = $t01127411343._2
620621 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
621622 }
622623 else throw("Strict value is not equal to itself.")
623624 }
624625
625626
626627
627628 @Callable(i)
628629 func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
629630 then (i.caller != acresContract)
630631 else false)
631632 then (i.caller != acres2Contract)
632633 else false)
633634 then throw("Permission denied")
634635 else {
635- let $t01160911663 = claimInternal2(addr)
636- let actions = $t01160911663._1
637- let wlgClaimedAmount = $t01160911663._2
636+ let $t01166211716 = claimInternal2(addr)
637+ let actions = $t01166211716._1
638+ let wlgClaimedAmount = $t01166211716._2
638639 $Tuple2(if ((wlgClaimedAmount > 0))
639640 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
640641 else actions, wlgClaimedAmount)
641642 }
642643
643644
644645
645646 @Callable(i)
646647 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
647648 then throw("Permission denied")
648649 else {
649650 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
650651 if ((wlgAmt > curStats[ixWlgWlg]))
651652 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
652653 else {
653654 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
654655 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
655656 }
656657 }
657658
658659
659660
660661 @Callable(i)
661662 func betForTicket (bet) = {
662663 let prologResult = prolog2()
663664 if ((prologResult == prologResult))
664665 then if ((size(i.payments) != 0))
665666 then throw("No payments required")
666667 else if (((bet / 4) != 0))
667668 then throw("Invalid bet: should be 0..3")
668669 else {
669670 let moment = (height % DAY_BLOCKS)
670671 if ((moment > (DAY_BLOCKS - 3)))
671672 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
672673 else {
673674 let addr = toString(i.caller)
674675 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
675676 let lvl = getLevelByAcres(stakedAcres)
676677 if ((lvl == 0))
677678 then throw("You need to stake some ACRES to bet")
678679 else {
679680 let tomorrow = ((height / DAY_BLOCKS) + 1)
680681 let betKey = keyUserBet(addr)
681682 let userBetStr = getString(betKey)
682683 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
683684 if (isDefined(userBetStr))
684685 then {
685686 let userBet = value(userBetStr)
686687 if ((split(userBet, "_")[0] == toString(tomorrow)))
687688 then throw("You already bet for tomorrow")
688689 else {
689690 let r = claimTicketsInternal(addr, userBet)
690691 $Tuple2([r._1[0], r._1[1], newBetEntry], r._2)
691692 }
692693 }
693694 else $Tuple2([newBetEntry], 0)
694695 }
695696 }
696697 }
697698 else throw("Strict value is not equal to itself.")
698699 }
699700
700701
701702
702703 @Callable(i)
703704 func claimTickets () = {
704705 let prologResult = prolog2()
705706 if ((prologResult == prologResult))
706707 then if ((size(i.payments) != 0))
707708 then throw("No payments required")
708709 else {
709710 let addr = toString(i.caller)
710711 let userBetStr = valueOrErrorMessage(getString(keyUserBet(addr)), "You have no tickets to claim")
711712 claimTicketsInternal(addr, userBetStr)
712713 }
713714 else throw("Strict value is not equal to itself.")
714715 }
715716
716717
717718
718719 @Callable(i)
719720 func takeWlgXp (addr) = if ((i.caller != stakingContract))
720721 then throw("Permission denied")
721722 else {
722- let $t01974119784 = takeXpInternal(addr, 0)
723- let actions = $t01974119784._1
724- let xp = $t01974119784._2
723+ let $t01979419837 = takeXpInternal(addr, 0)
724+ let actions = $t01979419837._1
725+ let xp = $t01979419837._2
725726 $Tuple2(actions, xp)
726727 }
727728
728729
729730
730731 @Callable(i)
731732 func checkWlgXpREADONLY (addr) = {
732- let $t01986119909 = takeXpInternal(addr, 0)
733- let ignored = $t01986119909._1
734- let deltaXP = $t01986119909._2
733+ let $t01991419962 = takeXpInternal(addr, 0)
734+ let ignored = $t01991419962._1
735+ let deltaXP = $t01991419962._2
735736 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
736737 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
737738 $Tuple2(nil, (lvlPoints :+ newXP))
738739 }
739740
740741

github/deemru/w8io/026f985 
78.59 ms