2023.03.02 15:39 [3537923] smart account 3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ > SELF 0.00000000 Waves

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

github/deemru/w8io/786bc32 
84.01 ms