tx · D6L5WcUmog4UibX8igseNPQXbpBvuFbqmhcrZ5dWfzNd

3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch:  -0.02300000 Waves

2024.06.04 17:04 [3136052] smart account 3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch > SELF 0.00000000 Waves

{ "type": 13, "id": "D6L5WcUmog4UibX8igseNPQXbpBvuFbqmhcrZ5dWfzNd", "fee": 2300000, "feeAssetId": null, "timestamp": 1717509856305, "version": 2, "chainId": 84, "sender": "3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch", "senderPublicKey": "3xjN6fjYDXBGUE1mcRw2Fvr4R6tEZnuJA98QFGF99sXd", "proofs": [ "2g8sRCDHgx3mK8j1hhnM6P47Vq9g1x81giuDPk5DBHswwE2wz5UN1yDHtoXwFqUXPnS6SRcCHHYerjXP2RyDDWpt" ], "script": "base64:CAIsCAISBAoCCAgSBQoDCAgBEgUKAwgIARIGCgQBCAgBEgMKAQISABIFCgMIAQg/AAdJTlRfTUFYAP//////////fwAFV0FWRVMAgMLXLwALTUlOX0JBTEFOQ0UJAGgCAKCcAQUFV0FWRVMAA1NFUAIBLAAPQkxPQ0tfSEFTSF9TSVpFACAADEFERFJFU1NfU0laRQAaABB0aGlzRXBvY2hEYXRhS2V5Ag10aGlzRXBvY2hEYXRhAAxhbGxNaW5lcnNLZXkCCWFsbE1pbmVycwAObWFpbkNoYWluSWRLZXkCC21haW5DaGFpbklkAA5sYXN0Q2hhaW5JZEtleQILbGFzdENoYWluSWQAF2ZpcnN0VmFsaWRBbHRDaGFpbklkS2V5AhRmaXJzdFZhbGlkQWx0Q2hhaW5JZAAObWluZXJSZXdhcmRLZXkCC21pbmVyUmV3YXJkABlzdGFraW5nQ29udHJhY3RBZGRyZXNzS2V5AhZzdGFraW5nQ29udHJhY3RBZGRyZXNzAApibG9ja01ldGFLAghibG9ja18weAEDcGFkAQFpBAFzCQCkAwEFAWkEByRtYXRjaDAJALECAQUBcwMJAAACAAEFByRtYXRjaDAJAKwCAgIHMDAwMDAwMAUBcwMJAAACAAIFByRtYXRjaDAJAKwCAgIGMDAwMDAwBQFzAwkAAAIAAwUHJG1hdGNoMAkArAICAgUwMDAwMAUBcwMJAAACAAQFByRtYXRjaDAJAKwCAgIEMDAwMAUBcwMJAAACAAUFByRtYXRjaDAJAKwCAgIDMDAwBQFzAwkAAAIABgUHJG1hdGNoMAkArAICAgIwMAUBcwMJAAACAAcFByRtYXRjaDAJAKwCAgIBMAUBcwUBcwEMZXBvY2hNZXRhS2V5AQVlcG9jaAkArAICAgZlcG9jaF8JAQNwYWQBBQVlcG9jaAEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBB2NoYWluSWQJAKwCAgkArAICAgVjaGFpbgkApAMBBQdjaGFpbklkAgpGaXJzdEJsb2NrAQxjaGFpbk1ldGFLZXkBB2NoYWluSWQJAKwCAgIGY2hhaW5fCQEDcGFkAQUHY2hhaW5JZAESY2hhaW5MYXN0SGVpZ2h0S2V5AgdjaGFpbklkBW1pbmVyCQCsAgIJAKwCAgkArAICAgZjaGFpbl8JAQNwYWQBBQdjaGFpbklkAgFfCQClCAEFBW1pbmVyAQ1zdXBwb3J0ZXJzS2V5AQdjaGFpbklkCQCsAgIJAKwCAgIFY2hhaW4JAKQDAQUHY2hhaW5JZAIKU3VwcG9ydGVycwEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQltaW5lckFkZHIJAKwCAgkArAICAgZtaW5lcl8FCW1pbmVyQWRkcgIOX1Jld2FyZEFkZHJlc3MBCm1pbmVyUGtLZXkBDXJld2FyZEFkZHJlc3MJAKwCAgkArAICAghtaW5lcl8weAUNcmV3YXJkQWRkcmVzcwIDX1BLAQ9taW5lckNoYWluSWRLZXkBBW1pbmVyCQCsAgIJAKwCAgIGbWluZXJfCQClCAEFBW1pbmVyAghfQ2hhaW5JZAAWc3Rha2luZ0NvbnRyYWN0QWRkcmVzcwQHJG1hdGNoMAkAnQgCBQR0aGlzBRlzdGFraW5nQ29udHJhY3RBZGRyZXNzS2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXMJAKwCAgIiaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3M6IAUBcwkBB0FkZHJlc3MBCQERQGV4dHJOYXRpdmUoMTA1MikCBQR0aGlzBRlzdGFraW5nQ29udHJhY3RBZGRyZXNzS2V5ARFnZW5lcmF0aW5nQmFsYW5jZQEHYWRkcmVzcwQHJG1hdGNoMAkAnQgCBRZzdGFraW5nQ29udHJhY3RBZGRyZXNzCQCsAgICBCVzX18JAKUIAQUHYWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA3N0cgUHJG1hdGNoMAQJcGFyYW1MaXN0CQC1CQIFA3N0cgICX18ECnByZXZIZWlnaHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlwYXJhbUxpc3QAAQQLcHJldkJhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlwYXJhbUxpc3QAAgQKbmV4dEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCXBhcmFtTGlzdAADBAtuZXh0QmFsYW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCXBhcmFtTGlzdAAEAwkAZwIFBmhlaWdodAUKbmV4dEhlaWdodAULbmV4dEJhbGFuY2UDCQBnAgUGaGVpZ2h0BQpwcmV2SGVpZ2h0BQtwcmV2QmFsYW5jZQAAAAABCWNoYWluTWV0YQEHY2hhaW5JZAQBcwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBDGNoYWluTWV0YUtleQEFB2NoYWluSWQEBWl0ZW1zCQC1CQIFAXMFA1NFUAkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFaXRlbXMAAAkAkQMCBQVpdGVtcwABAAttYWluQ2hhaW5JZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ5tYWluQ2hhaW5JZEtleQAAAAskdDAyNzgwMjg0NgkBCWNoYWluTWV0YQEFC21haW5DaGFpbklkAA9tYWluQ2hhaW5IZWlnaHQIBQskdDAyNzgwMjg0NgJfMQASbWFpbkNoYWluTGFzdEJsb2NrCAULJHQwMjc4MDI4NDYCXzIBCWVwb2NoTWV0YQEFZXBvY2gEByRtYXRjaDAJAKIIAQkBDGVwb2NoTWV0YUtleQEFBWVwb2NoAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAQJZnJhZ21lbnRzCQC1CQIFAXMFA1NFUAkAlQoDCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFCWZyYWdtZW50cwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZnJhZ21lbnRzAAEJAJEDAgUJZnJhZ21lbnRzAAIFBHVuaXQACyR0MDMwNzgzNTQyBAckbWF0Y2gwCQEJZXBvY2hNZXRhAQUGaGVpZ2h0AwkAAQIFByRtYXRjaDACFihBZGRyZXNzLCBJbnQsIFN0cmluZykEAW0FByRtYXRjaDAFAW0EByRtYXRjaDEJAKIIAQUQdGhpc0Vwb2NoRGF0YUtleQMJAAECBQckbWF0Y2gxAgZTdHJpbmcEEHJhd1RoaXNFcG9jaERhdGEFByRtYXRjaDEEDXRoaXNFcG9jaERhdGEJALUJAgUQcmF3VGhpc0Vwb2NoRGF0YQUDU0VQBAl0aGlzRXBvY2gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ10aGlzRXBvY2hEYXRhAAAJAJUKAwMJAAACBQl0aGlzRXBvY2gFBmhlaWdodAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQ10aGlzRXBvY2hEYXRhAAEFBHVuaXQAAAIACQCVCgMFBHVuaXQAAAIAAA50aGlzRXBvY2hNaW5lcggFCyR0MDMwNzgzNTQyAl8xAAx0aGlzRXBvY2hSZWYIBQskdDAzMDc4MzU0MgJfMgASdGhpc0Vwb2NoTGFzdEJsb2NrCAULJHQwMzA3ODM1NDICXzMADGFsbE1pbmVyc1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBBQxhbGxNaW5lcnNLZXkCAAAJYWxsTWluZXJzBAckbWF0Y2gwBQxhbGxNaW5lcnNTdHIDCQAAAgIABQckbWF0Y2gwBQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANyYXcFByRtYXRjaDAJALwJAgUDcmF3BQNTRVAJAAIBAgtNYXRjaCBlcnJvcgEJYmxvY2tNZXRhAQdibG9ja0lkBARtZXRhCQERQGV4dHJOYXRpdmUoMTA1NykBCQCsAgIFCmJsb2NrTWV0YUsFB2Jsb2NrSWQEC2Jsb2NrSGVpZ2h0CQCxCQEFBG1ldGEECmJsb2NrRXBvY2gJALIJAgUEbWV0YQAIBAtibG9ja1BhcmVudAkAyQECCQDKAQIFBG1ldGEAEAUPQkxPQ0tfSEFTSF9TSVpFBA5ibG9ja0dlbmVyYXRvcgkAzAECBQRtZXRhBQxBRERSRVNTX1NJWkUJAJYKBAULYmxvY2tIZWlnaHQFCmJsb2NrRXBvY2gFC2Jsb2NrUGFyZW50BQ5ibG9ja0dlbmVyYXRvcgEMbGFzdEhlaWdodEJ5AgVtaW5lcgdjaGFpbklkBAckbWF0Y2gwCQCfCAEJARJjaGFpbkxhc3RIZWlnaHRLZXkCBQdjaGFpbklkBQVtaW5lcgMJAAECBQckbWF0Y2gwAgNJbnQEAWgFByRtYXRjaDAFAWgECWJsb2NrSGFzaAkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICCQCsAgIJAKwCAgIFY2hhaW4JAKQDAQUHY2hhaW5JZAILTGFzdE1pbmVkQnkJAKUIAQUFbWluZXIICQEJYmxvY2tNZXRhAQUJYmxvY2tIYXNoAl8xAAskdDA0MzAyNTI2OAQJaGl0U291cmNlBAckbWF0Y2gwCAUJbGFzdEJsb2NrA3ZyZgMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAN2cmYFByRtYXRjaDAFA3ZyZggFCWxhc3RCbG9jaxNnZW5lcmF0aW9uU2lnbmF0dXJlCgEMcHJvY2Vzc01pbmVyAgRwcmV2BW1pbmVyBAskdDA0NjAwNDY2MwUEcHJldgQJcHJldkRlbGF5CAULJHQwNDYwMDQ2NjMCXzEECXByZXZNaW5lcggFCyR0MDQ2MDA0NjYzAl8yBBBwcmV2VG90YWxCYWxhbmNlCAULJHQwNDYwMDQ2NjMCXzMECnByZXZNaW5lcnMIBQskdDA0NjAwNDY2MwJfNAQMbWluZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQVtaW5lcgQPd2F2ZXNHZW5CYWxhbmNlCAkA7wcBBQxtaW5lckFkZHJlc3MKZ2VuZXJhdGluZwQMbWluZXJCYWxhbmNlCQERZ2VuZXJhdGluZ0JhbGFuY2UBBQxtaW5lckFkZHJlc3MDAwkAZgIFC01JTl9CQUxBTkNFBQ93YXZlc0dlbkJhbGFuY2UGCQBnAgAABQxtaW5lckJhbGFuY2UFBHByZXYECW5leHREZWxheQkAhQcCBQxtaW5lckFkZHJlc3MFDG1pbmVyQmFsYW5jZQMJAGYCBQlwcmV2RGVsYXkFCW5leHREZWxheQkAlgoEBQluZXh0RGVsYXkFBW1pbmVyCQBkAgUQcHJldlRvdGFsQmFsYW5jZQUMbWluZXJCYWxhbmNlCQDNCAIFCnByZXZNaW5lcnMFBW1pbmVyCQCWCgQFCXByZXZEZWxheQUJcHJldk1pbmVyCQBkAgUQcHJldlRvdGFsQmFsYW5jZQUMbWluZXJCYWxhbmNlCQDNCAIFCnByZXZNaW5lcnMFBW1pbmVyCgACJGwFCWFsbE1pbmVycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAUHSU5UX01BWAIAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMcHJvY2Vzc01pbmVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIADWNvbXB1dGVkRGVsYXkIBQskdDA0MzAyNTI2OAJfMQARY29tcHV0ZWRHZW5lcmF0b3IIBQskdDA0MzAyNTI2OAJfMgAUY29tcHV0ZWRUb3RhbEJhbGFuY2UIBQskdDA0MzAyNTI2OAJfMwAOZmlsdGVyZWRNaW5lcnMIBQskdDA0MzAyNTI2OAJfNAETZ2V0Q2hhaW5MYXN0QmxvY2tJZAEHY2hhaW5JZAgJAQljaGFpbk1ldGEBBQdjaGFpbklkAl8yAAskdDA1MzM0NTQzNgkBCWJsb2NrTWV0YQEFEm1haW5DaGFpbkxhc3RCbG9jawAHaWdub3JlZAgFCyR0MDUzMzQ1NDM2Al8xAA5tYWluQ2hhaW5FcG9jaAgFCyR0MDUzMzQ1NDM2Al8yABNtYWluQ2hhaW5QYXJlbnRIYXNoCAULJHQwNTMzNDU0MzYCXzMAEm1haW5DaGFpbkdlbmVyYXRvcggFCyR0MDUzMzQ1NDM2Al80AAskdDA1NDM4NjQ4OQQLb2Zmc2V0c18xMDAJALwJAgJkOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OgIABAtoYWxmQmFsYW5jZQkAaQIFFGNvbXB1dGVkVG90YWxCYWxhbmNlAAIKAQRzdGVwAgRwcmV2BG5leHQECyR0MDU3NTQ1ODE4BQRwcmV2BAl0aGlzRXBvY2gIBQskdDA1NzU0NTgxOAJfMQQMdG90YWxCYWxhbmNlCAULJHQwNTc1NDU4MTgCXzIEDm1heWJlU2FmZUVwb2NoCAULJHQwNTc1NDU4MTgCXzMECnByZXZNaW5lcnMIBQskdDA1NzU0NTgxOAJfNAQHJG1hdGNoMAUObWF5YmVTYWZlRXBvY2gDCQABAgUHJG1hdGNoMAIEVW5pdAQLJHQwNTg3NjU5NDQJAQV2YWx1ZQEJAQllcG9jaE1ldGEBBQl0aGlzRXBvY2gEBW1pbmVyCAULJHQwNTg3NjU5NDQCXzEECXByZXZFcG9jaAgFCyR0MDU4NzY1OTQ0Al8yBA1sYXN0QmxvY2tIYXNoCAULJHQwNTg3NjU5NDQCXzMECyR0MDU5NTM2MTQ5AwkBD2NvbnRhaW5zRWxlbWVudAIFCnByZXZNaW5lcnMFBW1pbmVyCQCUCgIFDHRvdGFsQmFsYW5jZQUKcHJldk1pbmVycwkAlAoCCQBkAgUMdG90YWxCYWxhbmNlCQERZ2VuZXJhdGluZ0JhbGFuY2UBBQVtaW5lcgkAzAgCBQVtaW5lcgUKcHJldk1pbmVycwQPbmV3VG90YWxCYWxhbmNlCAULJHQwNTk1MzYxNDkCXzEECW5ld01pbmVycwgFCyR0MDU5NTM2MTQ5Al8yAwkAZwIFD25ld1RvdGFsQmFsYW5jZQULaGFsZkJhbGFuY2UJAJYKBAUJdGhpc0Vwb2NoBQ9uZXdUb3RhbEJhbGFuY2UJAJQKAgUJdGhpc0Vwb2NoBQ1sYXN0QmxvY2tIYXNoBQlhbGxNaW5lcnMJAJYKBAUJcHJldkVwb2NoBQ9uZXdUb3RhbEJhbGFuY2UFBHVuaXQFCW5ld01pbmVycwUEcHJldgQDcmVzCgACJGwJAM4IAgULb2Zmc2V0c18xMDAFC29mZnNldHNfMTAwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQ5tYWluQ2hhaW5FcG9jaAAABQR1bml0BQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBHN0ZXACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFUxpc3Qgc2l6ZSBleGNlZWRzIDIwMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkB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AKwCAgkArAICCQCsAgIJANgEAQgFCWdlbmVyYXRvcgVieXRlcwIbIGlzIG5vdCBhbGxvd2VkIHRvIG1pbmUgaW4gCQCkAwEFBmhlaWdodAIRIGVwb2NoLiBFeHBlY3RlZCAFEWNvbXB1dGVkR2VuZXJhdG9yBQR1bml0ARJpc1JlZmVyZW5jZUNvcnJlY3QCCXJlZmVyZW5jZQlsYXN0QmxvY2sDCQAAAgUJcmVmZXJlbmNlBQlsYXN0QmxvY2sFBHVuaXQJAAIBCQCsAgIJAKwCAgkArAICAjBFeHBlY3RlZCBhIHJlZmVyZW5jZSB0byB0aGUgY2hhaW4gbGFzdCBibG9jazogMHgFCWxhc3RCbG9jawIJLiBHb3Q6IDB4BQlyZWZlcmVuY2UBD2NoYWluSXNJbmFjdGl2ZQEHY2hhaW5JZAQMZmlyc3RCbG9ja0lkCQERQGV4dHJOYXRpdmUoMTA1NykBCQEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBBQdjaGFpbklkBBRmaXJzdFZhbGlkQWx0Q2hhaW5JZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRdmaXJzdFZhbGlkQWx0Q2hhaW5JZEtleQAAAwkAZgIFFGZpcnN0VmFsaWRBbHRDaGFpbklkBQdjaGFpbklkBgkAZgIICQEJYmxvY2tNZXRhAQUSZmluYWxpemVkQmxvY2tIYXNoAl8xCAkBCWJsb2NrTWV0YQEJANwEAQUMZmlyc3RCbG9ja0lkAl8xAQxtaW5lckNoYWluSWQBBW1pbmVyCQELdmFsdWVPckVsc2UCCQCfCAEJAQ9taW5lckNoYWluSWRLZXkBBQVtaW5lcgkAnwgBCQCsAgICCWNoYWluSWRPZgkApQgBBQVtaW5lcgEdZW5zdXJlRXhwZWN0ZWRPckluYWN0aXZlQ2hhaW4DCWdlbmVyYXRvcg9leHBlY3RlZENoYWluSWQQY2hlY2tIZWlnaHRCbG9jawQPaGVpZ2h0SXNDb3JyZWN0BAckbWF0Y2gwBRBjaGVja0hlaWdodEJsb2NrAwkAAQIFByRtYXRjaDACBlN0cmluZwQJYmxvY2tIYXNoBQckbWF0Y2gwBBRsYXN0TWluZWRCbG9ja0hlaWdodAkBDGxhc3RIZWlnaHRCeQIFCWdlbmVyYXRvcgULbWFpbkNoYWluSWQJAGYCCQBkAggJAQlibG9ja01ldGEBBQlibG9ja0hhc2gCXzEAAQUUbGFzdE1pbmVkQmxvY2tIZWlnaHQGBAckbWF0Y2gwCQEMbWluZXJDaGFpbklkAQUJZ2VuZXJhdG9yAwkAAQIFByRtYXRjaDACA0ludAQJY3VycmVudElkBQckbWF0Y2gwAwMJAAACBQljdXJyZW50SWQFD2V4cGVjdGVkQ2hhaW5JZAYDCQEPY2hhaW5Jc0luYWN0aXZlAQUJY3VycmVudElkBQ9oZWlnaHRJc0NvcnJlY3QHBQR1bml0CQACAQkArAICAhxtaW5lciBpcyBtaW5pbmcgb3RoZXIgY2hhaW4gCQCkAwEFCWN1cnJlbnRJZAUEdW5pdAESZW5zdXJlQ29ycmVjdEVwb2NoAQVlcG9jaAMJAAACBQVlcG9jaAUGaGVpZ2h0BQR1bml0CQACAQkArAICCQCsAgIJAKwCAgIaRXhwZWN0ZWQgYmxvY2sgZnJvbSBlcG9jaCAJAKQDAQUGaGVpZ2h0AgYuIEdvdCAJAKQDAQUFZXBvY2gBDGFkZFN1cHBvcnRlcgIHY2hhaW5JZAlnZW5lcmF0b3IEDXN1cHBvcnRlcnNTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQ1zdXBwb3J0ZXJzS2V5AQUHY2hhaW5JZAQKc3VwcG9ydGVycwkAvAkCBQ1zdXBwb3J0ZXJzU3RyBQNTRVADCQEPY29udGFpbnNFbGVtZW50AgUKc3VwcG9ydGVycwkApQgBBQlnZW5lcmF0b3IFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQENc3VwcG9ydGVyc0tleQEFB2NoYWluSWQJAKwCAgkArAICBQ1zdXBwb3J0ZXJzU3RyBQNTRVAJAKUIAQUJZ2VuZXJhdG9yBQNuaWwBEXZhbGlkYXRlQmxvY2tIYXNoAQZoZXhTdHIEDGRlY29kZWRCeXRlcwkA3QQBBQZoZXhTdHIDCQECIT0CCQDIAQEFDGRlY29kZWRCeXRlcwAgCQACAQIXaW52YWxpZCBibG9jayBpZCBsZW5ndGgFBmhleFN0cgcBaQELYXBwZW5kQmxvY2sCDGJsb2NrSGFzaEhleAxyZWZlcmVuY2VIZXgDCQECIT0CBQ50aGlzRXBvY2hNaW5lcggFAWkMb3JpZ2luQ2FsbGVyBAckbWF0Y2gwBQ50aGlzRXBvY2hNaW5lcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAplcG9jaE1pbmVyBQckbWF0Y2gwCQACAQkArAICAjlub3QgYWxsb3dlZCB0byBmb3JnZSBibG9ja3MgaW4gdGhpcyBlcG9jaCwgZXhwZWN0ZWQgZnJvbSAJAKUIAQUKZXBvY2hNaW5lcgkAAgECQG5vdCBhbGxvd2VkIHRvIGZvcmdlIGJsb2NrcyBpbiB0aGlzIGVwb2NoLCBlcG9jaCBtaW5lciBpcyBhYnNlbnQEB2NoYWluSWQJAQt2YWx1ZU9yRWxzZQIJAQxtaW5lckNoYWluSWQBCAUBaQxvcmlnaW5DYWxsZXIFC21haW5DaGFpbklkBAskdDA5ODA2OTg1NwkBCWNoYWluTWV0YQEFB2NoYWluSWQEC2NoYWluSGVpZ2h0CAULJHQwOTgwNjk4NTcCXzEEC2xhc3RCbG9ja0lkCAULJHQwOTgwNjk4NTcCXzIEDmNoZWNrUmVmZXJlbmNlCQESaXNSZWZlcmVuY2VDb3JyZWN0AgUMcmVmZXJlbmNlSGV4BQtsYXN0QmxvY2tJZAMJAAACBQ5jaGVja1JlZmVyZW5jZQUOY2hlY2tSZWZlcmVuY2UEDm5ld0NoYWluSGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQMbmV3QmxvY2tNZXRhCQDLAQIJAMsBAgkAywECCQCaAwEFDm5ld0NoYWluSGVpZ2h0CQCaAwEFBmhlaWdodAkA3QQBBQtsYXN0QmxvY2tJZAgIBQFpDG9yaWdpbkNhbGxlcgVieXRlcwQJYmxvY2tIYXNoCQERdmFsaWRhdGVCbG9ja0hhc2gBBQxibG9ja0hhc2hIZXgJAMwIAgkBC0JpbmFyeUVudHJ5AgkArAICBQpibG9ja01ldGFLBQxibG9ja0hhc2hIZXgFDG5ld0Jsb2NrTWV0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmNoYWluTGFzdEhlaWdodEtleQIFB2NoYWluSWQIBQFpDG9yaWdpbkNhbGxlcgUObmV3Q2hhaW5IZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGNoYWluTWV0YUtleQEFB2NoYWluSWQJAKwCAgkArAICCQCkAwEFDm5ld0NoYWluSGVpZ2h0BQNTRVAFDGJsb2NrSGFzaEhleAkAzAgCCQELU3RyaW5nRW50cnkCCQEMZXBvY2hNZXRhS2V5AQUGaGVpZ2h0CQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQkBBXZhbHVlAQUOdGhpc0Vwb2NoTWluZXIFA1NFUAkApAMBBQx0aGlzRXBvY2hSZWYFA1NFUAUMYmxvY2tIYXNoSGV4BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPZXh0ZW5kTWFpbkNoYWluAwxibG9ja0hhc2hIZXgMcmVmZXJlbmNlSGV4BWVwb2NoBApjaGVja0Vwb2NoCQESZW5zdXJlQ29ycmVjdEVwb2NoAQUFZXBvY2gDCQAAAgUKY2hlY2tFcG9jaAUKY2hlY2tFcG9jaAQOY2hlY2tHZW5lcmF0b3IJARFlbnN1cmVNaW5pbmdFcG9jaAEIBQFpDG9yaWdpbkNhbGxlcgMJAAACBQ5jaGVja0dlbmVyYXRvcgUOY2hlY2tHZW5lcmF0b3IECmNoZWNrQ2hhaW4JAR1lbnN1cmVFeHBlY3RlZE9ySW5hY3RpdmVDaGFpbgMIBQFpDG9yaWdpbkNhbGxlcgULbWFpbkNoYWluSWQFBHVuaXQDCQAAAgUKY2hlY2tDaGFpbgUKY2hlY2tDaGFpbgQOY2hlY2tSZWZlcmVuY2UJARJpc1JlZmVyZW5jZUNvcnJlY3QCBQxyZWZlcmVuY2VIZXgFEm1haW5DaGFpbkxhc3RCbG9jawMJAAACBQ5jaGVja1JlZmVyZW5jZQUOY2hlY2tSZWZlcmVuY2UEDXRoaXNFcG9jaE1ldGEEByRtYXRjaDAJAQllcG9jaE1ldGEBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIEVW5pdAkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUDU0VQCQCkAwEFDm1haW5DaGFpbkVwb2NoBQNTRVAFDGJsb2NrSGFzaEhleAQFb3RoZXIFByRtYXRjaDAJAAIBAhVFcG9jaCBhbHJlYWR5IHN0YXJ0ZWQEDm5ld0NoYWluSGVpZ2h0CQBkAgUPbWFpbkNoYWluSGVpZ2h0AAEEDG5ld0Jsb2NrTWV0YQkAywECCQDLAQIJAMsBAgkAmgMBBQ5uZXdDaGFpbkhlaWdodAkAmgMBBQZoZWlnaHQJAN0EAQUSbWFpbkNoYWluTGFzdEJsb2NrCAgFAWkMb3JpZ2luQ2FsbGVyBWJ5dGVzCQDMCAIJAQtCaW5hcnlFbnRyeQIJAKwCAgUKYmxvY2tNZXRhSwUMYmxvY2tIYXNoSGV4BQxuZXdCbG9ja01ldGEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGNoYWluTWV0YUtleQEFC21haW5DaGFpbklkCQCsAgIJAKwCAgkApAMBBQ5uZXdDaGFpbkhlaWdodAUDU0VQBQxibG9ja0hhc2hIZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9taW5lckNoYWluSWRLZXkBCAUBaQxvcmlnaW5DYWxsZXIFC21haW5DaGFpbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESY2hhaW5MYXN0SGVpZ2h0S2V5AgULbWFpbkNoYWluSWQIBQFpDG9yaWdpbkNhbGxlcgUObmV3Q2hhaW5IZWlnaHQJAMwIAgUNdGhpc0Vwb2NoTWV0YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXN0YXJ0QWx0Q2hhaW4DDGJsb2NrSGFzaEhleAxyZWZlcmVuY2VIZXgFZXBvY2gECmNoZWNrRXBvY2gJARJlbnN1cmVDb3JyZWN0RXBvY2gBBQVlcG9jaAMJAAACBQpjaGVja0Vwb2NoBQpjaGVja0Vwb2NoBA5jaGVja0dlbmVyYXRvcgkBEWVuc3VyZU1pbmluZ0Vwb2NoAQgFAWkMb3JpZ2luQ2FsbGVyAwkAAAIFDmNoZWNrR2VuZXJhdG9yBQ5jaGVja0dlbmVyYXRvcgQNJHQwMTE5MzcxMjAxNQkBCWJsb2NrTWV0YQEFDHJlZmVyZW5jZUhleAQOcmVmQ2hhaW5IZWlnaHQIBQ0kdDAxMTkzNzEyMDE1Al8xBAhyZWZFcG9jaAgFDSR0MDExOTM3MTIwMTUCXzIEBnJlZlJlZggFDSR0MDExOTM3MTIwMTUCXzMEDHJlZkdlbmVyYXRvcggFDSR0MDExOTM3MTIwMTUCXzQECGVwb2NoUmVmAwkAZwIFCHJlZkVwb2NoBQ5maW5hbGl6ZWRFcG9jaAUIcmVmRXBvY2gJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICI2NhbiBub3Qgc3RhcnQgYWx0IGNoYWluIGZyb20gZXBvY2ggCQCkAwEFCHJlZkVwb2NoAggsIGVwb2NoIAkApAMBBQ5maW5hbGl6ZWRFcG9jaAINIGlzIGZpbmFsaXplZAQKY2hlY2tDaGFpbgkBHWVuc3VyZUV4cGVjdGVkT3JJbmFjdGl2ZUNoYWluAwgFAWkMb3JpZ2luQ2FsbGVyBQttYWluQ2hhaW5JZAUMcmVmZXJlbmNlSGV4AwkAAAIFCmNoZWNrQ2hhaW4FCmNoZWNrQ2hhaW4ECm5ld0NoYWluSWQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFDmxhc3RDaGFpbklkS2V5AAAAAQQPcmVmZXJlbmNlSGVpZ2h0CAkBCWJsb2NrTWV0YQEFDHJlZmVyZW5jZUhleAJfMQQObmV3Q2hhaW5IZWlnaHQJAGQCBQ9yZWZlcmVuY2VIZWlnaHQAAQQMbmV3QmxvY2tNZXRhCQDLAQIJAMsBAgkAywECCQCaAwEFDm5ld0NoYWluSGVpZ2h0CQCaAwEFBmhlaWdodAkA3QQBBQxyZWZlcmVuY2VIZXgICAUBaQxvcmlnaW5DYWxsZXIFYnl0ZXMEDXRoaXNFcG9jaE1ldGEEByRtYXRjaDAJAQllcG9jaE1ldGEBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIEVW5pdAkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUDU0VQCQCkAwEFCGVwb2NoUmVmBQNTRVAFDGJsb2NrSGFzaEhleAQFb3RoZXIFByRtYXRjaDAJAAIBAhVFcG9jaCBhbHJlYWR5IHN0YXJ0ZWQJAMwIAgUNdGhpc0Vwb2NoTWV0YQkAzAgCCQELQmluYXJ5RW50cnkCCQCsAgIFCmJsb2NrTWV0YUsFDGJsb2NrSGFzaEhleAUMbmV3QmxvY2tNZXRhCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEFCm5ld0NoYWluSWQFDGJsb2NrSGFzaEhleAkAzAgCCQELU3RyaW5nRW50cnkCCQEMY2hhaW5NZXRhS2V5AQULbWFpbkNoYWluSWQJAKwCAgkArAICCQCkAwEFDm5ld0NoYWluSGVpZ2h0BQNTRVAFDGJsb2NrSGFzaEhleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD21pbmVyQ2hhaW5JZEtleQEIBQFpDG9yaWdpbkNhbGxlcgUKbmV3Q2hhaW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmNoYWluTGFzdEhlaWdodEtleQIFCm5ld0NoYWluSWQIBQFpDG9yaWdpbkNhbGxlcgUObmV3Q2hhaW5IZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARJjaGFpbkxhc3RIZWlnaHRLZXkCBQttYWluQ2hhaW5JZAgFAWkMb3JpZ2luQ2FsbGVyBQ9yZWZlcmVuY2VIZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDXN1cHBvcnRlcnNLZXkBBQpuZXdDaGFpbklkCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUObGFzdENoYWluSWRLZXkFCm5ld0NoYWluSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5leHRlbmRBbHRDaGFpbgQHY2hhaW5JZAxibG9ja0hhc2hIZXgMcmVmZXJlbmNlSGV4BWVwb2NoBApjaGVja0Vwb2NoCQESZW5zdXJlQ29ycmVjdEVwb2NoAQUFZXBvY2gDCQAAAgUKY2hlY2tFcG9jaAUKY2hlY2tFcG9jaAQOY2hlY2tHZW5lcmF0b3IJARFlbnN1cmVNaW5pbmdFcG9jaAEIBQFpDG9yaWdpbkNhbGxlcgMJAAACBQ5jaGVja0dlbmVyYXRvcgUOY2hlY2tHZW5lcmF0b3IECmNoZWNrQ2hhaW4JAR1lbnN1cmVFeHBlY3RlZE9ySW5hY3RpdmVDaGFpbgMIBQFpDG9yaWdpbkNhbGxlcgUHY2hhaW5JZAkA3AQBCAkBCWJsb2NrTWV0YQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEFB2NoYWluSWQCXzMDCQAAAgUKY2hlY2tDaGFpbgUKY2hlY2tDaGFpbgQNJHQwMTQxMTUxNDE2OQkBCWNoYWluTWV0YQEFB2NoYWluSWQEC2NoYWluSGVpZ2h0CAUNJHQwMTQxMTUxNDE2OQJfMQQOY2hhaW5MYXN0QmxvY2sIBQ0kdDAxNDExNTE0MTY5Al8yBA5jaGVja1JlZmVyZW5jZQkBEmlzUmVmZXJlbmNlQ29ycmVjdAIFDHJlZmVyZW5jZUhleAUOY2hhaW5MYXN0QmxvY2sDCQAAAgUOY2hlY2tSZWZlcmVuY2UFDmNoZWNrUmVmZXJlbmNlBA5uZXdDaGFpbkhlaWdodAkAZAIFC2NoYWluSGVpZ2h0AAEEDm1haW5DaGFpbkVudHJ5AwkAZgIJARFzdXBwb3J0aW5nQmFsYW5jZQEFB2NoYWluSWQJAGkCBRRjb21wdXRlZFRvdGFsQmFsYW5jZQACCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5tYWluQ2hhaW5JZEtleQUHY2hhaW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXZmlyc3RWYWxpZEFsdENoYWluSWRLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFDmxhc3RDaGFpbklkS2V5AAAAAQUDbmlsBQNuaWwEDXRoaXNFcG9jaE1ldGEEByRtYXRjaDAJAQllcG9jaE1ldGEBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIEVW5pdAkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKwCAgkArAICCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUDU0VQCQCkAwEICQEJYmxvY2tNZXRhAQUMcmVmZXJlbmNlSGV4Al8yBQNTRVAFDGJsb2NrSGFzaEhleAQFb3RoZXIFByRtYXRjaDAJAAIBAhVFcG9jaCBhbHJlYWR5IHN0YXJ0ZWQEHXVwZGF0ZU1haW5DaGFpbkxhc3RNaW5lZEJsb2NrAwMJAAACBQ5tYWluQ2hhaW5FbnRyeQUDbmlsCQECIT0CCQELdmFsdWVPckVsc2UCCQEMbWluZXJDaGFpbklkAQgFAWkMb3JpZ2luQ2FsbGVyAAAFB2NoYWluSWQHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESY2hhaW5MYXN0SGVpZ2h0S2V5AgULbWFpbkNoYWluSWQIBQFpDG9yaWdpbkNhbGxlcggJAQlibG9ja01ldGEBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBBQdjaGFpbklkAl8xBQNuaWwFA25pbAQMbmV3QmxvY2tNZXRhCQDLAQIJAMsBAgkAywECCQCaAwEFDm5ld0NoYWluSGVpZ2h0CQCaAwEFBmhlaWdodAkA3QQBBQxyZWZlcmVuY2VIZXgICAUBaQxvcmlnaW5DYWxsZXIFYnl0ZXMJAM4IAgkAzggCCQDOCAIJAMwIAgkBC0JpbmFyeUVudHJ5AgkArAICBQpibG9ja01ldGFLBQxibG9ja0hhc2hIZXgFDG5ld0Jsb2NrTWV0YQkAzAgCCQELU3RyaW5nRW50cnkCCQEMY2hhaW5NZXRhS2V5AQULbWFpbkNoYWluSWQJAKwCAgkArAICCQCkAwEFDm5ld0NoYWluSGVpZ2h0BQNTRVAFDGJsb2NrSGFzaEhleAkAzAgCBQ10aGlzRXBvY2hNZXRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPbWluZXJDaGFpbklkS2V5AQgFAWkMb3JpZ2luQ2FsbGVyBQdjaGFpbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESY2hhaW5MYXN0SGVpZ2h0S2V5AgUHY2hhaW5JZAgFAWkMb3JpZ2luQ2FsbGVyBQ5uZXdDaGFpbkhlaWdodAUDbmlsBQ5tYWluQ2hhaW5FbnRyeQkBDGFkZFN1cHBvcnRlcgIFB2NoYWluSWQIBQFpDG9yaWdpbkNhbGxlcgUddXBkYXRlTWFpbkNoYWluTGFzdE1pbmVkQmxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEam9pbgENcmV3YXJkQWRkcmVzcwoBEmNoZWNrUmV3YXJkQWRkcmVzcwEHYWRkcmVzcwQHJG1hdGNoMAkAoQgBCQEKbWluZXJQa0tleQEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAgUCcGsIBQFpFW9yaWdpbkNhbGxlclB1YmxpY0tleQUEdW5pdAkAAgEJAKwCAgkArAICCQCsAgICEUwyIG1pbmVyIGFkZHJlc3MgBQdhZGRyZXNzAhggaXMgYWxyZWFkeSBsaW5rZWQgd2l0aCAJANgEAQUCcGsFBHVuaXQDCQEBIQEJAQ9pc0NvbnRyYWN0U2V0dXAACQACAQIfVGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IHNldCB1cAMJAGYCBQtNSU5fQkFMQU5DRQgJAO8HAQgFAWkMb3JpZ2luQ2FsbGVyCmdlbmVyYXRpbmcJAAIBCQCsAgIJAKwCAgkArAICAiFJbnN1ZmZpY2llbnQgZ2VuZXJhdGluZyBiYWxhbmNlOiAJAKQDAQgJAO8HAQgFAWkMb3JpZ2luQ2FsbGVyCmdlbmVyYXRpbmcCDC4gUmVxdWlyZWQ6IAkApAMBBQtNSU5fQkFMQU5DRQMJAQIhPQIJAMgBAQUNcmV3YXJkQWRkcmVzcwAUCQACAQIlcmV3YXJkQWRkcmVzcyBzaG91bGQgYmUgYW4gTDIgYWRkcmVzcwMJAGcCCQCQAwEFCWFsbE1pbmVycwAyCQACAQIPdG9vIG1hbnkgbWluZXJzCgEOY2hlY2tFeGlzdGVuY2UCBmV4aXN0cwVtaW5lcgMFBmV4aXN0cwYJAAACBQVtaW5lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEDWFscmVhZHlFeGlzdHMKAAIkbAUJYWxsTWluZXJzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDmNoZWNrRXhpc3RlbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIDBQ1hbHJlYWR5RXhpc3RzBQNuaWwECG5ld01pbmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQQcmV3YXJkQWRkcmVzc0hleAkA3AQBBQ1yZXdhcmRBZGRyZXNzBAVjaGVjawkBEmNoZWNrUmV3YXJkQWRkcmVzcwEFEHJld2FyZEFkZHJlc3NIZXgDCQAAAgUFY2hlY2sFBWNoZWNrBAluZXdNaW5lcnMDCQAAAgkAkAMBBQlhbGxNaW5lcnMAAAUIbmV3TWluZXIJAKwCAgkArAICBQxhbGxNaW5lcnNTdHIFA1NFUAUIbmV3TWluZXIEGGRlbGV0ZU9sZFJld2FyZEFkZHJlc3NQawQHJG1hdGNoMAkAoggBCQEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQUIbmV3TWluZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBApvbGRBZGRyZXNzBQckbWF0Y2gwAwkAAAIFCm9sZEFkZHJlc3MJANwEAQUNcmV3YXJkQWRkcmVzcwUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQptaW5lclBrS2V5AQUKb2xkQWRkcmVzcwUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQxhbGxNaW5lcnNLZXkFCW5ld01pbmVycwkAzAgCCQELU3RyaW5nRW50cnkCCQEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQUIbmV3TWluZXIJAKwCAgICMHgFEHJld2FyZEFkZHJlc3NIZXgJAMwIAgkBC0JpbmFyeUVudHJ5AgkBCm1pbmVyUGtLZXkBBRByZXdhcmRBZGRyZXNzSGV4CAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkFA25pbAUYZGVsZXRlT2xkUmV3YXJkQWRkcmVzc1BrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWxlYXZlAAQMbGVhdmluZ01pbmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgoBEHNraXBMZWF2aW5nTWluZXICA2FjYwVtaW5lcgMJAAACBQVtaW5lcgUMbGVhdmluZ01pbmVyBQNhY2MJAM0IAgUDYWNjBQVtaW5lcgQPcmVtYWluaW5nTWluZXJzCgACJGwFCWFsbE1pbmVycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQc2tpcExlYXZpbmdNaW5lcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyBA1yZXdhcmRBZGRyS2V5CQEVbWluZXJSZXdhcmRBZGRyZXNzS2V5AQUMbGVhdmluZ01pbmVyBBFwcmV2UmV3YXJkQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFDXJld2FyZEFkZHJLZXkCFm1pbmVyIGhhcyBuZXZlciBqb2luZWQDCQAAAgUOdGhpc0Vwb2NoTWluZXIIBQFpDG9yaWdpbkNhbGxlcgkAAgECHGRlc2lnbmF0ZWQgbWluZXIgY2FuJ3QgbGVhdmUJAMwIAgkBC1N0cmluZ0VudHJ5AgUMYWxsTWluZXJzS2V5CQC6CQIFD3JlbWFpbmluZ01pbmVycwUDU0VQCQDMCAIJAQtEZWxldGVFbnRyeQEFDXJld2FyZEFkZHJLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCm1pbmVyUGtLZXkBBRFwcmV2UmV3YXJkQWRkcmVzcwUDbmlsAWkBBXNldHVwAxNnZW5lc2lzQmxvY2tIYXNoSGV4C21pbmVyUmV3YXJkGXN0YWtpbmdDb250cmFjdEFkZHJlc3NCNTgDCQEPaXNDb250cmFjdFNldHVwAAkAAgECJFRoZSBjb250cmFjdCBoYXMgYmVlbiBhbHJlYWR5IHNldCB1cAQQZ2VuZXNpc0Jsb2NrSGFzaAkA3QQBBRNnZW5lc2lzQmxvY2tIYXNoSGV4BAdlbXB0eVBrASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQTZ2VuZXNpc01pbmVyQWRkcmVzcwkApwgBBQdlbXB0eVBrBBdnZW5lc2lzRXRoUmV3YXJkQWRkcmVzcwEUAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWdlbmVzaXNCbG9ja1JlZmVyZW5jZUhhc2gBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBnZW5lc2lzQmxvY2tNZXRhCQDLAQIJAMsBAgkAywECCQCaAwEAAAkAmgMBBQZoZWlnaHQFGWdlbmVzaXNCbG9ja1JlZmVyZW5jZUhhc2gIBRNnZW5lc2lzTWluZXJBZGRyZXNzBWJ5dGVzCQDMCAIJAQtCaW5hcnlFbnRyeQIJAKwCAgUKYmxvY2tNZXRhSwUTZ2VuZXNpc0Jsb2NrSGFzaEhleAUQZ2VuZXNpc0Jsb2NrTWV0YQkAzAgCCQELQmluYXJ5RW50cnkCCQEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBAAAFEGdlbmVzaXNCbG9ja0hhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGNoYWluTWV0YUtleQEAAAkArAICAgIwLAUTZ2VuZXNpc0Jsb2NrSGFzaEhleAkAzAgCCQEMSW50ZWdlckVudHJ5AgUObWluZXJSZXdhcmRLZXkFC21pbmVyUmV3YXJkCQDMCAIJAQtTdHJpbmdFbnRyeQIFGXN0YWtpbmdDb250cmFjdEFkZHJlc3NLZXkFGXN0YWtpbmdDb250cmFjdEFkZHJlc3NCNTgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGVwb2NoTWV0YUtleQEFBmhlaWdodAkArAICCQCsAgIJAKUIAQUTZ2VuZXNpc01pbmVyQWRkcmVzcwIDLDAsBRNnZW5lc2lzQmxvY2tIYXNoSGV4BQNuaWwAa1hJjg==", "height": 3136052, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4WWwz1Kg5sx8vVdrC6ivyizGEngERutep2rFvUA3eQr2 Next: 8Q1YgJ8TSiG5DhUd7MAZ6z6v9d9m8Kum5ap6UocJFm4a Diff:
OldNewDifferences
242242
243243 let mainChainGenerator = $t053345436._4
244244
245-let $t054386554 = {
246- let offsets_200 = split("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "")
245+let $t054386489 = {
246+ let offsets_100 = split_4C("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "")
247247 let halfBalance = (computedTotalBalance / 2)
248248 func step (prev,next) = {
249- let $t058515915 = prev
250- let thisEpoch = $t058515915._1
251- let totalBalance = $t058515915._2
252- let maybeSafeEpoch = $t058515915._3
253- let prevMiners = $t058515915._4
249+ let $t057545818 = prev
250+ let thisEpoch = $t057545818._1
251+ let totalBalance = $t057545818._2
252+ let maybeSafeEpoch = $t057545818._3
253+ let prevMiners = $t057545818._4
254254 match maybeSafeEpoch {
255255 case _: Unit =>
256- let $t059736041 = value(epochMeta(thisEpoch))
257- let miner = $t059736041._1
258- let prevEpoch = $t059736041._2
259- let lastBlockHash = $t059736041._3
260- let $t060506246 = if (containsElement(prevMiners, miner))
256+ let $t058765944 = value(epochMeta(thisEpoch))
257+ let miner = $t058765944._1
258+ let prevEpoch = $t058765944._2
259+ let lastBlockHash = $t058765944._3
260+ let $t059536149 = if (containsElement(prevMiners, miner))
261261 then $Tuple2(totalBalance, prevMiners)
262262 else $Tuple2((totalBalance + generatingBalance(miner)), miner :: prevMiners)
263- let newTotalBalance = $t060506246._1
264- let newMiners = $t060506246._2
263+ let newTotalBalance = $t059536149._1
264+ let newMiners = $t059536149._2
265265 if ((newTotalBalance >= halfBalance))
266- then $Tuple4(thisEpoch, newTotalBalance, thisEpoch, allMiners)
266+ then $Tuple4(thisEpoch, newTotalBalance, $Tuple2(thisEpoch, lastBlockHash), allMiners)
267267 else $Tuple4(prevEpoch, newTotalBalance, unit, newMiners)
268268 case _ =>
269269 prev
271271 }
272272
273273 let res = {
274- let $l = offsets_200
274+ let $l = (offsets_100 ++ offsets_100)
275275 let $s = size($l)
276276 let $acc0 = $Tuple4(mainChainEpoch, 0, unit, nil)
277277 func $f0_1 ($a,$i) = if (($i >= $s))
287287 valueOrElse(res._3, $Tuple2(1, ""))
288288 }
289289
290-let finalizedEpoch = $t054386554._1
290+let finalizedEpoch = $t054386489._1
291291
292-let finalizedBlockHash = $t054386554._2
292+let finalizedBlockHash = $t054386489._2
293293
294294 func supportingBalance (chainId) = {
295295 func addBalance (acc,generatorStr) = {
296- let $t066726708 = acc
297- let totalBalance = $t066726708._1
298- let generators = $t066726708._2
296+ let $t066076643 = acc
297+ let totalBalance = $t066076643._1
298+ let generators = $t066076643._2
299299 let generator = addressFromStringValue(generatorStr)
300300 if (containsElement(generators, generator))
301301 then acc
306306 }
307307
308308 let allGenerators = split_4C(getStringValue(supportersKey(chainId)), SEP)
309- let $t070307095 = {
309+ let $t069657030 = {
310310 let $l = allGenerators
311311 let $s = size($l)
312312 let $acc0 = $Tuple2(0, nil)
320320
321321 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
322322 }
323- let balance = $t070307095._1
324- let _g = $t070307095._2
323+ let balance = $t069657030._1
324+ let _g = $t069657030._2
325325 balance
326326 }
327327
344344 let firstValidAltChainId = valueOrElse(getInteger(firstValidAltChainIdKey), 0)
345345 if ((firstValidAltChainId > chainId))
346346 then true
347- else (finalizedEpoch > blockMeta(toBase16String(firstBlockId))._1)
347+ else (blockMeta(finalizedBlockHash)._1 > blockMeta(toBase16String(firstBlockId))._1)
348348 }
349349
350350
381381
382382 func addSupporter (chainId,generator) = {
383383 let supportersStr = getStringValue(supportersKey(chainId))
384- let supporters = split(supportersStr, SEP)
384+ let supporters = split_4C(supportersStr, SEP)
385385 if (containsElement(supporters, toString(generator)))
386386 then nil
387387 else [StringEntry(supportersKey(chainId), ((supportersStr + SEP) + toString(generator)))]
406406 }
407407 else {
408408 let chainId = valueOrElse(minerChainId(i.originCaller), mainChainId)
409- let $t098509901 = chainMeta(chainId)
410- let chainHeight = $t098509901._1
411- let lastBlockId = $t098509901._2
409+ let $t098069857 = chainMeta(chainId)
410+ let chainHeight = $t098069857._1
411+ let lastBlockId = $t098069857._2
412412 let checkReference = isReferenceCorrect(referenceHex, lastBlockId)
413413 if ((checkReference == checkReference))
414414 then {
465465 let checkGenerator = ensureMiningEpoch(i.originCaller)
466466 if ((checkGenerator == checkGenerator))
467467 then {
468- let $t01198112059 = blockMeta(referenceHex)
469- let refChainHeight = $t01198112059._1
470- let refEpoch = $t01198112059._2
471- let refRef = $t01198112059._3
472- let refGenerator = $t01198112059._4
468+ let $t01193712015 = blockMeta(referenceHex)
469+ let refChainHeight = $t01193712015._1
470+ let refEpoch = $t01193712015._2
471+ let refRef = $t01193712015._3
472+ let refGenerator = $t01193712015._4
473473 let epochRef = if ((refEpoch >= finalizedEpoch))
474474 then refEpoch
475475 else throw((((("can not start alt chain from epoch " + toString(refEpoch)) + ", epoch ") + toString(finalizedEpoch)) + " is finalized"))
508508 let checkChain = ensureExpectedOrInactiveChain(i.originCaller, chainId, toBase16String(blockMeta(getStringValue(chainFirstBlockIdKey(chainId)))._3))
509509 if ((checkChain == checkChain))
510510 then {
511- let $t01415914213 = chainMeta(chainId)
512- let chainHeight = $t01415914213._1
513- let chainLastBlock = $t01415914213._2
511+ let $t01411514169 = chainMeta(chainId)
512+ let chainHeight = $t01411514169._1
513+ let chainLastBlock = $t01411514169._2
514514 let checkReference = isReferenceCorrect(referenceHex, chainLastBlock)
515515 if ((checkReference == checkReference))
516516 then {
560560 then throw(((("Insufficient generating balance: " + toString(wavesBalance(i.originCaller).generating)) + ". Required: ") + toString(MIN_BALANCE)))
561561 else if ((size(rewardAddress) != 20))
562562 then throw("rewardAddress should be an L2 address")
563- else {
564- func checkExistence (exists,miner) = if (exists)
565- then true
566- else (miner == toString(i.originCaller))
563+ else if ((size(allMiners) >= 50))
564+ then throw("too many miners")
565+ else {
566+ func checkExistence (exists,miner) = if (exists)
567+ then true
568+ else (miner == toString(i.originCaller))
567569
568- let alreadyExists = {
569- let $l = allMiners
570- let $s = size($l)
571- let $acc0 = false
572- func $f0_1 ($a,$i) = if (($i >= $s))
573- then $a
574- else checkExistence($a, $l[$i])
570+ let alreadyExists = {
571+ let $l = allMiners
572+ let $s = size($l)
573+ let $acc0 = false
574+ func $f0_1 ($a,$i) = if (($i >= $s))
575+ then $a
576+ else checkExistence($a, $l[$i])
575577
576- func $f0_2 ($a,$i) = if (($i >= $s))
577- then $a
578- else throw("List size exceeds 50")
578+ func $f0_2 ($a,$i) = if (($i >= $s))
579+ then $a
580+ else throw("List size exceeds 50")
579581
580- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
582+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
583+ }
584+ if (alreadyExists)
585+ then nil
586+ else {
587+ let newMiner = toString(i.originCaller)
588+ let rewardAddressHex = toBase16String(rewardAddress)
589+ let check = checkRewardAddress(rewardAddressHex)
590+ if ((check == check))
591+ then {
592+ let newMiners = if ((size(allMiners) == 0))
593+ then newMiner
594+ else ((allMinersStr + SEP) + newMiner)
595+ let deleteOldRewardAddressPk = match getString(minerRewardAddressKey(newMiner)) {
596+ case oldAddress: String =>
597+ if ((oldAddress == toBase16String(rewardAddress)))
598+ then nil
599+ else [DeleteEntry(minerPkKey(oldAddress))]
600+ case _ =>
601+ nil
602+ }
603+ ([StringEntry(allMinersKey, newMiners), StringEntry(minerRewardAddressKey(newMiner), ("0x" + rewardAddressHex)), BinaryEntry(minerPkKey(rewardAddressHex), i.originCallerPublicKey)] ++ deleteOldRewardAddressPk)
604+ }
605+ else throw("Strict value is not equal to itself.")
606+ }
581607 }
582- if (alreadyExists)
583- then nil
584- else {
585- let newMiner = toString(i.originCaller)
586- let rewardAddressHex = toBase16String(rewardAddress)
587- let check = checkRewardAddress(rewardAddressHex)
588- if ((check == check))
589- then {
590- let newMiners = if ((size(allMiners) == 0))
591- then newMiner
592- else ((allMinersStr + SEP) + newMiner)
593- let deleteOldRewardAddressPk = match getString(minerRewardAddressKey(newMiner)) {
594- case oldAddress: String =>
595- if ((oldAddress == toBase16String(rewardAddress)))
596- then nil
597- else [DeleteEntry(minerPkKey(oldAddress))]
598- case _ =>
599- nil
600- }
601- ([StringEntry(allMinersKey, newMiners), StringEntry(minerRewardAddressKey(newMiner), ("0x" + rewardAddressHex)), BinaryEntry(minerPkKey(rewardAddressHex), i.originCallerPublicKey)] ++ deleteOldRewardAddressPk)
602- }
603- else throw("Strict value is not equal to itself.")
604- }
605- }
606608 }
607609
608610
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 8 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let INT_MAX = 9223372036854775807
55
66 let WAVES = 100000000
77
88 let MIN_BALANCE = (20000 * WAVES)
99
1010 let SEP = ","
1111
1212 let BLOCK_HASH_SIZE = 32
1313
1414 let ADDRESS_SIZE = 26
1515
1616 let thisEpochDataKey = "thisEpochData"
1717
1818 let allMinersKey = "allMiners"
1919
2020 let mainChainIdKey = "mainChainId"
2121
2222 let lastChainIdKey = "lastChainId"
2323
2424 let firstValidAltChainIdKey = "firstValidAltChainId"
2525
2626 let minerRewardKey = "minerReward"
2727
2828 let stakingContractAddressKey = "stakingContractAddress"
2929
3030 let blockMetaK = "block_0x"
3131
3232 func pad (i) = {
3333 let s = toString(i)
3434 match size(s) {
3535 case _ =>
3636 if ((1 == $match0))
3737 then ("0000000" + s)
3838 else if ((2 == $match0))
3939 then ("000000" + s)
4040 else if ((3 == $match0))
4141 then ("00000" + s)
4242 else if ((4 == $match0))
4343 then ("0000" + s)
4444 else if ((5 == $match0))
4545 then ("000" + s)
4646 else if ((6 == $match0))
4747 then ("00" + s)
4848 else if ((7 == $match0))
4949 then ("0" + s)
5050 else s
5151 }
5252 }
5353
5454
5555 func epochMetaKey (epoch) = ("epoch_" + pad(epoch))
5656
5757
5858 func chainFirstBlockIdKey (chainId) = (("chain" + toString(chainId)) + "FirstBlock")
5959
6060
6161 func chainMetaKey (chainId) = ("chain_" + pad(chainId))
6262
6363
6464 func chainLastHeightKey (chainId,miner) = ((("chain_" + pad(chainId)) + "_") + toString(miner))
6565
6666
6767 func supportersKey (chainId) = (("chain" + toString(chainId)) + "Supporters")
6868
6969
7070 func minerRewardAddressKey (minerAddr) = (("miner_" + minerAddr) + "_RewardAddress")
7171
7272
7373 func minerPkKey (rewardAddress) = (("miner_0x" + rewardAddress) + "_PK")
7474
7575
7676 func minerChainIdKey (miner) = (("miner_" + toString(miner)) + "_ChainId")
7777
7878
7979 let stakingContractAddress = match getString(this, stakingContractAddressKey) {
8080 case s: String =>
8181 valueOrErrorMessage(addressFromString(s), ("invalid staking contract address: " + s))
8282 case _ =>
8383 Address(getBinaryValue(this, stakingContractAddressKey))
8484 }
8585
8686 func generatingBalance (address) = match getString(stakingContractAddress, ("%s__" + toString(address))) {
8787 case str: String =>
8888 let paramList = split(str, "__")
8989 let prevHeight = parseIntValue(paramList[1])
9090 let prevBalance = parseIntValue(paramList[2])
9191 let nextHeight = parseIntValue(paramList[3])
9292 let nextBalance = parseIntValue(paramList[4])
9393 if ((height >= nextHeight))
9494 then nextBalance
9595 else if ((height >= prevHeight))
9696 then prevBalance
9797 else 0
9898 case _ =>
9999 0
100100 }
101101
102102
103103 func chainMeta (chainId) = {
104104 let s = getStringValue(chainMetaKey(chainId))
105105 let items = split(s, SEP)
106106 $Tuple2(parseIntValue(items[0]), items[1])
107107 }
108108
109109
110110 let mainChainId = valueOrElse(getInteger(mainChainIdKey), 0)
111111
112112 let $t027802846 = chainMeta(mainChainId)
113113
114114 let mainChainHeight = $t027802846._1
115115
116116 let mainChainLastBlock = $t027802846._2
117117
118118 func epochMeta (epoch) = match getString(epochMetaKey(epoch)) {
119119 case s: String =>
120120 let fragments = split(s, SEP)
121121 $Tuple3(addressFromStringValue(fragments[0]), parseIntValue(fragments[1]), fragments[2])
122122 case _ =>
123123 unit
124124 }
125125
126126
127127 let $t030783542 = match epochMeta(height) {
128128 case m: (Address, Int, String) =>
129129 m
130130 case _ =>
131131 match getString(thisEpochDataKey) {
132132 case rawThisEpochData: String =>
133133 let thisEpochData = split(rawThisEpochData, SEP)
134134 let thisEpoch = parseIntValue(thisEpochData[0])
135135 $Tuple3(if ((thisEpoch == height))
136136 then addressFromStringValue(thisEpochData[1])
137137 else unit, 0, "")
138138 case _ =>
139139 $Tuple3(unit, 0, "")
140140 }
141141 }
142142
143143 let thisEpochMiner = $t030783542._1
144144
145145 let thisEpochRef = $t030783542._2
146146
147147 let thisEpochLastBlock = $t030783542._3
148148
149149 let allMinersStr = valueOrElse(getString(allMinersKey), "")
150150
151151 let allMiners = match allMinersStr {
152152 case _ =>
153153 if (("" == $match0))
154154 then nil
155155 else if ($isInstanceOf($match0, "String"))
156156 then {
157157 let raw = $match0
158158 split_4C(raw, SEP)
159159 }
160160 else throw("Match error")
161161 }
162162
163163 func blockMeta (blockId) = {
164164 let meta = getBinaryValue((blockMetaK + blockId))
165165 let blockHeight = toInt(meta)
166166 let blockEpoch = toInt(meta, 8)
167167 let blockParent = take(drop(meta, 16), BLOCK_HASH_SIZE)
168168 let blockGenerator = takeRight(meta, ADDRESS_SIZE)
169169 $Tuple4(blockHeight, blockEpoch, blockParent, blockGenerator)
170170 }
171171
172172
173173 func lastHeightBy (miner,chainId) = match getInteger(chainLastHeightKey(chainId, miner)) {
174174 case h: Int =>
175175 h
176176 case _ =>
177177 let blockHash = getStringValue(((("chain" + toString(chainId)) + "LastMinedBy") + toString(miner)))
178178 blockMeta(blockHash)._1
179179 }
180180
181181
182182 let $t043025268 = {
183183 let hitSource = match lastBlock.vrf {
184184 case vrf: ByteVector =>
185185 vrf
186186 case _ =>
187187 lastBlock.generationSignature
188188 }
189189 func processMiner (prev,miner) = {
190190 let $t046004663 = prev
191191 let prevDelay = $t046004663._1
192192 let prevMiner = $t046004663._2
193193 let prevTotalBalance = $t046004663._3
194194 let prevMiners = $t046004663._4
195195 let minerAddress = addressFromStringValue(miner)
196196 let wavesGenBalance = wavesBalance(minerAddress).generating
197197 let minerBalance = generatingBalance(minerAddress)
198198 if (if ((MIN_BALANCE > wavesGenBalance))
199199 then true
200200 else (0 >= minerBalance))
201201 then prev
202202 else {
203203 let nextDelay = calculateDelay(minerAddress, minerBalance)
204204 if ((prevDelay > nextDelay))
205205 then $Tuple4(nextDelay, miner, (prevTotalBalance + minerBalance), (prevMiners :+ miner))
206206 else $Tuple4(prevDelay, prevMiner, (prevTotalBalance + minerBalance), (prevMiners :+ miner))
207207 }
208208 }
209209
210210 let $l = allMiners
211211 let $s = size($l)
212212 let $acc0 = $Tuple4(INT_MAX, "", 0, nil)
213213 func $f0_1 ($a,$i) = if (($i >= $s))
214214 then $a
215215 else processMiner($a, $l[$i])
216216
217217 func $f0_2 ($a,$i) = if (($i >= $s))
218218 then $a
219219 else throw("List size exceeds 50")
220220
221221 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
222222 }
223223
224224 let computedDelay = $t043025268._1
225225
226226 let computedGenerator = $t043025268._2
227227
228228 let computedTotalBalance = $t043025268._3
229229
230230 let filteredMiners = $t043025268._4
231231
232232 func getChainLastBlockId (chainId) = chainMeta(chainId)._2
233233
234234
235235 let $t053345436 = blockMeta(mainChainLastBlock)
236236
237237 let ignored = $t053345436._1
238238
239239 let mainChainEpoch = $t053345436._2
240240
241241 let mainChainParentHash = $t053345436._3
242242
243243 let mainChainGenerator = $t053345436._4
244244
245-let $t054386554 = {
246- let offsets_200 = split("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "")
245+let $t054386489 = {
246+ let offsets_100 = split_4C("::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", "")
247247 let halfBalance = (computedTotalBalance / 2)
248248 func step (prev,next) = {
249- let $t058515915 = prev
250- let thisEpoch = $t058515915._1
251- let totalBalance = $t058515915._2
252- let maybeSafeEpoch = $t058515915._3
253- let prevMiners = $t058515915._4
249+ let $t057545818 = prev
250+ let thisEpoch = $t057545818._1
251+ let totalBalance = $t057545818._2
252+ let maybeSafeEpoch = $t057545818._3
253+ let prevMiners = $t057545818._4
254254 match maybeSafeEpoch {
255255 case _: Unit =>
256- let $t059736041 = value(epochMeta(thisEpoch))
257- let miner = $t059736041._1
258- let prevEpoch = $t059736041._2
259- let lastBlockHash = $t059736041._3
260- let $t060506246 = if (containsElement(prevMiners, miner))
256+ let $t058765944 = value(epochMeta(thisEpoch))
257+ let miner = $t058765944._1
258+ let prevEpoch = $t058765944._2
259+ let lastBlockHash = $t058765944._3
260+ let $t059536149 = if (containsElement(prevMiners, miner))
261261 then $Tuple2(totalBalance, prevMiners)
262262 else $Tuple2((totalBalance + generatingBalance(miner)), miner :: prevMiners)
263- let newTotalBalance = $t060506246._1
264- let newMiners = $t060506246._2
263+ let newTotalBalance = $t059536149._1
264+ let newMiners = $t059536149._2
265265 if ((newTotalBalance >= halfBalance))
266- then $Tuple4(thisEpoch, newTotalBalance, thisEpoch, allMiners)
266+ then $Tuple4(thisEpoch, newTotalBalance, $Tuple2(thisEpoch, lastBlockHash), allMiners)
267267 else $Tuple4(prevEpoch, newTotalBalance, unit, newMiners)
268268 case _ =>
269269 prev
270270 }
271271 }
272272
273273 let res = {
274- let $l = offsets_200
274+ let $l = (offsets_100 ++ offsets_100)
275275 let $s = size($l)
276276 let $acc0 = $Tuple4(mainChainEpoch, 0, unit, nil)
277277 func $f0_1 ($a,$i) = if (($i >= $s))
278278 then $a
279279 else step($a, $l[$i])
280280
281281 func $f0_2 ($a,$i) = if (($i >= $s))
282282 then $a
283283 else throw("List size exceeds 200")
284284
285285 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
286286 }
287287 valueOrElse(res._3, $Tuple2(1, ""))
288288 }
289289
290-let finalizedEpoch = $t054386554._1
290+let finalizedEpoch = $t054386489._1
291291
292-let finalizedBlockHash = $t054386554._2
292+let finalizedBlockHash = $t054386489._2
293293
294294 func supportingBalance (chainId) = {
295295 func addBalance (acc,generatorStr) = {
296- let $t066726708 = acc
297- let totalBalance = $t066726708._1
298- let generators = $t066726708._2
296+ let $t066076643 = acc
297+ let totalBalance = $t066076643._1
298+ let generators = $t066076643._2
299299 let generator = addressFromStringValue(generatorStr)
300300 if (containsElement(generators, generator))
301301 then acc
302302 else {
303303 let balance = generatingBalance(generator)
304304 $Tuple2((totalBalance + balance), (generators :+ generator))
305305 }
306306 }
307307
308308 let allGenerators = split_4C(getStringValue(supportersKey(chainId)), SEP)
309- let $t070307095 = {
309+ let $t069657030 = {
310310 let $l = allGenerators
311311 let $s = size($l)
312312 let $acc0 = $Tuple2(0, nil)
313313 func $f0_1 ($a,$i) = if (($i >= $s))
314314 then $a
315315 else addBalance($a, $l[$i])
316316
317317 func $f0_2 ($a,$i) = if (($i >= $s))
318318 then $a
319319 else throw("List size exceeds 100")
320320
321321 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
322322 }
323- let balance = $t070307095._1
324- let _g = $t070307095._2
323+ let balance = $t069657030._1
324+ let _g = $t069657030._2
325325 balance
326326 }
327327
328328
329329 func isContractSetup () = isDefined(getInteger(minerRewardKey))
330330
331331
332332 func ensureMiningEpoch (generator) = if ((toString(generator) != computedGenerator))
333333 then throw(((((toBase58String(generator.bytes) + " is not allowed to mine in ") + toString(height)) + " epoch. Expected ") + computedGenerator))
334334 else unit
335335
336336
337337 func isReferenceCorrect (reference,lastBlock) = if ((reference == lastBlock))
338338 then unit
339339 else throw(((("Expected a reference to the chain last block: 0x" + lastBlock) + ". Got: 0x") + reference))
340340
341341
342342 func chainIsInactive (chainId) = {
343343 let firstBlockId = getBinaryValue(chainFirstBlockIdKey(chainId))
344344 let firstValidAltChainId = valueOrElse(getInteger(firstValidAltChainIdKey), 0)
345345 if ((firstValidAltChainId > chainId))
346346 then true
347- else (finalizedEpoch > blockMeta(toBase16String(firstBlockId))._1)
347+ else (blockMeta(finalizedBlockHash)._1 > blockMeta(toBase16String(firstBlockId))._1)
348348 }
349349
350350
351351 func minerChainId (miner) = valueOrElse(getInteger(minerChainIdKey(miner)), getInteger(("chainIdOf" + toString(miner))))
352352
353353
354354 func ensureExpectedOrInactiveChain (generator,expectedChainId,checkHeightBlock) = {
355355 let heightIsCorrect = match checkHeightBlock {
356356 case blockHash: String =>
357357 let lastMinedBlockHeight = lastHeightBy(generator, mainChainId)
358358 ((blockMeta(blockHash)._1 + 1) > lastMinedBlockHeight)
359359 case _ =>
360360 true
361361 }
362362 match minerChainId(generator) {
363363 case currentId: Int =>
364364 if (if ((currentId == expectedChainId))
365365 then true
366366 else if (chainIsInactive(currentId))
367367 then heightIsCorrect
368368 else false)
369369 then unit
370370 else throw(("miner is mining other chain " + toString(currentId)))
371371 case _ =>
372372 unit
373373 }
374374 }
375375
376376
377377 func ensureCorrectEpoch (epoch) = if ((epoch == height))
378378 then unit
379379 else throw(((("Expected block from epoch " + toString(height)) + ". Got ") + toString(epoch)))
380380
381381
382382 func addSupporter (chainId,generator) = {
383383 let supportersStr = getStringValue(supportersKey(chainId))
384- let supporters = split(supportersStr, SEP)
384+ let supporters = split_4C(supportersStr, SEP)
385385 if (containsElement(supporters, toString(generator)))
386386 then nil
387387 else [StringEntry(supportersKey(chainId), ((supportersStr + SEP) + toString(generator)))]
388388 }
389389
390390
391391 func validateBlockHash (hexStr) = {
392392 let decodedBytes = fromBase16String(hexStr)
393393 if ((size(decodedBytes) != 32))
394394 then throw("invalid block id length")
395395 else hexStr
396396 }
397397
398398
399399 @Callable(i)
400400 func appendBlock (blockHashHex,referenceHex) = if ((thisEpochMiner != i.originCaller))
401401 then match thisEpochMiner {
402402 case epochMiner: Address =>
403403 throw(("not allowed to forge blocks in this epoch, expected from " + toString(epochMiner)))
404404 case _ =>
405405 throw("not allowed to forge blocks in this epoch, epoch miner is absent")
406406 }
407407 else {
408408 let chainId = valueOrElse(minerChainId(i.originCaller), mainChainId)
409- let $t098509901 = chainMeta(chainId)
410- let chainHeight = $t098509901._1
411- let lastBlockId = $t098509901._2
409+ let $t098069857 = chainMeta(chainId)
410+ let chainHeight = $t098069857._1
411+ let lastBlockId = $t098069857._2
412412 let checkReference = isReferenceCorrect(referenceHex, lastBlockId)
413413 if ((checkReference == checkReference))
414414 then {
415415 let newChainHeight = (chainHeight + 1)
416416 let newBlockMeta = (((toBytes(newChainHeight) + toBytes(height)) + fromBase16String(lastBlockId)) + i.originCaller.bytes)
417417 let blockHash = validateBlockHash(blockHashHex)
418418 [BinaryEntry((blockMetaK + blockHashHex), newBlockMeta), IntegerEntry(chainLastHeightKey(chainId, i.originCaller), newChainHeight), StringEntry(chainMetaKey(chainId), ((toString(newChainHeight) + SEP) + blockHashHex)), StringEntry(epochMetaKey(height), ((((toString(value(thisEpochMiner)) + SEP) + toString(thisEpochRef)) + SEP) + blockHashHex))]
419419 }
420420 else throw("Strict value is not equal to itself.")
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func extendMainChain (blockHashHex,referenceHex,epoch) = {
427427 let checkEpoch = ensureCorrectEpoch(epoch)
428428 if ((checkEpoch == checkEpoch))
429429 then {
430430 let checkGenerator = ensureMiningEpoch(i.originCaller)
431431 if ((checkGenerator == checkGenerator))
432432 then {
433433 let checkChain = ensureExpectedOrInactiveChain(i.originCaller, mainChainId, unit)
434434 if ((checkChain == checkChain))
435435 then {
436436 let checkReference = isReferenceCorrect(referenceHex, mainChainLastBlock)
437437 if ((checkReference == checkReference))
438438 then {
439439 let thisEpochMeta = match epochMeta(height) {
440440 case _: Unit =>
441441 StringEntry(epochMetaKey(height), ((((toString(i.originCaller) + SEP) + toString(mainChainEpoch)) + SEP) + blockHashHex))
442442 case other =>
443443 throw("Epoch already started")
444444 }
445445 let newChainHeight = (mainChainHeight + 1)
446446 let newBlockMeta = (((toBytes(newChainHeight) + toBytes(height)) + fromBase16String(mainChainLastBlock)) + i.originCaller.bytes)
447447 [BinaryEntry((blockMetaK + blockHashHex), newBlockMeta), StringEntry(chainMetaKey(mainChainId), ((toString(newChainHeight) + SEP) + blockHashHex)), IntegerEntry(minerChainIdKey(i.originCaller), mainChainId), IntegerEntry(chainLastHeightKey(mainChainId, i.originCaller), newChainHeight), thisEpochMeta]
448448 }
449449 else throw("Strict value is not equal to itself.")
450450 }
451451 else throw("Strict value is not equal to itself.")
452452 }
453453 else throw("Strict value is not equal to itself.")
454454 }
455455 else throw("Strict value is not equal to itself.")
456456 }
457457
458458
459459
460460 @Callable(i)
461461 func startAltChain (blockHashHex,referenceHex,epoch) = {
462462 let checkEpoch = ensureCorrectEpoch(epoch)
463463 if ((checkEpoch == checkEpoch))
464464 then {
465465 let checkGenerator = ensureMiningEpoch(i.originCaller)
466466 if ((checkGenerator == checkGenerator))
467467 then {
468- let $t01198112059 = blockMeta(referenceHex)
469- let refChainHeight = $t01198112059._1
470- let refEpoch = $t01198112059._2
471- let refRef = $t01198112059._3
472- let refGenerator = $t01198112059._4
468+ let $t01193712015 = blockMeta(referenceHex)
469+ let refChainHeight = $t01193712015._1
470+ let refEpoch = $t01193712015._2
471+ let refRef = $t01193712015._3
472+ let refGenerator = $t01193712015._4
473473 let epochRef = if ((refEpoch >= finalizedEpoch))
474474 then refEpoch
475475 else throw((((("can not start alt chain from epoch " + toString(refEpoch)) + ", epoch ") + toString(finalizedEpoch)) + " is finalized"))
476476 let checkChain = ensureExpectedOrInactiveChain(i.originCaller, mainChainId, referenceHex)
477477 if ((checkChain == checkChain))
478478 then {
479479 let newChainId = (valueOrElse(getInteger(lastChainIdKey), 0) + 1)
480480 let referenceHeight = blockMeta(referenceHex)._1
481481 let newChainHeight = (referenceHeight + 1)
482482 let newBlockMeta = (((toBytes(newChainHeight) + toBytes(height)) + fromBase16String(referenceHex)) + i.originCaller.bytes)
483483 let thisEpochMeta = match epochMeta(height) {
484484 case _: Unit =>
485485 StringEntry(epochMetaKey(height), ((((toString(i.originCaller) + SEP) + toString(epochRef)) + SEP) + blockHashHex))
486486 case other =>
487487 throw("Epoch already started")
488488 }
489489 [thisEpochMeta, BinaryEntry((blockMetaK + blockHashHex), newBlockMeta), StringEntry(chainFirstBlockIdKey(newChainId), blockHashHex), StringEntry(chainMetaKey(mainChainId), ((toString(newChainHeight) + SEP) + blockHashHex)), IntegerEntry(minerChainIdKey(i.originCaller), newChainId), IntegerEntry(chainLastHeightKey(newChainId, i.originCaller), newChainHeight), IntegerEntry(chainLastHeightKey(mainChainId, i.originCaller), referenceHeight), StringEntry(supportersKey(newChainId), toString(i.originCaller)), IntegerEntry(lastChainIdKey, newChainId)]
490490 }
491491 else throw("Strict value is not equal to itself.")
492492 }
493493 else throw("Strict value is not equal to itself.")
494494 }
495495 else throw("Strict value is not equal to itself.")
496496 }
497497
498498
499499
500500 @Callable(i)
501501 func extendAltChain (chainId,blockHashHex,referenceHex,epoch) = {
502502 let checkEpoch = ensureCorrectEpoch(epoch)
503503 if ((checkEpoch == checkEpoch))
504504 then {
505505 let checkGenerator = ensureMiningEpoch(i.originCaller)
506506 if ((checkGenerator == checkGenerator))
507507 then {
508508 let checkChain = ensureExpectedOrInactiveChain(i.originCaller, chainId, toBase16String(blockMeta(getStringValue(chainFirstBlockIdKey(chainId)))._3))
509509 if ((checkChain == checkChain))
510510 then {
511- let $t01415914213 = chainMeta(chainId)
512- let chainHeight = $t01415914213._1
513- let chainLastBlock = $t01415914213._2
511+ let $t01411514169 = chainMeta(chainId)
512+ let chainHeight = $t01411514169._1
513+ let chainLastBlock = $t01411514169._2
514514 let checkReference = isReferenceCorrect(referenceHex, chainLastBlock)
515515 if ((checkReference == checkReference))
516516 then {
517517 let newChainHeight = (chainHeight + 1)
518518 let mainChainEntry = if ((supportingBalance(chainId) > (computedTotalBalance / 2)))
519519 then [IntegerEntry(mainChainIdKey, chainId), IntegerEntry(firstValidAltChainIdKey, (valueOrElse(getInteger(lastChainIdKey), 0) + 1))]
520520 else nil
521521 let thisEpochMeta = match epochMeta(height) {
522522 case _: Unit =>
523523 StringEntry(epochMetaKey(height), ((((toString(i.originCaller) + SEP) + toString(blockMeta(referenceHex)._2)) + SEP) + blockHashHex))
524524 case other =>
525525 throw("Epoch already started")
526526 }
527527 let updateMainChainLastMinedBlock = if (if ((mainChainEntry == nil))
528528 then (valueOrElse(minerChainId(i.originCaller), 0) != chainId)
529529 else false)
530530 then [IntegerEntry(chainLastHeightKey(mainChainId, i.originCaller), blockMeta(getStringValue(chainFirstBlockIdKey(chainId)))._1)]
531531 else nil
532532 let newBlockMeta = (((toBytes(newChainHeight) + toBytes(height)) + fromBase16String(referenceHex)) + i.originCaller.bytes)
533533 ((([BinaryEntry((blockMetaK + blockHashHex), newBlockMeta), StringEntry(chainMetaKey(mainChainId), ((toString(newChainHeight) + SEP) + blockHashHex)), thisEpochMeta, IntegerEntry(minerChainIdKey(i.originCaller), chainId), IntegerEntry(chainLastHeightKey(chainId, i.originCaller), newChainHeight)] ++ mainChainEntry) ++ addSupporter(chainId, i.originCaller)) ++ updateMainChainLastMinedBlock)
534534 }
535535 else throw("Strict value is not equal to itself.")
536536 }
537537 else throw("Strict value is not equal to itself.")
538538 }
539539 else throw("Strict value is not equal to itself.")
540540 }
541541 else throw("Strict value is not equal to itself.")
542542 }
543543
544544
545545
546546 @Callable(i)
547547 func join (rewardAddress) = {
548548 func checkRewardAddress (address) = match getBinary(minerPkKey(address)) {
549549 case pk: ByteVector =>
550550 if ((pk == i.originCallerPublicKey))
551551 then unit
552552 else throw(((("L2 miner address " + address) + " is already linked with ") + toBase58String(pk)))
553553 case _ =>
554554 unit
555555 }
556556
557557 if (!(isContractSetup()))
558558 then throw("The contract has not yet set up")
559559 else if ((MIN_BALANCE > wavesBalance(i.originCaller).generating))
560560 then throw(((("Insufficient generating balance: " + toString(wavesBalance(i.originCaller).generating)) + ". Required: ") + toString(MIN_BALANCE)))
561561 else if ((size(rewardAddress) != 20))
562562 then throw("rewardAddress should be an L2 address")
563- else {
564- func checkExistence (exists,miner) = if (exists)
565- then true
566- else (miner == toString(i.originCaller))
563+ else if ((size(allMiners) >= 50))
564+ then throw("too many miners")
565+ else {
566+ func checkExistence (exists,miner) = if (exists)
567+ then true
568+ else (miner == toString(i.originCaller))
567569
568- let alreadyExists = {
569- let $l = allMiners
570- let $s = size($l)
571- let $acc0 = false
572- func $f0_1 ($a,$i) = if (($i >= $s))
573- then $a
574- else checkExistence($a, $l[$i])
570+ let alreadyExists = {
571+ let $l = allMiners
572+ let $s = size($l)
573+ let $acc0 = false
574+ func $f0_1 ($a,$i) = if (($i >= $s))
575+ then $a
576+ else checkExistence($a, $l[$i])
575577
576- func $f0_2 ($a,$i) = if (($i >= $s))
577- then $a
578- else throw("List size exceeds 50")
578+ func $f0_2 ($a,$i) = if (($i >= $s))
579+ then $a
580+ else throw("List size exceeds 50")
579581
580- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
582+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
583+ }
584+ if (alreadyExists)
585+ then nil
586+ else {
587+ let newMiner = toString(i.originCaller)
588+ let rewardAddressHex = toBase16String(rewardAddress)
589+ let check = checkRewardAddress(rewardAddressHex)
590+ if ((check == check))
591+ then {
592+ let newMiners = if ((size(allMiners) == 0))
593+ then newMiner
594+ else ((allMinersStr + SEP) + newMiner)
595+ let deleteOldRewardAddressPk = match getString(minerRewardAddressKey(newMiner)) {
596+ case oldAddress: String =>
597+ if ((oldAddress == toBase16String(rewardAddress)))
598+ then nil
599+ else [DeleteEntry(minerPkKey(oldAddress))]
600+ case _ =>
601+ nil
602+ }
603+ ([StringEntry(allMinersKey, newMiners), StringEntry(minerRewardAddressKey(newMiner), ("0x" + rewardAddressHex)), BinaryEntry(minerPkKey(rewardAddressHex), i.originCallerPublicKey)] ++ deleteOldRewardAddressPk)
604+ }
605+ else throw("Strict value is not equal to itself.")
606+ }
581607 }
582- if (alreadyExists)
583- then nil
584- else {
585- let newMiner = toString(i.originCaller)
586- let rewardAddressHex = toBase16String(rewardAddress)
587- let check = checkRewardAddress(rewardAddressHex)
588- if ((check == check))
589- then {
590- let newMiners = if ((size(allMiners) == 0))
591- then newMiner
592- else ((allMinersStr + SEP) + newMiner)
593- let deleteOldRewardAddressPk = match getString(minerRewardAddressKey(newMiner)) {
594- case oldAddress: String =>
595- if ((oldAddress == toBase16String(rewardAddress)))
596- then nil
597- else [DeleteEntry(minerPkKey(oldAddress))]
598- case _ =>
599- nil
600- }
601- ([StringEntry(allMinersKey, newMiners), StringEntry(minerRewardAddressKey(newMiner), ("0x" + rewardAddressHex)), BinaryEntry(minerPkKey(rewardAddressHex), i.originCallerPublicKey)] ++ deleteOldRewardAddressPk)
602- }
603- else throw("Strict value is not equal to itself.")
604- }
605- }
606608 }
607609
608610
609611
610612 @Callable(i)
611613 func leave () = {
612614 let leavingMiner = toString(i.originCaller)
613615 func skipLeavingMiner (acc,miner) = if ((miner == leavingMiner))
614616 then acc
615617 else (acc :+ miner)
616618
617619 let remainingMiners = {
618620 let $l = allMiners
619621 let $s = size($l)
620622 let $acc0 = nil
621623 func $f0_1 ($a,$i) = if (($i >= $s))
622624 then $a
623625 else skipLeavingMiner($a, $l[$i])
624626
625627 func $f0_2 ($a,$i) = if (($i >= $s))
626628 then $a
627629 else throw("List size exceeds 50")
628630
629631 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
630632 }
631633 let rewardAddrKey = minerRewardAddressKey(leavingMiner)
632634 let prevRewardAddress = valueOrErrorMessage(getString(this, rewardAddrKey), "miner has never joined")
633635 if ((thisEpochMiner == i.originCaller))
634636 then throw("designated miner can't leave")
635637 else [StringEntry(allMinersKey, makeString_2C(remainingMiners, SEP)), DeleteEntry(rewardAddrKey), DeleteEntry(minerPkKey(prevRewardAddress))]
636638 }
637639
638640
639641
640642 @Callable(i)
641643 func setup (genesisBlockHashHex,minerReward,stakingContractAddressB58) = if (isContractSetup())
642644 then throw("The contract has been already set up")
643645 else {
644646 let genesisBlockHash = fromBase16String(genesisBlockHashHex)
645647 let emptyPk = base58'11111111111111111111111111111111'
646648 let genesisMinerAddress = addressFromPublicKey(emptyPk)
647649 let genesisEthRewardAddress = base58'11111111111111111111'
648650 let genesisBlockReferenceHash = base58'11111111111111111111111111111111'
649651 let genesisBlockMeta = (((toBytes(0) + toBytes(height)) + genesisBlockReferenceHash) + genesisMinerAddress.bytes)
650652 [BinaryEntry((blockMetaK + genesisBlockHashHex), genesisBlockMeta), BinaryEntry(chainFirstBlockIdKey(0), genesisBlockHash), StringEntry(chainMetaKey(0), ("0," + genesisBlockHashHex)), IntegerEntry(minerRewardKey, minerReward), StringEntry(stakingContractAddressKey, stakingContractAddressB58), StringEntry(epochMetaKey(height), ((toString(genesisMinerAddress) + ",0,") + genesisBlockHashHex))]
651653 }
652654
653655

github/deemru/w8io/169f3d6 
130.65 ms