tx · DrWndUqWpU2Ckv8GVS4rrLhHaZu491ZijKmsDeANoU7x

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.01700000 Waves

2023.07.10 20:50 [2660124] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "DrWndUqWpU2Ckv8GVS4rrLhHaZu491ZijKmsDeANoU7x", "fee": 1700000, "feeAssetId": null, "timestamp": 1689011429684, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "2favdGjybgMYkLawa722vX3srJhoLV4Byee1Sms4SesnmQYGKZqncPmjdVb6JEeUDGAZNtkcpZWfFyEKvJvjspAC" ], "script": "base64:BgIgCAISBgoECAgICBIDCgEBEgMKAQESABIDCgEIEgMKAQhUAAJNNgDAhD0AAk04AIDC1y8ACE1JTExJT042AICA6YOx3hYADk1BUktFVElOR1NIQVJFAKCNBgAJVEVBTVNIQVJFAMCaDAANQUNUSVZJVFlTSEFSRQCgjQYAC1BMQVlFUlNIQVJFAIC1GAAKWUVBUk1JTExJUwCAhuvHdQAKV0VFS01JTExJUwCAiLKgAgAJTUFYUEVSSU9EAJwBABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAt0ZWFtQWRkcktleQIIdGVhbUFkZHIAFGxhc3RNYXJrZXRpbmdUaW1lS2V5AhlsYXN0Q2xhaW1lZFRpbWVfbWFya2V0aW5nABZtYXJrZXRpbmdBbW91bnRMZWZ0S2V5AhNtYXJrZXRpbmdBbW91bnRMZWZ0AA9sYXN0VGVhbVRpbWVLZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtABF0ZWFtQW1vdW50TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFWxhc3RBY3Rpdml0aWVzVGltZUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMAEGFjdEFtb3VudExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABRzdGFrZXJzQW1vdW50TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgAPd2xnSXNzdWVUaW1lS2V5Ag13bGdfaXNzdWVUaW1lABJ3bGdJc3N1ZWRBbW91bnRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADGlkeFdsZ0Ftb3VudAAAAAtpZHhXbGdQcmljZQABAAtpZHhXbGdGdW5kcwACAAhkYXBwUmVzdAAAAAtkYXBwU3Rha2luZwABAAtkYXBwRWNvbm9teQACAAdkYXBwV2xnAAQACmRhcHBQdXp6bGUABQEJZ2V0UGllY2VzAhJ1c2VyQWRkclN0ck9yRW1wdHkPc3Rha2luZ0NvbnRyYWN0BAVwcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAITcmVzVHlwZXNQcm9wb3J0aW9ucwILMF8wXzBfMF8wXzACAV8KAQVhZGRlcgIDYWNjBGl0ZW0JAGQCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQKdG90YWxQb3dlcgoAAiRsBQVwcm9wcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYECnVzZXJzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQCsAgICFHN0YWtlZFBpZWNlc0J5T3duZXJfBRJ1c2VyQWRkclN0ck9yRW1wdHkAAAkAzAgCBQp0b3RhbFBvd2VyCQDMCAIFCnVzZXJzUG93ZXIFA25pbAELZ2V0V2xnU3RhdHMDC3VzZXJBZGRyT3B0CWNvbnRyYWN0cwZ1c2R0SWQEDGlzc3VlZEFtb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRJ3bGdJc3N1ZWRBbW91bnRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQKZWNvbm9teVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwULZGFwcEVjb25vbXkFBnVzZHRJZAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcFJlc3QFBnVzZHRJZAQGd2xnVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQZ1c2R0SWQECXB1enpsZVVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUKZGFwcFB1enpsZQUGdXNkdElkBA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCmVjb25vbXlVc2QFB3Jlc3RVc2QFBndsZ1VzZAQFd2xnSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwILd2xnX2Fzc2V0SWQCE05vdCBpbml0aWFsaXplZCB5ZXQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECWlzc3VlVGltZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ93bGdJc3N1ZVRpbWVLZXkCD05vdCBpbml0aWFsaXplZAQObWFya2V0aW5nVG90YWwJAGsDBQhNSUxMSU9ONgUOTUFSS0VUSU5HU0hBUkUFAk02BBNtYXJrZXRpbmdBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBRZtYXJrZXRpbmdBbW91bnRMZWZ0S2V5BQ5tYXJrZXRpbmdUb3RhbAQRbGFzdE1hcmtldGluZ1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFFGxhc3RNYXJrZXRpbmdUaW1lS2V5BQlpc3N1ZVRpbWUEDW1hcmtldGluZ0FkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFEG1hcmtldGluZ0FkZHJLZXkEG21hcmtldGluZ0Ftb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQ5tYXJrZXRpbmdUb3RhbAkAZQIFA25vdwURbGFzdE1hcmtldGluZ1RpbWUFCllFQVJNSUxMSVMJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAUDbmlsBA9tYXJrZXRpbmdXbGdvbGQJAPAHAgUNbWFya2V0aW5nQWRkcgUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUIZGFwcFJlc3QFEGFjdEFtb3VudExlZnRLZXkFCGFjdFRvdGFsBBJsYXN0QWN0aXZpdGllc1RpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFCllFQVJNSUxMSVMJAMwIAgUNYWN0QW1vdW50TGVmdAUDbmlsBAlhY3RXbGdvbGQJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQV3bGdJZAQJY3VyUGVyaW9kCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQpXRUVLTUlMTElTBANlZmYJAQlnZXRQaWVjZXMCBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nBAt0b3RhbFBpZWNlcwkAkQMCBQNlZmYAAAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFFHN0YWtlcnNBbW91bnRMZWZ0S2V5AAAEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAawMFD2Ftb3VudExlZnRUb3RhbAkAaAIAAgULdG90YWxQaWVjZXMJAGQCBQt0b3RhbFBpZWNlcwkAaAIJAJYDAQkAzAgCAKCNBgkAzAgCBQt0b3RhbFBpZWNlcwUDbmlsCQBlAgUJTUFYUEVSSU9EBQljdXJQZXJpb2QEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQULdXNlckFkZHJPcHQFCWlzc3VlVGltZQQKdXNlckFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJEDAgUDZWZmAAEFC3RvdGFsUGllY2VzCQBlAgUDbm93BQxsYXN0VXNlclRpbWUJAGgCAAMFCllFQVJNSUxMSVMJAMwIAgUMaXNzdWVkQW1vdW50CQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQJNOAUMaXNzdWVkQW1vdW50CQDMCAIFDXRvdGFsRnVuZHNVc2QJAMwIAgUKZWNvbm9teVVzZAkAzAgCBQdyZXN0VXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFEWxhc3RNYXJrZXRpbmdUaW1lCQDMCAIFDm1hcmtldGluZ1RvdGFsCQDMCAIFE21hcmtldGluZ0Ftb3VudExlZnQJAMwIAgUbbWFya2V0aW5nQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFD21hcmtldGluZ1dsZ29sZAkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUKdXNlckFtb3VudAUDbmlsAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAANS1NBTExPV1dMR09MRAYABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgAOYXJiaXRyYWdlRGVsYXkEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAwM8kAwkAAAIBAVQFByRtYXRjaDAA4NQDCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAVTU0laRQAZAAVNU0laRQBkAAVMU0laRQDhAQAGWExTSVpFAJADAAdYWExTSVpFAPEEAA5NSU5TSE9QUEFZTUVOVACgjQYBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABFJZHhDZmdTdGFraW5nRGFwcAABABFJZHhDZmdFY29ub215RGFwcAACABRJZHhDZmdHb3Zlcm5hbmNlRGFwcAADAA1JZHhDZmdXbGdEYXBwAAQAFElkeENmZ1B1enpsZVBvb2xEYXBwAAUBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD2Vjb25vbXlDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ0Vjb25vbXlEYXBwAAtnb3ZDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0dvdmVybmFuY2VEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnB1enpsZVBvb2xDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1B1enpsZVBvb2xEYXBwAAtyZWNMYW5kU2l6ZQABAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhNOb3QgaW5pdGlhbGl6ZWQgeWV0AAtJZHhFZmZUb3RhbAAAAApJZHhFZmZVc2VyAAEBEWtleVJlc1Byb3BvcnRpb25zAAITcmVzVHlwZXNQcm9wb3J0aW9ucwEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAFBVNTSVpFAwkAAAICAU0FByRtYXRjaDAFBU1TSVpFAwkAAAICAUwFByRtYXRjaDAFBUxTSVpFAwkAAAICAlhMBQckbWF0Y2gwBQZYTFNJWkUDCQAAAgIDWFhMBQckbWF0Y2gwBQdYWExTSVpFCQACAQIRVW5rbm93biBsYW5kIHNpemUBDmdldFZvdGluZ1Bvd2VyARJ1c2VyQWRkclN0ck9yRW1wdHkEBXByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwoBBWFkZGVyAgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAp0b3RhbFBvd2VyCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlcnNQb3dlcgMJAAACBRJ1c2VyQWRkclN0ck9yRW1wdHkCAAAABAhsYW5kc1N0cgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBRJ1c2VyQWRkclN0ck9yRW1wdHkEBWxhbmRzAwkBCWlzRGVm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ZXJzQW1vdW50UGFpZFVzZXIBBGFkZHIJAKwCAgIWc3Rha2Vyc0Ftb3VudFBhaWRVc2VyXwUEYWRkcgEGcHJvbG9nAAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPc3Rha2luZ0NvbnRyYWN0CQEKa2V5QmxvY2tlZAAHCQACAQIfQ29udHJhY3RzIGFyZSB1bmRlciBtYWludGVuYW5jZQkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQxnZXRTd2FwTGltaXQBBGFkZHIECGxhc3RUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQ5hcmJpdHJhZ2VEZWxheQkAZQIFA25vdwUIbGFzdFRpbWUJAAIBCQCsAgIJAKwCAgIfQXJiaXRyYWdlcyBhcmUgcG9zc2libGUgb25jZSBhIAkApAMBCQBpAgUOYXJiaXRyYWdlRGVsYXkA4NQDAgNtaW4EBnBpZWNlcwkAkQMCCQEOZ2V0Vm90aW5nUG93ZXIBBQRhZGRyBQpJZHhFZmZVc2VyBARwb3c4CQBsBgUGcGllY2VzAAAFAkI4AAgACAUHQ0VJTElORwkAawMFAkE2BQRwb3c4BQVNVUxUOAENY2xhaW1JbnRlcm5hbAEEYWRkcgMJAQEhAQUNS1NBTExPV1dMR09MRAkAlAoCBQNuaWwAAAQGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAlpc3N1ZVRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ93bGdJc3N1ZVRpbWVLZXkCD05vdCBpbml0aWFsaXplZAQObWFya2V0aW5nVG90YWwJAGsDBQhNSUxMSU9ONgUOTUFSS0VUSU5HU0hBUkUFBU1VTFQ2BBNtYXJrZXRpbmdBbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCfCAEFFm1hcmtldGluZ0Ftb3VudExlZnRLZXkFDm1hcmtldGluZ1RvdGFsBBFsYXN0TWFya2V0aW5nVGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBRRsYXN0TWFya2V0aW5nVGltZUtleQUJaXNzdWVUaW1lBA1tYXJrZXRpbmdBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEFEG1hcmtldGluZ0FkZHJLZXkED21hcmtldGluZ0Ftb3VudAkAlwMBCQDMCAIJAGsDBQ5tYXJrZXRpbmdUb3RhbAkAZQIFA25vdwURbGFzdE1hcmtldGluZ1RpbWUFCllFQVJNSUxMSVMJAMwIAgUTbWFya2V0aW5nQW1vdW50TGVmdAUDbmlsBAl0ZWFtVG90YWwJAGsDBQhNSUxMSU9ONgUJVEVBTVNIQVJFBQVNVUxUNgQOdGVhbUFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFD2xhc3RUZWFtVGltZUtleQUJaXNzdWVUaW1lBAh0ZWFtQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQQKdGVhbUFtb3VudAkAlwMBCQDMCAIJAGsDBQl0ZWFtVG90YWwJAGUCBQNub3cFDGxhc3RUZWFtVGltZQkAaAIAAwUKWUVBUk1JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQVNVUxUNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRBhY3RBbW91bnRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFFWxhc3RBY3Rpdml0aWVzVGltZUtleQUJaXNzdWVUaW1lBAlhY3RBbW91bnQJAJcDAQkAzAgCCQBrAwUIYWN0VG90YWwJAGUCBQNub3cFEmxhc3RBY3Rpdml0aWVzVGltZQkAaAIAAwUKWUVBUk1JTExJUwkAzAgCBQ1hY3RBbW91bnRMZWZ0BQNuaWwECWN1clBlcmlvZAkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKV0VFS01JTExJUwMJAGYCBQljdXJQZXJpb2QJAGkCBQlNQVhQRVJJT0QAAgkAAgECPVBsZWFzZSBtb2RpZnkgY29udHJhY3QgZm9yIG5leHQgMS41IHllYXJzLCBhY2NvcmRpbmcgdG8gc3RhdHMEA2VmZgkBDmdldFZvdGluZ1Bvd2VyAQUEYWRkcgQLdG90YWxQaWVjZXMJAJEDAgUDZWZmBQtJZHhFZmZUb3RhbAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFFHN0YWtlcnNBbW91bnRMZWZ0S2V5AAAEFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAawMFD2Ftb3VudExlZnRUb3RhbAkAaAIAAgULdG90YWxQaWVjZXMJAGQCBQt0b3RhbFBpZWNlcwkAaAIJAJYDAQkAzAgCAKCNBgkAzAgCBQt0b3RhbFBpZWNlcwUDbmlsCQBlAgUJTUFYUEVSSU9EBQljdXJQZXJpb2QEC3VzZXJUaW1lS2V5CQEYa2V5TGFzdENsYWltZWRUaW1lQnlVc2VyAQUEYWRkcgQMbGFzdFVzZXJUaW1lCQELdmFsdWVPckVsc2UCCQCfCAEFC3VzZXJUaW1lS2V5BQlpc3N1ZVRpbWUECnVzZXJBbW91bnQJAGsDCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQCRAwIFA2VmZgUKSWR4RWZmVXNlcgULdG90YWxQaWVjZXMJAGUCBQNub3cFDGxhc3RVc2VyVGltZQkAaAIAAwUKWUVBUk1JTExJUwQHdXNlcktleQkBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEFBGFkZHIJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1tYXJrZXRpbmdBZGRyBQ9tYXJrZXRpbmdBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdGVhbUFkZHIFCnRlYW1BbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQp1c2VyQW1vdW50BQp3bGdBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd1c2VyS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd1c2VyS2V5AAAFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCBQ9hbW91bnRMZWZ0VG90YWwFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFm1hcmtldGluZ0Ftb3VudExlZnRLZXkJAGUCBRNtYXJrZXRpbmdBbW91bnRMZWZ0BQ9tYXJrZXRpbmdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFGxhc3RNYXJrZXRpbmdUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5CQBlAgUOdGVhbUFtb3VudExlZnQFCnRlYW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2xhc3RUZWFtVGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBhY3RBbW91bnRMZWZ0S2V5CQBlAgUNYWN0QW1vdW50TGVmdAUJYWN0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0QWN0aXZpdGllc1RpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgULdXNlclRpbWVLZXkFA25vdwUDbmlsBQp1c2VyQW1vdW50BgFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFCE1JTExJT042BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQhNSUxMSU9ONgULUExBWUVSU0hBUkUFBU1VTFQ2CQDMCAIJAQtCaW5hcnlFbnRyeQIFDXdsZ0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbWFya2V0aW5nQWRkcktleQUNbWFya2V0aW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQt0ZWFtQWRkcktleQUIdGVhbUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNcHJvZml0QWRkcktleQUKcHJvZml0QWRkcgUDbmlsAWkBBmJ1eVdsZwEJbWluQW1vdW50AwkBASEBBQ1LU0FMTE9XV0xHT0xECQCUCgIFA25pbAAABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEB3VzZHRBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhNVU0RUIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEB21heFVzZHQJAQxnZXRTd2FwTGltaXQBBQRhZGRyAwkAZgIFB3VzZHRBbXQFB21heFVzZHQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFB21heFVzZHQABgIFIFVTRFQDCQBmAgUOTUlOU0hPUFBBWU1FTlQFB3VzZHRBbXQJAAIBCQCsAgIJAKwCAgISWW91IGNhbiB0cmFkZSBtaW4gCQEKZml4ZWRQb2ludAIFDk1JTlNIT1BQQVlNRU5UAAYCBSBVU0RUBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzAwIACQDMCAIFDHJlc3RDb250cmFjdAkAzAgCBQ9zdGFraW5nQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFC2dvdkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQxpZHhXbGdBbW91bnQEC29sZEZ1bmRzVXNkCQBlAgkAkQMCBQhjdXJTdGF0cwULaWR4V2xnRnVuZHMFB3VzZHRBbXQECHdsZ1ByaWNlCQBrAwULb2xkRnVuZHNVc2QFBU1VTFQ4BQxjdXJXbGdBbW91bnQECGJ1eVByaWNlCQBrAwUId2xnUHJpY2UABgAFBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UDCQBmAgUJbWluQW1vdW50BQl3bGdBbW91bnQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgQKZGVsdGFGdW5kcwkAZQIFB3VzZHRBbXQFDHByb2ZpdEFtb3VudAQIcmVpc3N1ZWQJAGsDBQxjdXJXbGdBbW91bnQFCmRlbHRhRnVuZHMFC29sZEZ1bmRzVXNkCQCUCgIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQhyZWlzc3VlZAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIFDGN1cldsZ0Ftb3VudAUIcmVpc3N1ZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXdsZ0Ftb3VudAUKd2xnQXNzZXRJZAUDbmlsBQxwcm9sb2dSZXN1bHQBaQEHc2VsbFdsZwEJbWluQW1vdW50AwkBASEBBQ1LU0FMTE9XV0xHT0xECQCUCgIFA25pbAAABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAh5XQVZFUyBjYW4ndCBiZSB1c2VkIGFzIHBheW1lbnQDCQECIT0CBQpwbXRBc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEB21heFVzZHQJAQxnZXRTd2FwTGltaXQBBQRhZGRyBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzAwIACQDMCAIFDHJlc3RDb250cmFjdAkAzAgCBQ9zdGFraW5nQ29udHJhY3QJAMwIAgUPZWNvbm9teUNvbnRyYWN0CQDMCAIFC2dvdkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQxpZHhXbGdBbW91bnQECXNlbGxQcmljZQkAawMJAJEDAgUIY3VyU3RhdHMFC2lkeFdsZ1ByaWNlAAQABQQHdXNkdEFtdAkAawMFBndsZ0FtdAUJc2VsbFByaWNlBQVNVUxUOAMJAGYCBQd1c2R0QW10BQdtYXhVc2R0CQACAQkArAICCQCsAgICEFlvdSBjYW4gZ2V0IG1heCAJAQpmaXhlZFBvaW50AgUHbWF4VXNkdAAGAgUgVVNEVAMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQDCQBmAgUJbWluQW1vdW50BQd1c2R0QW10CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAQEBmJ1cm5lZAkAawMJAGQCBQd1c2R0QW10BQxwcm9maXRBbW91bnQFDGN1cldsZ0Ftb3VudAkAkQMCBQhjdXJTdGF0cwULaWR4V2xnRnVuZHMJAJQKAgkAzAgCCQEEQnVybgIFCndsZ0Fzc2V0SWQFBmJ1cm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5CQBlAgUMY3VyV2xnQW1vdW50BQZidXJuZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAFpAQVjbGFpbQAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEB2FjdGlvbnMICQENY2xhaW1JbnRlcm5hbAEJAKUIAQgFAWkGY2FsbGVyAl8xCQCUCgIFB2FjdGlvbnMFDHByb2xvZ1Jlc3VsdAFpAQtvblN0YWtlTGFuZAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAQ1jbGFpbUludGVybmFsAQUEYWRkcgFpAQ1vblVuc3Rha2VMYW5kAQRhZGRyAwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkBDWNsYWltSW50ZXJuYWwBBQRhZGRyAHketMw=", "height": 2660124, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8FmLnyMLph6quQh1kge8Q6TKbb9G4Ra7NkPyjnk3dpy Next: E8mQtK1Sc1f4youKgYMjFT11XtZAxrPAT7V6NSeMedBB Diff:
OldNewDifferences
5858
5959 let dappEconomy = 2
6060
61+let dappWlg = 4
62+
6163 let dappPuzzle = 5
6264
6365 func getPieces (userAddrStrOrEmpty,stakingContract) = {
8486
8587
8688 func getWlgStats (userAddrOpt,contracts,usdtId) = {
87- let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappStaking], wlgIssuedAmountKey), "WLGOLD is not issued yet")
89+ let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
8890 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
8991 let restUsd = assetBalance(contracts[dappRest], usdtId)
90- let wlgUsd = assetBalance(contracts[dappStaking], usdtId)
92+ let wlgUsd = assetBalance(contracts[dappWlg], usdtId)
9193 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
9294 let totalFundsUsd = ((economyUsd + restUsd) + wlgUsd)
93- let wlgId = valueOrErrorMessage(getBinary(contracts[dappStaking], "wlg_assetId"), "Not initialized yet")
95+ let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
9496 let now = lastBlock.timestamp
95- let issueTime = valueOrErrorMessage(getInteger(contracts[dappStaking], wlgIssueTimeKey), "Not initialized")
97+ let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
9698 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
97- let marketingAmountLeft = valueOrElse(getInteger(contracts[dappStaking], marketingAmountLeftKey), marketingTotal)
98- let lastMarketingTime = valueOrElse(getInteger(contracts[dappStaking], lastMarketingTimeKey), issueTime)
99- let marketingAddr = addressFromStringValue(value(getString(contracts[dappStaking], marketingAddrKey)))
99+ let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
100+ let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
101+ let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
100102 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
101103 let marketingWlgold = assetBalance(marketingAddr, wlgId)
102104 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
103- let teamAmountLeft = valueOrElse(getInteger(contracts[dappStaking], teamAmountLeftKey), teamTotal)
104- let lastTeamTime = valueOrElse(getInteger(contracts[dappStaking], lastTeamTimeKey), issueTime)
105- let teamAddr = addressFromStringValue(value(getString(contracts[dappStaking], teamAddrKey)))
105+ let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
106+ let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
107+ let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
106108 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
107109 let teamWlgold = assetBalance(teamAddr, wlgId)
108110 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let M6 = 1000000
55
66 let M8 = 100000000
77
88 let MILLION6 = 100000000000000
99
1010 let MARKETINGSHARE = 100000
1111
1212 let TEAMSHARE = 200000
1313
1414 let ACTIVITYSHARE = 100000
1515
1616 let PLAYERSHARE = 400000
1717
1818 let YEARMILLIS = 31557600000
1919
2020 let WEEKMILLIS = 604800000
2121
2222 let MAXPERIOD = 156
2323
2424 let marketingAddrKey = "marketingAddr"
2525
2626 let teamAddrKey = "teamAddr"
2727
2828 let lastMarketingTimeKey = "lastClaimedTime_marketing"
2929
3030 let marketingAmountLeftKey = "marketingAmountLeft"
3131
3232 let lastTeamTimeKey = "lastClaimedTime_team"
3333
3434 let teamAmountLeftKey = "teamAmountLeft"
3535
3636 let lastActivitiesTimeKey = "lastClaimedTime_activities"
3737
3838 let actAmountLeftKey = "activitiesAmountLeft"
3939
4040 let stakersAmountLeftKey = "stakersAmountLeft"
4141
4242 func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
4343
4444
4545 let wlgIssueTimeKey = "wlg_issueTime"
4646
4747 let wlgIssuedAmountKey = "wlg_issuedAmount"
4848
4949 let idxWlgAmount = 0
5050
5151 let idxWlgPrice = 1
5252
5353 let idxWlgFunds = 2
5454
5555 let dappRest = 0
5656
5757 let dappStaking = 1
5858
5959 let dappEconomy = 2
6060
61+let dappWlg = 4
62+
6163 let dappPuzzle = 5
6264
6365 func getPieces (userAddrStrOrEmpty,stakingContract) = {
6466 let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
6567 func adder (acc,item) = (acc + parseIntValue(item))
6668
6769 let totalPower = {
6870 let $l = props
6971 let $s = size($l)
7072 let $acc0 = 0
7173 func $f0_1 ($a,$i) = if (($i >= $s))
7274 then $a
7375 else adder($a, $l[$i])
7476
7577 func $f0_2 ($a,$i) = if (($i >= $s))
7678 then $a
7779 else throw("List size exceeds 6")
7880
7981 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
8082 }
8183 let usersPower = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
8284 [totalPower, usersPower]
8385 }
8486
8587
8688 func getWlgStats (userAddrOpt,contracts,usdtId) = {
87- let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappStaking], wlgIssuedAmountKey), "WLGOLD is not issued yet")
89+ let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
8890 let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
8991 let restUsd = assetBalance(contracts[dappRest], usdtId)
90- let wlgUsd = assetBalance(contracts[dappStaking], usdtId)
92+ let wlgUsd = assetBalance(contracts[dappWlg], usdtId)
9193 let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
9294 let totalFundsUsd = ((economyUsd + restUsd) + wlgUsd)
93- let wlgId = valueOrErrorMessage(getBinary(contracts[dappStaking], "wlg_assetId"), "Not initialized yet")
95+ let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
9496 let now = lastBlock.timestamp
95- let issueTime = valueOrErrorMessage(getInteger(contracts[dappStaking], wlgIssueTimeKey), "Not initialized")
97+ let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
9698 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, M6)
97- let marketingAmountLeft = valueOrElse(getInteger(contracts[dappStaking], marketingAmountLeftKey), marketingTotal)
98- let lastMarketingTime = valueOrElse(getInteger(contracts[dappStaking], lastMarketingTimeKey), issueTime)
99- let marketingAddr = addressFromStringValue(value(getString(contracts[dappStaking], marketingAddrKey)))
99+ let marketingAmountLeft = valueOrElse(getInteger(contracts[dappWlg], marketingAmountLeftKey), marketingTotal)
100+ let lastMarketingTime = valueOrElse(getInteger(contracts[dappWlg], lastMarketingTimeKey), issueTime)
101+ let marketingAddr = addressFromStringValue(value(getString(contracts[dappWlg], marketingAddrKey)))
100102 let marketingAmountAvailableNow = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
101103 let marketingWlgold = assetBalance(marketingAddr, wlgId)
102104 let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
103- let teamAmountLeft = valueOrElse(getInteger(contracts[dappStaking], teamAmountLeftKey), teamTotal)
104- let lastTeamTime = valueOrElse(getInteger(contracts[dappStaking], lastTeamTimeKey), issueTime)
105- let teamAddr = addressFromStringValue(value(getString(contracts[dappStaking], teamAddrKey)))
105+ let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
106+ let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
107+ let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
106108 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
107109 let teamWlgold = assetBalance(teamAddr, wlgId)
108110 let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
109111 let actAmountLeft = valueOrElse(getInteger(contracts[dappRest], actAmountLeftKey), actTotal)
110112 let lastActivitiesTime = valueOrElse(getInteger(contracts[dappRest], lastActivitiesTimeKey), issueTime)
111113 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
112114 let actWlgold = assetBalance(contracts[dappRest], wlgId)
113115 let curPeriod = ((now - issueTime) / WEEKMILLIS)
114116 let eff = getPieces(userAddrOpt, contracts[dappStaking])
115117 let totalPieces = eff[0]
116118 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
117119 let curPeriodDistribution = fraction(amountLeftTotal, (2 * totalPieces), (totalPieces + (max([100000, totalPieces]) * (MAXPERIOD - curPeriod))))
118120 let lastUserTime = valueOrElse(getInteger(keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
119121 let userAmount = fraction(fraction(curPeriodDistribution, eff[1], totalPieces), (now - lastUserTime), (3 * YEARMILLIS))
120122 [issuedAmount, fraction(totalFundsUsd, M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastMarketingTime, marketingTotal, marketingAmountLeft, marketingAmountAvailableNow, marketingWlgold, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, userAmount]
121123 }
122124
123125
124126 func keyBlocked () = "contractsBlocked"
125127
126128
127129 let KSALLOWWLGOLD = true
128130
129131 let chain = take(drop(this.bytes, 1), 1)
130132
131133 let usdtAssetId = match chain {
132134 case _ =>
133135 if ((base58'2W' == $match0))
134136 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
135137 else if ((base58'2T' == $match0))
136138 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
137139 else throw("Unknown chain")
138140 }
139141
140142 let defaultRestAddressStr = match chain {
141143 case _ =>
142144 if ((base58'2W' == $match0))
143145 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
144146 else if ((base58'2T' == $match0))
145147 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
146148 else throw("Unknown chain")
147149 }
148150
149151 let arbitrageDelay = match chain {
150152 case _ =>
151153 if ((base58'2W' == $match0))
152154 then 600000
153155 else if ((base58'2T' == $match0))
154156 then 60000
155157 else throw("Unknown chain")
156158 }
157159
158160 let SEP = "__"
159161
160162 let MULT6 = 1000000
161163
162164 let MULT8 = 100000000
163165
164166 let SSIZE = 25
165167
166168 let MSIZE = 100
167169
168170 let LSIZE = 225
169171
170172 let XLSIZE = 400
171173
172174 let XXLSIZE = 625
173175
174176 let MINSHOPPAYMENT = 100000
175177
176178 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
177179
178180
179181 let IdxCfgStakingDapp = 1
180182
181183 let IdxCfgEconomyDapp = 2
182184
183185 let IdxCfgGovernanceDapp = 3
184186
185187 let IdxCfgWlgDapp = 4
186188
187189 let IdxCfgPuzzlePoolDapp = 5
188190
189191 func keyRestCfg () = "%s__restConfig"
190192
191193
192194 func keyRestAddress () = "%s__restAddr"
193195
194196
195197 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
196198
197199
198200 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
199201
200202
201203 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
202204
203205 let restCfg = readRestCfgOrFail(restContract)
204206
205207 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
206208
207209 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
208210
209211 let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
210212
211213 let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
212214
213215 let puzzlePoolContract = getContractAddressOrFail(restCfg, IdxCfgPuzzlePoolDapp)
214216
215217 let recLandSize = 1
216218
217219 let wlgAssetIdKey = "wlg_assetId"
218220
219221 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
220222
221223 let IdxEffTotal = 0
222224
223225 let IdxEffUser = 1
224226
225227 func keyResProportions () = "resTypesProportions"
226228
227229
228230 func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
229231
230232
231233 func asInt (v) = match v {
232234 case n: Int =>
233235 n
234236 case _ =>
235237 throw("fail to cast into Int")
236238 }
237239
238240
239241 func numPiecesBySize (landSize) = match landSize {
240242 case _ =>
241243 if (("S" == $match0))
242244 then SSIZE
243245 else if (("M" == $match0))
244246 then MSIZE
245247 else if (("L" == $match0))
246248 then LSIZE
247249 else if (("XL" == $match0))
248250 then XLSIZE
249251 else if (("XXL" == $match0))
250252 then XXLSIZE
251253 else throw("Unknown land size")
252254 }
253255
254256
255257 func getVotingPower (userAddrStrOrEmpty) = {
256258 let props = split(valueOrElse(getString(stakingContract, keyResProportions()), "0_0_0_0_0_0"), "_")
257259 func adder (acc,item) = (acc + parseIntValue(item))
258260
259261 let totalPower = {
260262 let $l = props
261263 let $s = size($l)
262264 let $acc0 = 0
263265 func $f0_1 ($a,$i) = if (($i >= $s))
264266 then $a
265267 else adder($a, $l[$i])
266268
267269 func $f0_2 ($a,$i) = if (($i >= $s))
268270 then $a
269271 else throw("List size exceeds 6")
270272
271273 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
272274 }
273275 let usersPower = if ((userAddrStrOrEmpty == ""))
274276 then 0
275277 else {
276278 let landsStr = getString(stakingContract, keyStakedLandsByOwner(userAddrStrOrEmpty))
277279 let lands = if (isDefined(landsStr))
278280 then split_51C(value(landsStr), "_")
279281 else nil
280282 func oneLand (acc,landAssetId) = {
281283 let asset = value(assetInfo(fromBase58String(landAssetId)))
282284 let landSize = split(asset.description, "_")[recLandSize]
283285 (acc + numPiecesBySize(landSize))
284286 }
285287
286288 let $l = lands
287289 let $s = size($l)
288290 let $acc0 = 0
289291 func $f1_1 ($a,$i) = if (($i >= $s))
290292 then $a
291293 else oneLand($a, $l[$i])
292294
293295 func $f1_2 ($a,$i) = if (($i >= $s))
294296 then $a
295297 else throw("List size exceeds 100")
296298
297299 $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)
298300 }
299301 [totalPower, usersPower]
300302 }
301303
302304
303305 func fixedPoint (val,decimals) = {
304306 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
305307 ((toString((val / tenPow)) + ".") + toString((val % tenPow)))
306308 }
307309
308310
309311 let A6 = 100000000
310312
311313 let B8 = 50000000
312314
313315 let profitAddrKey = "profitAddr"
314316
315317 func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
316318
317319
318320 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
319321
320322 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
321323
322324
323325 func prolog () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
324326 then throw("Contracts are under maintenance")
325327 else asInt(invoke(stakingContract, "saveLastTx", nil, nil))
326328
327329
328330 func getSwapLimit (addr) = {
329331 let lastTime = valueOrElse(getInteger(keyLastArbTimeByUser(addr)), 0)
330332 let now = lastBlock.timestamp
331333 if ((arbitrageDelay > (now - lastTime)))
332334 then throw((("Arbitrages are possible once a " + toString((arbitrageDelay / 60000))) + "min"))
333335 else {
334336 let pieces = getVotingPower(addr)[IdxEffUser]
335337 let pow8 = pow(pieces, 0, B8, 8, 8, CEILING)
336338 fraction(A6, pow8, MULT8)
337339 }
338340 }
339341
340342
341343 func claimInternal (addr) = if (!(KSALLOWWLGOLD))
342344 then $Tuple2(nil, 0)
343345 else {
344346 let caller = addressFromStringValue(addr)
345347 let now = lastBlock.timestamp
346348 let issueTime = valueOrErrorMessage(getInteger(wlgIssueTimeKey), "Not initialized")
347349 let marketingTotal = fraction(MILLION6, MARKETINGSHARE, MULT6)
348350 let marketingAmountLeft = valueOrElse(getInteger(marketingAmountLeftKey), marketingTotal)
349351 let lastMarketingTime = valueOrElse(getInteger(lastMarketingTimeKey), issueTime)
350352 let marketingAddr = addressFromStringValue(value(getString(marketingAddrKey)))
351353 let marketingAmount = min([fraction(marketingTotal, (now - lastMarketingTime), YEARMILLIS), marketingAmountLeft])
352354 let teamTotal = fraction(MILLION6, TEAMSHARE, MULT6)
353355 let teamAmountLeft = valueOrElse(getInteger(teamAmountLeftKey), teamTotal)
354356 let lastTeamTime = valueOrElse(getInteger(lastTeamTimeKey), issueTime)
355357 let teamAddr = addressFromStringValue(value(getString(teamAddrKey)))
356358 let teamAmount = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
357359 let actTotal = fraction(MILLION6, ACTIVITYSHARE, MULT6)
358360 let actAmountLeft = valueOrElse(getInteger(actAmountLeftKey), actTotal)
359361 let lastActivitiesTime = valueOrElse(getInteger(lastActivitiesTimeKey), issueTime)
360362 let actAmount = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
361363 let curPeriod = ((now - issueTime) / WEEKMILLIS)
362364 if ((curPeriod > (MAXPERIOD / 2)))
363365 then throw("Please modify contract for next 1.5 years, according to stats")
364366 else {
365367 let eff = getVotingPower(addr)
366368 let totalPieces = eff[IdxEffTotal]
367369 let amountLeftTotal = valueOrElse(getInteger(stakersAmountLeftKey), 0)
368370 let curPeriodDistribution = fraction(amountLeftTotal, (2 * totalPieces), (totalPieces + (max([100000, totalPieces]) * (MAXPERIOD - curPeriod))))
369371 let userTimeKey = keyLastClaimedTimeByUser(addr)
370372 let lastUserTime = valueOrElse(getInteger(userTimeKey), issueTime)
371373 let userAmount = fraction(fraction(curPeriodDistribution, eff[IdxEffUser], totalPieces), (now - lastUserTime), (3 * YEARMILLIS))
372374 let userKey = keyStakersAmountPaidUser(addr)
373375 $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(marketingAmountLeftKey, (marketingAmountLeft - marketingAmount)), IntegerEntry(lastMarketingTimeKey, now), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, now)], userAmount)
374376 }
375377 }
376378
377379
378380 @Callable(i)
379381 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
380382 then throw("Permission denied")
381383 else if (isDefined(getBinary(wlgAssetIdKey)))
382384 then throw("Already initialized")
383385 else {
384386 let issuedAmount = MILLION6
385387 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
386388 let assetId = calculateAssetId(issue)
387389 [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)]
388390 }
389391
390392
391393
392394 @Callable(i)
393395 func buyWlg (minAmount) = if (!(KSALLOWWLGOLD))
394396 then $Tuple2(nil, 0)
395397 else {
396398 let prologResult = prolog()
397399 if ((size(i.payments) != 1))
398400 then throw("exactly 1 payment must be attached")
399401 else {
400402 let pmt = i.payments[0]
401403 let usdtAmt = pmt.amount
402404 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
403405 if ((pmtAssetId != usdtAssetId))
404406 then throw("USDT payments only!")
405407 else {
406408 let caller = i.caller
407409 let addr = toString(caller)
408410 let maxUsdt = getSwapLimit(addr)
409411 if ((usdtAmt > maxUsdt))
410412 then throw((("You can spend max " + fixedPoint(maxUsdt, 6)) + " USDT"))
411413 else if ((MINSHOPPAYMENT > usdtAmt))
412414 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
413415 else {
414416 let curStats = getWlgStats("", [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId)
415417 let curWlgAmount = curStats[idxWlgAmount]
416418 let oldFundsUsd = (curStats[idxWlgFunds] - usdtAmt)
417419 let wlgPrice = fraction(oldFundsUsd, MULT8, curWlgAmount)
418420 let buyPrice = fraction(wlgPrice, 6, 5)
419421 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
420422 if ((minAmount > wlgAmount))
421423 then throw("Price changed during operation, please try again")
422424 else {
423425 let profitAmount = (usdtAmt / 6)
424426 let deltaFunds = (usdtAmt - profitAmount)
425427 let reissued = fraction(curWlgAmount, deltaFunds, oldFundsUsd)
426428 $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)
427429 }
428430 }
429431 }
430432 }
431433 }
432434
433435
434436
435437 @Callable(i)
436438 func sellWlg (minAmount) = if (!(KSALLOWWLGOLD))
437439 then $Tuple2(nil, 0)
438440 else {
439441 let prologResult = prolog()
440442 if ((size(i.payments) != 1))
441443 then throw("exactly 1 payment must be attached")
442444 else {
443445 let pmt = i.payments[0]
444446 let wlgAmt = pmt.amount
445447 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
446448 if ((pmtAssetId != wlgAssetId))
447449 then throw("WLGOLD payments only!")
448450 else {
449451 let caller = i.caller
450452 let addr = toString(caller)
451453 let maxUsdt = getSwapLimit(addr)
452454 let curStats = getWlgStats("", [restContract, stakingContract, economyContract, govContract, wlgContract, puzzlePoolContract], usdtAssetId)
453455 let curWlgAmount = curStats[idxWlgAmount]
454456 let sellPrice = fraction(curStats[idxWlgPrice], 4, 5)
455457 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
456458 if ((usdtAmt > maxUsdt))
457459 then throw((("You can get max " + fixedPoint(maxUsdt, 6)) + " USDT"))
458460 else if ((MINSHOPPAYMENT > usdtAmt))
459461 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
460462 else if ((minAmount > usdtAmt))
461463 then throw("Price changed during operation, please try again")
462464 else {
463465 let profitAmount = (usdtAmt / 4)
464466 let burned = fraction((usdtAmt + profitAmount), curWlgAmount, curStats[idxWlgFunds])
465467 $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)
466468 }
467469 }
468470 }
469471 }
470472
471473
472474
473475 @Callable(i)
474476 func claim () = {
475477 let prologResult = prolog()
476478 let actions = claimInternal(toString(i.caller))._1
477479 $Tuple2(actions, prologResult)
478480 }
479481
480482
481483
482484 @Callable(i)
483485 func onStakeLand (addr) = if ((i.caller != stakingContract))
484486 then throw("Permission denied")
485487 else claimInternal(addr)
486488
487489
488490
489491 @Callable(i)
490492 func onUnstakeLand (addr) = if ((i.caller != stakingContract))
491493 then throw("Permission denied")
492494 else claimInternal(addr)
493495
494496

github/deemru/w8io/026f985 
60.98 ms