tx · 3i4Kd15QJzxL6YABmmnBDfiTnp1dsrickaUysfZBDjAg

3N9LkJahTMx41wGhSxLS42prCZtRCp4dhTs:  -0.04000000 Waves

2022.10.25 17:20 [2288024] smart account 3N9LkJahTMx41wGhSxLS42prCZtRCp4dhTs > SELF 0.00000000 Waves

{ "type": 13, "id": "3i4Kd15QJzxL6YABmmnBDfiTnp1dsrickaUysfZBDjAg", "fee": 4000000, "feeAssetId": null, "timestamp": 1666707635090, "version": 1, "sender": "3N9LkJahTMx41wGhSxLS42prCZtRCp4dhTs", "senderPublicKey": "8hm3x3tdBbKUu4XpjDGwNdaPA2qEdrdchHue4k49BsYJ", "proofs": [ "t9ALU6vgojJ4cwhhZKRP36ifwfW8ghHhYWUFQmqdEs9L7wryeaCfr1Akc9zxrxpiv8d4eoToTXVog6ZJcD6PZPA", "2Gv8SVrLB7ZAYbJyeBP4DTHHY9hMo6wH6hxg3soPSgjBrKHxgYfpbCwciVFd5o44m81FseZHQ8kJuuEvoV1KP9Qf", "3wNr51YWKbw4pLyAfQXBJxvm9fLGdCU6Sp4yNqG2imdYoXpsiTr9vs2E526gMT5pi7Qzj7fWy36kMYDdueKnEDa2" ], "script": "base64:BgI5CAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESABIECgIIARIAEgQKAgEIEgQKAgEIZQADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUWDYJALYCAQUFTVVMVDYABk1VTFRYOAkAtgIBBQVNVUxUOAAHTVVMVFgxOAkAtgIBAICAkLu61q3wDQAKV0FWRVNJRFNUUgIFV0FWRVMAB1dBVkVTSUQJANkEAQUKV0FWRVNJRFNUUgAJREFZTUlMTElTAIC4mSkAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUHYWRkcmVzcwIBLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDGdldEludE9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPTWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEMZ2V0U3RyT3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBEGtleU1pbkxvY2tBbW91bnQAAhElc19fbWluTG9ja0Ftb3VudAEQa2V5U3Rha2VkQXNzZXRJZAACESVzX19zdGFrZWRBc3NldElkARFrZXlDb250cm9sQWRkcmVzcwACHCVzJXNfX2NvbmZpZ19fY29udHJvbEFkZHJlc3MBDWtleUNvbnRyb2xDZmcAAhElc19fY29udHJvbENvbmZpZwEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAIVc3VwcG9ydGVkUmV3YXJkQXNzZXRzARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwABBzdGFrZWRBc3NldElkU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQAAA1zdGFrZWRBc3NldElkCQDZBAEFEHN0YWtlZEFzc2V0SWRTdHIADW1pbkxvY2tBbW91bnQJAQxnZXRJbnRPckZhaWwBCQEQa2V5TWluTG9ja0Ftb3VudAAAEnN1cHBvcnRlZEFzc2V0c1N0cgkBDGdldFN0ck9yRWxzZQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAgAAE3N1cHBvcnRlZEFzc2V0c0xpc3QJALUJAgUSc3VwcG9ydGVkQXNzZXRzU3RyAgFfARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCAgZhbW91bnQFA25pbAUDU0VQARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCAgVzdGFydAUDbmlsBQNTRVABEGtleUhpc3RvcnlSZWNvcmQDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICB2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEWFjdGl2ZVRvdGFsTG9ja2VkBQNuaWwFA1NFUAESa2V5U3RhdHNMb2Nrc0NvdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIKbG9ja3NDb3VudAUDbmlsBQNTRVABEmtleVN0YXRzVXNlcnNDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEGFjdGl2ZVVzZXJzQ291bnQFA25pbAUDU0VQARdrZXlTdGF0c0RlcG9zaXRBbXRCeURheQEJdGltZXN0YW1wCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICBXN0YXRzCQDMCAICD2RlcG9zaXRBbXRCeURheQkAzAgCCQCkAwEFCXRpbWVzdGFtcAUDbmlsBQNTRVABGGtleVN0YXRzRGVwb3NpdEFtdFRvdGFscwAJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIFc3RhdHMJAMwIAgIQZGVwb3NpdEFtdFRvdGFscwUDbmlsBQNTRVABDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAERa2V5RGVwb3NpdE51bUxhc3QACQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA2RlcAkAzAgCAgdsYXN0TnVtBQNuaWwFA1NFUAEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1c2VyUndkRnJvbURlcE51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABFWtleVJld2FyZFBlck5zYnRTdW1BdAIKZGVwb3NpdE51bQN0a24JALkJAgkAzAgCAgQlcyVkCQDMCAICFXJ3ZFBlck5zYnRTdW1CeURlcE51bQkAzAgCCQCkAwEFCmRlcG9zaXROdW0JAMwIAgUDdGtuBQNuaWwFA1NFUAEJa2V5UmV3YXJkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDcndkCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQNTRVABCmtleUNsYWltZWQCC3VzZXJBZGRyZXNzA3RrbgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNjbG0JAMwIAgULdXNlckFkZHJlc3MJAMwIAgUDdGtuBQNuaWwFA1NFUAEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBA3RrbgkAuQkCCQDMCAICBCVzJXMJAMwIAgIObm90RGlzdHJpYnV0ZWQJAMwIAgUDdGtuBQNuaWwFA1NFUAEUa2V5TGVnYWN5VXNlckJhbGFuY2UCCHVzZXJBZGRyA3RrbgkAuQkCCQDMCAICC3JwZF9iYWxhbmNlCQDMCAIFA3RrbgkAzAgCBQh1c2VyQWRkcgUDbmlsAgFfARVrZXlMZWdhY3lUb3RhbEJhbGFuY2UBA3RrbgkAuQkCCQDMCAICC3JwZF9iYWxhbmNlCQDMCAIFA3RrbgUDbmlsAgFfAQV0b1gxOAIHb3JpZ1ZhbAhvcmlnTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFB01VTFRYMTgFCG9yaWdNdWx0AQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEMZ2V0SW50T3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBD3RvQWRkcmVzc09yRmFpbAEKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFCmFkZHJlc3NTdHIJAKwCAgIhY291bGRuJ3QgcGFyc2UgcGFzc2VkIGFkZHJlc3NTdHI9BQphZGRyZXNzU3RyAQt0b0Fzc2V0VmVjdAEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHIFCldBVkVTSURTVFIFBHVuaXQJANkEAQUIYXNzZXRTdHIBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARJhc1N3YXBQYXJhbXNTVFJVQ1QBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIjKEludCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCkEBnN0cnVjdAUHJG1hdGNoMAUGc3RydWN0CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARNmb3JtYXRIaXN0b3J5UmVjb3JkAwt1c2VyQWRkcmVzcwlvbGRBbW91bnQJbmV3QW1vdW50CQC5CQIJAMwIAgIKJXMlZCVkJWQlZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQlvbGRBbW91bnQJAMwIAgkApAMBBQluZXdBbW91bnQFA25pbAUDU0VQARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCC3VzZXJBZGRyZXNzDmNsYWltZWRSZXdhcmRzCQC5CQIJAMwIAgIIJXMlZCVkJXMJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFA1NFUAESSGlzdG9yeVJlY29yZEVudHJ5BQR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CW5ld0Ftb3VudAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQDBQt1c2VyQWRkcmVzcwUJb2xkQW1vdW50BQluZXdBbW91bnQBEUNsYWltSGlzdG9yeUVudHJ5Awt1c2VyQWRkcmVzcwR0eElkDmNsYWltZWRSZXdhcmRzCQELU3RyaW5nRW50cnkCCQEQa2V5SGlzdG9yeVJlY29yZAMCBWNsYWltBQt1c2VyQWRkcmVzcwUEdHhJZAkBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleUxlZ2FjeVRvdGFsQmFsYW5jZQEFEHN0YWtlZEFzc2V0SWRTdHIFDnRvdGFsQW1vdW50TmV3BQNuaWwFC3RvdGFsQW1vdW50BQ50b3RhbEFtb3VudE5ldwEPTG9ja1BhcmFtc0VudHJ5Awt1c2VyQWRkcmVzcwZhbW91bnQSc3Rha2luZ1N0YXJ0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TGVnYWN5VXNlckJhbGFuY2UCBQt1c2VyQWRkcmVzcwUQc3Rha2VkQXNzZXRJZFN0cgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFEnN0YWtpbmdTdGFydEhlaWdodAUDbmlsAQ9nZXRQYXJhbXNPckZhaWwACQCUCgIJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJARBrZXlTdGFrZWRBc3NldElkAAkBDGdldEludE9yRmFpbAEJARBrZXlNaW5Mb2NrQW1vdW50AAEMaXNBY3RpdmVVc2VyAQt1c2VyQWRkcmVzcwkAZgIJAQxnZXRJbnRPckVsc2UCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzAAAAAAETZ2V0VXNlclBhcmFtc09yVW5pdAELdXNlckFkZHJlc3MDCQEMaXNBY3RpdmVVc2VyAQULdXNlckFkZHJlc3MJAJUKAwcJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzCQEMZ2V0SW50T3JGYWlsAQkBFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sBBQt1c2VyQWRkcmVzcwUEdW5pdAETZ2V0VXNlclBhcmFtc09yRmFpbAELdXNlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkArAICCQCsAgICBVVzZXIgBQt1c2VyQWRkcmVzcwIPIGlzIG5vdCBkZWZpbmVkAQpjYWxjUmV3YXJkBQt1c2VyQWRkcmVzcwdhc3NldElkDXN0YWtlZEFtb3VudFgOZGVwb3NpdE51bVVzZXIOZGVwb3NpdE51bUxhc3QEF3Jld2FyZFBlck5zYnRTdW1MYXN0S0VZCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bUxhc3QFB2Fzc2V0SWQECnN1bUxhc3RYMTgJAKcDAQkBDGdldFN0ck9yRWxzZQIJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAIBMAQKc3VtVXNlclgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1Vc2VyBQdhc3NldElkAgEwBBFyZXdhcmREeW5hbWljUGFydAkAoAMBCQC8AgMJALgCAgUKc3VtTGFzdFgxOAUKc3VtVXNlclgxOAUNc3Rha2VkQW1vdW50WAUHTVVMVFgxOAQTcmV3YXJkQ2FjaGVkUGFydEtFWQkBCWtleVJld2FyZAIFC3VzZXJBZGRyZXNzBQdhc3NldElkBBByZXdhcmRDYWNoZWRQYXJ0CQEMZ2V0SW50T3JFbHNlAgUTcmV3YXJkQ2FjaGVkUGFydEtFWQAACQCWCgQJAGQCBRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUQcmV3YXJkQ2FjaGVkUGFydAURcmV3YXJkRHluYW1pY1BhcnQFE3Jld2FyZENhY2hlZFBhcnRLRVkBDHRvU3RhcnRPZkRheQEJdGltZXN0YW1wCQBoAgkAaQIFCXRpbWVzdGFtcAUJREFZTUlMTElTBQlEQVlNSUxMSVMBE2ZpbmRFbGVtZW50UG9zaXRpb24DA3NyYwdlbGVtZW50A3NlcAQMZWxlbWVudFN0YXJ0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALMJAgUDc3JjBQdlbGVtZW50CQCsAgIJAKwCAgkArAICAhZ0aGVyZSBpcyBubyBzdWJzdHJpbmcgBQdlbGVtZW50AgQgaW4gBQNzcmMDCQAAAgUMZWxlbWVudFN0YXJ0AAAAAAQEbGVmdAkArwICBQNzcmMFDGVsZW1lbnRTdGFydAkAZQIJAJADAQkAtQkCBQRsZWZ0BQNzZXAAAQATRGVwb3NpdFRvdGFsc1BSRUZJWAIEJWQlZAETdXBkYXRlRGVwb3NpdFRvdGFscwMHY3VyclZhbAtpZHhUb1VwZGF0ZQhkZWx0YUFtdAQHY3VyckFycgkAtQkCBQdjdXJyVmFsBQNTRVAKAQ51cGREZXBUb3RCeUlkeAEDaWR4AwkBAiE9AgUDaWR4BQtpZHhUb1VwZGF0ZQkAkQMCBQdjdXJyQXJyBQNpZHgJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdjdXJyQXJyBQNpZHgFCGRlbHRhQW10CQC5CQIJAMwIAgUTRGVwb3NpdFRvdGFsc1BSRUZJWAkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAAEJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQACBQNuaWwFA1NFUAEVRGVwb3NpdHNUb3RhbHNFbnRyaWVzAg1kZXBvc2l0QW1vdW50CmFzc2V0SWRTdHIECnN0YXJ0T2ZEYXkJAQx0b1N0YXJ0T2ZEYXkBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQIYnlEYXlLRVkJARdrZXlTdGF0c0RlcG9zaXRBbXRCeURheQEFCnN0YXJ0T2ZEYXkECXRvdGFsc0tFWQkBGGtleVN0YXRzRGVwb3NpdEFtdFRvdGFscwAECHBvc2l0aW9uCQETZmluZEVsZW1lbnRQb3NpdGlvbgMFEnN1cHBvcnRlZEFzc2V0c1N0cgUKYXNzZXRJZFN0cgIBXwQLZGVmYXVsdERBVEEJAKwCAgUTRGVwb3NpdFRvdGFsc1BSRUZJWAIGX18wX18wBA5jdXJyVG90YWxzREFUQQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQl0b3RhbHNLRVkFC2RlZmF1bHREQVRBBA1uZXdUb3RhbHNEQVRBCQETdXBkYXRlRGVwb3NpdFRvdGFscwMFDmN1cnJUb3RhbHNEQVRBCQBkAgUIcG9zaXRpb24AAQUNZGVwb3NpdEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCBQl0b3RhbHNLRVkFDW5ld1RvdGFsc0RBVEEJAMwIAgkBC1N0cmluZ0VudHJ5AgUIYnlEYXlLRVkFDW5ld1RvdGFsc0RBVEEFA25pbAENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDEwNjE3MTA3NTIJAQpjYWxjUmV3YXJkBQULdXNlckFkZHJlc3MFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTA2MTcxMDc1MgJfMQQGY2FjaGVkCAUNJHQwMTA2MTcxMDc1MgJfMgQHZHluYW1pYwgFDSR0MDEwNjE3MTA3NTICXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxMDYxNzEwNzUyAl80CQDNCAIFBWFjY3VtCQEMSW50ZWdlckVudHJ5AgUTcmV3YXJkQ2FjaGVkUGFydEtFWQULcmV3YXJkVG90YWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAAACBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwUDbmlsAwMJAAACBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBmAgUOZGVwb3NpdE51bVVzZXIA////////////AQcJAAIBAi9pbnZhbGlkIGRlcG9zaXROdW1MYXN0IGFuZCBkZXBvc2l0TnVtVXNlciBzdGF0ZQMDCQBmAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAZwIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHAwUJaXNOZXdVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0BQNuaWwJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACCQEMSW50ZWdlckVudHJ5AgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQ5kZXBvc2l0TnVtTGFzdAkAAgEJAKwCAgkArAICCQCsAgICJHVuY292ZXJlZCBjb25kaXRpb246IGRlcG9zaXROdW1MYXN0PQkApAMBBQ5kZXBvc2l0TnVtTGFzdAIQIGRlcG9zaXROdW1Vc2VyPQkApAMBBQ5kZXBvc2l0TnVtVXNlcgEiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQIDdGtuCWFtb3VudEluYwQXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJARdrZXlOb3REaXN0cmlidXRlZFJld2FyZAEFA3RrbgQUbm90RGlzdHJpYnV0ZWRSZXdhcmQJAQxnZXRJbnRPckVsc2UCBRdub3REaXN0cmlidXRlZFJld2FyZEtFWQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdub3REaXN0cmlidXRlZFJld2FyZEtFWQkAZAIFFG5vdERpc3RyaWJ1dGVkUmV3YXJkBQlhbW91bnRJbmMFA25pbAEKbWVyZ2VTdGFrZQILdXNlckFkZHJlc3MLYW1vdW50VG9BZGQEDSR0MDEzNTc2MTM2OTIJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAUGaGVpZ2h0BAlpc05ld1VzZXIIBQ0kdDAxMzU3NjEzNjkyAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxMzU3NjEzNjkyAl8yBBJzdGFraW5nU3RhcnRIZWlnaHQIBQ0kdDAxMzU3NjEzNjkyAl8zBA9zdGFrZWRBbW91bnRORVcDBQlpc05ld1VzZXIFC2Ftb3VudFRvQWRkCQBkAgULYW1vdW50VG9BZGQFDHN0YWtlZEFtb3VudAkAlgoEBQlpc05ld1VzZXIFDHN0YWtlZEFtb3VudAUSc3Rha2luZ1N0YXJ0SGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcBC2NvbW1vblN0YWtlAgt1c2VyQWRkcmVzcwFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIVSW52YWxpZCBwYXltZW50cyBzaXplBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFB3BheW1lbnQGYW1vdW50BBNpbnZhbGlkQXNzZXRNZXNzYWdlCQCsAgIJAKwCAgIPSW52YWxpZCBhc3NldC4gCQDYBAEFDXN0YWtlZEFzc2V0SWQCDCBpcyBleHBlY3RlZAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkBRNpbnZhbGlkQXNzZXRNZXNzYWdlAwkBAiE9AgUHYXNzZXRJZAUNc3Rha2VkQXNzZXRJZAkAAgEFE2ludmFsaWRBc3NldE1lc3NhZ2UEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBAptZXJnZWREYXRhCQEKbWVyZ2VTdGFrZQIFDnVzZXJBZGRyZXNzU3RyBQZhbW91bnQECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEnN0YWtpbmdTdGFydEhlaWdodAgFCm1lcmdlZERhdGECXzMED3N0YWtlZEFtb3VudE5FVwgFCm1lcmdlZERhdGECXzQDCQBmAgUNbWluTG9ja0Ftb3VudAUPc3Rha2VkQW1vdW50TkVXCQACAQkArAICAhNNaW4gbG9jayBhbW91bnQgaXMgCQCkAwEFDW1pbkxvY2tBbW91bnQEDSR0MDE0NjY1MTQ3NjcJAQtTdGF0c1Jlc3VsdAMFBmFtb3VudAABAwUJaXNOZXdVc2VyAAEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTQ2NjUxNDc2NwJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxNDY2NTE0NzY3Al8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDE0NjY1MTQ3NjcCXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQUCBXN0YWtlBQ51c2VyQWRkcmVzc1N0cggFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BQ9zdGFrZWRBbW91bnRORVcFA25pbAkBDVJld2FyZEVudHJpZXMDBQlpc05ld1VzZXIFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQ51c2VyQWRkcmVzc1N0cgUPc3Rha2VkQW1vdW50TkVXBRJzdGFraW5nU3RhcnRIZWlnaHQFDHN0YXRzRW50cmllcwENY29tbW9uVW5zdGFrZQIGYW1vdW50AWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiN1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MEDSR0MDE1MjQyMTUzMzAJARNnZXRVc2VyUGFyYW1zT3JGYWlsAQUOdXNlckFkZHJlc3NTdHIECWlzTmV3VXNlcggFDSR0MDE1MjQyMTUzMzACXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE1MjQyMTUzMzACXzIEEnN0YWtpbmdTdGFydEhlaWdodAgFDSR0MDE1MjQyMTUzMzACXzMEEHN3YXBQYXJhbXNTVFJVQ1QJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD9BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBQ51c2VyQWRkcmVzc1N0cgkAzAgCAAAFA25pbAUDbmlsBBRzd2FwTGltaXRTcGVudEluVXNkbggFEHN3YXBQYXJhbXNTVFJVQ1QCXzIEDmJsY2tzMkxtdFJlc2V0CAUQc3dhcFBhcmFtc1NUUlVDVAJfMwMJAGYCBRRzd2FwTGltaXRTcGVudEluVXNkbgAACQACAQkArAICCQCsAgICLVlvdSBoYXZlIGFscmVhZHkgbWFkZSBhIHN3YXAgb3BlcmF0aW9uLiBXYWl0IAkApAMBCQBkAgUGaGVpZ2h0BQ5ibGNrczJMbXRSZXNldAISIGhlaWdodCB0byB1bnN0YWtlAwkAZwIAAAUMc3Rha2VkQW1vdW50CQACAQISTm90aGluZyB0byB1bnN0YWtlAwkAZgIFBmFtb3VudAUMc3Rha2VkQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIKUmVxdWVzdGVkIAkApAMBBQZhbW91bnQCEiwgYnV0IHN0YWtlZCBvbmx5IAkApAMBBQxzdGFrZWRBbW91bnQED3N0YWtlZEFtb3VudE5FVwkAZQIFDHN0YWtlZEFtb3VudAUGYW1vdW50BA0kdDAxNTk2ODE2MTI2CQELU3RhdHNSZXN1bHQDCQEBLQEFBmFtb3VudAMJAAACBQZhbW91bnQFDHN0YWtlZEFtb3VudAD///////////8BAAADCQAAAgUGYW1vdW50BQxzdGFrZWRBbW91bnQA////////////AQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxNTk2ODE2MTI2Al8xBAt0b3RhbFN0YWtlZAgFDSR0MDE1OTY4MTYxMjYCXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTU5NjgxNjEyNgJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQ1zdGFrZWRBc3NldElkCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkFAgd1bnN0YWtlBQ51c2VyQWRkcmVzc1N0cggFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BQ9zdGFrZWRBbW91bnRORVcFA25pbAkBDVJld2FyZEVudHJpZXMDBwUOdXNlckFkZHJlc3NTdHIFDHN0YWtlZEFtb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFDnVzZXJBZGRyZXNzU3RyBQ9zdGFrZWRBbW91bnRORVcFEnN0YWtpbmdTdGFydEhlaWdodAUMc3RhdHNFbnRyaWVzAQtjb21tb25DbGFpbQILdXNlckFkZHJlc3MBaQQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQNJHQwMTY2MjIxNjczMAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQ51c2VyQWRkcmVzc1N0cgkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE2NjIyMTY3MzACXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE2NjIyMTY3MzACXzIEDHN0YWtpbmdTdGFydAgFDSR0MDE2NjIyMTY3MzACXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMTcxMDExNzIzOQkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAxNzEwMTE3MjM5Al8xBAZjYWNoZWQIBQ0kdDAxNzEwMTE3MjM5Al8yBAdkeW5hbWljCAUNJHQwMTcxMDExNzIzOQJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDE3MTAxMTcyMzkCXzQECmNsYWltZWRLRVkJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BA0kdDAxNzI5OTE3MzM2BQVhY2N1bQQEZGF0YQgFDSR0MDE3Mjk5MTczMzYCXzEEEWNsYWltZWRBbXRCeUFzc2V0CAUNJHQwMTcyOTkxNzMzNgJfMgQHbmV3UGFydAkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwFA25pbAIBOgQUY2xhaW1lZEFtdEJ5QXNzZXROZXcJALkJAgkAzAgCBRFjbGFpbWVkQW10QnlBc3NldAkAzAgCBQduZXdQYXJ0BQNuaWwCAV8DCQBnAgAABQtyZXdhcmRUb3RhbAkAlAoCBQRkYXRhBRRjbGFpbWVkQW10QnlBc3NldE5ldwkAlAoCCQDNCAIJAM0IAgkAzQgCBQRkYXRhCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULcmV3YXJkVG90YWwJAQt0b0Fzc2V0VmVjdAEFBWFzc2V0CQEMSW50ZWdlckVudHJ5AgUKY2xhaW1lZEtFWQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKY2xhaW1lZEtFWQAABQtyZXdhcmRUb3RhbAkBDEludGVnZXJFbnRyeQIFE3Jld2FyZENhY2hlZFBhcnRLRVkAAAUUY2xhaW1lZEFtdEJ5QXNzZXROZXcEDSR0MDE3Nzk2MTc5MDkKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACBAl0cmFuc2ZlcnMIBQ0kdDAxNzc5NjE3OTA5Al8xBBdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAgFDSR0MDE3Nzk2MTc5MDkCXzIDCQBnAgAACQCQAwEFCXRyYW5zZmVycwkAlAoCBQNuaWwAAAkAlAoCCQDNCAIJAM0IAgUJdHJhbnNmZXJzCQEMSW50ZWdlckVudHJ5AgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQ5kZXBvc2l0TnVtTGFzdAkBEUNsYWltSGlzdG9yeUVudHJ5AwUOdXNlckFkZHJlc3NTdHIIBQFpDXRyYW5zYWN0aW9uSWQJALACAgUXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQAAQkAkAMBBQl0cmFuc2ZlcnMACFVTRE5UWVBFAgRVU0ROAAhOU0JUVFlQRQIETlNCVAASTmV1dHJpbm9Bc3NldElkS2V5AhFuZXV0cmlub19hc3NldF9pZAATTmV1dHJpbm9Db250cmFjdEtleQIRbmV1dHJpbm9fY29udHJhY3QADk5zYnRBc3NldElkS2V5Ag1ib25kX2Fzc2V0X2lkAApCYWxhbmNlS2V5AgtycGRfYmFsYW5jZQAPbmV1dHJpbm9Bc3NldElkCQDZBAEJAQ9nZXRTdHJpbmdPckZhaWwCBRBuZXV0cmlub0NvbnRyYWN0BRJOZXV0cmlub0Fzc2V0SWRLZXkADm5zYnRBc3NldElkU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAgUQbmV1dHJpbm9Db250cmFjdAUOTnNidEFzc2V0SWRLZXkAC25zYnRBc3NldElkCQDZBAEFDm5zYnRBc3NldElkU3RyARFnZXRVc2VyQmFsYW5jZUtleQIFb3duZXIHYXNzZXRJZAkAuQkCCQDMCAIFCkJhbGFuY2VLZXkJAMwIAgUHYXNzZXRJZAkAzAgCBQVvd25lcgUDbmlsAgFfARVnZXRDb250cmFjdEJhbGFuY2VLZXkBB2Fzc2V0SWQJAKwCAgkArAICBQpCYWxhbmNlS2V5AgFfBQdhc3NldElkARJnZXRDb250cmFjdEJhbGFuY2UBB2Fzc2V0SWQJAQxnZXRJbnRPckVsc2UCCQEVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AQUHYXNzZXRJZAAAAQ5nZXRVc2VyQmFsYW5jZQIFb3duZXIHYXNzZXRJZAkBDGdldEludE9yRWxzZQIJARFnZXRVc2VyQmFsYW5jZUtleQIFBW93bmVyBQdhc3NldElkAAABGmdldFZhbGlkU3Rha2luZ0Fzc2V0T3JGYWlsAgtzdGFraW5nVHlwZQdhc3NldElkAwMJAAACBQtzdGFraW5nVHlwZQUIVVNETlRZUEUJAQIhPQIFB2Fzc2V0SWQFD25ldXRyaW5vQXNzZXRJZAcJAAIBAhFjYW4gdXNlIFVTRE4gb25seQMDCQAAAgULc3Rha2luZ1R5cGUFCE5TQlRUWVBFCQECIT0CBQdhc3NldElkBQtuc2J0QXNzZXRJZAcJAAIBAhFjYW4gdXNlIE5TQlQgb25seQMDCQECIT0CBQtzdGFraW5nVHlwZQUIVVNETlRZUEUJAQIhPQIFC3N0YWtpbmdUeXBlBQhOU0JUVFlQRQcJAAIBCQCsAgICGXVuc3VwcG9ydGVkIHN0YWtpbmcgdHlwZSAFC3N0YWtpbmdUeXBlBQdhc3NldElkAQ5pbnRlcm5hbFVubG9jawQLc3Rha2luZ1R5cGUBaQx1bmxvY2tBbW91bnQMYXNzZXRJZFBhcmFtBAdhY2NvdW50CQClCAEIBQFpBmNhbGxlcgQHYXNzZXRJZAkBGmdldFZhbGlkU3Rha2luZ0Fzc2V0T3JGYWlsAgULc3Rha2luZ1R5cGUJANkEAQUMYXNzZXRJZFBhcmFtBA1hc3NldElkU3RyaW5nCQDYBAEFB2Fzc2V0SWQEB2JhbGFuY2UJAGUCCQEOZ2V0VXNlckJhbGFuY2UCBQdhY2NvdW50BQ1hc3NldElkU3RyaW5nBQx1bmxvY2tBbW91bnQDCQBmAgAABQdiYWxhbmNlCQACAQIOaW52YWxpZCBhbW91bnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWdldENvbnRyYWN0QmFsYW5jZUtleQEFDWFzc2V0SWRTdHJpbmcJAGUCCQESZ2V0Q29udHJhY3RCYWxhbmNlAQUNYXNzZXRJZFN0cmluZwUMdW5sb2NrQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERZ2V0VXNlckJhbGFuY2VLZXkCBQdhY2NvdW50BQ1hc3NldElkU3RyaW5nBQdiYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FjY291bnQFDHVubG9ja0Ftb3VudAUHYXNzZXRJZAUDbmlsBQR1bml0DgFpAQtjb25zdHJ1Y3RvcgMNbWluTG9ja0Ftb3VudBVzdXBwb3J0ZWRSZXdhcmRBc3NldHMOcFN0YWtlZEFzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleU1pbkxvY2tBbW91bnQABQ1taW5Mb2NrQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMABRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVN0YWtlZEFzc2V0SWQABQ5wU3Rha2VkQXNzZXRJZAUDbmlsAWkBBXN0YWtlAAkBC2NvbW1vblN0YWtlAggFAWkGY2FsbGVyBQFpAWkBE3N0YWtlQnlPcmlnaW5DYWxsZXIACQELY29tbW9uU3Rha2UCCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEHdW5zdGFrZQEGYW1vdW50CQENY29tbW9uVW5zdGFrZQIFBmFtb3VudAUBaQFpAQdkZXBvc2l0AAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECH2V4YWN0IDEgcGF5bWVudCBpcyBhbGxvd2VkIG9ubHkEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQELdmFsdWVPckVsc2UCCAUDcG10B2Fzc2V0SWQFB1dBVkVTSUQEDXBtdEFzc2V0SWRTdHIJANgEAQUKcG10QXNzZXRJZAQIcG10TXVsdFgDCQAAAgUKcG10QXNzZXRJZAUHV0FWRVNJRAUGTVVMVFg4BQZNVUxUWDYEB2Ftb3VudFgJALYCAQUGYW1vdW50BAt0b3RhbFN0YWtlZAkBDGdldEludE9yRWxzZQIJARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAQMdG90YWxTdGFrZWRYCQC2AgEFC3RvdGFsU3Rha2VkAwkAZgIAAAULdG90YWxTdGFrZWQJAAIBAhtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgULdG90YWxTdGFrZWQAAAkBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCBQ1wbXRBc3NldElkU3RyBQZhbW91bnQEEHJld2FyZFBlck5zYnRYMTgJALwCAwUHYW1vdW50WAUHTVVMVFgxOAUMdG90YWxTdGFrZWRYBBFkZXBvc2l0TnVtTGFzdEtFWQkBEWtleURlcG9zaXROdW1MYXN0AAQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCBRFkZXBvc2l0TnVtTGFzdEtFWQD///////////8BBA1kZXBvc2l0TnVtTmV3CQBkAgUOZGVwb3NpdE51bUxhc3QAAQMJAQEhAQkBCGNvbnRhaW5zAgUSc3VwcG9ydGVkQXNzZXRzU3RyBQ1wbXRBc3NldElkU3RyCQACAQkArAICCQCsAgIFEnN1cHBvcnRlZEFzc2V0c1N0cgIRIGRvZXNuJ3QgY29udGFpbiAFDXBtdEFzc2V0SWRTdHIKARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFYWNjdW0JbmV4dEFzc2V0BBZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUNZGVwb3NpdE51bU5ldwUJbmV4dEFzc2V0BApzdW1MYXN0U3RyCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQluZXh0QXNzZXQCATAJAM0IAgUFYWNjdW0DCQAAAgUJbmV4dEFzc2V0BQ1wbXRBc3NldElkU3RyCQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQCmAwEJALcCAgkApwMBBQpzdW1MYXN0U3RyBRByZXdhcmRQZXJOc2J0WDE4CQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZBQpzdW1MYXN0U3RyCQDOCAIJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIJAQxJbnRlZ2VyRW50cnkCBRFkZXBvc2l0TnVtTGFzdEtFWQUNZGVwb3NpdE51bU5ldwkBFURlcG9zaXRzVG90YWxzRW50cmllcwIFBmFtb3VudAUNcG10QXNzZXRJZFN0cgFpAQxjbGFpbVJld2FyZHMACQELY29tbW9uQ2xhaW0CCAUBaQZjYWxsZXIFAWkBaQEaY2xhaW1SZXdhcmRzQnlPcmlnaW5DYWxsZXIACQELY29tbW9uQ2xhaW0CCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZAQ51c2VyQWRkcmVzc1N0cgoBFmZvckVhY2hBc3NldFplcm9SZXdhcmQCBWFjY3VtBWFzc2V0CQCsAgIJAKwCAgUFYWNjdW0JALkJAgkAzAgCBQVhc3NldAkAzAgCAgEwCQDMCAICATAFA25pbAIBOgIBXwQSdW5jbGFpbWVkUmV3YXJkU3RyAwkAAAIFDnVzZXJBZGRyZXNzU3RyAgAKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQ51c2VyQWRkcmVzc1N0cgQNJHQwMjI5NjQyMzA3OAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQ51c2VyQWRkcmVzc1N0cgkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDIyOTY0MjMwNzgCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDIyOTY0MjMwNzgCXzIEEnN0YWtpbmdTdGFydEhlaWdodAgFDSR0MDIyOTY0MjMwNzgCXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMjM0MjQyMzU2MgkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAyMzQyNDIzNTYyAl8xBAZjYWNoZWQIBQ0kdDAyMzQyNDIzNTYyAl8yBAdkeW5hbWljCAUNJHQwMjM0MjQyMzU2MgJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDIzNDI0MjM1NjICXzQEB2NsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBCmtleUNsYWltZWQCBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQAAAkArAICCQCsAgIFBWFjY3VtCQC5CQIJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQtyZXdhcmRUb3RhbAkAzAgCCQCkAwEFB2NsYWltZWQFA25pbAIBOgIBXwoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgkAlAoCBQNuaWwJALMCAgUSdW5jbGFpbWVkUmV3YXJkU3RyAAEBaQEWdXNkblN0YWtpbmdTWVNSRUFET05MWQIVdXNlckFkZHJlc3NTdHJPckVtcHR5CHVzZG5EaWZmBBJ1c2RuVG90YWxBbXRTdGFrZWQJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAADCQAAAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBRJ1c2RuVG90YWxBbXRTdGFrZWQJAMwIAgAABQNuaWwEC3VzZXJBZGRyZXNzCQEPdG9BZGRyZXNzT3JGYWlsAQUVdXNlckFkZHJlc3NTdHJPckVtcHR5BAptZXJnZWREYXRhCQEKbWVyZ2VTdGFrZQIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUIdXNkbkRpZmYECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEEHVzZG5TdGFrZWRCeVVzZXIIBQptZXJnZWREYXRhAl8yBBJzdGFraW5nU3RhcnRIZWlnaHQIBQptZXJnZWREYXRhAl8zBA9zdGFrZWRBbW91bnRORVcIBQptZXJnZWREYXRhAl80CQCUCgIFA25pbAkAzAgCBRB1c2RuU3Rha2VkQnlVc2VyCQDMCAIFEnVzZG5Ub3RhbEFtdFN0YWtlZAUDbmlsAWkBEWNvbmZpZ1NZU1JFQURPTkxZAAQKbWluTG9ja0FtdAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBEGtleU1pbkxvY2tBbW91bnQACQCUCgIFA25pbAkAzAgCBQptaW5Mb2NrQW10BQNuaWwBaQEObG9ja05ldXRyaW5vU1ACCHJlY2VpdmVyBXNoYXJlCQELY29tbW9uU3Rha2UCCAUBaQZjYWxsZXIFAWkBaQEMbG9ja05ldXRyaW5vAAkBC2NvbW1vblN0YWtlAggFAWkGY2FsbGVyBQFpAWkBDnVubG9ja05ldXRyaW5vAgx1bmxvY2tBbW91bnQNYXNzZXRJZFN0cmluZwkBDWNvbW1vblVuc3Rha2UCBQx1bmxvY2tBbW91bnQFAWkBaQEKdW5sb2NrTnNidAIMdW5sb2NrQW1vdW50DWFzc2V0SWRTdHJpbmcJAQ5pbnRlcm5hbFVubG9jawQFCE5TQlRUWVBFBQFpBQx1bmxvY2tBbW91bnQFDWFzc2V0SWRTdHJpbmcBAnR4AQZ2ZXJpZnkABBNwdWJLZXlBZG1pbnNMaXN0U3RyCQC5CQIJAMwIAgIsRXh0RUVLMTlubUtqOW1DcG5XeXZFRUpGWUFUTE1jVkVNdm9oaFVIa3lITm0JAMwIAgIsRXY1cHk1RmZCUVg5Y1pwWUtuZlFyVEI0OUJ5ZjhRbXBaV2VEVlJpbTR5VjcJAMwIAgIsRFV1dUxqWHU5OG5Cd1pjN2Zxd0NUanRBM25uUndnVGJrTVNyNVNVMk5tRFIJAMwIAgIsRFV1dUxqWHU5OG5Cd1pjN2Zxd0NUanRBM25uUndnVGJrTVNyNVNVMk5tRFIFA25pbAUDU0VQBBBwdWJLZXlBZG1pbnNMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPY29udHJvbENvbnRyYWN0Agwlc19fbXVsdGlzaWcFE3B1YktleUFkbWluc0xpc3RTdHIFA1NFUAQFY291bnQJAGQCCQBkAgkAZAIDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAAAAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAEAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAgABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwADCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAADAAIAAAkAZwIFBWNvdW50AANlrwdH", "chainId": 84, "height": 2288024, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3jh6dkt1R7KUXxJZ2Dbg82p4DraHUKknmgByigfFUiUR Next: none Diff:
OldNewDifferences
136136 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], SEP)
137137
138138
139-func keyLegacyUserBalance (userAddr,tkn) = makeString(["rpd_balance", tkn, userAddr], SEP)
139+func keyLegacyUserBalance (userAddr,tkn) = makeString(["rpd_balance", tkn, userAddr], "_")
140140
141141
142-func keyLegacyTotalBalance (tkn) = makeString(["rpd_balance", tkn], SEP)
142+func keyLegacyTotalBalance (tkn) = makeString(["rpd_balance", tkn], "_")
143143
144144
145145 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MULTX6 = toBigInt(MULT6)
1111
1212 let MULTX8 = toBigInt(MULT8)
1313
1414 let MULTX18 = toBigInt(1000000000000000000)
1515
1616 let WAVESIDSTR = "WAVES"
1717
1818 let WAVESID = fromBase58String(WAVESIDSTR)
1919
2020 let DAYMILLIS = 86400000
2121
2222 let IdxControlCfgNeutrinoDapp = 1
2323
2424 let IdxControlCfgAuctionDapp = 2
2525
2626 let IdxControlCfgRpdDapp = 3
2727
2828 let IdxControlCfgMathDapp = 4
2929
3030 let IdxControlCfgLiquidationDapp = 5
3131
3232 let IdxControlCfgRestDapp = 6
3333
3434 let IdxControlCfgNodeRegistryDapp = 7
3535
3636 let IdxControlCfgNsbtStakingDapp = 8
3737
3838 let IdxControlCfgMediatorDapp = 9
3939
4040 let IdxControlCfgSurfStakingDapp = 10
4141
4242 let IdxControlCfgGnsbtControllerDapp = 11
4343
4444 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4545
4646
4747 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
4848
4949
5050 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
5151
5252
5353 func keyMinLockAmount () = "%s__minLockAmount"
5454
5555
5656 func keyStakedAssetId () = "%s__stakedAssetId"
5757
5858
5959 func keyControlAddress () = "%s%s__config__controlAddress"
6060
6161
6262 func keyControlCfg () = "%s__controlConfig"
6363
6464
6565 func keySupportedRewardAssets () = "supportedRewardAssets"
6666
6767
6868 func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
6969
7070
7171 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
7272
7373
7474 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
7575
7676 let controlCfg = readControlCfgOrFail(controlContract)
7777
7878 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
7979
8080 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
8181
8282 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
8383
8484 let stakedAssetIdStr = getStringOrFail(this, keyStakedAssetId())
8585
8686 let stakedAssetId = fromBase58String(stakedAssetIdStr)
8787
8888 let minLockAmount = getIntOrFail(keyMinLockAmount())
8989
9090 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
9191
9292 let supportedAssetsList = split(supportedAssetsStr, "_")
9393
9494 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
9595
9696
9797 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
9898
9999
100100 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, userAddress, toBase58String(txId)], SEP)
101101
102102
103103 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], SEP)
104104
105105
106106 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], SEP)
107107
108108
109109 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], SEP)
110110
111111
112112 func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], SEP)
113113
114114
115115 func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], SEP)
116116
117117
118118 func keyNextPeriod () = "%s__nextPeriod"
119119
120120
121121 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], SEP)
122122
123123
124124 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], SEP)
125125
126126
127127 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], SEP)
128128
129129
130130 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], SEP)
131131
132132
133133 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], SEP)
134134
135135
136136 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], SEP)
137137
138138
139-func keyLegacyUserBalance (userAddr,tkn) = makeString(["rpd_balance", tkn, userAddr], SEP)
139+func keyLegacyUserBalance (userAddr,tkn) = makeString(["rpd_balance", tkn, userAddr], "_")
140140
141141
142-func keyLegacyTotalBalance (tkn) = makeString(["rpd_balance", tkn], SEP)
142+func keyLegacyTotalBalance (tkn) = makeString(["rpd_balance", tkn], "_")
143143
144144
145145 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
146146
147147
148148 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
149149
150150
151151 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
152152
153153
154154 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
155155
156156
157157 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
158158 then unit
159159 else fromBase58String(assetStr)
160160
161161
162162 func asInt (val) = match val {
163163 case valInt: Int =>
164164 valInt
165165 case _ =>
166166 throw("fail to cast into Int")
167167 }
168168
169169
170170 func asSwapParamsSTRUCT (v) = match v {
171171 case struct: (Int, Int, Int, Int, Int, Int, Int) =>
172172 struct
173173 case _ =>
174174 throw("fail to cast into Int")
175175 }
176176
177177
178178 func formatHistoryRecord (userAddress,oldAmount,newAmount) = makeString(["%s%d%d%d%d", userAddress, toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(newAmount)], SEP)
179179
180180
181181 func formatClaimHistoryRecord (userAddress,claimedRewards) = makeString(["%s%d%d%s", userAddress, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], SEP)
182182
183183
184184 func HistoryRecordEntry (type,userAddress,txId,oldAmount,newAmount) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(userAddress, oldAmount, newAmount))
185185
186186
187187 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(userAddress, claimedRewards))
188188
189189
190190 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
191191 let locksCount = getIntOrZero(keyStatsLocksCount())
192192 let usersCount = getIntOrZero(keyStatsUsersCount())
193193 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
194194 let totalAmountNew = (totalAmount + totalLockedInc)
195195 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew), IntegerEntry(keyLegacyTotalBalance(stakedAssetIdStr), totalAmountNew)], totalAmount, totalAmountNew)
196196 }
197197
198198
199199 func LockParamsEntry (userAddress,amount,stakingStartHeight) = [IntegerEntry(keyLegacyUserBalance(userAddress, stakedAssetIdStr), amount), IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), stakingStartHeight)]
200200
201201
202202 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
203203
204204
205205 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
206206
207207
208208 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
209209 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
210210 else unit
211211
212212
213213 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + userAddress) + " is not defined"))
214214
215215
216216 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
217217 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
218218 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
219219 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
220220 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
221221 let rewardCachedPartKEY = keyReward(userAddress, assetId)
222222 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
223223 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
224224 }
225225
226226
227227 func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
228228
229229
230230 func findElementPosition (src,element,sep) = {
231231 let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
232232 if ((elementStart == 0))
233233 then 0
234234 else {
235235 let left = take(src, elementStart)
236236 (size(split(left, sep)) - 1)
237237 }
238238 }
239239
240240
241241 let DepositTotalsPREFIX = "%d%d"
242242
243243 func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
244244 let currArr = split(currVal, SEP)
245245 func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
246246 then currArr[idx]
247247 else toString((parseIntValue(currArr[idx]) + deltaAmt))
248248
249249 makeString([DepositTotalsPREFIX, updDepTotByIdx(1), updDepTotByIdx(2)], SEP)
250250 }
251251
252252
253253 func DepositsTotalsEntries (depositAmount,assetIdStr) = {
254254 let startOfDay = toStartOfDay(lastBlock.timestamp)
255255 let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
256256 let totalsKEY = keyStatsDepositAmtTotals()
257257 let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
258258 let defaultDATA = (DepositTotalsPREFIX + "__0__0")
259259 let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
260260 let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
261261 [StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
262262 }
263263
264264
265265 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
266266 let stakedAmountX = toBigInt(stakedAmount)
267267 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
268268 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
269269 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
270270 func forEachAssetCacheUserReward (accum,asset) = {
271271 let $t01061710752 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
272272 let rewardTotal = $t01061710752._1
273273 let cached = $t01061710752._2
274274 let dynamic = $t01061710752._3
275275 let rewardCachedPartKEY = $t01061710752._4
276276 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
277277 }
278278
279279 if (if ((depositNumLast == -1))
280280 then (depositNumUser == -1)
281281 else false)
282282 then nil
283283 else if (if ((depositNumLast == -1))
284284 then (depositNumUser > -1)
285285 else false)
286286 then throw("invalid depositNumLast and depositNumUser state")
287287 else if (if ((depositNumLast > -1))
288288 then (depositNumUser >= -1)
289289 else false)
290290 then if (isNewUser)
291291 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
292292 else ({
293293 let $l = supportedAssetsList
294294 let $s = size($l)
295295 let $acc0 = nil
296296 func $f0_1 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else forEachAssetCacheUserReward($a, $l[$i])
299299
300300 func $f0_2 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else throw("List size exceeds 2")
303303
304304 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
305305 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
306306 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
307307 }
308308
309309
310310 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
311311 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
312312 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
313313 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
314314 }
315315
316316
317317 func mergeStake (userAddress,amountToAdd) = {
318318 let $t01357613692 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, height))
319319 let isNewUser = $t01357613692._1
320320 let stakedAmount = $t01357613692._2
321321 let stakingStartHeight = $t01357613692._3
322322 let stakedAmountNEW = if (isNewUser)
323323 then amountToAdd
324324 else (amountToAdd + stakedAmount)
325325 $Tuple4(isNewUser, stakedAmount, stakingStartHeight, stakedAmountNEW)
326326 }
327327
328328
329329 func commonStake (userAddress,i) = if ((size(i.payments) != 1))
330330 then throw("Invalid payments size")
331331 else {
332332 let payment = i.payments[0]
333333 let amount = payment.amount
334334 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
335335 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
336336 if ((assetId != stakedAssetId))
337337 then throw(invalidAssetMessage)
338338 else {
339339 let userAddressStr = toString(userAddress)
340340 let mergedData = mergeStake(userAddressStr, amount)
341341 let isNewUser = mergedData._1
342342 let stakedAmount = mergedData._2
343343 let stakingStartHeight = mergedData._3
344344 let stakedAmountNEW = mergedData._4
345345 if ((minLockAmount > stakedAmountNEW))
346346 then throw(("Min lock amount is " + toString(minLockAmount)))
347347 else {
348348 let $t01466514767 = StatsResult(amount, 1, if (isNewUser)
349349 then 1
350350 else 0)
351351 let statsEntries = $t01466514767._1
352352 let totalStaked = $t01466514767._2
353353 let totalStakedNew = $t01466514767._3
354354 ((([HistoryRecordEntry("stake", userAddressStr, i.transactionId, stakedAmount, stakedAmountNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddressStr, stakedAmountNEW, stakingStartHeight)) ++ statsEntries)
355355 }
356356 }
357357 }
358358
359359
360360 func commonUnstake (amount,i) = if ((size(i.payments) != 0))
361361 then throw("unstake doesn't require any payment")
362362 else {
363363 let userAddress = i.caller
364364 let userAddressStr = toString(userAddress)
365365 let $t01524215330 = getUserParamsOrFail(userAddressStr)
366366 let isNewUser = $t01524215330._1
367367 let stakedAmount = $t01524215330._2
368368 let stakingStartHeight = $t01524215330._3
369369 let swapParamsSTRUCT = asSwapParamsSTRUCT(reentrantInvoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStr, 0], nil))
370370 let swapLimitSpentInUsdn = swapParamsSTRUCT._2
371371 let blcks2LmtReset = swapParamsSTRUCT._3
372372 if ((swapLimitSpentInUsdn > 0))
373373 then throw((("You have already made a swap operation. Wait " + toString((height + blcks2LmtReset))) + " height to unstake"))
374374 else if ((0 >= stakedAmount))
375375 then throw("Nothing to unstake")
376376 else if ((amount > stakedAmount))
377377 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
378378 else {
379379 let stakedAmountNEW = (stakedAmount - amount)
380380 let $t01596816126 = StatsResult(-(amount), if ((amount == stakedAmount))
381381 then -1
382382 else 0, if ((amount == stakedAmount))
383383 then -1
384384 else 0)
385385 let statsEntries = $t01596816126._1
386386 let totalStaked = $t01596816126._2
387387 let totalStakedNew = $t01596816126._3
388388 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddressStr, i.transactionId, stakedAmount, stakedAmountNEW)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddressStr, stakedAmountNEW, stakingStartHeight)) ++ statsEntries)
389389 }
390390 }
391391
392392
393393 func commonClaim (userAddress,i) = {
394394 let userAddressStr = toString(userAddress)
395395 if ((size(i.payments) > 0))
396396 then throw("payments are not accepted")
397397 else {
398398 let $t01662216730 = valueOrElse(getUserParamsOrUnit(userAddressStr), $Tuple3(true, 0, 0))
399399 let isNewUser = $t01662216730._1
400400 let stakedAmount = $t01662216730._2
401401 let stakingStart = $t01662216730._3
402402 let stakedAmountX = toBigInt(stakedAmount)
403403 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
404404 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
405405 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
406406 func forEachAssetCalcUnclaimedReward (accum,asset) = {
407407 let $t01710117239 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
408408 let rewardTotal = $t01710117239._1
409409 let cached = $t01710117239._2
410410 let dynamic = $t01710117239._3
411411 let rewardCachedPartKEY = $t01710117239._4
412412 let claimedKEY = keyClaimed(userAddressStr, asset)
413413 let $t01729917336 = accum
414414 let data = $t01729917336._1
415415 let claimedAmtByAsset = $t01729917336._2
416416 let newPart = makeString([asset, toString(rewardTotal)], ":")
417417 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
418418 if ((0 >= rewardTotal))
419419 then $Tuple2(data, claimedAmtByAssetNew)
420420 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
421421 }
422422
423423 let $t01779617909 = {
424424 let $l = supportedAssetsList
425425 let $s = size($l)
426426 let $acc0 = $Tuple2(nil, "")
427427 func $f0_1 ($a,$i) = if (($i >= $s))
428428 then $a
429429 else forEachAssetCalcUnclaimedReward($a, $l[$i])
430430
431431 func $f0_2 ($a,$i) = if (($i >= $s))
432432 then $a
433433 else throw("List size exceeds 2")
434434
435435 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
436436 }
437437 let transfers = $t01779617909._1
438438 let claimedAmtByAssetResult = $t01779617909._2
439439 if ((0 >= size(transfers)))
440440 then $Tuple2(nil, 0)
441441 else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddressStr, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
442442 }
443443 }
444444
445445
446446 let USDNTYPE = "USDN"
447447
448448 let NSBTTYPE = "NSBT"
449449
450450 let NeutrinoAssetIdKey = "neutrino_asset_id"
451451
452452 let NeutrinoContractKey = "neutrino_contract"
453453
454454 let NsbtAssetIdKey = "bond_asset_id"
455455
456456 let BalanceKey = "rpd_balance"
457457
458458 let neutrinoAssetId = fromBase58String(getStringOrFail(neutrinoContract, NeutrinoAssetIdKey))
459459
460460 let nsbtAssetIdStr = getStringOrFail(neutrinoContract, NsbtAssetIdKey)
461461
462462 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
463463
464464 func getUserBalanceKey (owner,assetId) = makeString([BalanceKey, assetId, owner], "_")
465465
466466
467467 func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId)
468468
469469
470470 func getContractBalance (assetId) = getIntOrElse(getContractBalanceKey(assetId), 0)
471471
472472
473473 func getUserBalance (owner,assetId) = getIntOrElse(getUserBalanceKey(owner, assetId), 0)
474474
475475
476476 func getValidStakingAssetOrFail (stakingType,assetId) = if (if ((stakingType == USDNTYPE))
477477 then (assetId != neutrinoAssetId)
478478 else false)
479479 then throw("can use USDN only")
480480 else if (if ((stakingType == NSBTTYPE))
481481 then (assetId != nsbtAssetId)
482482 else false)
483483 then throw("can use NSBT only")
484484 else if (if ((stakingType != USDNTYPE))
485485 then (stakingType != NSBTTYPE)
486486 else false)
487487 then throw(("unsupported staking type " + stakingType))
488488 else assetId
489489
490490
491491 func internalUnlock (stakingType,i,unlockAmount,assetIdParam) = {
492492 let account = toString(i.caller)
493493 let assetId = getValidStakingAssetOrFail(stakingType, fromBase58String(assetIdParam))
494494 let assetIdString = toBase58String(assetId)
495495 let balance = (getUserBalance(account, assetIdString) - unlockAmount)
496496 if ((0 > balance))
497497 then throw("invalid amount")
498498 else $Tuple2([IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, assetId)], unit)
499499 }
500500
501501
502502 @Callable(i)
503503 func constructor (minLockAmount,supportedRewardAssets,pStakedAssetId) = if ((i.caller != this))
504504 then throw("Permission denied")
505505 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), pStakedAssetId)]
506506
507507
508508
509509 @Callable(i)
510510 func stake () = commonStake(i.caller, i)
511511
512512
513513
514514 @Callable(i)
515515 func stakeByOriginCaller () = commonStake(i.originCaller, i)
516516
517517
518518
519519 @Callable(i)
520520 func unstake (amount) = commonUnstake(amount, i)
521521
522522
523523
524524 @Callable(i)
525525 func deposit () = if ((size(i.payments) != 1))
526526 then throw("exact 1 payment is allowed only")
527527 else {
528528 let pmt = i.payments[0]
529529 let amount = pmt.amount
530530 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
531531 let pmtAssetIdStr = toBase58String(pmtAssetId)
532532 let pmtMultX = if ((pmtAssetId == WAVESID))
533533 then MULTX8
534534 else MULTX6
535535 let amountX = toBigInt(amount)
536536 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
537537 let totalStakedX = toBigInt(totalStaked)
538538 if ((0 > totalStaked))
539539 then throw("TODO: case is not supported")
540540 else if ((totalStaked == 0))
541541 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
542542 else {
543543 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
544544 let depositNumLastKEY = keyDepositNumLast()
545545 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
546546 let depositNumNew = (depositNumLast + 1)
547547 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
548548 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
549549 else {
550550 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
551551 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
552552 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
553553 (accum :+ (if ((nextAsset == pmtAssetIdStr))
554554 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
555555 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
556556 }
557557
558558 (({
559559 let $l = supportedAssetsList
560560 let $s = size($l)
561561 let $acc0 = nil
562562 func $f0_1 ($a,$i) = if (($i >= $s))
563563 then $a
564564 else refreshRewardPerNsbtSUM($a, $l[$i])
565565
566566 func $f0_2 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else throw("List size exceeds 2")
569569
570570 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
571571 } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
572572 }
573573 }
574574 }
575575
576576
577577
578578 @Callable(i)
579579 func claimRewards () = commonClaim(i.caller, i)
580580
581581
582582
583583 @Callable(i)
584584 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
585585
586586
587587
588588 @Callable(i)
589589 func unclaimedRewardsREADONLY (userAddressStr) = {
590590 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
591591
592592 let unclaimedRewardStr = if ((userAddressStr == ""))
593593 then {
594594 let $l = supportedAssetsList
595595 let $s = size($l)
596596 let $acc0 = ""
597597 func $f0_1 ($a,$i) = if (($i >= $s))
598598 then $a
599599 else forEachAssetZeroReward($a, $l[$i])
600600
601601 func $f0_2 ($a,$i) = if (($i >= $s))
602602 then $a
603603 else throw("List size exceeds 2")
604604
605605 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
606606 }
607607 else {
608608 let userAddress = addressFromStringValue(userAddressStr)
609609 let $t02296423078 = valueOrElse(getUserParamsOrUnit(userAddressStr), $Tuple3(true, 0, 0))
610610 let isNewUser = $t02296423078._1
611611 let stakedAmount = $t02296423078._2
612612 let stakingStartHeight = $t02296423078._3
613613 let stakedAmountX = toBigInt(stakedAmount)
614614 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
615615 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
616616 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
617617 func forEachAssetCalcUnclaimedReward (accum,asset) = {
618618 let $t02342423562 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
619619 let rewardTotal = $t02342423562._1
620620 let cached = $t02342423562._2
621621 let dynamic = $t02342423562._3
622622 let rewardCachedPartKEY = $t02342423562._4
623623 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
624624 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
625625 }
626626
627627 let $l = supportedAssetsList
628628 let $s = size($l)
629629 let $acc0 = ""
630630 func $f0_1 ($a,$i) = if (($i >= $s))
631631 then $a
632632 else forEachAssetCalcUnclaimedReward($a, $l[$i])
633633
634634 func $f0_2 ($a,$i) = if (($i >= $s))
635635 then $a
636636 else throw("List size exceeds 2")
637637
638638 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
639639 }
640640 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
641641 }
642642
643643
644644
645645 @Callable(i)
646646 func usdnStakingSYSREADONLY (userAddressStrOrEmpty,usdnDiff) = {
647647 let usdnTotalAmtStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
648648 if ((userAddressStrOrEmpty == ""))
649649 then $Tuple2(nil, [0, usdnTotalAmtStaked, 0])
650650 else {
651651 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
652652 let mergedData = mergeStake(userAddressStrOrEmpty, usdnDiff)
653653 let isNewUser = mergedData._1
654654 let usdnStakedByUser = mergedData._2
655655 let stakingStartHeight = mergedData._3
656656 let stakedAmountNEW = mergedData._4
657657 $Tuple2(nil, [usdnStakedByUser, usdnTotalAmtStaked])
658658 }
659659 }
660660
661661
662662
663663 @Callable(i)
664664 func configSYSREADONLY () = {
665665 let minLockAmt = getIntegerValue(keyMinLockAmount())
666666 $Tuple2(nil, [minLockAmt])
667667 }
668668
669669
670670
671671 @Callable(i)
672672 func lockNeutrinoSP (receiver,share) = commonStake(i.caller, i)
673673
674674
675675
676676 @Callable(i)
677677 func lockNeutrino () = commonStake(i.caller, i)
678678
679679
680680
681681 @Callable(i)
682682 func unlockNeutrino (unlockAmount,assetIdString) = commonUnstake(unlockAmount, i)
683683
684684
685685
686686 @Callable(i)
687687 func unlockNsbt (unlockAmount,assetIdString) = internalUnlock(NSBTTYPE, i, unlockAmount, assetIdString)
688688
689689
690690 @Verifier(tx)
691691 func verify () = {
692692 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
693693 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
694694 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
695695 then 1
696696 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
697697 then 1
698698 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
699699 then 1
700700 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
701701 then 2
702702 else 0))
703703 (count >= 3)
704704 }
705705

github/deemru/w8io/3ef1775 
97.15 ms