tx · 54vbnaqZsxsDCEAu2RsW9izsjHKAH2ihSHeffkvyVwd2

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.02600000 Waves

2023.03.28 07:50 [2509346] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "54vbnaqZsxsDCEAu2RsW9izsjHKAH2ihSHeffkvyVwd2", "fee": 2600000, "feeAssetId": null, "timestamp": 1679979009472, "version": 2, "chainId": 84, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "7aHqa8YaJDiBMHAAhErjjKLqfupsRsFYWc7iWgNMps3h5voLWD5Gjtbx4aeiqsEsuopbxijFLtKyPvgsumMyFet", "3a7GW1sz4vQwAcm1c6gR1JZqcHNUrkg2dE1hhBkWt7Faz6WVJej6Dwvf2SSZNSkekFhTJxJy6CSixSYDXAfG4rb9", "5XnzNWA5J7yZWZ3TA8pQ422qFdgBC5Lf1hNnMChfCzV3mD3gcQ1apZF961nzp3T5pvMZW7UsNHYuRgdMrSuskthp" ], "script": "base64:BgIpCAISBwoFCAgBAQgSABIDCgEBEgASABIAEgMKAQgSBAoCCAESBAoCCAFUAAlzZXBhcmF0b3ICAl9fAANTRVACAl9fAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABk1VTFRYNgkAtgIBBQVNVUxUNgAGTVVMVFg4CQC2AgEFBU1VTFQ4AAdNVUxUWDE4CQC2AgEAgICQu7rWrfANAApXQVZFU0lEU1RSAgVXQVZFUwAHV0FWRVNJRAkA2QQBBQpXQVZFU0lEU1RSAAlEQVlNSUxMSVMAgLiZKQAJTUFYQkFTS0VUAAkAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwAA0BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQdhZGRyZXNzAgEuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAC2dvdkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwAQxrZXlCb25kQXNzZXQAAg1ib25kX2Fzc2V0X2lkARdrZXlVc2VyR25zYnRSZWxlYXNlVGltZQEIdXNlckFkZHIJAKwCAgIbJXMlc191c2VyR25zYnRSZWxlYXNlVGltZV9fBQh1c2VyQWRkcgEaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAhslc19fbmV1dHJpbm9Db250cmFjdEFkZHJlc3MBFmtleU1hdGhDb250cmFjdEFkZHJlc3MAAhAlc19fbWF0aENvbnRyYWN0ARBrZXlNaW5Mb2NrQW1vdW50AAIRJXNfX21pbkxvY2tBbW91bnQBC2tleUhhbGZMaWZlAAIMJXNfX2hhbGZMaWZlARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICBmFtb3VudAUDbmlsBQlzZXBhcmF0b3IBFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUJc2VwYXJhdG9yARBrZXlIaXN0b3J5UmVjb3JkAwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUJc2VwYXJhdG9yARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEWFjdGl2ZVRvdGFsTG9ja2VkBQNuaWwFCXNlcGFyYXRvcgESa2V5U3RhdHNMb2Nrc0NvdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIKbG9ja3NDb3VudAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzVXNlcnNDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICEGFjdGl2ZVVzZXJzQ291bnQFA25pbAUJc2VwYXJhdG9yARdrZXlTdGF0c0RlcG9zaXRBbXRCeURheQEJdGltZXN0YW1wCQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICBXN0YXRzCQDMCAICD2RlcG9zaXRBbXRCeURheQkAzAgCCQCkAwEFCXRpbWVzdGFtcAUDbmlsBQlzZXBhcmF0b3IBGGtleVN0YXRzRGVwb3NpdEFtdFRvdGFscwAJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIFc3RhdHMJAMwIAgIQZGVwb3NpdEFtdFRvdGFscwUDbmlsBQlzZXBhcmF0b3IBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAIVc3VwcG9ydGVkUmV3YXJkQXNzZXRzARFrZXlEZXBvc2l0TnVtTGFzdAAJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDZGVwCQDMCAICB2xhc3ROdW0FA25pbAUJc2VwYXJhdG9yARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVzZXJSd2RGcm9tRGVwTnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgpkZXBvc2l0TnVtA3RrbgkAuQkCCQDMCAICBCVzJWQJAMwIAgIVcndkUGVyTnNidFN1bUJ5RGVwTnVtCQDMCAIJAKQDAQUKZGVwb3NpdE51bQkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQlrZXlSZXdhcmQCC3VzZXJBZGRyZXNzA3RrbgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNyd2QJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUDdGtuBQNuaWwFCXNlcGFyYXRvcgEKa2V5Q2xhaW1lZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA2NsbQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yARdrZXlOb3REaXN0cmlidXRlZFJld2FyZAEDdGtuCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg5ub3REaXN0cmlidXRlZAkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQV0b1gxOAIHb3JpZ1ZhbAhvcmlnTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFB01VTFRYMTgFCG9yaWdNdWx0AQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEMZ2V0SW50T3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBDGdldEludE9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPTWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEMZ2V0U3RyT3JFbHNlAgNrZXkKZGVmYXVsdFZhbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkFCmRlZmF1bHRWYWwBD3RvQWRkcmVzc09yRmFpbAEKYWRkcmVzc1N0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFCmFkZHJlc3NTdHIJAKwCAgIhY291bGRuJ3QgcGFyc2UgcGFzc2VkIGFkZHJlc3NTdHI9BQphZGRyZXNzU3RyAQt0b0Fzc2V0VmVjdAEIYXNzZXRTdHIDCQAAAgUIYXNzZXRTdHIFCldBVkVTSURTVFIFBHVuaXQJANkEAQUIYXNzZXRTdHIBBWFzSW50AQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgNJbnQEBnZhbEludAUHJG1hdGNoMAUGdmFsSW50CQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50ARNmb3JtYXRIaXN0b3J5UmVjb3JkBAlvbGRBbW91bnQIb2xkU3RhcnQJbmV3QW1vdW50CG5ld1N0YXJ0CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFCW9sZEFtb3VudAkAzAgCCQCkAwEFCG9sZFN0YXJ0CQDMCAIJAKQDAQUJbmV3QW1vdW50CQDMCAIJAKQDAQUIbmV3U3RhcnQFA25pbAUJc2VwYXJhdG9yARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCBHVzZXIOY2xhaW1lZFJld2FyZHMJALkJAgkAzAgCAgglcyVkJWQlcwkAzAgCBQR1c2VyCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCBQ5jbGFpbWVkUmV3YXJkcwUDbmlsBQlzZXBhcmF0b3IBEkhpc3RvcnlSZWNvcmRFbnRyeQcEdHlwZQt1c2VyQWRkcmVzcwR0eElkCW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwUEdHlwZQULdXNlckFkZHJlc3MFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkBAUJb2xkQW1vdW50BQhvbGRTdGFydAUJbmV3QW1vdW50BQhuZXdTdGFydAERQ2xhaW1IaXN0b3J5RW50cnkDC3VzZXJBZGRyZXNzBHR4SWQOY2xhaW1lZFJld2FyZHMJAQtTdHJpbmdFbnRyeQIJARBrZXlIaXN0b3J5UmVjb3JkAwIFY2xhaW0FC3VzZXJBZGRyZXNzBQR0eElkCQEYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAgkApQgBBQt1c2VyQWRkcmVzcwUOY2xhaW1lZFJld2FyZHMBC1N0YXRzUmVzdWx0Aw50b3RhbExvY2tlZEluYwxsb2NrQ291bnRJbmMNdXNlcnNDb3VudEluYwQKbG9ja3NDb3VudAkBDGdldEludE9yWmVybwEJARJrZXlTdGF0c0xvY2tzQ291bnQABAp1c2Vyc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzVXNlcnNDb3VudAAEC3RvdGFsQW1vdW50CQEMZ2V0SW50T3JaZXJvAQkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAQOdG90YWxBbW91bnROZXcJAGQCBQt0b3RhbEFtb3VudAUOdG90YWxMb2NrZWRJbmMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzTG9ja3NDb3VudAAJAGQCBQpsb2Nrc0NvdW50BQxsb2NrQ291bnRJbmMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlTdGF0c1VzZXJzQ291bnQACQBkAgUKdXNlcnNDb3VudAUNdXNlcnNDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAUOdG90YWxBbW91bnROZXcFA25pbAULdG90YWxBbW91bnQFDnRvdGFsQW1vdW50TmV3AQ9Mb2NrUGFyYW1zRW50cnkDC3VzZXJBZGRyZXNzBmFtb3VudAVzdGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBBQt1c2VyQWRkcmVzcwUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQVzdGFydAUDbmlsAQ9nZXRQYXJhbXNPckZhaWwACQCVCgMJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDGtleUJvbmRBc3NldAAJAQxnZXRJbnRPckZhaWwBCQEQa2V5TWluTG9ja0Ftb3VudAAJAQxnZXRJbnRPckZhaWwBCQELa2V5SGFsZkxpZmUAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQEMdG9TdGFydE9mRGF5AQl0aW1lc3RhbXAJAGgCCQBpAgUJdGltZXN0YW1wBQlEQVlNSUxMSVMFCURBWU1JTExJUwETZmluZEVsZW1lbnRQb3NpdGlvbgMDc3JjB2VsZW1lbnQDc2VwBAxlbGVtZW50U3RhcnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAswkCBQNzcmMFB2VsZW1lbnQJAKwCAgkArAICCQCsAgICFnRoZXJlIGlzIG5vIHN1YnN0cmluZyAFB2VsZW1lbnQCBCBpbiAFA3NyYwMJAAACBQxlbGVtZW50U3RhcnQAAAAABARsZWZ0CQCvAgIFA3NyYwUMZWxlbWVudFN0YXJ0CQBlAgkAkAMBCQC1CQIFBGxlZnQFA3NlcAABABNEZXBvc2l0VG90YWxzUFJFRklYAiQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQAEWRlZmF1bHRUb3RhbHNEQVRBCQCsAgIFE0RlcG9zaXRUb3RhbHNQUkVGSVgCNl9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMF9fMAEHcGFkTGlzdAECaW4ECGN1cnJTaXplCQBlAgkAkAMBBQJpbgABCgEKbGlzdFBhZGRlcgIDYWNjA2lkeAMJAGYCBQhjdXJyU2l6ZQUDaWR4BQNhY2MJAM0IAgUDYWNjAgEwCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFAmluCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpsaXN0UGFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxOAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgEJcGFkU3RyaW5nAQJpbgQIY3VyclNpemUJAGUCCQCQAwEJALwJAgUCaW4FA1NFUAABCgEJc3RyUGFkZGVyAgNhY2MDaWR4AwkAZgIFCGN1cnJTaXplBQNpZHgFA2FjYwkArAICBQNhY2MCA19fMAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQJpbgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJc3RyUGFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxOAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDEwMjYwMTAzOTUJAQpjYWxjUmV3YXJkBQULdXNlckFkZHJlc3MFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTAyNjAxMDM5NQJfMQQGY2FjaGVkCAUNJHQwMTAyNjAxMDM5NQJfMgQHZHluYW1pYwgFDSR0MDEwMjYwMTAzOTUCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxMDI2MDEwMzk1Al80CQDNCAIFBWFjY3VtCQEMSW50ZWdlckVudHJ5AgUTcmV3YXJkQ2FjaGVkUGFydEtFWQULcmV3YXJkVG90YWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAAACBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwUDbmlsAwMJAAACBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBmAgUOZGVwb3NpdE51bVVzZXIA////////////AQcJAAIBAi9pbnZhbGlkIGRlcG9zaXROdW1MYXN0IGFuZCBkZXBvc2l0TnVtVXNlciBzdGF0ZQMDCQBmAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAZwIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHAwUJaXNOZXdVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0BQNuaWwJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0CQACAQkArAICCQCsAgIJAKwCAgIkdW5jb3ZlcmVkIGNvbmRpdGlvbjogZGVwb3NpdE51bUxhc3Q9CQCkAwEFDmRlcG9zaXROdW1MYXN0AhAgZGVwb3NpdE51bVVzZXI9CQCkAwEFDmRlcG9zaXROdW1Vc2VyASJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AgN0a24JYW1vdW50SW5jBBdub3REaXN0cmlidXRlZFJld2FyZEtFWQkBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQUDdGtuBBRub3REaXN0cmlidXRlZFJld2FyZAkBDGdldEludE9yRWxzZQIFF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZAAAJAQxJbnRlZ2VyRW50cnkCBRdub3REaXN0cmlidXRlZFJld2FyZEtFWQkAZAIFFG5vdERpc3RyaWJ1dGVkUmV3YXJkBQlhbW91bnRJbmMBC2NvbW1vbkNsYWltAgt1c2VyQWRkcmVzcwFpBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhlwYXltZW50cyBhcmUgbm90IGFjY2VwdGVkBA0kdDAxMzMzNjEzNDQxCQELdmFsdWVPckVsc2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCVCgMGAAAAAAQJaXNOZXdVc2VyCAUNJHQwMTMzMzYxMzQ0MQJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTMzMzYxMzQ0MQJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMTMzMzYxMzQ0MQJfMwQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFDnVzZXJBZGRyZXNzU3RyBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBWFjY3VtBWFzc2V0BA0kdDAxMzgxMjEzOTUwCQEKY2FsY1Jld2FyZAUFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFDSR0MDEzODEyMTM5NTACXzEEBmNhY2hlZAgFDSR0MDEzODEyMTM5NTACXzIEB2R5bmFtaWMIBQ0kdDAxMzgxMjEzOTUwAl8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUNJHQwMTM4MTIxMzk1MAJfNAQKY2xhaW1lZEtFWQkBCmtleUNsYWltZWQCBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQEDSR0MDE0MDEwMTQwNDcFBWFjY3VtBARkYXRhCAUNJHQwMTQwMTAxNDA0NwJfMQQRY2xhaW1lZEFtdEJ5QXNzZXQIBQ0kdDAxNDAxMDE0MDQ3Al8yBAduZXdQYXJ0CQC5CQIJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQtyZXdhcmRUb3RhbAUDbmlsAgE6BBRjbGFpbWVkQW10QnlBc3NldE5ldwkAuQkCCQDMCAIFEWNsYWltZWRBbXRCeUFzc2V0CQDMCAIFB25ld1BhcnQFA25pbAIBXwMJAGcCAAAFC3Jld2FyZFRvdGFsCQCUCgIFBGRhdGEFFGNsYWltZWRBbXRCeUFzc2V0TmV3CQCUCgIJAM0IAgkAzQgCCQDNCAIFBGRhdGEJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQtyZXdhcmRUb3RhbAkBC3RvQXNzZXRWZWN0AQUFYXNzZXQJAQxJbnRlZ2VyRW50cnkCBQpjbGFpbWVkS0VZCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQpjbGFpbWVkS0VZAAAFC3Jld2FyZFRvdGFsCQEMSW50ZWdlckVudHJ5AgUTcmV3YXJkQ2FjaGVkUGFydEtFWQAABRRjbGFpbWVkQW10QnlBc3NldE5ldwQNJHQwMTQ1MDcxNDYyMAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwCAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQQJdHJhbnNmZXJzCAUNJHQwMTQ1MDcxNDYyMAJfMQQXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQIBQ0kdDAxNDUwNzE0NjIwAl8yAwkAZwIAAAkAkAMBBQl0cmFuc2ZlcnMJAJQKAgUDbmlsAAAJAJQKAgkAzQgCCQDNCAIFCXRyYW5zZmVycwkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJARFDbGFpbUhpc3RvcnlFbnRyeQMFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQCwAgIFF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0AAEJAJADAQUJdHJhbnNmZXJzCQFpAQ1jb25zdHJ1Y3RvclYxBRduZXV0cmlub0NvbnRyYWN0QWRkcmVzcxNtYXRoQ29udHJhY3RBZGRyZXNzDW1pbkxvY2tBbW91bnQIaGFsZkxpZmUVc3VwcG9ydGVkUmV3YXJkQXNzZXRzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleU5ldXRyaW5vQ29udHJhY3RBZGRyZXNzAAUXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleU1hdGhDb250cmFjdEFkZHJlc3MABRNtYXRoQ29udHJhY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5TWluTG9ja0Ftb3VudAAFDW1pbkxvY2tBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlIYWxmTGlmZQAFCGhhbGZMaWZlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMABRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMFA25pbAFpAQVzdGFrZQAEDSR0MDE1NDcxMTU1MzMJAQ9nZXRQYXJhbXNPckZhaWwABAtib25kQXNzZXRJZAgFDSR0MDE1NDcxMTU1MzMCXzEEDW1pbkxvY2tBbW91bnQIBQ0kdDAxNTQ3MTE1NTMzAl8yBAhoYWxmTGlmZQgFDSR0MDE1NDcxMTU1MzMCXzMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhVJbnZhbGlkIHBheW1lbnRzIHNpemUEB3BheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQEE2ludmFsaWRBc3NldE1lc3NhZ2UJAKwCAgkArAICAg9JbnZhbGlkIGFzc2V0LiAJANgEAQULYm9uZEFzc2V0SWQCDCBpcyBleHBlY3RlZAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkBRNpbnZhbGlkQXNzZXRNZXNzYWdlAwkBAiE9AgUHYXNzZXRJZAULYm9uZEFzc2V0SWQJAAIBBRNpbnZhbGlkQXNzZXRNZXNzYWdlBAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBA51c2VyQWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEDSR0MDE2MDc1MTYxODIJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAD///////////8BBAlpc05ld1VzZXIIBQ0kdDAxNjA3NTE2MTgyAl8xBApsb2NrQW1vdW50CAUNJHQwMTYwNzUxNjE4MgJfMgQPbG9ja1N0YXJ0SGVpZ2h0CAUNJHQwMTYwNzUxNjE4MgJfMwQMbWVyZ2VkQW1vdW50AwUJaXNOZXdVc2VyBQZhbW91bnQJAGQCBQZhbW91bnQFCmxvY2tBbW91bnQEEW1lcmdlZFN0YXJ0SGVpZ2h0AwUJaXNOZXdVc2VyBQZoZWlnaHQJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AhNtZXJnZVN0YWtlc1JFQURPTkxZCQDMCAIFBmFtb3VudAkAzAgCBQZoZWlnaHQJAMwIAgUKbG9ja0Ftb3VudAkAzAgCBQ9sb2NrU3RhcnRIZWlnaHQJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsAwkAZgIFDW1pbkxvY2tBbW91bnQFDG1lcmdlZEFtb3VudAkAAgEJAKwCAgITTWluIGxvY2sgYW1vdW50IGlzIAkApAMBBQ1taW5Mb2NrQW1vdW50BA0kdDAxNjU0MzE2NjQ1CQELU3RhdHNSZXN1bHQDBQZhbW91bnQAAQMFCWlzTmV3VXNlcgABAAAEDHN0YXRzRW50cmllcwgFDSR0MDE2NTQzMTY2NDUCXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTY1NDMxNjY0NQJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxNjU0MzE2NjQ1Al8zCQDOCAIJAM4IAgkAzggCCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgVzdGFrZQULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQFCmxvY2tBbW91bnQFD2xvY2tTdGFydEhlaWdodAUMbWVyZ2VkQW1vdW50BRFtZXJnZWRTdGFydEhlaWdodAUDbmlsCQENUmV3YXJkRW50cmllcwMFCWlzTmV3VXNlcgUOdXNlckFkZHJlc3NTdHIFCmxvY2tBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUMbWVyZ2VkQW1vdW50BRFtZXJnZWRTdGFydEhlaWdodAUMc3RhdHNFbnRyaWVzAWkBB3Vuc3Rha2UBBmFtb3VudAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwQNJHQwMTcxMzExNzE5MwkBD2dldFBhcmFtc09yRmFpbAAEC2JvbmRBc3NldElkCAUNJHQwMTcxMzExNzE5MwJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDE3MTMxMTcxOTMCXzIECGhhbGZMaWZlCAUNJHQwMTcxMzExNzE5MwJfMwQNJHQwMTcxOTYxNzI3MAkBE2dldFVzZXJQYXJhbXNPckZhaWwBBQt1c2VyQWRkcmVzcwQJaXNOZXdVc2VyCAUNJHQwMTcxOTYxNzI3MAJfMQQKbG9ja0Ftb3VudAgFDSR0MDE3MTk2MTcyNzACXzIECWxvY2tTdGFydAgFDSR0MDE3MTk2MTcyNzACXzMDCQBnAgAABQpsb2NrQW1vdW50CQACAQISTm90aGluZyB0byB1bnN0YWtlAwkAZgIFBmFtb3VudAUKbG9ja0Ftb3VudAkAAgEJAKwCAgkArAICCQCsAgICClJlcXVlc3RlZCAJAKQDAQUGYW1vdW50AhIsIGJ1dCBzdGFrZWQgb25seSAJAKQDAQUKbG9ja0Ftb3VudAQBdAgJAQV2YWx1ZQEJAO0HAQUGaGVpZ2h0CXRpbWVzdGFtcAQLcmVsZWFzZVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgULZ292Q29udHJhY3QJARdrZXlVc2VyR25zYnRSZWxlYXNlVGltZQEFDnVzZXJBZGRyZXNzU3RyAAADCQBnAgULcmVsZWFzZVRpbWUFAXQJAAIBCQCsAgICO1lvdXIgZ05zYnQgYXJlIHRha2luZyBwYXJ0IGluIHZvdGluZywgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFC3JlbGVhc2VUaW1lBA9jb21pc3Npb25BbW91bnQJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AiFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAMwIAgUGYW1vdW50CQDMCAIFCWxvY2tTdGFydAkAzAgCBQhoYWxmTGlmZQUDbmlsBQNuaWwEDSR0MDE3OTExMTgwNjUJAQtTdGF0c1Jlc3VsdAMJAQEtAQUGYW1vdW50AwkAAAIFBmFtb3VudAUKbG9ja0Ftb3VudAD///////////8BAAADCQAAAgUGYW1vdW50BQpsb2NrQW1vdW50AP///////////wEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTc5MTExODA2NQJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxNzkxMTE4MDY1Al8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDE3OTExMTgwNjUCXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MJAGUCBQZhbW91bnQFD2NvbWlzc2lvbkFtb3VudAULYm9uZEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPYXVjdGlvbkNvbnRyYWN0BQ9jb21pc3Npb25BbW91bnQFC2JvbmRBc3NldElkCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgd1bnN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUKbG9ja0Ftb3VudAUJbG9ja1N0YXJ0CQBlAgUKbG9ja0Ftb3VudAUGYW1vdW50BQlsb2NrU3RhcnQFA25pbAkBDVJld2FyZEVudHJpZXMDBwUOdXNlckFkZHJlc3NTdHIFCmxvY2tBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwkAZQIFCmxvY2tBbW91bnQFBmFtb3VudAUJbG9ja1N0YXJ0BQxzdGF0c0VudHJpZXMBaQEHZGVwb3NpdAAEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAwkAZgIAAAULdG90YWxTdGFrZWQJAAIBAhtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQEEWRlcG9zaXROdW1MYXN0S0VZCQERa2V5RGVwb3NpdE51bUxhc3QABA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIFEWRlcG9zaXROdW1MYXN0S0VZAP///////////wEEDWRlcG9zaXROdW1OZXcJAGQCBQ5kZXBvc2l0TnVtTGFzdAABBAl0b3RhbHNLRVkJARhrZXlTdGF0c0RlcG9zaXRBbXRUb3RhbHMABAhieURheUtFWQkBF2tleVN0YXRzRGVwb3NpdEFtdEJ5RGF5AQkBDHRvU3RhcnRPZkRheQEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBApjdXJyVG90YWxzCQEHcGFkTGlzdAEJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQl0b3RhbHNLRVkFEWRlZmF1bHRUb3RhbHNEQVRBBQNTRVAKAQNkZXACA2FjYwNwbXQEBmFtb3VudAgFA3BtdAZhbW91bnQEDXBtdEFzc2V0SWRTdHIJANgEAQkBC3ZhbHVlT3JFbHNlAggFA3BtdAdhc3NldElkBQdXQVZFU0lEAwkBASEBCQEIY29udGFpbnMCBRJzdXBwb3J0ZWRBc3NldHNTdHIFDXBtdEFzc2V0SWRTdHIJAAIBCQCsAgIJAKwCAgUSc3VwcG9ydGVkQXNzZXRzU3RyAhEgZG9lc24ndCBjb250YWluIAUNcG10QXNzZXRJZFN0cgMJAAACBQt0b3RhbFN0YWtlZAAACQCWCgQJAM0IAggFA2FjYwJfMQkBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCBQ1wbXRBc3NldElkU3RyBQZhbW91bnQJAM0IAggFA2FjYwJfMgUNcG10QXNzZXRJZFN0cgkAzQgCCAUDYWNjAl8zCQC2AgEAAAkAzQgCCAUDYWNjAl80BQZhbW91bnQEEHJld2FyZFBlck5zYnRYMTgJALwCAwkAtgIBBQZhbW91bnQFB01VTFRYMTgJALYCAQULdG90YWxTdGFrZWQJAJYKBAgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yBQ1wbXRBc3NldElkU3RyCQDNCAIIBQNhY2MCXzMFEHJld2FyZFBlck5zYnRYMTgJAM0IAggFA2FjYwJfNAUGYW1vdW50BApwbXRzUmVzdWx0CgACJGwIBQFpCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA2RlcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgoBGXJlZnJlc2hSZXdhcmRVcGRhdGVUb3RhbHMCBWFjY3VtCW5leHRBc3NldAQBawgFBWFjY3VtAl8zBApzdW1MYXN0U3RyCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQluZXh0QXNzZXQCATAEA2lkeAkAzwgCCAUKcG10c1Jlc3VsdAJfMgUJbmV4dEFzc2V0BANzdW0DCQEJaXNEZWZpbmVkAQUDaWR4BAFqCQEFdmFsdWUBBQNpZHgECnN0YXRzRGVsdGEJAJEDAggFCnBtdHNSZXN1bHQCXzQFAWoJAJQKAgkApgMBCQC3AgIJAKcDAQUKc3VtTGFzdFN0cgkAkQMCCAUKcG10c1Jlc3VsdAJfMwUBagkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmN1cnJUb3RhbHMJAGQCBQFrAAEFCnN0YXRzRGVsdGEJAJQKAgUKc3VtTGFzdFN0cgkAkQMCBQpjdXJyVG90YWxzCQBkAgUBawABCQCVCgMJAM0IAggFBWFjY3VtAl8xCQELU3RyaW5nRW50cnkCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUNZGVwb3NpdE51bU5ldwUJbmV4dEFzc2V0CAUDc3VtAl8xCQCsAgIJAKwCAggFBWFjY3VtAl8yBQNTRVAIBQNzdW0CXzIJAGQCBQFrAAEEDGFzc2V0c1Jlc3VsdAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFE0RlcG9zaXRUb3RhbHNQUkVGSVgAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEZcmVmcmVzaFJld2FyZFVwZGF0ZVRvdGFscwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQQGdG90YWxzCQEJcGFkU3RyaW5nAQgFDGFzc2V0c1Jlc3VsdAJfMgkAlAoCCQDNCAIJAM0IAgkAzQgCCQDOCAIIBQpwbXRzUmVzdWx0Al8xCAUMYXNzZXRzUmVzdWx0Al8xCQEMSW50ZWdlckVudHJ5AgURZGVwb3NpdE51bUxhc3RLRVkFDWRlcG9zaXROdW1OZXcJAQtTdHJpbmdFbnRyeQIFCXRvdGFsc0tFWQUGdG90YWxzCQELU3RyaW5nRW50cnkCBQhieURheUtFWQUGdG90YWxzBQ1kZXBvc2l0TnVtTmV3AWkBDGNsYWltUmV3YXJkcwAJAQtjb21tb25DbGFpbQIIBQFpBmNhbGxlcgUBaQFpARpjbGFpbVJld2FyZHNCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25DbGFpbQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpARh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkBDnVzZXJBZGRyZXNzU3RyCgEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFYWNjdW0FYXNzZXQJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAICATAJAMwIAgIBMAUDbmlsAgE6AgFfBBJ1bmNsYWltZWRSZXdhcmRTdHIDCQAAAgUOdXNlckFkZHJlc3NTdHICAAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOdXNlckFkZHJlc3NTdHIEDSR0MDIxOTE0MjIwMTkJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAyMTkxNDIyMDE5Al8xBAxzdGFrZWRBbW91bnQIBQ0kdDAyMTkxNDIyMDE5Al8yBAxzdGFraW5nU3RhcnQIBQ0kdDAyMTkxNDIyMDE5Al8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDIyMzY1MjI1MDMJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMjIzNjUyMjUwMwJfMQQGY2FjaGVkCAUNJHQwMjIzNjUyMjUwMwJfMgQHZHluYW1pYwgFDSR0MDIyMzY1MjI1MDMCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAyMjM2NTIyNTAzAl80BAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0AAAJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwJAMwIAgkApAMBBQdjbGFpbWVkBQNuaWwCAToCAV8KAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQkAlAoCBQNuaWwJALMCAgUSdW5jbGFpbWVkUmV3YXJkU3RyAAEBaQEYbnNidFVuc3Rha2luZ1NZU1JFQURPTkxZAhV1c2VyQWRkcmVzc1N0ck9yRW1wdHkLdW5zdGFrZUFtdFAEC3Jlc3VsdEFycmF5AwkAAAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVdXNlckFkZHJlc3NTdHJPckVtcHR5BAdjZmdEQVRBCQEPZ2V0UGFyYW1zT3JGYWlsAAQLbnNidEFzc2V0SWQIBQdjZmdEQVRBAl8xBA1taW5Mb2NrQW1vdW50CAUHY2ZnREFUQQJfMgQIaGFsZkxpZmUIBQdjZmdEQVRBAl8zBAh1c2VyREFUQQkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFCHVzZXJEQVRBAl8xBAxzdGFrZWRBbW91bnQIBQh1c2VyREFUQQJfMgQJbG9ja1N0YXJ0CAUIdXNlckRBVEECXzMECnVuc3Rha2VBbXQDCQBmAgULdW5zdGFrZUFtdFAFDHN0YWtlZEFtb3VudAUMc3Rha2VkQW1vdW50BQt1bnN0YWtlQW10UAQPc3Rha2VkQW1vdW50TkVXCQBlAgUMc3Rha2VkQW1vdW50BQp1bnN0YWtlQW10BA9jb21pc3Npb25BbW91bnQDCQAAAgUKdW5zdGFrZUFtdAAAAAAJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AiFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAMwIAgUKdW5zdGFrZUFtdAkAzAgCBQlsb2NrU3RhcnQJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsBA1yZWNlaXZlQW1vdW50CQBlAgUKdW5zdGFrZUFtdAUPY29taXNzaW9uQW1vdW50CQDMCAIFDHN0YWtlZEFtb3VudAkAzAgCBQ9zdGFrZWRBbW91bnRORVcJAMwIAgUNcmVjZWl2ZUFtb3VudAkAzAgCBQ9jb21pc3Npb25BbW91bnQFA25pbAkAlAoCBQNuaWwFC3Jlc3VsdEFycmF5AWkBFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkCDnVzZXJBZGRyZXNzU3RyCG5zYnREaWZmBAx0b3RhbE5zYnRBbXQJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAADCQAAAgUOdXNlckFkZHJlc3NTdHICAAkAlAoCBQNuaWwJAMwIAgAACQDMCAIFDHRvdGFsTnNidEFtdAkAzAgCAAAFA25pbAQLdXNlckFkZHJlc3MJAQ90b0FkZHJlc3NPckZhaWwBBQ51c2VyQWRkcmVzc1N0cgQNJHQwMjQxODEyNDI4NQkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDI0MTgxMjQyODUCXzEEC3VzZXJOc2J0QW10CAUNJHQwMjQxODEyNDI4NQJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMjQxODEyNDI4NQJfMwkAlAoCBQNuaWwJAMwIAgULdXNlck5zYnRBbXQJAMwIAgUMdG90YWxOc2J0QW10CQDMCAIFDHN0YWtpbmdTdGFydAUDbmlsAQJ0eAEGdmVyaWZ5AAQTcHViS2V5QWRtaW5zTGlzdFN0cgkAuQkCCQDMCAICLEV4dEVFSzE5bm1LajltQ3BuV3l2RUVKRllBVExNY1ZFTXZvaGhVSGt5SE5tCQDMCAICLEV2NXB5NUZmQlFYOWNacFlLbmZRclRCNDlCeWY4UW1wWldlRFZSaW00eVY3CQDMCAICLERVdXVMalh1OThuQndaYzdmcXdDVGp0QTNublJ3Z1Ria01TcjVTVTJObURSCQDMCAICLERVdXVMalh1OThuQndaYzdmcXdDVGp0QTNublJ3Z1Ria01TcjVTVTJObURSBQNuaWwFA1NFUAQQcHViS2V5QWRtaW5zTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD2NvbnRyb2xDb250cmFjdAIMJXNfX211bHRpc2lnBRNwdWJLZXlBZG1pbnNMaXN0U3RyBQNTRVAEBWNvdW50CQBkAgkAZAIJAGQCAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAAABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAABAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAIAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAwkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAwACAAAJAGcCBQVjb3VudAADPesTaA==", "height": 2509346, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 32JFwnf7GdUEubdXkiaZAtk2NbjLGeR7u62jk65CWptU Next: E9gAqUH1Z8mkHbm3WA7PuJ6LcJtfqf8YPasCL2gwpmhC Diff:
OldNewDifferences
2020 let WAVESID = fromBase58String(WAVESIDSTR)
2121
2222 let DAYMILLIS = 86400000
23+
24+let MAXBASKET = 9
2325
2426 let IdxControlCfgNeutrinoDapp = 1
2527
236238
237239 let defaultTotalsDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
238240
241+func padList (in) = {
242+ let currSize = (size(in) - 1)
243+ func listPadder (acc,idx) = if ((currSize > idx))
244+ then acc
245+ else (acc :+ "0")
246+
247+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
248+ let $s = size($l)
249+ let $acc0 = in
250+ func $f0_1 ($a,$i) = if (($i >= $s))
251+ then $a
252+ else listPadder($a, $l[$i])
253+
254+ func $f0_2 ($a,$i) = if (($i >= $s))
255+ then $a
256+ else throw("List size exceeds 18")
257+
258+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18)
259+ }
260+
261+
262+func padString (in) = {
263+ let currSize = (size(split_4C(in, SEP)) - 1)
264+ func strPadder (acc,idx) = if ((currSize > idx))
265+ then acc
266+ else (acc + "__0")
267+
268+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
269+ let $s = size($l)
270+ let $acc0 = in
271+ func $f0_1 ($a,$i) = if (($i >= $s))
272+ then $a
273+ else strPadder($a, $l[$i])
274+
275+ func $f0_2 ($a,$i) = if (($i >= $s))
276+ then $a
277+ else throw("List size exceeds 18")
278+
279+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18)
280+ }
281+
282+
239283 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
240284 let stakedAmountX = toBigInt(stakedAmount)
241285 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
242286 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
243287 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
244288 func forEachAssetCacheUserReward (accum,asset) = {
245- let $t095209655 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
246- let rewardTotal = $t095209655._1
247- let cached = $t095209655._2
248- let dynamic = $t095209655._3
249- let rewardCachedPartKEY = $t095209655._4
289+ let $t01026010395 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
290+ let rewardTotal = $t01026010395._1
291+ let cached = $t01026010395._2
292+ let dynamic = $t01026010395._3
293+ let rewardCachedPartKEY = $t01026010395._4
250294 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
251295 }
252296
293337 if ((size(i.payments) > 0))
294338 then throw("payments are not accepted")
295339 else {
296- let $t01259612701 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
297- let isNewUser = $t01259612701._1
298- let stakedAmount = $t01259612701._2
299- let stakingStart = $t01259612701._3
340+ let $t01333613441 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
341+ let isNewUser = $t01333613441._1
342+ let stakedAmount = $t01333613441._2
343+ let stakingStart = $t01333613441._3
300344 let stakedAmountX = toBigInt(stakedAmount)
301345 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
302346 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
303347 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
304348 func forEachAssetCalcUnclaimedReward (accum,asset) = {
305- let $t01307213210 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
306- let rewardTotal = $t01307213210._1
307- let cached = $t01307213210._2
308- let dynamic = $t01307213210._3
309- let rewardCachedPartKEY = $t01307213210._4
349+ let $t01381213950 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
350+ let rewardTotal = $t01381213950._1
351+ let cached = $t01381213950._2
352+ let dynamic = $t01381213950._3
353+ let rewardCachedPartKEY = $t01381213950._4
310354 let claimedKEY = keyClaimed(userAddressStr, asset)
311- let $t01327013307 = accum
312- let data = $t01327013307._1
313- let claimedAmtByAsset = $t01327013307._2
355+ let $t01401014047 = accum
356+ let data = $t01401014047._1
357+ let claimedAmtByAsset = $t01401014047._2
314358 let newPart = makeString([asset, toString(rewardTotal)], ":")
315359 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
316360 if ((0 >= rewardTotal))
318362 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
319363 }
320364
321- let $t01376713880 = {
365+ let $t01450714620 = {
322366 let $l = supportedAssetsList
323367 let $s = size($l)
324368 let $acc0 = $Tuple2(nil, "")
332376
333377 $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)
334378 }
335- let transfers = $t01376713880._1
336- let claimedAmtByAssetResult = $t01376713880._2
379+ let transfers = $t01450714620._1
380+ let claimedAmtByAssetResult = $t01450714620._2
337381 if ((0 >= size(transfers)))
338382 then $Tuple2(nil, 0)
339383 else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
350394
351395 @Callable(i)
352396 func stake () = {
353- let $t01473114793 = getParamsOrFail()
354- let bondAssetId = $t01473114793._1
355- let minLockAmount = $t01473114793._2
356- let halfLife = $t01473114793._3
397+ let $t01547115533 = getParamsOrFail()
398+ let bondAssetId = $t01547115533._1
399+ let minLockAmount = $t01547115533._2
400+ let halfLife = $t01547115533._3
357401 if ((size(i.payments) != 1))
358402 then throw("Invalid payments size")
359403 else {
366410 else {
367411 let userAddress = i.caller
368412 let userAddressStr = toString(i.caller)
369- let $t01533515442 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
370- let isNewUser = $t01533515442._1
371- let lockAmount = $t01533515442._2
372- let lockStartHeight = $t01533515442._3
413+ let $t01607516182 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
414+ let isNewUser = $t01607516182._1
415+ let lockAmount = $t01607516182._2
416+ let lockStartHeight = $t01607516182._3
373417 let mergedAmount = if (isNewUser)
374418 then amount
375419 else (amount + lockAmount)
379423 if ((minLockAmount > mergedAmount))
380424 then throw(("Min lock amount is " + toString(minLockAmount)))
381425 else {
382- let $t01580315905 = StatsResult(amount, 1, if (isNewUser)
426+ let $t01654316645 = StatsResult(amount, 1, if (isNewUser)
383427 then 1
384428 else 0)
385- let statsEntries = $t01580315905._1
386- let totalStaked = $t01580315905._2
387- let totalStakedNew = $t01580315905._3
429+ let statsEntries = $t01654316645._1
430+ let totalStaked = $t01654316645._2
431+ let totalStakedNew = $t01654316645._3
388432 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
389433 }
390434 }
399443 else {
400444 let userAddress = i.caller
401445 let userAddressStr = toString(userAddress)
402- let $t01639116453 = getParamsOrFail()
403- let bondAssetId = $t01639116453._1
404- let minLockAmount = $t01639116453._2
405- let halfLife = $t01639116453._3
406- let $t01645616530 = getUserParamsOrFail(userAddress)
407- let isNewUser = $t01645616530._1
408- let lockAmount = $t01645616530._2
409- let lockStart = $t01645616530._3
446+ let $t01713117193 = getParamsOrFail()
447+ let bondAssetId = $t01713117193._1
448+ let minLockAmount = $t01713117193._2
449+ let halfLife = $t01713117193._3
450+ let $t01719617270 = getUserParamsOrFail(userAddress)
451+ let isNewUser = $t01719617270._1
452+ let lockAmount = $t01719617270._2
453+ let lockStart = $t01719617270._3
410454 if ((0 >= lockAmount))
411455 then throw("Nothing to unstake")
412456 else if ((amount > lockAmount))
418462 then throw(("Your gNsbt are taking part in voting, cannot unstake until " + toString(releaseTime)))
419463 else {
420464 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
421- let $t01717117325 = StatsResult(-(amount), if ((amount == lockAmount))
465+ let $t01791118065 = StatsResult(-(amount), if ((amount == lockAmount))
422466 then -1
423467 else 0, if ((amount == lockAmount))
424468 then -1
425469 else 0)
426- let statsEntries = $t01717117325._1
427- let totalStaked = $t01717117325._2
428- let totalStakedNew = $t01717117325._3
470+ let statsEntries = $t01791118065._1
471+ let totalStaked = $t01791118065._2
472+ let totalStakedNew = $t01791118065._3
429473 ((([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)
430474 }
431475 }
444488 let depositNumNew = (depositNumLast + 1)
445489 let totalsKEY = keyStatsDepositAmtTotals()
446490 let byDayKEY = keyStatsDepositAmtByDay(toStartOfDay(lastBlock.timestamp))
447- let currTotals = split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP)
448- let currByDay = split(valueOrElse(getString(byDayKEY), defaultTotalsDATA), SEP)
491+ let currTotals = padList(split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP))
449492 func dep (acc,pmt) = {
450493 let amount = pmt.amount
451494 let pmtAssetIdStr = toBase58String(valueOrElse(pmt.assetId, WAVESID))
474517 $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)
475518 }
476519 func refreshRewardUpdateTotals (accum,nextAsset) = {
477- let k = accum._4
520+ let k = accum._3
478521 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
479522 let idx = indexOf(pmtsResult._2, nextAsset)
480523 let sum = if (isDefined(idx))
481524 then {
482525 let j = value(idx)
483526 let statsDelta = pmtsResult._4[j]
484- $Tuple3(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)), toString((parseIntValue(currByDay[(k + 1)]) + statsDelta)))
527+ $Tuple2(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)))
485528 }
486- else $Tuple3(sumLastStr, currTotals[(k + 1)], currByDay[(k + 1)])
487- $Tuple4((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), ((accum._3 + SEP) + sum._3), (k + 1))
529+ else $Tuple2(sumLastStr, currTotals[(k + 1)])
530+ $Tuple3((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), (k + 1))
488531 }
489532
490533 let assetsResult = {
491534 let $l = supportedAssetsList
492535 let $s = size($l)
493- let $acc0 = $Tuple4(nil, DepositTotalsPREFIX, DepositTotalsPREFIX, 0)
536+ let $acc0 = $Tuple3(nil, DepositTotalsPREFIX, 0)
494537 func $f1_1 ($a,$i) = if (($i >= $s))
495538 then $a
496539 else refreshRewardUpdateTotals($a, $l[$i])
501544
502545 $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)
503546 }
504- $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, assetsResult._2)) :+ StringEntry(byDayKEY, assetsResult._3)), depositNumNew)
547+ let totals = padString(assetsResult._2)
548+ $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, totals)) :+ StringEntry(byDayKEY, totals)), depositNumNew)
505549 }
506550 }
507551
538582 }
539583 else {
540584 let userAddress = addressFromStringValue(userAddressStr)
541- let $t02125621361 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
542- let isNewUser = $t02125621361._1
543- let stakedAmount = $t02125621361._2
544- let stakingStart = $t02125621361._3
585+ let $t02191422019 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
586+ let isNewUser = $t02191422019._1
587+ let stakedAmount = $t02191422019._2
588+ let stakingStart = $t02191422019._3
545589 let stakedAmountX = toBigInt(stakedAmount)
546590 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
547591 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
548592 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
549593 func forEachAssetCalcUnclaimedReward (accum,asset) = {
550- let $t02170721845 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
551- let rewardTotal = $t02170721845._1
552- let cached = $t02170721845._2
553- let dynamic = $t02170721845._3
554- let rewardCachedPartKEY = $t02170721845._4
594+ let $t02236522503 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
595+ let rewardTotal = $t02236522503._1
596+ let cached = $t02236522503._2
597+ let dynamic = $t02236522503._3
598+ let rewardCachedPartKEY = $t02236522503._4
555599 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
556600 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
557601 }
610654 then $Tuple2(nil, [0, totalNsbtAmt, 0])
611655 else {
612656 let userAddress = toAddressOrFail(userAddressStr)
613- let $t02352323627 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
614- let isNewUser = $t02352323627._1
615- let userNsbtAmt = $t02352323627._2
616- let stakingStart = $t02352323627._3
657+ let $t02418124285 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
658+ let isNewUser = $t02418124285._1
659+ let userNsbtAmt = $t02418124285._2
660+ let stakingStart = $t02418124285._3
617661 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
618662 }
619663 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
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
23+
24+let MAXBASKET = 9
2325
2426 let IdxControlCfgNeutrinoDapp = 1
2527
2628 let IdxControlCfgAuctionDapp = 2
2729
2830 let IdxControlCfgRpdDapp = 3
2931
3032 let IdxControlCfgMathDapp = 4
3133
3234 let IdxControlCfgLiquidationDapp = 5
3335
3436 let IdxControlCfgRestDapp = 6
3537
3638 let IdxControlCfgNodeRegistryDapp = 7
3739
3840 let IdxControlCfgNsbtStakingDapp = 8
3941
4042 let IdxControlCfgMediatorDapp = 9
4143
4244 let IdxControlCfgGovernanceDapp = 13
4345
4446 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4547
4648
4749 func keyControlAddress () = "%s%s__config__controlAddress"
4850
4951
5052 func keyControlCfg () = "%s__controlConfig"
5153
5254
5355 func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
5456
5557
5658 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5759
5860
5961 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
6062
6163 let controlCfg = readControlCfgOrFail(controlContract)
6264
6365 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6466
6567 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6668
6769 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
6870
6971 let govContract = getContractAddressOrFail(controlCfg, IdxControlCfgGovernanceDapp)
7072
7173 func keyBondAsset () = "bond_asset_id"
7274
7375
7476 func keyUserGnsbtReleaseTime (userAddr) = ("%s%s_userGnsbtReleaseTime__" + userAddr)
7577
7678
7779 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
7880
7981
8082 func keyMathContractAddress () = "%s__mathContract"
8183
8284
8385 func keyMinLockAmount () = "%s__minLockAmount"
8486
8587
8688 func keyHalfLife () = "%s__halfLife"
8789
8890
8991 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
9092
9193
9294 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
9395
9496
9597 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
9698
9799
98100 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
99101
100102
101103 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
102104
103105
104106 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
105107
106108
107109 func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
108110
109111
110112 func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
111113
112114
113115 func keyNextPeriod () = "%s__nextPeriod"
114116
115117
116118 func keySupportedRewardAssets () = "supportedRewardAssets"
117119
118120
119121 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
120122
121123
122124 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
123125
124126
125127 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
126128
127129
128130 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
129131
130132
131133 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
132134
133135
134136 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
135137
136138
137139 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
138140
139141
140142 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
141143
142144
143145 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
144146
145147
146148 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
147149
148150
149151 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
150152
151153
152154 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
153155
154156
155157 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
156158 then unit
157159 else fromBase58String(assetStr)
158160
159161
160162 func asInt (val) = match val {
161163 case valInt: Int =>
162164 valInt
163165 case _ =>
164166 throw("fail to cast into Int")
165167 }
166168
167169
168170 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)
169171
170172
171173 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
172174
173175
174176 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
175177
176178
177179 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
178180
179181
180182 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
181183 let locksCount = getIntOrZero(keyStatsLocksCount())
182184 let usersCount = getIntOrZero(keyStatsUsersCount())
183185 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
184186 let totalAmountNew = (totalAmount + totalLockedInc)
185187 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
186188 }
187189
188190
189191 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
190192
191193
192194 func getParamsOrFail () = $Tuple3(fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
193195
194196
195197 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
196198
197199
198200 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
199201 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
200202 else unit
201203
202204
203205 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
204206
205207
206208 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
207209
208210 let supportedAssetsList = split(supportedAssetsStr, "_")
209211
210212 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
211213 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
212214 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
213215 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
214216 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
215217 let rewardCachedPartKEY = keyReward(userAddress, assetId)
216218 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
217219 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
218220 }
219221
220222
221223 func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
222224
223225
224226 func findElementPosition (src,element,sep) = {
225227 let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
226228 if ((elementStart == 0))
227229 then 0
228230 else {
229231 let left = take(src, elementStart)
230232 (size(split(left, sep)) - 1)
231233 }
232234 }
233235
234236
235237 let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
236238
237239 let defaultTotalsDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
238240
241+func padList (in) = {
242+ let currSize = (size(in) - 1)
243+ func listPadder (acc,idx) = if ((currSize > idx))
244+ then acc
245+ else (acc :+ "0")
246+
247+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
248+ let $s = size($l)
249+ let $acc0 = in
250+ func $f0_1 ($a,$i) = if (($i >= $s))
251+ then $a
252+ else listPadder($a, $l[$i])
253+
254+ func $f0_2 ($a,$i) = if (($i >= $s))
255+ then $a
256+ else throw("List size exceeds 18")
257+
258+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18)
259+ }
260+
261+
262+func padString (in) = {
263+ let currSize = (size(split_4C(in, SEP)) - 1)
264+ func strPadder (acc,idx) = if ((currSize > idx))
265+ then acc
266+ else (acc + "__0")
267+
268+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
269+ let $s = size($l)
270+ let $acc0 = in
271+ func $f0_1 ($a,$i) = if (($i >= $s))
272+ then $a
273+ else strPadder($a, $l[$i])
274+
275+ func $f0_2 ($a,$i) = if (($i >= $s))
276+ then $a
277+ else throw("List size exceeds 18")
278+
279+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18)
280+ }
281+
282+
239283 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
240284 let stakedAmountX = toBigInt(stakedAmount)
241285 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
242286 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
243287 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
244288 func forEachAssetCacheUserReward (accum,asset) = {
245- let $t095209655 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
246- let rewardTotal = $t095209655._1
247- let cached = $t095209655._2
248- let dynamic = $t095209655._3
249- let rewardCachedPartKEY = $t095209655._4
289+ let $t01026010395 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
290+ let rewardTotal = $t01026010395._1
291+ let cached = $t01026010395._2
292+ let dynamic = $t01026010395._3
293+ let rewardCachedPartKEY = $t01026010395._4
250294 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
251295 }
252296
253297 if (if ((depositNumLast == -1))
254298 then (depositNumUser == -1)
255299 else false)
256300 then nil
257301 else if (if ((depositNumLast == -1))
258302 then (depositNumUser > -1)
259303 else false)
260304 then throw("invalid depositNumLast and depositNumUser state")
261305 else if (if ((depositNumLast > -1))
262306 then (depositNumUser >= -1)
263307 else false)
264308 then if (isNewUser)
265309 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
266310 else ({
267311 let $l = supportedAssetsList
268312 let $s = size($l)
269313 let $acc0 = nil
270314 func $f0_1 ($a,$i) = if (($i >= $s))
271315 then $a
272316 else forEachAssetCacheUserReward($a, $l[$i])
273317
274318 func $f0_2 ($a,$i) = if (($i >= $s))
275319 then $a
276320 else throw("List size exceeds 9")
277321
278322 $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)
279323 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
280324 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
281325 }
282326
283327
284328 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
285329 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
286330 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
287331 IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))
288332 }
289333
290334
291335 func commonClaim (userAddress,i) = {
292336 let userAddressStr = toString(userAddress)
293337 if ((size(i.payments) > 0))
294338 then throw("payments are not accepted")
295339 else {
296- let $t01259612701 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
297- let isNewUser = $t01259612701._1
298- let stakedAmount = $t01259612701._2
299- let stakingStart = $t01259612701._3
340+ let $t01333613441 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
341+ let isNewUser = $t01333613441._1
342+ let stakedAmount = $t01333613441._2
343+ let stakingStart = $t01333613441._3
300344 let stakedAmountX = toBigInt(stakedAmount)
301345 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
302346 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
303347 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
304348 func forEachAssetCalcUnclaimedReward (accum,asset) = {
305- let $t01307213210 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
306- let rewardTotal = $t01307213210._1
307- let cached = $t01307213210._2
308- let dynamic = $t01307213210._3
309- let rewardCachedPartKEY = $t01307213210._4
349+ let $t01381213950 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
350+ let rewardTotal = $t01381213950._1
351+ let cached = $t01381213950._2
352+ let dynamic = $t01381213950._3
353+ let rewardCachedPartKEY = $t01381213950._4
310354 let claimedKEY = keyClaimed(userAddressStr, asset)
311- let $t01327013307 = accum
312- let data = $t01327013307._1
313- let claimedAmtByAsset = $t01327013307._2
355+ let $t01401014047 = accum
356+ let data = $t01401014047._1
357+ let claimedAmtByAsset = $t01401014047._2
314358 let newPart = makeString([asset, toString(rewardTotal)], ":")
315359 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
316360 if ((0 >= rewardTotal))
317361 then $Tuple2(data, claimedAmtByAssetNew)
318362 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
319363 }
320364
321- let $t01376713880 = {
365+ let $t01450714620 = {
322366 let $l = supportedAssetsList
323367 let $s = size($l)
324368 let $acc0 = $Tuple2(nil, "")
325369 func $f0_1 ($a,$i) = if (($i >= $s))
326370 then $a
327371 else forEachAssetCalcUnclaimedReward($a, $l[$i])
328372
329373 func $f0_2 ($a,$i) = if (($i >= $s))
330374 then $a
331375 else throw("List size exceeds 9")
332376
333377 $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)
334378 }
335- let transfers = $t01376713880._1
336- let claimedAmtByAssetResult = $t01376713880._2
379+ let transfers = $t01450714620._1
380+ let claimedAmtByAssetResult = $t01450714620._2
337381 if ((0 >= size(transfers)))
338382 then $Tuple2(nil, 0)
339383 else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
340384 }
341385 }
342386
343387
344388 @Callable(i)
345389 func constructorV1 (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
346390 then throw("Permission denied")
347391 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
348392
349393
350394
351395 @Callable(i)
352396 func stake () = {
353- let $t01473114793 = getParamsOrFail()
354- let bondAssetId = $t01473114793._1
355- let minLockAmount = $t01473114793._2
356- let halfLife = $t01473114793._3
397+ let $t01547115533 = getParamsOrFail()
398+ let bondAssetId = $t01547115533._1
399+ let minLockAmount = $t01547115533._2
400+ let halfLife = $t01547115533._3
357401 if ((size(i.payments) != 1))
358402 then throw("Invalid payments size")
359403 else {
360404 let payment = i.payments[0]
361405 let amount = payment.amount
362406 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
363407 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
364408 if ((assetId != bondAssetId))
365409 then throw(invalidAssetMessage)
366410 else {
367411 let userAddress = i.caller
368412 let userAddressStr = toString(i.caller)
369- let $t01533515442 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
370- let isNewUser = $t01533515442._1
371- let lockAmount = $t01533515442._2
372- let lockStartHeight = $t01533515442._3
413+ let $t01607516182 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
414+ let isNewUser = $t01607516182._1
415+ let lockAmount = $t01607516182._2
416+ let lockStartHeight = $t01607516182._3
373417 let mergedAmount = if (isNewUser)
374418 then amount
375419 else (amount + lockAmount)
376420 let mergedStartHeight = if (isNewUser)
377421 then height
378422 else asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
379423 if ((minLockAmount > mergedAmount))
380424 then throw(("Min lock amount is " + toString(minLockAmount)))
381425 else {
382- let $t01580315905 = StatsResult(amount, 1, if (isNewUser)
426+ let $t01654316645 = StatsResult(amount, 1, if (isNewUser)
383427 then 1
384428 else 0)
385- let statsEntries = $t01580315905._1
386- let totalStaked = $t01580315905._2
387- let totalStakedNew = $t01580315905._3
429+ let statsEntries = $t01654316645._1
430+ let totalStaked = $t01654316645._2
431+ let totalStakedNew = $t01654316645._3
388432 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
389433 }
390434 }
391435 }
392436 }
393437
394438
395439
396440 @Callable(i)
397441 func unstake (amount) = if ((size(i.payments) != 0))
398442 then throw("unstake doesn't require any payment")
399443 else {
400444 let userAddress = i.caller
401445 let userAddressStr = toString(userAddress)
402- let $t01639116453 = getParamsOrFail()
403- let bondAssetId = $t01639116453._1
404- let minLockAmount = $t01639116453._2
405- let halfLife = $t01639116453._3
406- let $t01645616530 = getUserParamsOrFail(userAddress)
407- let isNewUser = $t01645616530._1
408- let lockAmount = $t01645616530._2
409- let lockStart = $t01645616530._3
446+ let $t01713117193 = getParamsOrFail()
447+ let bondAssetId = $t01713117193._1
448+ let minLockAmount = $t01713117193._2
449+ let halfLife = $t01713117193._3
450+ let $t01719617270 = getUserParamsOrFail(userAddress)
451+ let isNewUser = $t01719617270._1
452+ let lockAmount = $t01719617270._2
453+ let lockStart = $t01719617270._3
410454 if ((0 >= lockAmount))
411455 then throw("Nothing to unstake")
412456 else if ((amount > lockAmount))
413457 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
414458 else {
415459 let t = value(blockInfoByHeight(height)).timestamp
416460 let releaseTime = valueOrElse(getInteger(govContract, keyUserGnsbtReleaseTime(userAddressStr)), 0)
417461 if ((releaseTime >= t))
418462 then throw(("Your gNsbt are taking part in voting, cannot unstake until " + toString(releaseTime)))
419463 else {
420464 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
421- let $t01717117325 = StatsResult(-(amount), if ((amount == lockAmount))
465+ let $t01791118065 = StatsResult(-(amount), if ((amount == lockAmount))
422466 then -1
423467 else 0, if ((amount == lockAmount))
424468 then -1
425469 else 0)
426- let statsEntries = $t01717117325._1
427- let totalStaked = $t01717117325._2
428- let totalStakedNew = $t01717117325._3
470+ let statsEntries = $t01791118065._1
471+ let totalStaked = $t01791118065._2
472+ let totalStakedNew = $t01791118065._3
429473 ((([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)
430474 }
431475 }
432476 }
433477
434478
435479
436480 @Callable(i)
437481 func deposit () = {
438482 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
439483 if ((0 > totalStaked))
440484 then throw("TODO: case is not supported")
441485 else {
442486 let depositNumLastKEY = keyDepositNumLast()
443487 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
444488 let depositNumNew = (depositNumLast + 1)
445489 let totalsKEY = keyStatsDepositAmtTotals()
446490 let byDayKEY = keyStatsDepositAmtByDay(toStartOfDay(lastBlock.timestamp))
447- let currTotals = split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP)
448- let currByDay = split(valueOrElse(getString(byDayKEY), defaultTotalsDATA), SEP)
491+ let currTotals = padList(split(valueOrElse(getString(totalsKEY), defaultTotalsDATA), SEP))
449492 func dep (acc,pmt) = {
450493 let amount = pmt.amount
451494 let pmtAssetIdStr = toBase58String(valueOrElse(pmt.assetId, WAVESID))
452495 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
453496 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
454497 else if ((totalStaked == 0))
455498 then $Tuple4((acc._1 :+ IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)), (acc._2 :+ pmtAssetIdStr), (acc._3 :+ toBigInt(0)), (acc._4 :+ amount))
456499 else {
457500 let rewardPerNsbtX18 = fraction(toBigInt(amount), MULTX18, toBigInt(totalStaked))
458501 $Tuple4(acc._1, (acc._2 :+ pmtAssetIdStr), (acc._3 :+ rewardPerNsbtX18), (acc._4 :+ amount))
459502 }
460503 }
461504
462505 let pmtsResult = {
463506 let $l = i.payments
464507 let $s = size($l)
465508 let $acc0 = $Tuple4(nil, nil, nil, nil)
466509 func $f0_1 ($a,$i) = if (($i >= $s))
467510 then $a
468511 else dep($a, $l[$i])
469512
470513 func $f0_2 ($a,$i) = if (($i >= $s))
471514 then $a
472515 else throw("List size exceeds 10")
473516
474517 $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)
475518 }
476519 func refreshRewardUpdateTotals (accum,nextAsset) = {
477- let k = accum._4
520+ let k = accum._3
478521 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
479522 let idx = indexOf(pmtsResult._2, nextAsset)
480523 let sum = if (isDefined(idx))
481524 then {
482525 let j = value(idx)
483526 let statsDelta = pmtsResult._4[j]
484- $Tuple3(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)), toString((parseIntValue(currByDay[(k + 1)]) + statsDelta)))
527+ $Tuple2(toString((parseBigIntValue(sumLastStr) + pmtsResult._3[j])), toString((parseIntValue(currTotals[(k + 1)]) + statsDelta)))
485528 }
486- else $Tuple3(sumLastStr, currTotals[(k + 1)], currByDay[(k + 1)])
487- $Tuple4((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), ((accum._3 + SEP) + sum._3), (k + 1))
529+ else $Tuple2(sumLastStr, currTotals[(k + 1)])
530+ $Tuple3((accum._1 :+ StringEntry(keyRewardPerNsbtSumAt(depositNumNew, nextAsset), sum._1)), ((accum._2 + SEP) + sum._2), (k + 1))
488531 }
489532
490533 let assetsResult = {
491534 let $l = supportedAssetsList
492535 let $s = size($l)
493- let $acc0 = $Tuple4(nil, DepositTotalsPREFIX, DepositTotalsPREFIX, 0)
536+ let $acc0 = $Tuple3(nil, DepositTotalsPREFIX, 0)
494537 func $f1_1 ($a,$i) = if (($i >= $s))
495538 then $a
496539 else refreshRewardUpdateTotals($a, $l[$i])
497540
498541 func $f1_2 ($a,$i) = if (($i >= $s))
499542 then $a
500543 else throw("List size exceeds 9")
501544
502545 $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)
503546 }
504- $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, assetsResult._2)) :+ StringEntry(byDayKEY, assetsResult._3)), depositNumNew)
547+ let totals = padString(assetsResult._2)
548+ $Tuple2(((((pmtsResult._1 ++ assetsResult._1) :+ IntegerEntry(depositNumLastKEY, depositNumNew)) :+ StringEntry(totalsKEY, totals)) :+ StringEntry(byDayKEY, totals)), depositNumNew)
505549 }
506550 }
507551
508552
509553
510554 @Callable(i)
511555 func claimRewards () = commonClaim(i.caller, i)
512556
513557
514558
515559 @Callable(i)
516560 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
517561
518562
519563
520564 @Callable(i)
521565 func unclaimedRewardsREADONLY (userAddressStr) = {
522566 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
523567
524568 let unclaimedRewardStr = if ((userAddressStr == ""))
525569 then {
526570 let $l = supportedAssetsList
527571 let $s = size($l)
528572 let $acc0 = ""
529573 func $f0_1 ($a,$i) = if (($i >= $s))
530574 then $a
531575 else forEachAssetZeroReward($a, $l[$i])
532576
533577 func $f0_2 ($a,$i) = if (($i >= $s))
534578 then $a
535579 else throw("List size exceeds 9")
536580
537581 $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)
538582 }
539583 else {
540584 let userAddress = addressFromStringValue(userAddressStr)
541- let $t02125621361 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
542- let isNewUser = $t02125621361._1
543- let stakedAmount = $t02125621361._2
544- let stakingStart = $t02125621361._3
585+ let $t02191422019 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
586+ let isNewUser = $t02191422019._1
587+ let stakedAmount = $t02191422019._2
588+ let stakingStart = $t02191422019._3
545589 let stakedAmountX = toBigInt(stakedAmount)
546590 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
547591 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
548592 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
549593 func forEachAssetCalcUnclaimedReward (accum,asset) = {
550- let $t02170721845 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
551- let rewardTotal = $t02170721845._1
552- let cached = $t02170721845._2
553- let dynamic = $t02170721845._3
554- let rewardCachedPartKEY = $t02170721845._4
594+ let $t02236522503 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
595+ let rewardTotal = $t02236522503._1
596+ let cached = $t02236522503._2
597+ let dynamic = $t02236522503._3
598+ let rewardCachedPartKEY = $t02236522503._4
555599 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
556600 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
557601 }
558602
559603 let $l = supportedAssetsList
560604 let $s = size($l)
561605 let $acc0 = ""
562606 func $f0_1 ($a,$i) = if (($i >= $s))
563607 then $a
564608 else forEachAssetCalcUnclaimedReward($a, $l[$i])
565609
566610 func $f0_2 ($a,$i) = if (($i >= $s))
567611 then $a
568612 else throw("List size exceeds 9")
569613
570614 $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)
571615 }
572616 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
573617 }
574618
575619
576620
577621 @Callable(i)
578622 func nsbtUnstakingSYSREADONLY (userAddressStrOrEmpty,unstakeAmtP) = {
579623 let resultArray = if ((userAddressStrOrEmpty == ""))
580624 then [0, 0, 0, 0]
581625 else {
582626 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
583627 let cfgDATA = getParamsOrFail()
584628 let nsbtAssetId = cfgDATA._1
585629 let minLockAmount = cfgDATA._2
586630 let halfLife = cfgDATA._3
587631 let userDATA = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
588632 let isNewUser = userDATA._1
589633 let stakedAmount = userDATA._2
590634 let lockStart = userDATA._3
591635 let unstakeAmt = if ((unstakeAmtP > stakedAmount))
592636 then stakedAmount
593637 else unstakeAmtP
594638 let stakedAmountNEW = (stakedAmount - unstakeAmt)
595639 let comissionAmount = if ((unstakeAmt == 0))
596640 then 0
597641 else asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
598642 let receiveAmount = (unstakeAmt - comissionAmount)
599643 [stakedAmount, stakedAmountNEW, receiveAmount, comissionAmount]
600644 }
601645 $Tuple2(nil, resultArray)
602646 }
603647
604648
605649
606650 @Callable(i)
607651 func nsbtStakingSYSREADONLY (userAddressStr,nsbtDiff) = {
608652 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
609653 if ((userAddressStr == ""))
610654 then $Tuple2(nil, [0, totalNsbtAmt, 0])
611655 else {
612656 let userAddress = toAddressOrFail(userAddressStr)
613- let $t02352323627 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
614- let isNewUser = $t02352323627._1
615- let userNsbtAmt = $t02352323627._2
616- let stakingStart = $t02352323627._3
657+ let $t02418124285 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
658+ let isNewUser = $t02418124285._1
659+ let userNsbtAmt = $t02418124285._2
660+ let stakingStart = $t02418124285._3
617661 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
618662 }
619663 }
620664
621665
622666 @Verifier(tx)
623667 func verify () = {
624668 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
625669 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
626670 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
627671 then 1
628672 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
629673 then 1
630674 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
631675 then 1
632676 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
633677 then 2
634678 else 0))
635679 (count >= 3)
636680 }
637681

github/deemru/w8io/3ef1775 
557.16 ms