tx · Fo7WAmXBfxQCo6rmNK1LAwUTYQrcn6Kdo8u3BWcujvvB

3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV:  -0.01000000 Waves

2023.10.05 19:40 [3851393] smart account 3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV > SELF 0.00000000 Waves

{ "type": 13, "id": "Fo7WAmXBfxQCo6rmNK1LAwUTYQrcn6Kdo8u3BWcujvvB", "fee": 1000000, "feeAssetId": null, "timestamp": 1696524127522, "version": 2, "chainId": 87, "sender": "3P7aVqHv6fXkYuS4sRW2K17ENZMsbXi3sPV", "senderPublicKey": "5SevHzYFiymbFWe1GPt6nNYccPnfTbMft1DqZWfRH8GN", "proofs": [ "3v1UEKKhgBNYCR7QgStwVXRkFhDhUP2VQNrA5ZhnvhdV9f8fPzbTMYqRLTVwByG85oTrfVD1RLNQ5dbSxLdtDvpX" ], "script": "base64:BgIiCAISAwoBCBIECgIIARIDCgEIEgQKAggBEgMKAQESAwoBCCcBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAoAgBBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQIUc3RhdGljX29yYWNsZUFkZHJlc3MBHnN0YXRpY0tleV90dXJ0bGVTdGFraW5nQWRkcmVzcwACG3N0YXRpY190dXJ0bGVTdGFraW5nQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzARVzdGF0aWNLZXlfcm9wZUFkZHJlc3MAAhJzdGF0aWNfcm9wZUFkZHJlc3MBHHN0YXRpY0tleV9sZXZlbFN5c3RlbUFkZHJlc3MAAhlzdGF0aWNfbGV2ZWxTeXN0ZW1BZGRyZXNzARZzdGF0aWNLZXlfc3BpY2VBc3NldElkAAITc3RhdGljX3NwaWNlQXNzZXRJZAERZ2V0UmViaXJ0aEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19yZWJpcnRoQWRkcmVzcwETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBEWdldEZhcm1pbmdBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfZmFybWluZ0FkZHJlc3MBEmdldEdhbWVEYXBwQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIWc3RhdGljX2dhbWVEYXBwQWRkcmVzcwEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEnN0YXRpY19idXJuQWRkcmVzcwESZ2V0QmFieWR1Y2tBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhZzdGF0aWNfYmFieUR1Y2tBZGRyZXNzARJnZXRCcmVlZGluZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEQZ2V0TWFzdGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIWc3RhdGljX2NmTWFzdGVyQWRkcmVzcwEXZ2V0VHVydGxlU3Rha2luZ0FkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfdHVydGxlU3Rha2luZ0FkZHJlc3MAARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwABDmdldFJvcGVBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEVc3RhdGljS2V5X3JvcGVBZGRyZXNzAAEPZ2V0U3BpY2VBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAARVnZXRMZXZlbFN5c3RlbUFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfbGV2ZWxTeXN0ZW1BZGRyZXNzAAAId0FjY1BLZXkJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQlnZXRPcmFjbGUAAg9zdGF0aWNfd2Fyc1BLZXkCG3N0YXRpY193YXJzUEtleSBub3QgZGVmaW5lZAAPc2NDYW5Vc2VDb3Vwb25zCQDMCAIJARFnZXRSZWJpcnRoQWRkcmVzcwAJAMwIAgkBE2dldEluY3ViYXRvckFkZHJlc3MACQDMCAIJARFnZXRGYXJtaW5nQWRkcmVzcwAJAMwIAgkBEmdldEdhbWVEYXBwQWRkcmVzcwAJAMwIAgkBEmdldEJhYnlkdWNrQWRkcmVzcwAJAMwIAgkBEmdldEJyZWVkaW5nQWRkcmVzcwAJAMwIAgkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAkAzAgCCQEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MACQDMCAIJAQ5nZXRSb3BlQWRkcmVzcwAJAMwIAgkBFWdldExldmVsU3lzdGVtQWRkcmVzcwAFA25pbAEQY291cG9uc1VzZXJTcGVuZAEEdXNlcgkArAICBQR1c2VyAgZfc3BlbmQBEWNvdXBvbnNVc2VyQWN0aXZlAQR1c2VyCQCsAgIFBHVzZXICB19hY3RpdmUBFGNvdXBvbnNVc2VyQWN0aXZlT2xkAQR1c2VyCQCsAgIJARFjb3Vwb25zVXNlckFjdGl2ZQEFBHVzZXICBF9vbGQBEGNvdXBvbnNTcGVuZE9uU2MBAnNjCQCsAgIFAnNjAg9fc3BlbmRfYnlfdXNpbmcBHWFjdGlvblBlckFkZHJlc3NQZXJVc2VyUGVyRGF5BAR1c2VyBmFjdGlvbgtkYXBwQWRkcmVzcwNkYXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgULZGFwcEFkZHJlc3MCAV8FBmFjdGlvbgIBXwUEdXNlcgIBXwUDZGF5AghfYWN0aW9ucwEjYWN0aW9uUGVyQWRkcmVzc1BlclVzZXJMYXN0Q2hlY2tEYXkCBHVzZXIGYWN0aW9uCQCsAgIJAKwCAgkArAICBQZhY3Rpb24CAV8FBHVzZXICEl9hY3Rpb25zX2NoZWNrX2RheQEjYWN0aW9uUGVyQWRkcmVzc1BlclVzZXJBbW91bnRJbkFSb3cCBHVzZXIGYWN0aW9uCQCsAgIJAKwCAgkArAICBQZhY3Rpb24CAV8FBHVzZXICFl9hY3Rpb25zX2Ftb3VudF9pbl9yb3cBDnVzZXJFeHBlcmllbmNlAQR1c2VyCQCsAgIFBHVzZXICC19leHBlcmllbmNlARJhZGRDb3Vwb25zSW50ZXJuYWwCBHVzZXIGYW1vdW50BAZrZXlPbGQJARRjb3Vwb25zVXNlckFjdGl2ZU9sZAEFBHVzZXIEA2tleQkBEWNvdXBvbnNVc2VyQWN0aXZlAQUEdXNlcgQKY291cG9uc09sZAkBDXRyeUdldEludGVnZXIBBQNrZXkEB2NvdXBvbnMJAGQCBQpjb3Vwb25zT2xkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFBmtleU9sZAUKY291cG9uc09sZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQdjb3Vwb25zBQNuaWwACXN0YXJ0VHNNcwCAiNj6qzEBF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQEZGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzdGFydFRzTXMECmRheXNQYXNzZWQJAGkCBQRkaWZmCQBoAgCAowUA6AcFCmRheXNQYXNzZWQBEGhhc0RvbmVUYXNrN0RheXMEA2RheQdhZGRyZXNzCmFjdGlvbk5hbWUMcmV3YXJkQW1vdW50BBF1c2VyRXhwZXJpZW5jZUtleQkBDnVzZXJFeHBlcmllbmNlAQUHYWRkcmVzcwQPdXNlckV4cFRpbGxkYXRlCQENdHJ5R2V0SW50ZWdlcgEFEXVzZXJFeHBlcmllbmNlS2V5BAtjaGVja0RheUtleQkBI2FjdGlvblBlckFkZHJlc3NQZXJVc2VyTGFzdENoZWNrRGF5AgUHYWRkcmVzcwUKYWN0aW9uTmFtZQQMZGF5c0luUm93S2V5CQEjYWN0aW9uUGVyQWRkcmVzc1BlclVzZXJBbW91bnRJbkFSb3cCBQdhZGRyZXNzBQphY3Rpb25OYW1lBAxsYXN0Q2hlY2tEYXkJAQ10cnlHZXRJbnRlZ2VyAQULY2hlY2tEYXlLZXkECWRheXNJblJvdwkBDXRyeUdldEludGVnZXIBBQxkYXlzSW5Sb3dLZXkED2RheXNJblJvd1VwZGF0ZQMJAAACBQxsYXN0Q2hlY2tEYXkJAGUCBQNkYXkAAQkAZAIFCWRheXNJblJvdwABAwkAZgIJAGUCBQNkYXkAAQUMbGFzdENoZWNrRGF5AAEAAAQSbGFzdENoZWNrRGF5VXBkYXRlBQNkYXkEBnJld2FyZAMJAAACBQ9kYXlzSW5Sb3dVcGRhdGUABwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQdhZGRyZXNzAIDC1y8JAQ9nZXRTcGljZUFzc2V0SWQACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxkYXlzSW5Sb3dLZXkAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxkYXlzSW5Sb3dLZXkFD2RheXNJblJvd1VwZGF0ZQUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFC2NoZWNrRGF5S2V5BRJsYXN0Q2hlY2tEYXlVcGRhdGUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwUMcmV3YXJkQW1vdW50CQEPZ2V0U3BpY2VBc3NldElkAAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdXNlckV4cGVyaWVuY2VLZXkJAGQCBQ91c2VyRXhwVGlsbGRhdGUAAQUDbmlsBQZyZXdhcmQBCXBheUFjdGlvbgQKYWN0aW9uTmFtZQt1c2VyQWRkcmVzcwZhbW91bnQDZGF5BAtjb21wb3NlZEtleQMJAQ10cnlHZXRCb29sZWFuAQkArAICCQCsAgICBVRBU0tfBQphY3Rpb25OYW1lAgZfRVZFUlkFCmFjdGlvbk5hbWUJAKwCAgkArAICBQphY3Rpb25OYW1lAgFfCQCkAwEFBmFtb3VudAMJAQ10cnlHZXRCb29sZWFuAQkArAICAgVUQVNLXwULY29tcG9zZWRLZXkJARBoYXNEb25lVGFzazdEYXlzBAUDZGF5CQClCAEFC3VzZXJBZGRyZXNzBQtjb21wb3NlZEtleQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIFVEFTS18FC2NvbXBvc2VkS2V5Ag1fUkVXQVJEX0RBSUxZBQNuaWwBFHJlY29yZEFjdGlvbkludGVybmFsAwphY3Rpb25OYW1lAWkHYWRkcmVzcwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFD3NjQ2FuVXNlQ291cG9ucwgFAWkGY2FsbGVyCQACAQI9Q1JBOiBPbmx5IGNlcnRhaW4gc21hcnQgY29udHJhY3RzIGNhbiB1c2UgdGhpcyByZXdhcmQgbW9kdWxlIQQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAlhY3Rpb25LZXkJAR1hY3Rpb25QZXJBZGRyZXNzUGVyVXNlclBlckRheQQJAKUIAQUHYWRkcmVzcwUKYWN0aW9uTmFtZQkApQgBCAUBaQZjYWxsZXIJAKQDAQUDZGF5BAx0b3RhbEFjdGlvbnMJAGQCCQENdHJ5R2V0SW50ZWdlcgEFCWFjdGlvbktleQABCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWFjdGlvbktleQUMdG90YWxBY3Rpb25zBQNuaWwJAQlwYXlBY3Rpb24EBQphY3Rpb25OYW1lBQdhZGRyZXNzBQx0b3RhbEFjdGlvbnMFA2RheQYBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9DQ086IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX29yYWNsZUFkZHJlc3MFBm9yYWNsZQUDbmlsAWkBCmFkZENvdXBvbnMCBHVzZXIGYW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkPY2FsbGVyUHVibGljS2V5BQh3QWNjUEtleQcJAAIBAg9DQUM6IGFkbWluIG9ubHkDCQBmAgUGYW1vdW50AKDCHgkAzggCCQEUcmVjb3JkQWN0aW9uSW50ZXJuYWwDAgtWRUdHNTBfMDAwMAUBaQgFAWkMb3JpZ2luQ2FsbGVyCQESYWRkQ291cG9uc0ludGVybmFsAgUEdXNlcgUGYW1vdW50CQESYWRkQ291cG9uc0ludGVybmFsAgUEdXNlcgUGYW1vdW50AWkBD2FkZENvdXBvbnNCYXRjaAEFYmF0Y2gDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQ9jYWxsZXJQdWJsaWNLZXkFCHdBY2NQS2V5BwkAAgECD0NBQzogYWRtaW4gb25seQQLY291cG9uc0xpc3QJALUJAgUFYmF0Y2gCATsKAQxoYW5kbGVDb3Vwb24CA2FjYwZjb3Vwb24ECnNwbGl0QXJyYXkJALUJAgUGY291cG9uAgE6BAR1c2VyCQCRAwIFCnNwbGl0QXJyYXkAAAQGYW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3BsaXRBcnJheQABBAhidXJuQ2FsbAkA/AcECQEOZ2V0QnVybkFkZHJlc3MAAgxidXJuQnlJbnZva2UJAMwIAgUGYW1vdW50BQNuaWwFA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwDCQBmAgUGYW1vdW50AKDCHgkAzggCCQDOCAIFA2FjYwkBFHJlY29yZEFjdGlvbkludGVybmFsAwILVkVHRzUwXzAwMDAFAWkIBQFpDG9yaWdpbkNhbGxlcgkBEmFkZENvdXBvbnNJbnRlcm5hbAIFBHVzZXIFBmFtb3VudAkAzggCBQNhY2MJARJhZGRDb3Vwb25zSW50ZXJuYWwCBQR1c2VyBQZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KAAIkbAULY291cG9uc0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGhhbmRsZUNvdXBvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAWkBCENGUmVmdW5kAglyZWNpcGllbnQGYW1vdW50BAljZkFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDUzKQIIBQFpBmNhbGxlcgIKQ0ZfQUREUkVTUwQDa2V5CQCsAgIJAKwCAgICZl8FCWNmQWRkcmVzcwIOX3N0YWtlX2FkZHJlc3MEDHN0YWtlQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgkBEGdldE1hc3RlckFkZHJlc3MABQNrZXkDCQECIT0CBQxzdGFrZUFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyCQACAQImQ0NSOiBUaGlzIGlzIHNvbWV0aGluZyBmaXNoeSBnb2luZyBvbiEJARJhZGRDb3Vwb25zSW50ZXJuYWwCBQlyZWNpcGllbnQFBmFtb3VudAFpAQp1c2VDb3Vwb25zARFhbW91bnRUcnlpbmdUb1BheQQKaW52b2tpbmdTYwgFAWkGY2FsbGVyAwkAZgIAAAURYW1vdW50VHJ5aW5nVG9QYXkJAAIBAi9DVUM6IE9ubHkgcG9zaXRpdmUgYW1vdW50IG9mIG1vbmV5IGNhbiBiZSBwYWlkIQMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFD3NjQ2FuVXNlQ291cG9ucwUKaW52b2tpbmdTYwkAAgECPUNVQzogT25seSBjZXJ0YWluIHNtYXJ0IGNvbnRyYWN0cyBjYW4gdXNlIHRoaXMgY291cG9uIG1vZHVsZSEEBHVzZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAlrZXlBY3RpdmUJARFjb3Vwb25zVXNlckFjdGl2ZQEFBHVzZXIEEGF2YWlsYWJsZUNvdXBvbnMJAQ10cnlHZXRJbnRlZ2VyAQUJa2V5QWN0aXZlAwkAZgIAAAUQYXZhaWxhYmxlQ291cG9ucwkAAgECDkNVQzogR2V0IHJla3QhBAlsZWZ0VG9QYXkDCQBmAgURYW1vdW50VHJ5aW5nVG9QYXkFEGF2YWlsYWJsZUNvdXBvbnMJAGUCBRFhbW91bnRUcnlpbmdUb1BheQUQYXZhaWxhYmxlQ291cG9ucwAABAphbW91bnRQYWlkCQBlAgURYW1vdW50VHJ5aW5nVG9QYXkFCWxlZnRUb1BheQQUYXZhaWxhYmxlQ291cG9uc0xlZnQJAGUCBRBhdmFpbGFibGVDb3Vwb25zBQphbW91bnRQYWlkAwkAZgIAAAUUYXZhaWxhYmxlQ291cG9uc0xlZnQJAAIBAhpDVUM6IFlvdSB0cnkgdG8gb3ZlcnNwZW5kIQQIa2V5U3BlbmQJARBjb3Vwb25zVXNlclNwZW5kAQUEdXNlcgQGa2V5T2xkCQEUY291cG9uc1VzZXJBY3RpdmVPbGQBBQR1c2VyBAprZXlTcGVuZFNjCQEQY291cG9uc1NwZW5kT25TYwEJAKUIAQgFAWkGY2FsbGVyBAp0b3RhbFNwZW5kCQBkAgkBDXRyeUdldEludGVnZXIBBQhrZXlTcGVuZAUKYW1vdW50UGFpZAQMdG90YWxTcGVuZFNjCQBkAgkBDXRyeUdldEludGVnZXIBBQprZXlTcGVuZFNjBQphbW91bnRQYWlkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGtleVNwZW5kBQp0b3RhbFNwZW5kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQZrZXlPbGQFEGF2YWlsYWJsZUNvdXBvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUFjdGl2ZQUUYXZhaWxhYmxlQ291cG9uc0xlZnQJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtleVNwZW5kU2MFDHRvdGFsU3BlbmRTYwUDbmlsBQphbW91bnRQYWlkAWkBDHJlY29yZEFjdGlvbgEKYWN0aW9uTmFtZQkBFHJlY29yZEFjdGlvbkludGVybmFsAwUKYWN0aW9uTmFtZQUBaQgFAWkMb3JpZ2luQ2FsbGVyADhLk9E=", "height": 3851393, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EawqfYhiUz8B5w5mTvWN5fdrBuyjBP1xGqwUrbvDSgL4 Next: 9wNGMqBAEZMB4s6q7p2in54SsXZLdUxhPoz8MBeAoZfU Diff:
OldNewDifferences
66 a
77 case _ =>
88 ""
9+}
10+
11+
12+func tryGetBoolean (key) = match getBoolean(key) {
13+ case b: Boolean =>
14+ b
15+ case _ =>
16+ false
917 }
1018
1119
143151 }
144152
145153
146-func payAction (actionName,userAddress,amount,day) = if ((actionName == "ROPE"))
147- then {
148- let composedKey = (actionName + toString(amount))
149- if ((amount == 5))
150- then hasDoneTask7Days(day, toString(userAddress), composedKey, 50000000)
151- else if ((amount == 10))
152- then hasDoneTask7Days(day, toString(userAddress), composedKey, 150000000)
153- else if ((amount == 15))
154- then hasDoneTask7Days(day, toString(userAddress), composedKey, 300000000)
155- else nil
156- }
157- else if ((actionName == "VEGG50_0000"))
158- then if ((amount == 1))
159- then hasDoneTask7Days(day, toString(userAddress), actionName, 10000000)
160- else nil
161- else if ((actionName == "REBIRTH"))
162- then if ((amount == 1))
163- then hasDoneTask7Days(day, toString(userAddress), actionName, 100000000)
164- else nil
165- else if ((actionName == "FEEDDUCKLING10"))
166- then if ((amount == 1))
167- then hasDoneTask7Days(day, toString(userAddress), actionName, 150000000)
168- else nil
169- else if ((actionName == "LEVELUP"))
170- then hasDoneTask7Days(day, toString(userAddress), actionName, 500000000)
171- else if ((actionName == "BUY5"))
172- then if ((amount == 1))
173- then hasDoneTask7Days(day, toString(userAddress), actionName, 50000000)
174- else nil
175- else if ((actionName == "BUY20"))
176- then if ((amount == 1))
177- then hasDoneTask7Days(day, toString(userAddress), actionName, 250000000)
178- else nil
179- else if ((actionName == "BUY50"))
180- then if ((amount == 1))
181- then hasDoneTask7Days(day, toString(userAddress), actionName, 650000000)
182- else nil
183- else nil
154+func payAction (actionName,userAddress,amount,day) = {
155+ let composedKey = if (tryGetBoolean((("TASK_" + actionName) + "_EVERY")))
156+ then actionName
157+ else ((actionName + "_") + toString(amount))
158+ if (tryGetBoolean(("TASK_" + composedKey)))
159+ then hasDoneTask7Days(day, toString(userAddress), composedKey, tryGetInteger((("TASK_" + composedKey) + "_REWARD_DAILY")))
160+ else nil
161+ }
184162
185163
186164 func recordActionInternal (actionName,i,address) = if (!(containsElement(scCanUseCoupons, i.caller)))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
9+}
10+
11+
12+func tryGetBoolean (key) = match getBoolean(key) {
13+ case b: Boolean =>
14+ b
15+ case _ =>
16+ false
917 }
1018
1119
1220 func tryGetString (key) = tryGetStringExternal(this, key)
1321
1422
1523 func tryGetInteger (key) = match getInteger(this, key) {
1624 case b: Int =>
1725 b
1826 case _ =>
1927 0
2028 }
2129
2230
2331 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
2432
2533
2634 func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
2735
2836
2937 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
3038
3139
3240 func staticKey_ropeAddress () = "static_ropeAddress"
3341
3442
3543 func staticKey_levelSystemAddress () = "static_levelSystemAddress"
3644
3745
3846 func staticKey_spiceAssetId () = "static_spiceAssetId"
3947
4048
4149 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
4250
4351
4452 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
4553
4654
4755 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
4856
4957
5058 func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_gameDappAddress")))
5159
5260
5361 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_burnAddress")))
5462
5563
5664 func getBabyduckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_babyDuckAddress")))
5765
5866
5967 func getBreedingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
6068
6169
6270 func getMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress")))
6371
6472
6573 func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
6674
6775
6876 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
6977
7078
7179 func getRopeAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_ropeAddress())))
7280
7381
7482 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
7583
7684
7785 func getLevelSystemAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_levelSystemAddress())))
7886
7987
8088 let wAccPKey = fromBase58String(valueOrErrorMessage(getString(getOracle(), "static_warsPKey"), "static_warsPKey not defined"))
8189
8290 let scCanUseCoupons = [getRebirthAddress(), getIncubatorAddress(), getFarmingAddress(), getGameDappAddress(), getBabyduckAddress(), getBreedingAddress(), getTurtleStakingAddress(), getTurtleRebirthAddress(), getRopeAddress(), getLevelSystemAddress()]
8391
8492 func couponsUserSpend (user) = (user + "_spend")
8593
8694
8795 func couponsUserActive (user) = (user + "_active")
8896
8997
9098 func couponsUserActiveOld (user) = (couponsUserActive(user) + "_old")
9199
92100
93101 func couponsSpendOnSc (sc) = (sc + "_spend_by_using")
94102
95103
96104 func actionPerAddressPerUserPerDay (user,action,dappAddress,day) = (((((((dappAddress + "_") + action) + "_") + user) + "_") + day) + "_actions")
97105
98106
99107 func actionPerAddressPerUserLastCheckDay (user,action) = (((action + "_") + user) + "_actions_check_day")
100108
101109
102110 func actionPerAddressPerUserAmountInARow (user,action) = (((action + "_") + user) + "_actions_amount_in_row")
103111
104112
105113 func userExperience (user) = (user + "_experience")
106114
107115
108116 func addCouponsInternal (user,amount) = {
109117 let keyOld = couponsUserActiveOld(user)
110118 let key = couponsUserActive(user)
111119 let couponsOld = tryGetInteger(key)
112120 let coupons = (couponsOld + amount)
113121 [IntegerEntry(keyOld, couponsOld), IntegerEntry(key, coupons)]
114122 }
115123
116124
117125 let startTsMs = 1695427200000
118126
119127 func calculateDaysSinceStart () = {
120128 let diff = (lastBlock.timestamp - startTsMs)
121129 let daysPassed = (diff / (86400 * 1000))
122130 daysPassed
123131 }
124132
125133
126134 func hasDoneTask7Days (day,address,actionName,rewardAmount) = {
127135 let userExperienceKey = userExperience(address)
128136 let userExpTilldate = tryGetInteger(userExperienceKey)
129137 let checkDayKey = actionPerAddressPerUserLastCheckDay(address, actionName)
130138 let daysInRowKey = actionPerAddressPerUserAmountInARow(address, actionName)
131139 let lastCheckDay = tryGetInteger(checkDayKey)
132140 let daysInRow = tryGetInteger(daysInRowKey)
133141 let daysInRowUpdate = if ((lastCheckDay == (day - 1)))
134142 then (daysInRow + 1)
135143 else if (((day - 1) > lastCheckDay))
136144 then 1
137145 else 0
138146 let lastCheckDayUpdate = day
139147 let reward = if ((daysInRowUpdate == 7))
140148 then [ScriptTransfer(addressFromStringValue(address), 100000000, getSpiceAssetId()), IntegerEntry(daysInRowKey, 0)]
141149 else [IntegerEntry(daysInRowKey, daysInRowUpdate)]
142150 ([IntegerEntry(checkDayKey, lastCheckDayUpdate), ScriptTransfer(addressFromStringValue(address), rewardAmount, getSpiceAssetId()), IntegerEntry(userExperienceKey, (userExpTilldate + 1))] ++ reward)
143151 }
144152
145153
146-func payAction (actionName,userAddress,amount,day) = if ((actionName == "ROPE"))
147- then {
148- let composedKey = (actionName + toString(amount))
149- if ((amount == 5))
150- then hasDoneTask7Days(day, toString(userAddress), composedKey, 50000000)
151- else if ((amount == 10))
152- then hasDoneTask7Days(day, toString(userAddress), composedKey, 150000000)
153- else if ((amount == 15))
154- then hasDoneTask7Days(day, toString(userAddress), composedKey, 300000000)
155- else nil
156- }
157- else if ((actionName == "VEGG50_0000"))
158- then if ((amount == 1))
159- then hasDoneTask7Days(day, toString(userAddress), actionName, 10000000)
160- else nil
161- else if ((actionName == "REBIRTH"))
162- then if ((amount == 1))
163- then hasDoneTask7Days(day, toString(userAddress), actionName, 100000000)
164- else nil
165- else if ((actionName == "FEEDDUCKLING10"))
166- then if ((amount == 1))
167- then hasDoneTask7Days(day, toString(userAddress), actionName, 150000000)
168- else nil
169- else if ((actionName == "LEVELUP"))
170- then hasDoneTask7Days(day, toString(userAddress), actionName, 500000000)
171- else if ((actionName == "BUY5"))
172- then if ((amount == 1))
173- then hasDoneTask7Days(day, toString(userAddress), actionName, 50000000)
174- else nil
175- else if ((actionName == "BUY20"))
176- then if ((amount == 1))
177- then hasDoneTask7Days(day, toString(userAddress), actionName, 250000000)
178- else nil
179- else if ((actionName == "BUY50"))
180- then if ((amount == 1))
181- then hasDoneTask7Days(day, toString(userAddress), actionName, 650000000)
182- else nil
183- else nil
154+func payAction (actionName,userAddress,amount,day) = {
155+ let composedKey = if (tryGetBoolean((("TASK_" + actionName) + "_EVERY")))
156+ then actionName
157+ else ((actionName + "_") + toString(amount))
158+ if (tryGetBoolean(("TASK_" + composedKey)))
159+ then hasDoneTask7Days(day, toString(userAddress), composedKey, tryGetInteger((("TASK_" + composedKey) + "_REWARD_DAILY")))
160+ else nil
161+ }
184162
185163
186164 func recordActionInternal (actionName,i,address) = if (!(containsElement(scCanUseCoupons, i.caller)))
187165 then throw("CRA: Only certain smart contracts can use this reward module!")
188166 else {
189167 let day = calculateDaysSinceStart()
190168 let actionKey = actionPerAddressPerUserPerDay(toString(address), actionName, toString(i.caller), toString(day))
191169 let totalActions = (tryGetInteger(actionKey) + 1)
192170 ([IntegerEntry(actionKey, totalActions)] ++ payAction(actionName, address, totalActions, day))
193171 }
194172
195173
196174 @Callable(i)
197175 func configureOracle (oracle) = if ((i.caller != this))
198176 then throw("CCO: admin only")
199177 else [StringEntry("static_oracleAddress", oracle)]
200178
201179
202180
203181 @Callable(i)
204182 func addCoupons (user,amount) = if (if ((i.caller != this))
205183 then (i.callerPublicKey != wAccPKey)
206184 else false)
207185 then throw("CAC: admin only")
208186 else if ((amount > 500000))
209187 then (recordActionInternal("VEGG50_0000", i, i.originCaller) ++ addCouponsInternal(user, amount))
210188 else addCouponsInternal(user, amount)
211189
212190
213191
214192 @Callable(i)
215193 func addCouponsBatch (batch) = if (if ((i.caller != this))
216194 then (i.callerPublicKey != wAccPKey)
217195 else false)
218196 then throw("CAC: admin only")
219197 else {
220198 let couponsList = split(batch, ";")
221199 func handleCoupon (acc,coupon) = {
222200 let splitArray = split(coupon, ":")
223201 let user = splitArray[0]
224202 let amount = parseIntValue(splitArray[1])
225203 let burnCall = invoke(getBurnAddress(), "burnByInvoke", [amount], nil)
226204 if ((burnCall == burnCall))
227205 then if ((amount > 500000))
228206 then ((acc ++ recordActionInternal("VEGG50_0000", i, i.originCaller)) ++ addCouponsInternal(user, amount))
229207 else (acc ++ addCouponsInternal(user, amount))
230208 else throw("Strict value is not equal to itself.")
231209 }
232210
233211 let $l = couponsList
234212 let $s = size($l)
235213 let $acc0 = nil
236214 func $f0_1 ($a,$i) = if (($i >= $s))
237215 then $a
238216 else handleCoupon($a, $l[$i])
239217
240218 func $f0_2 ($a,$i) = if (($i >= $s))
241219 then $a
242220 else throw("List size exceeds 20")
243221
244222 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
245223 }
246224
247225
248226
249227 @Callable(i)
250228 func CFRefund (recipient,amount) = {
251229 let cfAddress = getStringValue(i.caller, "CF_ADDRESS")
252230 let key = (("f_" + cfAddress) + "_stake_address")
253231 let stakeAddress = getStringValue(getMasterAddress(), key)
254232 if ((stakeAddress != toString(i.caller)))
255233 then throw("CCR: This is something fishy going on!")
256234 else addCouponsInternal(recipient, amount)
257235 }
258236
259237
260238
261239 @Callable(i)
262240 func useCoupons (amountTryingToPay) = {
263241 let invokingSc = i.caller
264242 if ((0 > amountTryingToPay))
265243 then throw("CUC: Only positive amount of money can be paid!")
266244 else if (!(containsElement(scCanUseCoupons, invokingSc)))
267245 then throw("CUC: Only certain smart contracts can use this coupon module!")
268246 else {
269247 let user = toString(i.originCaller)
270248 let keyActive = couponsUserActive(user)
271249 let availableCoupons = tryGetInteger(keyActive)
272250 if ((0 > availableCoupons))
273251 then throw("CUC: Get rekt!")
274252 else {
275253 let leftToPay = if ((amountTryingToPay > availableCoupons))
276254 then (amountTryingToPay - availableCoupons)
277255 else 0
278256 let amountPaid = (amountTryingToPay - leftToPay)
279257 let availableCouponsLeft = (availableCoupons - amountPaid)
280258 if ((0 > availableCouponsLeft))
281259 then throw("CUC: You try to overspend!")
282260 else {
283261 let keySpend = couponsUserSpend(user)
284262 let keyOld = couponsUserActiveOld(user)
285263 let keySpendSc = couponsSpendOnSc(toString(i.caller))
286264 let totalSpend = (tryGetInteger(keySpend) + amountPaid)
287265 let totalSpendSc = (tryGetInteger(keySpendSc) + amountPaid)
288266 $Tuple2([IntegerEntry(keySpend, totalSpend), IntegerEntry(keyOld, availableCoupons), IntegerEntry(keyActive, availableCouponsLeft), IntegerEntry(keySpendSc, totalSpendSc)], amountPaid)
289267 }
290268 }
291269 }
292270 }
293271
294272
295273
296274 @Callable(i)
297275 func recordAction (actionName) = recordActionInternal(actionName, i, i.originCaller)
298276
299277

github/deemru/w8io/3ef1775 
39.70 ms