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

{ "type": 13, "id": "9yih3rZcBbGQbMxApQAsRBqMLU2sBpaJKcjFypPUfaHY", "fee": 2600000, "feeAssetId": null, "timestamp": 1677760894878, "version": 1, "sender": "3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3", "senderPublicKey": "6uKJV5r5qjqG9uVK4Q24W7zG5KZtGtKXz3NWRMwfZbB7", "proofs": [ "", "34qU2oJcVjWMV2yKdZtR9NarrejmUDYeYveG9W1a1CLPqAEiw6VrEX8fH992rbvJvV8o5sST5h2Ls6zertSufKsM", "", "3yMXBcQf1WwzreZrDdJDNb2bPdxHho8yWdRUM5djCRBsGiuUdzTFnkWuc4oCw9H9o5ygAS3HE4o75F8GBcvs5jTM" ], "script": "base64:BgIpCAISBwoFCAgBAQgSABIDCgEBEgASABIAEgMKAQgSBAoCCAESBAoCCAFSAAtyZXZpc2lvbk51bQIoNDZkZGY5YWQ0ZjRhNjdhNzlkODcyZjdjNTY3MWFhMDEyOTUzYTM0YgAJc2VwYXJhdG9yAgJfXwADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUWDYJALYCAQUFTVVMVDYABk1VTFRYOAkAtgIBBQVNVUxUOAAHTVVMVFgxOAkAtgIBAICAkLu61q3wDQAKV0FWRVNJRFNUUgIFV0FWRVMAB1dBVkVTSUQJANkEAQUKV0FWRVNJRFNUUgAJREFZTUlMTElTAIC4mSkAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwAA0BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQdhZGRyZXNzAgEuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzUDVCZmQ1OFBQZk52Qk0ySHk4UWZiY0RxTWVOdHpnN0tmUAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAC2dvdkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwAQxrZXlCb25kQXNzZXQAAg1ib25kX2Fzc2V0X2lkARdrZXlVc2VyR25zYnRSZWxlYXNlVGltZQEIdXNlckFkZHIJAKwCAgIbJXMlc191c2VyR25zYnRSZWxlYXNlVGltZV9fBQh1c2VyQWRkcgEaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAhslc19fbmV1dHJpbm9Db250cmFjdEFkZHJlc3MBFmtleU1hdGhDb250cmFjdEFkZHJlc3MAAhAlc19fbWF0aENvbnRyYWN0ARBrZXlNaW5Mb2NrQW1vdW50AAIRJXNfX21pbkxvY2tBbW91bnQBC2tleUhhbGZMaWZlAAIMJXNfX2hhbGZMaWZlARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICBmFtb3VudAUDbmlsBQlzZXBhcmF0b3IBFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUJc2VwYXJhdG9yARBrZXlIaXN0b3J5UmVjb3JkAwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUJc2VwYXJhdG9yARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEWFjdGl2ZVRvdGFsTG9ja2VkBQNuaWwFCXNlcGFyYXRvcgESa2V5U3RhdHNMb2Nrc0NvdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIKbG9ja3NDb3VudAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzVXNlcnNDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEGFjdGl2ZVVzZXJzQ291bnQFA25pbAUJc2VwYXJhdG9yARdrZXlTdGF0c0RlcG9zaXRBbXRCeURheQEJdGltZXN0YW1wCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICBXN0YXRzCQDMCAICD2RlcG9zaXRBbXRCeURheQkAzAgCCQCkAwEFCXRpbWVzdGFtcAUDbmlsBQlzZXBhcmF0b3IBGGtleVN0YXRzRGVwb3NpdEFtdFRvdGFscwAJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIFc3RhdHMJAMwIAgIQZGVwb3NpdEFtdFRvdGFscwUDbmlsBQlzZXBhcmF0b3IBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAIVc3VwcG9ydGVkUmV3YXJkQXNzZXRzARFrZXlEZXBvc2l0TnVtTGFzdAAJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDZGVwCQDMCAICB2xhc3ROdW0FA25pbAUJc2VwYXJhdG9yARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVzZXJSd2RGcm9tRGVwTnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgpkZXBvc2l0TnVtA3RrbgkAuQkCCQDMCAICBCVzJWQJAMwIAgIVcndkUGVyTnNidFN1bUJ5RGVwTnVtCQDMCAIJAKQDAQUKZGVwb3NpdE51bQkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQlrZXlSZXdhcmQCC3VzZXJBZGRyZXNzA3RrbgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNyd2QJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUDdGtuBQNuaWwFCXNlcGFyYXRvcgEKa2V5Q2xhaW1lZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA2NsbQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yARdrZXlOb3REaXN0cmlidXRlZFJld2FyZAEDdGtuCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg5ub3REaXN0cmlidXRlZAkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQV0b1gxOAIHb3JpZ1ZhbAhvcmlnTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFB01VTFRYMTgFCG9yaWdNdWx0AQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEMZ2V0SW50T3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBDGdldEludE9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPTWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEMZ2V0U3RyT3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBD3RvQWRkcmVzc09yRmFpbAEKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFCmFkZHJlc3NTdHIJAKwCAgIhY291bGRuJ3QgcGFyc2UgcGFzc2VkIGFkZHJlc3NTdHI9BQphZGRyZXNzU3RyAQt0b0Fzc2V0VmVjdAEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHIFCldBVkVTSURTVFIFBHVuaXQJANkEAQUIYXNzZXRTdHIBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARNmb3JtYXRIaXN0b3J5UmVjb3JkBAlvbGRBbW91bnQIb2xkU3RhcnQJbmV3QW1vdW50CG5ld1N0YXJ0CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFCW9sZEFtb3VudAkAzAgCCQCkAwEFCG9sZFN0YXJ0CQDMCAIJAKQDAQUJbmV3QW1vdW50CQDMCAIJAKQDAQUIbmV3U3RhcnQFA25pbAUJc2VwYXJhdG9yARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCBHVzZXIOY2xhaW1lZFJld2FyZHMJALkJAgkAzAgCAgglcyVkJWQlcwkAzAgCBQR1c2VyCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCBQ5jbGFpbWVkUmV3YXJkcwUDbmlsBQlzZXBhcmF0b3IBEkhpc3RvcnlSZWNvcmRFbnRyeQcEdHlwZQt1c2VyQWRkcmVzcwR0eElkCW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwUEdHlwZQULdXNlckFkZHJlc3MFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkBAUJb2xkQW1vdW50BQhvbGRTdGFydAUJbmV3QW1vdW50BQhuZXdTdGFydAERQ2xhaW1IaXN0b3J5RW50cnkDC3VzZXJBZGRyZXNzBHR4SWQOY2xhaW1lZFJld2FyZHMJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwIFY2xhaW0FC3VzZXJBZGRyZXNzBQR0eElkCQEYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAgkApQgBBQt1c2VyQWRkcmVzcwUOY2xhaW1lZFJld2FyZHMBC1N0YXRzUmVzdWx0Aw50b3RhbExvY2tlZEluYwxsb2NrQ291bnRJbmMNdXNlcnNDb3VudEluYwQKbG9ja3NDb3VudAkBDGdldEludE9yWmVybwEJARJrZXlTdGF0c0xvY2tzQ291bnQABAp1c2Vyc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzVXNlcnNDb3VudAAEC3RvdGFsQW1vdW50CQEMZ2V0SW50T3JaZXJvAQkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAQOdG90YWxBbW91bnROZXcJAGQCBQt0b3RhbEFtb3VudAUOdG90YWxMb2NrZWRJbmMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzTG9ja3NDb3VudAAJAGQCBQpsb2Nrc0NvdW50BQxsb2NrQ291bnRJbmMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlTdGF0c1VzZXJzQ291bnQACQBkAgUKdXNlcnNDb3VudAUNdXNlcnNDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAUOdG90YWxBbW91bnROZXcFA25pbAULdG90YWxBbW91bnQFDnRvdGFsQW1vdW50TmV3AQ9Mb2NrUGFyYW1zRW50cnkDC3VzZXJBZGRyZXNzBmFtb3VudAVzdGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBBQt1c2VyQWRkcmVzcwUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQVzdGFydAUDbmlsAQ9nZXRQYXJhbXNPckZhaWwACQCVCgMJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDGtleUJvbmRBc3NldAAJAQxnZXRJbnRPckZhaWwBCQEQa2V5TWluTG9ja0Ftb3VudAAJAQxnZXRJbnRPckZhaWwBCQELa2V5SGFsZkxpZmUAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQEMdG9TdGFydE9mRGF5AQl0aW1lc3RhbXAJAGgCCQBpAgUJdGltZXN0YW1wBQlEQVlNSUxMSVMFCURBWU1JTExJUwETZmluZEVsZW1lbnRQb3NpdGlvbgMDc3JjB2VsZW1lbnQDc2VwBAxlbGVtZW50U3RhcnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAswkCBQNzcmMFB2VsZW1lbnQJAKwCAgkArAICCQCsAgICFnRoZXJlIGlzIG5vIHN1YnN0cmluZyAFB2VsZW1lbnQCBCBpbiAFA3NyYwMJAAACBQxlbGVtZW50U3RhcnQAAAAABARsZWZ0CQCvAgIFA3NyYwUMZWxlbWVudFN0YXJ0CQBlAgkAkAMBCQC1CQIFBGxlZnQFA3NlcAABABNEZXBvc2l0VG90YWxzUFJFRklYAiQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQAEWRlZmF1bHRUb3RhbHNEQVRBCQCsAgIFE0RlcG9zaXRUb3RhbHNQUkVGSVgCNl9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMAENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQECyR0MDk1NjE5Njk2CQEKY2FsY1Jld2FyZAUFC3VzZXJBZGRyZXNzBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFCyR0MDk1NjE5Njk2Al8xBAZjYWNoZWQIBQskdDA5NTYxOTY5NgJfMgQHZHluYW1pYwgFCyR0MDk1NjE5Njk2Al8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAULJHQwOTU2MTk2OTYCXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkBDEludGVnZXJFbnRyeQIFF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQBkAgUUbm90RGlzdHJpYnV0ZWRSZXdhcmQFCWFtb3VudEluYwELY29tbW9uQ2xhaW0CC3VzZXJBZGRyZXNzAWkEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECGXBheW1lbnRzIGFyZSBub3QgYWNjZXB0ZWQEDSR0MDEyNjM3MTI3NDIJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxMjYzNzEyNzQyAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxMjYzNzEyNzQyAl8yBAxzdGFraW5nU3RhcnQIBQ0kdDAxMjYzNzEyNzQyAl8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDEzMTEzMTMyNTEJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTMxMTMxMzI1MQJfMQQGY2FjaGVkCAUNJHQwMTMxMTMxMzI1MQJfMgQHZHluYW1pYwgFDSR0MDEzMTEzMTMyNTECXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxMzExMzEzMjUxAl80BApjbGFpbWVkS0VZCQEKa2V5Q2xhaW1lZAIFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAQNJHQwMTMzMTExMzM0OAUFYWNjdW0EBGRhdGEIBQ0kdDAxMzMxMTEzMzQ4Al8xBBFjbGFpbWVkQW10QnlBc3NldAgFDSR0MDEzMzExMTMzNDgCXzIEB25ld1BhcnQJALkJAgkAzAgCBQVhc3NldAkAzAgCCQCkAwEFC3Jld2FyZFRvdGFsBQNuaWwCAToEFGNsYWltZWRBbXRCeUFzc2V0TmV3CQC5CQIJAMwIAgURY2xhaW1lZEFtdEJ5QXNzZXQJAMwIAgUHbmV3UGFydAUDbmlsAgFfAwkAZwIAAAULcmV3YXJkVG90YWwJAJQKAgUEZGF0YQUUY2xhaW1lZEFtdEJ5QXNzZXROZXcJAJQKAgkAzQgCCQDNCAIJAM0IAgUEZGF0YQkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFC3Jld2FyZFRvdGFsCQELdG9Bc3NldFZlY3QBBQVhc3NldAkBDEludGVnZXJFbnRyeQIFCmNsYWltZWRLRVkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCmNsYWltZWRLRVkAAAULcmV3YXJkVG90YWwJAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAFFGNsYWltZWRBbXRCeUFzc2V0TmV3BA0kdDAxMzgwODEzOTIxCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAl0cmFuc2ZlcnMIBQ0kdDAxMzgwODEzOTIxAl8xBBdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAgFDSR0MDEzODA4MTM5MjECXzIDCQBnAgAACQCQAwEFCXRyYW5zZmVycwkAlAoCBQNuaWwAAAkAlAoCCQDNCAIJAM0IAgUJdHJhbnNmZXJzCQEMSW50ZWdlckVudHJ5AgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQ5kZXBvc2l0TnVtTGFzdAkBEUNsYWltSGlzdG9yeUVudHJ5AwULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJALACAgUXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQAAQkAkAMBBQl0cmFuc2ZlcnMJAWkBDWNvbnN0cnVjdG9yVjEFF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzE21hdGhDb250cmFjdEFkZHJlc3MNbWluTG9ja0Ftb3VudAhoYWxmTGlmZRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MABRduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5TWF0aENvbnRyYWN0QWRkcmVzcwAFE21hdGhDb250cmFjdEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlNaW5Mb2NrQW1vdW50AAUNbWluTG9ja0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBC2tleUhhbGZMaWZlAAUIaGFsZkxpZmUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAFFXN1cHBvcnRlZFJld2FyZEFzc2V0cwUDbmlsAWkBBXN0YWtlAAQNJHQwMTQ3NzIxNDgzNAkBD2dldFBhcmFtc09yRmFpbAAEC2JvbmRBc3NldElkCAUNJHQwMTQ3NzIxNDgzNAJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDE0NzcyMTQ4MzQCXzIECGhhbGZMaWZlCAUNJHQwMTQ3NzIxNDgzNAJfMwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFUludmFsaWQgcGF5bWVudHMgc2l6ZQQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQTaW52YWxpZEFzc2V0TWVzc2FnZQkArAICCQCsAgICD0ludmFsaWQgYXNzZXQuIAkA2AQBBQtib25kQXNzZXRJZAIMIGlzIGV4cGVjdGVkBAdhc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQdwYXltZW50B2Fzc2V0SWQFE2ludmFsaWRBc3NldE1lc3NhZ2UDCQECIT0CBQdhc3NldElkBQtib25kQXNzZXRJZAkAAgEFE2ludmFsaWRBc3NldE1lc3NhZ2UEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEDnVzZXJBZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQNJHQwMTUzNzYxNTQ4MwkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAP///////////wEECWlzTmV3VXNlcggFDSR0MDE1Mzc2MTU0ODMCXzEECmxvY2tBbW91bnQIBQ0kdDAxNTM3NjE1NDgzAl8yBA9sb2NrU3RhcnRIZWlnaHQIBQ0kdDAxNTM3NjE1NDgzAl8zBAxtZXJnZWRBbW91bnQDBQlpc05ld1VzZXIFBmFtb3VudAkAZAIFBmFtb3VudAUKbG9ja0Ftb3VudAQRbWVyZ2VkU3RhcnRIZWlnaHQDBQlpc05ld1VzZXIFBmhlaWdodAkBBWFzSW50AQkA/AcEBQxtYXRoQ29udHJhY3QCE21lcmdlU3Rha2VzUkVBRE9OTFkJAMwIAgUGYW1vdW50CQDMCAIFBmhlaWdodAkAzAgCBQpsb2NrQW1vdW50CQDMCAIFD2xvY2tTdGFydEhlaWdodAkAzAgCBQhoYWxmTGlmZQUDbmlsBQNuaWwDCQBmAgUNbWluTG9ja0Ftb3VudAUMbWVyZ2VkQW1vdW50CQACAQkArAICAhNNaW4gbG9jayBhbW91bnQgaXMgCQCkAwEFDW1pbkxvY2tBbW91bnQEDSR0MDE1ODQ0MTU5NDYJAQtTdGF0c1Jlc3VsdAMFBmFtb3VudAABAwUJaXNOZXdVc2VyAAEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTU4NDQxNTk0NgJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxNTg0NDE1OTQ2Al8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDE1ODQ0MTU5NDYCXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUKbG9ja0Ftb3VudAUPbG9ja1N0YXJ0SGVpZ2h0BQxtZXJnZWRBbW91bnQFEW1lcmdlZFN0YXJ0SGVpZ2h0BQNuaWwJAQ1SZXdhcmRFbnRyaWVzAwUJaXNOZXdVc2VyBQ51c2VyQWRkcmVzc1N0cgUKbG9ja0Ftb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFC3VzZXJBZGRyZXNzBQxtZXJnZWRBbW91bnQFEW1lcmdlZFN0YXJ0SGVpZ2h0BQxzdGF0c0VudHJpZXMBaQEHdW5zdGFrZQEGYW1vdW50AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIjdW5zdGFrZSBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnQEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBA0kdDAxNjQzMjE2NDk0CQEPZ2V0UGFyYW1zT3JGYWlsAAQLYm9uZEFzc2V0SWQIBQ0kdDAxNjQzMjE2NDk0Al8xBA1taW5Mb2NrQW1vdW50CAUNJHQwMTY0MzIxNjQ5NAJfMgQIaGFsZkxpZmUIBQ0kdDAxNjQzMjE2NDk0Al8zBA0kdDAxNjQ5NzE2NTcxCQETZ2V0VXNlclBhcmFtc09yRmFpbAEFC3VzZXJBZGRyZXNzBAlpc05ld1VzZXIIBQ0kdDAxNjQ5NzE2NTcxAl8xBApsb2NrQW1vdW50CAUNJHQwMTY0OTcxNjU3MQJfMgQJbG9ja1N0YXJ0CAUNJHQwMTY0OTcxNjU3MQJfMwMJAGcCAAAFCmxvY2tBbW91bnQJAAIBAhJOb3RoaW5nIHRvIHVuc3Rha2UDCQBmAgUGYW1vdW50BQpsb2NrQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIKUmVxdWVzdGVkIAkApAMBBQZhbW91bnQCEiwgYnV0IHN0YWtlZCBvbmx5IAkApAMBBQpsb2NrQW1vdW50BAF0CAkBBXZhbHVlAQkA7QcBBQZoZWlnaHQJdGltZXN0YW1wBAtyZWxlYXNlVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQtnb3ZDb250cmFjdAkBF2tleVVzZXJHbnNidFJlbGVhc2VUaW1lAQUOdXNlckFkZHJlc3NTdHIAAAMJAGcCBQtyZWxlYXNlVGltZQUBdAkAAgEJAKwCAgI7WW91ciBnTnNidCBhcmUgdGFraW5nIHBhcnQgaW4gdm90aW5nLCBjYW5ub3QgdW5zdGFrZSB1bnRpbCAJAKQDAQULcmVsZWFzZVRpbWUED2NvbWlzc2lvbkFtb3VudAkBBWFzSW50AQkA/AcEBQxtYXRoQ29udHJhY3QCIWdldFVuc3Rha2VDb21pc3Npb25BbW91bnRSRUFET05MWQkAzAgCBQZhbW91bnQJAMwIAgUJbG9ja1N0YXJ0CQDMCAIFCGhhbGZMaWZlBQNuaWwFA25pbAQNJHQwMTcyMTIxNzM2NgkBC1N0YXRzUmVzdWx0AwkBAS0BBQZhbW91bnQDCQAAAgUGYW1vdW50BQpsb2NrQW1vdW50AP///////////wEAAAMJAAACBQZhbW91bnQFCmxvY2tBbW91bnQA////////////AQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxNzIxMjE3MzY2Al8xBAt0b3RhbFN0YWtlZAgFDSR0MDE3MjEyMTczNjYCXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTcyMTIxNzM2NgJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwkAZQIFBmFtb3VudAUPY29taXNzaW9uQW1vdW50BQtib25kQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9hdWN0aW9uQ29udHJhY3QFD2NvbWlzc2lvbkFtb3VudAULYm9uZEFzc2V0SWQJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCB3Vuc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQpsb2NrQW1vdW50BQlsb2NrU3RhcnQJAGUCBQpsb2NrQW1vdW50BQZhbW91bnQFCWxvY2tTdGFydAUDbmlsCQENUmV3YXJkRW50cmllcwMHBQ51c2VyQWRkcmVzc1N0cgUKbG9ja0Ftb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFC3VzZXJBZGRyZXNzCQBlAgUKbG9ja0Ftb3VudAUGYW1vdW50BQlsb2NrU3RhcnQFDHN0YXRzRW50cmllcwFpAQdkZXBvc2l0AAQLdG90YWxTdGFrZWQJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAADCQBmAgAABQt0b3RhbFN0YWtlZAkAAgECG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAQRZGVwb3NpdE51bUxhc3RLRVkJARFrZXlEZXBvc2l0TnVtTGFzdAAEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgURZGVwb3NpdE51bUxhc3RLRVkA////////////AQQNZGVwb3NpdE51bU5ldwkAZAIFDmRlcG9zaXROdW1MYXN0AAEECXRvdGFsc0tFWQkBGGtleVN0YXRzRGVwb3NpdEFtdFRvdGFscwAECGJ5RGF5S0VZCQEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBCQEMdG9TdGFydE9mRGF5AQgFCWxhc3RCbG9jawl0aW1lc3RhbXAECmN1cnJUb3RhbHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQl0b3RhbHNLRVkFEWRlZmF1bHRUb3RhbHNEQVRBBQNTRVAECWN1cnJCeURheQkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFCGJ5RGF5S0VZBRFkZWZhdWx0VG90YWxzREFUQQUDU0VQCgEDZGVwAgNhY2MDcG10BAZhbW91bnQIBQNwbXQGYW1vdW50BA1wbXRBc3NldElkU3RyCQDYBAEJAQt2YWx1ZU9yRWxzZQIIBQNwbXQHYXNzZXRJZAUHV0FWRVNJRAMJAQEhAQkBCGNvbnRhaW5zAgUSc3VwcG9ydGVkQXNzZXRzU3RyBQ1wbXRBc3NldElkU3RyCQACAQkArAICCQCsAgIFEnN1cHBvcnRlZEFzc2V0c1N0cgIRIGRvZXNuJ3QgY29udGFpbiAFDXBtdEFzc2V0SWRTdHIDCQAAAgULdG90YWxTdGFrZWQAAAkAlgoECQDNCAIIBQNhY2MCXzEJASJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AgUNcG10QXNzZXRJZFN0cgUGYW1vdW50CQDNCAIIBQNhY2MCXzIFDXBtdEFzc2V0SWRTdHIJAM0IAggFA2FjYwJfMwkAtgIBAAAJAM0IAggFA2FjYwJfNAUGYW1vdW50BBByZXdhcmRQZXJOc2J0WDE4CQC8AgMJALYCAQUGYW1vdW50BQdNVUxUWDE4CQC2AgEFC3RvdGFsU3Rha2VkCQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgUNcG10QXNzZXRJZFN0cgkAzQgCCAUDYWNjAl8zBRByZXdhcmRQZXJOc2J0WDE4CQDNCAIIBQNhY2MCXzQFBmFtb3VudAQKcG10c1Jlc3VsdAoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNkZXACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoKARlyZWZyZXNoUmV3YXJkVXBkYXRlVG90YWxzAgVhY2N1bQluZXh0QXNzZXQEAWsIBQVhY2N1bQJfNAQKc3VtTGFzdFN0cgkBDGdldFN0ck9yRWxzZQIJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUJbmV4dEFzc2V0AgEwBANpZHgJAM8IAggFCnBtdHNSZXN1bHQCXzIFCW5leHRBc3NldAQDc3VtAwkBCWlzRGVmaW5lZAEFA2lkeAQBagkBBXZhbHVlAQUDaWR4BApzdGF0c0RlbHRhCQCRAwIIBQpwbXRzUmVzdWx0Al80BQFqCQCVCgMJAKYDAQkAtwICCQCnAwEFCnN1bUxhc3RTdHIJAJEDAggFCnBtdHNSZXN1bHQCXzMFAWoJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpjdXJyVG90YWxzCQBkAgUBawABBQpzdGF0c0RlbHRhCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VyckJ5RGF5CQBkAgUBawABBQpzdGF0c0RlbHRhCQCVCgMFCnN1bUxhc3RTdHIJAJEDAgUKY3VyclRvdGFscwkAZAIFAWsAAQkAkQMCBQljdXJyQnlEYXkJAGQCBQFrAAEJAJYKBAkAzQgCCAUFYWNjdW0CXzEJAQtTdHJpbmdFbnRyeQIJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ1kZXBvc2l0TnVtTmV3BQluZXh0QXNzZXQIBQNzdW0CXzEJAKwCAgkArAICCAUFYWNjdW0CXzIFA1NFUAgFA3N1bQJfMgkArAICCQCsAgIIBQVhY2N1bQJfMwUDU0VQCAUDc3VtAl8zCQBkAgUBawABBAxhc3NldHNSZXN1bHQKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUDbmlsBRNEZXBvc2l0VG90YWxzUFJFRklYBRNEZXBvc2l0VG90YWxzUFJFRklYAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBGXJlZnJlc2hSZXdhcmRVcGRhdGVUb3RhbHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkJAJQKAgkAzQgCCQDNCAIJAM0IAgkAzggCCAUKcG10c1Jlc3VsdAJfMQgFDGFzc2V0c1Jlc3VsdAJfMQkBDEludGVnZXJFbnRyeQIFEWRlcG9zaXROdW1MYXN0S0VZBQ1kZXBvc2l0TnVtTmV3CQELU3RyaW5nRW50cnkCBQl0b3RhbHNLRVkIBQxhc3NldHNSZXN1bHQCXzIJAQtTdHJpbmdFbnRyeQIFCGJ5RGF5S0VZCAUMYXNzZXRzUmVzdWx0Al8zBQ1kZXBvc2l0TnVtTmV3AWkBDGNsYWltUmV3YXJkcwAJAQtjb21tb25DbGFpbQIIBQFpBmNhbGxlcgUBaQFpARpjbGFpbVJld2FyZHNCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25DbGFpbQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpARh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkBDnVzZXJBZGRyZXNzU3RyCgEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFYWNjdW0FYXNzZXQJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAICATAJAMwIAgIBMAUDbmlsAgE6AgFfBBJ1bmNsYWltZWRSZXdhcmRTdHIDCQAAAgUOdXNlckFkZHJlc3NTdHICAAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOdXNlckFkZHJlc3NTdHIEDSR0MDIxMjk3MjE0MDIJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAyMTI5NzIxNDAyAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAyMTI5NzIxNDAyAl8yBAxzdGFraW5nU3RhcnQIBQ0kdDAyMTI5NzIxNDAyAl8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDIxNzQ4MjE4ODYJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMjE3NDgyMTg4NgJfMQQGY2FjaGVkCAUNJHQwMjE3NDgyMTg4NgJfMgQHZHluYW1pYwgFDSR0MDIxNzQ4MjE4ODYCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAyMTc0ODIxODg2Al80BAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0AAAJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwJAMwIAgkApAMBBQdjbGFpbWVkBQNuaWwCAToCAV8KAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQkAlAoCBQNuaWwJALMCAgUSdW5jbGFpbWVkUmV3YXJkU3RyAAEBaQEYbnNidFVuc3Rha2luZ1NZU1JFQURPTkxZAhV1c2VyQWRkcmVzc1N0ck9yRW1wdHkLdW5zdGFrZUFtdFAEC3Jlc3VsdEFycmF5AwkAAAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVdXNlckFkZHJlc3NTdHJPckVtcHR5BAdjZmdEQVRBCQEPZ2V0UGFyYW1zT3JGYWlsAAQLbnNidEFzc2V0SWQIBQdjZmdEQVRBAl8xBA1taW5Mb2NrQW1vdW50CAUHY2ZnREFUQQJfMgQIaGFsZkxpZmUIBQdjZmdEQVRBAl8zBAh1c2VyREFUQQkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFCHVzZXJEQVRBAl8xBAxzdGFrZWRBbW91bnQIBQh1c2VyREFUQQJfMgQJbG9ja1N0YXJ0CAUIdXNlckRBVEECXzMECnVuc3Rha2VBbXQDCQBmAgULdW5zdGFrZUFtdFAFDHN0YWtlZEFtb3VudAUMc3Rha2VkQW1vdW50BQt1bnN0YWtlQW10UAQPc3Rha2VkQW1vdW50TkVXCQBlAgUMc3Rha2VkQW1vdW50BQp1bnN0YWtlQW10BA9jb21pc3Npb25BbW91bnQDCQAAAgUKdW5zdGFrZUFtdAAAAAAJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AiFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAMwIAgUKdW5zdGFrZUFtdAkAzAgCBQlsb2NrU3RhcnQJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsBA1yZWNlaXZlQW1vdW50CQBlAgUKdW5zdGFrZUFtdAUPY29taXNzaW9uQW1vdW50CQDMCAIFDHN0YWtlZEFtb3VudAkAzAgCBQ9zdGFrZWRBbW91bnRORVcJAMwIAgUNcmVjZWl2ZUFtb3VudAkAzAgCBQ9jb21pc3Npb25BbW91bnQFA25pbAkAlAoCBQNuaWwFC3Jlc3VsdEFycmF5AWkBFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkCDnVzZXJBZGRyZXNzU3RyCG5zYnREaWZmBAx0b3RhbE5zYnRBbXQJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAADCQAAAgUOdXNlckFkZHJlc3NTdHICAAkAlAoCBQNuaWwJAMwIAgAACQDMCAIFDHRvdGFsTnNidEFtdAkAzAgCAAAFA25pbAQLdXNlckFkZHJlc3MJAQ90b0FkZHJlc3NPckZhaWwBBQ51c2VyQWRkcmVzc1N0cgQNJHQwMjM1NjQyMzY2OAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDIzNTY0MjM2NjgCXzEEC3VzZXJOc2J0QW10CAUNJHQwMjM1NjQyMzY2OAJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMjM1NjQyMzY2OAJfMwkAlAoCBQNuaWwJAMwIAgULdXNlck5zYnRBbXQJAMwIAgUMdG90YWxOc2J0QW10CQDMCAIFDHN0YWtpbmdTdGFydAUDbmlsAQJ0eAEGdmVyaWZ5AAQTcHViS2V5QWRtaW5zTGlzdFN0cgkAuQkCCQDMCAICLEdKZExTYUxpdjVLN3h1ZWphYzhtY1JjSG95bzNkUHJFU3J2a3RHM2E2TUFSCQDMCAICLEVZd1ptVVJkNUtLYVFSQmpzVmE2ZzhEUGlzRm9TNlNvdlJKdEZpTDVnTUhVCQDMCAICLER0bUFmdURkQ3JISzhzcGRBZUFZenE2TXNaZWdlRDlnbnNycHVUUmtDYlZBCQDMCAICLDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQNuaWwFA1NFUAQQcHViS2V5QWRtaW5zTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD2NvbnRyb2xDb250cmFjdAIMJXNfX211bHRpc2lnBRNwdWJLZXlBZG1pbnNMaXN0U3RyBQNTRVAEBWNvdW50CQBkAgkAZAIJAGQCAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAAABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAABAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAIAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAwkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAwACAAAJAGcCBQVjb3VudAADfpgaig==", "chainId": 87, "height": 3537923, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AyMiW85d5HfV6hPQxuAfFS4sGWDyUFnCZsKdYUJHPvDM Next: 28MNVd1pzQ2SYPQFqEcdY4rqFJW1C4w3THonYdSnsJWZ Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "c556dd7e5f6e83db072aec698b7b12b2b942a395"
4+let revisionNum = "46ddf9ad4f4a67a79d872f7c5671aa012953a34b"
55
66 let separator = "__"
77
5252 func keyControlCfg () = "%s__controlConfig"
5353
5454
55-func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
55+func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
5656
5757
5858 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
236236
237237 let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
238238
239-func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
240- let currArr = split(currVal, SEP)
241- func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
242- then currArr[idx]
243- else toString((parseIntValue(currArr[idx]) + deltaAmt))
244-
245- makeString([DepositTotalsPREFIX, updDepTotByIdx(1), updDepTotByIdx(2), updDepTotByIdx(3), updDepTotByIdx(4), updDepTotByIdx(5), updDepTotByIdx(6), updDepTotByIdx(7), updDepTotByIdx(8), updDepTotByIdx(9), updDepTotByIdx(10), updDepTotByIdx(11), updDepTotByIdx(12), updDepTotByIdx(13), updDepTotByIdx(14), updDepTotByIdx(15), updDepTotByIdx(16), updDepTotByIdx(17), updDepTotByIdx(18)], SEP)
246- }
247-
248-
249-func DepositsTotalsEntries (depositAmount,assetIdStr) = {
250- let startOfDay = toStartOfDay(lastBlock.timestamp)
251- let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
252- let totalsKEY = keyStatsDepositAmtTotals()
253- let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
254- let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
255- let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
256- let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
257-[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
258- }
259-
239+let defaultTotalsDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
260240
261241 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
262242 let stakedAmountX = toBigInt(stakedAmount)
264244 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
265245 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
266246 func forEachAssetCacheUserReward (accum,asset) = {
267- let $t01083610971 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
268- let rewardTotal = $t01083610971._1
269- let cached = $t01083610971._2
270- let dynamic = $t01083610971._3
271- let rewardCachedPartKEY = $t01083610971._4
247+ let $t095619696 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
248+ let rewardTotal = $t095619696._1
249+ let cached = $t095619696._2
250+ let dynamic = $t095619696._3
251+ let rewardCachedPartKEY = $t095619696._4
272252 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
273253 }
274254
306286 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
307287 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
308288 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
309-[IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
289+ IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))
310290 }
311291
312292
315295 if ((size(i.payments) > 0))
316296 then throw("payments are not accepted")
317297 else {
318- let $t01391414019 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
319- let isNewUser = $t01391414019._1
320- let stakedAmount = $t01391414019._2
321- let stakingStart = $t01391414019._3
298+ let $t01263712742 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
299+ let isNewUser = $t01263712742._1
300+ let stakedAmount = $t01263712742._2
301+ let stakingStart = $t01263712742._3
322302 let stakedAmountX = toBigInt(stakedAmount)
323303 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
324304 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
325305 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
326306 func forEachAssetCalcUnclaimedReward (accum,asset) = {
327- let $t01439014528 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
328- let rewardTotal = $t01439014528._1
329- let cached = $t01439014528._2
330- let dynamic = $t01439014528._3
331- let rewardCachedPartKEY = $t01439014528._4
307+ let $t01311313251 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
308+ let rewardTotal = $t01311313251._1
309+ let cached = $t01311313251._2
310+ let dynamic = $t01311313251._3
311+ let rewardCachedPartKEY = $t01311313251._4
332312 let claimedKEY = keyClaimed(userAddressStr, asset)
333- let $t01458814625 = accum
334- let data = $t01458814625._1
335- let claimedAmtByAsset = $t01458814625._2
313+ let $t01331113348 = accum
314+ let data = $t01331113348._1
315+ let claimedAmtByAsset = $t01331113348._2
336316 let newPart = makeString([asset, toString(rewardTotal)], ":")
337317 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
338318 if ((0 >= rewardTotal))
340320 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
341321 }
342322
343- let $t01508515198 = {
323+ let $t01380813921 = {
344324 let $l = supportedAssetsList
345325 let $s = size($l)
346326 let $acc0 = $Tuple2(nil, "")
354334
355335 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
356336 }
357- let transfers = $t01508515198._1
358- let claimedAmtByAssetResult = $t01508515198._2
337+ let transfers = $t01380813921._1
338+ let claimedAmtByAssetResult = $t01380813921._2
359339 if ((0 >= size(transfers)))
360340 then $Tuple2(nil, 0)
361341 else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
364344
365345
366346 @Callable(i)
367-func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
347+func constructorV1 (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
368348 then throw("Permission denied")
369349 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
370350
372352
373353 @Callable(i)
374354 func stake () = {
375- let $t01604716109 = getParamsOrFail()
376- let bondAssetId = $t01604716109._1
377- let minLockAmount = $t01604716109._2
378- let halfLife = $t01604716109._3
355+ let $t01477214834 = getParamsOrFail()
356+ let bondAssetId = $t01477214834._1
357+ let minLockAmount = $t01477214834._2
358+ let halfLife = $t01477214834._3
379359 if ((size(i.payments) != 1))
380360 then throw("Invalid payments size")
381361 else {
388368 else {
389369 let userAddress = i.caller
390370 let userAddressStr = toString(i.caller)
391- let $t01665116758 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
392- let isNewUser = $t01665116758._1
393- let lockAmount = $t01665116758._2
394- let lockStartHeight = $t01665116758._3
371+ let $t01537615483 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
372+ let isNewUser = $t01537615483._1
373+ let lockAmount = $t01537615483._2
374+ let lockStartHeight = $t01537615483._3
395375 let mergedAmount = if (isNewUser)
396376 then amount
397377 else (amount + lockAmount)
401381 if ((minLockAmount > mergedAmount))
402382 then throw(("Min lock amount is " + toString(minLockAmount)))
403383 else {
404- let $t01711917221 = StatsResult(amount, 1, if (isNewUser)
384+ let $t01584415946 = StatsResult(amount, 1, if (isNewUser)
405385 then 1
406386 else 0)
407- let statsEntries = $t01711917221._1
408- let totalStaked = $t01711917221._2
409- let totalStakedNew = $t01711917221._3
387+ let statsEntries = $t01584415946._1
388+ let totalStaked = $t01584415946._2
389+ let totalStakedNew = $t01584415946._3
410390 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
411391 }
412392 }
421401 else {
422402 let userAddress = i.caller
423403 let userAddressStr = toString(userAddress)
424- let $t01770717769 = getParamsOrFail()
425- let bondAssetId = $t01770717769._1
426- let minLockAmount = $t01770717769._2
427- let halfLife = $t01770717769._3
428- let $t01777217846 = getUserParamsOrFail(userAddress)
429- let isNewUser = $t01777217846._1
430- let lockAmount = $t01777217846._2
431- let lockStart = $t01777217846._3
404+ let $t01643216494 = getParamsOrFail()
405+ let bondAssetId = $t01643216494._1
406+ let minLockAmount = $t01643216494._2
407+ let halfLife = $t01643216494._3
408+ let $t01649716571 = getUserParamsOrFail(userAddress)
409+ let isNewUser = $t01649716571._1
410+ let lockAmount = $t01649716571._2
411+ let lockStart = $t01649716571._3
432412 if ((0 >= lockAmount))
433413 then throw("Nothing to unstake")
434414 else if ((amount > lockAmount))
440420 then throw(("Your gNsbt are taking part in voting, cannot unstake until " + toString(releaseTime)))
441421 else {
442422 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
443- let $t01848718641 = StatsResult(-(amount), if ((amount == lockAmount))
423+ let $t01721217366 = StatsResult(-(amount), if ((amount == lockAmount))
444424 then -1
445425 else 0, if ((amount == lockAmount))
446426 then -1
447427 else 0)
448- let statsEntries = $t01848718641._1
449- let totalStaked = $t01848718641._2
450- let totalStakedNew = $t01848718641._3
428+ let statsEntries = $t01721217366._1
429+ let totalStaked = $t01721217366._2
430+ let totalStakedNew = $t01721217366._3
451431 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(auctionContract, comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
452432 }
453433 }
456436
457437
458438 @Callable(i)
459-func deposit () = if ((size(i.payments) != 1))
460- then throw("exact 1 payment is allowed only")
461- else {
462- let pmt = i.payments[0]
463- let amount = pmt.amount
464- let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
465- let pmtAssetIdStr = toBase58String(pmtAssetId)
466- let pmtMultX = if ((pmtAssetId == WAVESID))
467- then MULTX8
468- else MULTX6
469- let amountX = toBigInt(amount)
470- let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
471- let totalStakedX = toBigInt(totalStaked)
472- if ((0 > totalStaked))
473- then throw("TODO: case is not supported")
474- else if ((totalStaked == 0))
475- then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
476- else {
477- let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
478- let depositNumLastKEY = keyDepositNumLast()
479- let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
480- let depositNumNew = (depositNumLast + 1)
481- if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
482- then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
439+func deposit () = {
440+ let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
441+ if ((0 > totalStaked))
442+ then throw("TODO: case is not supported")
443+ else {
444+ let depositNumLastKEY = keyDepositNumLast()
445+ let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
446+ let depositNumNew = (depositNumLast + 1)
447+ let totalsKEY = keyStatsDepositAmtTotals()
448+ let byDayKEY = keyStatsDepositAmtByDay(toStartOfDay(lastBlock.timestamp))
449+ let currTotals = split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP)
450+ let currByDay = split(valueOrElse(getString(byDayKEY), defaultTotalsDATA), SEP)
451+ func dep (acc,pmt) = {
452+ let amount = pmt.amount
453+ let pmtAssetIdStr = toBase58String(valueOrElse(pmt.assetId, WAVESID))
454+ if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
455+ then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
456+ else if ((totalStaked == 0))
457+ then $Tuple4((acc._1 :+ IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)), (acc._2 :+ pmtAssetIdStr), (acc._3 :+ toBigInt(0)), (acc._4 :+ amount))
483458 else {
484- func refreshRewardPerNsbtSUM (accum,nextAsset) = {
485- let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
486- let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
487- (accum :+ (if ((nextAsset == pmtAssetIdStr))
488- then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
489- else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
490- }
459+ let rewardPerNsbtX18 = fraction(toBigInt(amount), MULTX18, toBigInt(totalStaked))
460+ $Tuple4(acc._1, (acc._2 :+ pmtAssetIdStr), (acc._3 :+ rewardPerNsbtX18), (acc._4 :+ amount))
461+ }
462+ }
491463
492- (({
493- let $l = supportedAssetsList
494- let $s = size($l)
495- let $acc0 = nil
496- func $f0_1 ($a,$i) = if (($i >= $s))
497- then $a
498- else refreshRewardPerNsbtSUM($a, $l[$i])
464+ let pmtsResult = {
465+ let $l = i.payments
466+ let $s = size($l)
467+ let $acc0 = $Tuple4(nil, nil, nil, nil)
468+ func $f0_1 ($a,$i) = if (($i >= $s))
469+ then $a
470+ else dep($a, $l[$i])
499471
500- func $f0_2 ($a,$i) = if (($i >= $s))
501- then $a
502- else throw("List size exceeds 9")
472+ func $f0_2 ($a,$i) = if (($i >= $s))
473+ then $a
474+ else throw("List size exceeds 10")
503475
504- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
505- } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
506- }
507- }
508- }
476+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
477+ }
478+ func refreshRewardUpdateTotals (accum,nextAsset) = {
479+ let k = accum._4
480+ let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
481+ let idx = indexOf(pmtsResult._2, nextAsset)
482+ let sum = if (isDefined(idx))
483+ then {
484+ let j = value(idx)
485+ let statsDelta = pmtsResult._4[j]
486+ $Tuple3(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)), toString((parseIntValue(currByDay[(k + 1)]) + statsDelta)))
487+ }
488+ else $Tuple3(sumLastStr, currTotals[(k + 1)], currByDay[(k + 1)])
489+ $Tuple4((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), ((accum._3 + SEP) + sum._3), (k + 1))
490+ }
491+
492+ let assetsResult = {
493+ let $l = supportedAssetsList
494+ let $s = size($l)
495+ let $acc0 = $Tuple4(nil, DepositTotalsPREFIX, DepositTotalsPREFIX, 0)
496+ func $f1_1 ($a,$i) = if (($i >= $s))
497+ then $a
498+ else refreshRewardUpdateTotals($a, $l[$i])
499+
500+ func $f1_2 ($a,$i) = if (($i >= $s))
501+ then $a
502+ else throw("List size exceeds 9")
503+
504+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
505+ }
506+ $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, assetsResult._2)) :+ StringEntry(byDayKEY, assetsResult._3)), depositNumNew)
507+ }
508+ }
509509
510510
511511
540540 }
541541 else {
542542 let userAddress = addressFromStringValue(userAddressStr)
543- let $t02136721472 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
544- let isNewUser = $t02136721472._1
545- let stakedAmount = $t02136721472._2
546- let stakingStart = $t02136721472._3
543+ let $t02129721402 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
544+ let isNewUser = $t02129721402._1
545+ let stakedAmount = $t02129721402._2
546+ let stakingStart = $t02129721402._3
547547 let stakedAmountX = toBigInt(stakedAmount)
548548 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
549549 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
550550 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
551551 func forEachAssetCalcUnclaimedReward (accum,asset) = {
552- let $t02181821956 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
553- let rewardTotal = $t02181821956._1
554- let cached = $t02181821956._2
555- let dynamic = $t02181821956._3
556- let rewardCachedPartKEY = $t02181821956._4
552+ let $t02174821886 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
553+ let rewardTotal = $t02174821886._1
554+ let cached = $t02174821886._2
555+ let dynamic = $t02174821886._3
556+ let rewardCachedPartKEY = $t02174821886._4
557557 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
558558 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
559559 }
612612 then $Tuple2(nil, [0, totalNsbtAmt, 0])
613613 else {
614614 let userAddress = toAddressOrFail(userAddressStr)
615- let $t02363423738 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
616- let isNewUser = $t02363423738._1
617- let userNsbtAmt = $t02363423738._2
618- let stakingStart = $t02363423738._3
615+ let $t02356423668 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
616+ let isNewUser = $t02356423668._1
617+ let userNsbtAmt = $t02356423668._2
618+ let stakingStart = $t02356423668._3
619619 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
620620 }
621621 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "c556dd7e5f6e83db072aec698b7b12b2b942a395"
4+let revisionNum = "46ddf9ad4f4a67a79d872f7c5671aa012953a34b"
55
66 let separator = "__"
77
88 let SEP = "__"
99
1010 let MULT6 = 1000000
1111
1212 let MULT8 = 100000000
1313
1414 let MULTX6 = toBigInt(MULT6)
1515
1616 let MULTX8 = toBigInt(MULT8)
1717
1818 let MULTX18 = toBigInt(1000000000000000000)
1919
2020 let WAVESIDSTR = "WAVES"
2121
2222 let WAVESID = fromBase58String(WAVESIDSTR)
2323
2424 let DAYMILLIS = 86400000
2525
2626 let IdxControlCfgNeutrinoDapp = 1
2727
2828 let IdxControlCfgAuctionDapp = 2
2929
3030 let IdxControlCfgRpdDapp = 3
3131
3232 let IdxControlCfgMathDapp = 4
3333
3434 let IdxControlCfgLiquidationDapp = 5
3535
3636 let IdxControlCfgRestDapp = 6
3737
3838 let IdxControlCfgNodeRegistryDapp = 7
3939
4040 let IdxControlCfgNsbtStakingDapp = 8
4141
4242 let IdxControlCfgMediatorDapp = 9
4343
4444 let IdxControlCfgGovernanceDapp = 13
4545
4646 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4747
4848
4949 func keyControlAddress () = "%s%s__config__controlAddress"
5050
5151
5252 func keyControlCfg () = "%s__controlConfig"
5353
5454
55-func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
55+func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
5656
5757
5858 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5959
6060
6161 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP"))
6262
6363 let controlCfg = readControlCfgOrFail(controlContract)
6464
6565 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6666
6767 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6868
6969 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
7070
7171 let govContract = getContractAddressOrFail(controlCfg, IdxControlCfgGovernanceDapp)
7272
7373 func keyBondAsset () = "bond_asset_id"
7474
7575
7676 func keyUserGnsbtReleaseTime (userAddr) = ("%s%s_userGnsbtReleaseTime__" + userAddr)
7777
7878
7979 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
8080
8181
8282 func keyMathContractAddress () = "%s__mathContract"
8383
8484
8585 func keyMinLockAmount () = "%s__minLockAmount"
8686
8787
8888 func keyHalfLife () = "%s__halfLife"
8989
9090
9191 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
9292
9393
9494 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
9595
9696
9797 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
9898
9999
100100 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
101101
102102
103103 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
104104
105105
106106 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
107107
108108
109109 func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
110110
111111
112112 func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
113113
114114
115115 func keyNextPeriod () = "%s__nextPeriod"
116116
117117
118118 func keySupportedRewardAssets () = "supportedRewardAssets"
119119
120120
121121 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
122122
123123
124124 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
125125
126126
127127 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
128128
129129
130130 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
131131
132132
133133 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
134134
135135
136136 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
137137
138138
139139 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
140140
141141
142142 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
143143
144144
145145 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
146146
147147
148148 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
149149
150150
151151 func getStrOrElse (key,defaultVal) = valueOrElse(getString(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 formatHistoryRecord (oldAmount,oldStart,newAmount,newStart) = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(oldStart), toString(newAmount), toString(newStart)], separator)
171171
172172
173173 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
174174
175175
176176 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
177177
178178
179179 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
180180
181181
182182 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
183183 let locksCount = getIntOrZero(keyStatsLocksCount())
184184 let usersCount = getIntOrZero(keyStatsUsersCount())
185185 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
186186 let totalAmountNew = (totalAmount + totalLockedInc)
187187 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
188188 }
189189
190190
191191 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
192192
193193
194194 func getParamsOrFail () = $Tuple3(fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
195195
196196
197197 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
198198
199199
200200 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
201201 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
202202 else unit
203203
204204
205205 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
206206
207207
208208 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
209209
210210 let supportedAssetsList = split(supportedAssetsStr, "_")
211211
212212 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
213213 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
214214 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
215215 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
216216 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
217217 let rewardCachedPartKEY = keyReward(userAddress, assetId)
218218 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
219219 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
220220 }
221221
222222
223223 func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
224224
225225
226226 func findElementPosition (src,element,sep) = {
227227 let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
228228 if ((elementStart == 0))
229229 then 0
230230 else {
231231 let left = take(src, elementStart)
232232 (size(split(left, sep)) - 1)
233233 }
234234 }
235235
236236
237237 let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
238238
239-func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
240- let currArr = split(currVal, SEP)
241- func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
242- then currArr[idx]
243- else toString((parseIntValue(currArr[idx]) + deltaAmt))
244-
245- makeString([DepositTotalsPREFIX, updDepTotByIdx(1), updDepTotByIdx(2), updDepTotByIdx(3), updDepTotByIdx(4), updDepTotByIdx(5), updDepTotByIdx(6), updDepTotByIdx(7), updDepTotByIdx(8), updDepTotByIdx(9), updDepTotByIdx(10), updDepTotByIdx(11), updDepTotByIdx(12), updDepTotByIdx(13), updDepTotByIdx(14), updDepTotByIdx(15), updDepTotByIdx(16), updDepTotByIdx(17), updDepTotByIdx(18)], SEP)
246- }
247-
248-
249-func DepositsTotalsEntries (depositAmount,assetIdStr) = {
250- let startOfDay = toStartOfDay(lastBlock.timestamp)
251- let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
252- let totalsKEY = keyStatsDepositAmtTotals()
253- let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
254- let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
255- let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
256- let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
257-[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
258- }
259-
239+let defaultTotalsDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
260240
261241 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
262242 let stakedAmountX = toBigInt(stakedAmount)
263243 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
264244 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
265245 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
266246 func forEachAssetCacheUserReward (accum,asset) = {
267- let $t01083610971 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
268- let rewardTotal = $t01083610971._1
269- let cached = $t01083610971._2
270- let dynamic = $t01083610971._3
271- let rewardCachedPartKEY = $t01083610971._4
247+ let $t095619696 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
248+ let rewardTotal = $t095619696._1
249+ let cached = $t095619696._2
250+ let dynamic = $t095619696._3
251+ let rewardCachedPartKEY = $t095619696._4
272252 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
273253 }
274254
275255 if (if ((depositNumLast == -1))
276256 then (depositNumUser == -1)
277257 else false)
278258 then nil
279259 else if (if ((depositNumLast == -1))
280260 then (depositNumUser > -1)
281261 else false)
282262 then throw("invalid depositNumLast and depositNumUser state")
283263 else if (if ((depositNumLast > -1))
284264 then (depositNumUser >= -1)
285265 else false)
286266 then if (isNewUser)
287267 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
288268 else ({
289269 let $l = supportedAssetsList
290270 let $s = size($l)
291271 let $acc0 = nil
292272 func $f0_1 ($a,$i) = if (($i >= $s))
293273 then $a
294274 else forEachAssetCacheUserReward($a, $l[$i])
295275
296276 func $f0_2 ($a,$i) = if (($i >= $s))
297277 then $a
298278 else throw("List size exceeds 9")
299279
300280 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
301281 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
302282 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
303283 }
304284
305285
306286 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
307287 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
308288 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
309-[IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
289+ IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))
310290 }
311291
312292
313293 func commonClaim (userAddress,i) = {
314294 let userAddressStr = toString(userAddress)
315295 if ((size(i.payments) > 0))
316296 then throw("payments are not accepted")
317297 else {
318- let $t01391414019 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
319- let isNewUser = $t01391414019._1
320- let stakedAmount = $t01391414019._2
321- let stakingStart = $t01391414019._3
298+ let $t01263712742 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
299+ let isNewUser = $t01263712742._1
300+ let stakedAmount = $t01263712742._2
301+ let stakingStart = $t01263712742._3
322302 let stakedAmountX = toBigInt(stakedAmount)
323303 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
324304 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
325305 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
326306 func forEachAssetCalcUnclaimedReward (accum,asset) = {
327- let $t01439014528 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
328- let rewardTotal = $t01439014528._1
329- let cached = $t01439014528._2
330- let dynamic = $t01439014528._3
331- let rewardCachedPartKEY = $t01439014528._4
307+ let $t01311313251 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
308+ let rewardTotal = $t01311313251._1
309+ let cached = $t01311313251._2
310+ let dynamic = $t01311313251._3
311+ let rewardCachedPartKEY = $t01311313251._4
332312 let claimedKEY = keyClaimed(userAddressStr, asset)
333- let $t01458814625 = accum
334- let data = $t01458814625._1
335- let claimedAmtByAsset = $t01458814625._2
313+ let $t01331113348 = accum
314+ let data = $t01331113348._1
315+ let claimedAmtByAsset = $t01331113348._2
336316 let newPart = makeString([asset, toString(rewardTotal)], ":")
337317 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
338318 if ((0 >= rewardTotal))
339319 then $Tuple2(data, claimedAmtByAssetNew)
340320 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
341321 }
342322
343- let $t01508515198 = {
323+ let $t01380813921 = {
344324 let $l = supportedAssetsList
345325 let $s = size($l)
346326 let $acc0 = $Tuple2(nil, "")
347327 func $f0_1 ($a,$i) = if (($i >= $s))
348328 then $a
349329 else forEachAssetCalcUnclaimedReward($a, $l[$i])
350330
351331 func $f0_2 ($a,$i) = if (($i >= $s))
352332 then $a
353333 else throw("List size exceeds 9")
354334
355335 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
356336 }
357- let transfers = $t01508515198._1
358- let claimedAmtByAssetResult = $t01508515198._2
337+ let transfers = $t01380813921._1
338+ let claimedAmtByAssetResult = $t01380813921._2
359339 if ((0 >= size(transfers)))
360340 then $Tuple2(nil, 0)
361341 else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
362342 }
363343 }
364344
365345
366346 @Callable(i)
367-func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
347+func constructorV1 (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
368348 then throw("Permission denied")
369349 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
370350
371351
372352
373353 @Callable(i)
374354 func stake () = {
375- let $t01604716109 = getParamsOrFail()
376- let bondAssetId = $t01604716109._1
377- let minLockAmount = $t01604716109._2
378- let halfLife = $t01604716109._3
355+ let $t01477214834 = getParamsOrFail()
356+ let bondAssetId = $t01477214834._1
357+ let minLockAmount = $t01477214834._2
358+ let halfLife = $t01477214834._3
379359 if ((size(i.payments) != 1))
380360 then throw("Invalid payments size")
381361 else {
382362 let payment = i.payments[0]
383363 let amount = payment.amount
384364 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
385365 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
386366 if ((assetId != bondAssetId))
387367 then throw(invalidAssetMessage)
388368 else {
389369 let userAddress = i.caller
390370 let userAddressStr = toString(i.caller)
391- let $t01665116758 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
392- let isNewUser = $t01665116758._1
393- let lockAmount = $t01665116758._2
394- let lockStartHeight = $t01665116758._3
371+ let $t01537615483 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
372+ let isNewUser = $t01537615483._1
373+ let lockAmount = $t01537615483._2
374+ let lockStartHeight = $t01537615483._3
395375 let mergedAmount = if (isNewUser)
396376 then amount
397377 else (amount + lockAmount)
398378 let mergedStartHeight = if (isNewUser)
399379 then height
400380 else asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
401381 if ((minLockAmount > mergedAmount))
402382 then throw(("Min lock amount is " + toString(minLockAmount)))
403383 else {
404- let $t01711917221 = StatsResult(amount, 1, if (isNewUser)
384+ let $t01584415946 = StatsResult(amount, 1, if (isNewUser)
405385 then 1
406386 else 0)
407- let statsEntries = $t01711917221._1
408- let totalStaked = $t01711917221._2
409- let totalStakedNew = $t01711917221._3
387+ let statsEntries = $t01584415946._1
388+ let totalStaked = $t01584415946._2
389+ let totalStakedNew = $t01584415946._3
410390 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
411391 }
412392 }
413393 }
414394 }
415395
416396
417397
418398 @Callable(i)
419399 func unstake (amount) = if ((size(i.payments) != 0))
420400 then throw("unstake doesn't require any payment")
421401 else {
422402 let userAddress = i.caller
423403 let userAddressStr = toString(userAddress)
424- let $t01770717769 = getParamsOrFail()
425- let bondAssetId = $t01770717769._1
426- let minLockAmount = $t01770717769._2
427- let halfLife = $t01770717769._3
428- let $t01777217846 = getUserParamsOrFail(userAddress)
429- let isNewUser = $t01777217846._1
430- let lockAmount = $t01777217846._2
431- let lockStart = $t01777217846._3
404+ let $t01643216494 = getParamsOrFail()
405+ let bondAssetId = $t01643216494._1
406+ let minLockAmount = $t01643216494._2
407+ let halfLife = $t01643216494._3
408+ let $t01649716571 = getUserParamsOrFail(userAddress)
409+ let isNewUser = $t01649716571._1
410+ let lockAmount = $t01649716571._2
411+ let lockStart = $t01649716571._3
432412 if ((0 >= lockAmount))
433413 then throw("Nothing to unstake")
434414 else if ((amount > lockAmount))
435415 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
436416 else {
437417 let t = value(blockInfoByHeight(height)).timestamp
438418 let releaseTime = valueOrElse(getInteger(govContract, keyUserGnsbtReleaseTime(userAddressStr)), 0)
439419 if ((releaseTime >= t))
440420 then throw(("Your gNsbt are taking part in voting, cannot unstake until " + toString(releaseTime)))
441421 else {
442422 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
443- let $t01848718641 = StatsResult(-(amount), if ((amount == lockAmount))
423+ let $t01721217366 = StatsResult(-(amount), if ((amount == lockAmount))
444424 then -1
445425 else 0, if ((amount == lockAmount))
446426 then -1
447427 else 0)
448- let statsEntries = $t01848718641._1
449- let totalStaked = $t01848718641._2
450- let totalStakedNew = $t01848718641._3
428+ let statsEntries = $t01721217366._1
429+ let totalStaked = $t01721217366._2
430+ let totalStakedNew = $t01721217366._3
451431 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(auctionContract, comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
452432 }
453433 }
454434 }
455435
456436
457437
458438 @Callable(i)
459-func deposit () = if ((size(i.payments) != 1))
460- then throw("exact 1 payment is allowed only")
461- else {
462- let pmt = i.payments[0]
463- let amount = pmt.amount
464- let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
465- let pmtAssetIdStr = toBase58String(pmtAssetId)
466- let pmtMultX = if ((pmtAssetId == WAVESID))
467- then MULTX8
468- else MULTX6
469- let amountX = toBigInt(amount)
470- let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
471- let totalStakedX = toBigInt(totalStaked)
472- if ((0 > totalStaked))
473- then throw("TODO: case is not supported")
474- else if ((totalStaked == 0))
475- then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
476- else {
477- let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
478- let depositNumLastKEY = keyDepositNumLast()
479- let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
480- let depositNumNew = (depositNumLast + 1)
481- if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
482- then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
439+func deposit () = {
440+ let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
441+ if ((0 > totalStaked))
442+ then throw("TODO: case is not supported")
443+ else {
444+ let depositNumLastKEY = keyDepositNumLast()
445+ let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
446+ let depositNumNew = (depositNumLast + 1)
447+ let totalsKEY = keyStatsDepositAmtTotals()
448+ let byDayKEY = keyStatsDepositAmtByDay(toStartOfDay(lastBlock.timestamp))
449+ let currTotals = split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP)
450+ let currByDay = split(valueOrElse(getString(byDayKEY), defaultTotalsDATA), SEP)
451+ func dep (acc,pmt) = {
452+ let amount = pmt.amount
453+ let pmtAssetIdStr = toBase58String(valueOrElse(pmt.assetId, WAVESID))
454+ if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
455+ then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
456+ else if ((totalStaked == 0))
457+ then $Tuple4((acc._1 :+ IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)), (acc._2 :+ pmtAssetIdStr), (acc._3 :+ toBigInt(0)), (acc._4 :+ amount))
483458 else {
484- func refreshRewardPerNsbtSUM (accum,nextAsset) = {
485- let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
486- let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
487- (accum :+ (if ((nextAsset == pmtAssetIdStr))
488- then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
489- else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
490- }
459+ let rewardPerNsbtX18 = fraction(toBigInt(amount), MULTX18, toBigInt(totalStaked))
460+ $Tuple4(acc._1, (acc._2 :+ pmtAssetIdStr), (acc._3 :+ rewardPerNsbtX18), (acc._4 :+ amount))
461+ }
462+ }
491463
492- (({
493- let $l = supportedAssetsList
494- let $s = size($l)
495- let $acc0 = nil
496- func $f0_1 ($a,$i) = if (($i >= $s))
497- then $a
498- else refreshRewardPerNsbtSUM($a, $l[$i])
464+ let pmtsResult = {
465+ let $l = i.payments
466+ let $s = size($l)
467+ let $acc0 = $Tuple4(nil, nil, nil, nil)
468+ func $f0_1 ($a,$i) = if (($i >= $s))
469+ then $a
470+ else dep($a, $l[$i])
499471
500- func $f0_2 ($a,$i) = if (($i >= $s))
501- then $a
502- else throw("List size exceeds 9")
472+ func $f0_2 ($a,$i) = if (($i >= $s))
473+ then $a
474+ else throw("List size exceeds 10")
503475
504- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
505- } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
506- }
507- }
508- }
476+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
477+ }
478+ func refreshRewardUpdateTotals (accum,nextAsset) = {
479+ let k = accum._4
480+ let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
481+ let idx = indexOf(pmtsResult._2, nextAsset)
482+ let sum = if (isDefined(idx))
483+ then {
484+ let j = value(idx)
485+ let statsDelta = pmtsResult._4[j]
486+ $Tuple3(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)), toString((parseIntValue(currByDay[(k + 1)]) + statsDelta)))
487+ }
488+ else $Tuple3(sumLastStr, currTotals[(k + 1)], currByDay[(k + 1)])
489+ $Tuple4((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), ((accum._3 + SEP) + sum._3), (k + 1))
490+ }
491+
492+ let assetsResult = {
493+ let $l = supportedAssetsList
494+ let $s = size($l)
495+ let $acc0 = $Tuple4(nil, DepositTotalsPREFIX, DepositTotalsPREFIX, 0)
496+ func $f1_1 ($a,$i) = if (($i >= $s))
497+ then $a
498+ else refreshRewardUpdateTotals($a, $l[$i])
499+
500+ func $f1_2 ($a,$i) = if (($i >= $s))
501+ then $a
502+ else throw("List size exceeds 9")
503+
504+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
505+ }
506+ $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, assetsResult._2)) :+ StringEntry(byDayKEY, assetsResult._3)), depositNumNew)
507+ }
508+ }
509509
510510
511511
512512 @Callable(i)
513513 func claimRewards () = commonClaim(i.caller, i)
514514
515515
516516
517517 @Callable(i)
518518 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
519519
520520
521521
522522 @Callable(i)
523523 func unclaimedRewardsREADONLY (userAddressStr) = {
524524 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
525525
526526 let unclaimedRewardStr = if ((userAddressStr == ""))
527527 then {
528528 let $l = supportedAssetsList
529529 let $s = size($l)
530530 let $acc0 = ""
531531 func $f0_1 ($a,$i) = if (($i >= $s))
532532 then $a
533533 else forEachAssetZeroReward($a, $l[$i])
534534
535535 func $f0_2 ($a,$i) = if (($i >= $s))
536536 then $a
537537 else throw("List size exceeds 9")
538538
539539 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
540540 }
541541 else {
542542 let userAddress = addressFromStringValue(userAddressStr)
543- let $t02136721472 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
544- let isNewUser = $t02136721472._1
545- let stakedAmount = $t02136721472._2
546- let stakingStart = $t02136721472._3
543+ let $t02129721402 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
544+ let isNewUser = $t02129721402._1
545+ let stakedAmount = $t02129721402._2
546+ let stakingStart = $t02129721402._3
547547 let stakedAmountX = toBigInt(stakedAmount)
548548 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
549549 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
550550 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
551551 func forEachAssetCalcUnclaimedReward (accum,asset) = {
552- let $t02181821956 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
553- let rewardTotal = $t02181821956._1
554- let cached = $t02181821956._2
555- let dynamic = $t02181821956._3
556- let rewardCachedPartKEY = $t02181821956._4
552+ let $t02174821886 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
553+ let rewardTotal = $t02174821886._1
554+ let cached = $t02174821886._2
555+ let dynamic = $t02174821886._3
556+ let rewardCachedPartKEY = $t02174821886._4
557557 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
558558 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
559559 }
560560
561561 let $l = supportedAssetsList
562562 let $s = size($l)
563563 let $acc0 = ""
564564 func $f0_1 ($a,$i) = if (($i >= $s))
565565 then $a
566566 else forEachAssetCalcUnclaimedReward($a, $l[$i])
567567
568568 func $f0_2 ($a,$i) = if (($i >= $s))
569569 then $a
570570 else throw("List size exceeds 9")
571571
572572 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9)
573573 }
574574 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
575575 }
576576
577577
578578
579579 @Callable(i)
580580 func nsbtUnstakingSYSREADONLY (userAddressStrOrEmpty,unstakeAmtP) = {
581581 let resultArray = if ((userAddressStrOrEmpty == ""))
582582 then [0, 0, 0, 0]
583583 else {
584584 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
585585 let cfgDATA = getParamsOrFail()
586586 let nsbtAssetId = cfgDATA._1
587587 let minLockAmount = cfgDATA._2
588588 let halfLife = cfgDATA._3
589589 let userDATA = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
590590 let isNewUser = userDATA._1
591591 let stakedAmount = userDATA._2
592592 let lockStart = userDATA._3
593593 let unstakeAmt = if ((unstakeAmtP > stakedAmount))
594594 then stakedAmount
595595 else unstakeAmtP
596596 let stakedAmountNEW = (stakedAmount - unstakeAmt)
597597 let comissionAmount = if ((unstakeAmt == 0))
598598 then 0
599599 else asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
600600 let receiveAmount = (unstakeAmt - comissionAmount)
601601 [stakedAmount, stakedAmountNEW, receiveAmount, comissionAmount]
602602 }
603603 $Tuple2(nil, resultArray)
604604 }
605605
606606
607607
608608 @Callable(i)
609609 func nsbtStakingSYSREADONLY (userAddressStr,nsbtDiff) = {
610610 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
611611 if ((userAddressStr == ""))
612612 then $Tuple2(nil, [0, totalNsbtAmt, 0])
613613 else {
614614 let userAddress = toAddressOrFail(userAddressStr)
615- let $t02363423738 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
616- let isNewUser = $t02363423738._1
617- let userNsbtAmt = $t02363423738._2
618- let stakingStart = $t02363423738._3
615+ let $t02356423668 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
616+ let isNewUser = $t02356423668._1
617+ let userNsbtAmt = $t02356423668._2
618+ let stakingStart = $t02356423668._3
619619 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
620620 }
621621 }
622622
623623
624624 @Verifier(tx)
625625 func verify () = {
626626 let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
627627 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
628628 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
629629 then 1
630630 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
631631 then 1
632632 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
633633 then 1
634634 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
635635 then 2
636636 else 0))
637637 (count >= 3)
638638 }
639639

github/deemru/w8io/786bc32 
106.86 ms