tx · G8yejSpwF5hyzLV1QvMVZjFfe1Gs1HZ9pWqeogxv5CHX

3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL:  -0.02700000 Waves

2022.06.22 14:21 [2107539] smart account 3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL > SELF 0.00000000 Waves

{ "type": 13, "id": "G8yejSpwF5hyzLV1QvMVZjFfe1Gs1HZ9pWqeogxv5CHX", "fee": 2700000, "feeAssetId": null, "timestamp": 1655896922415, "version": 1, "sender": "3MyVvNfXht9piazyf1e5BVFsqv1R7z5cWJL", "senderPublicKey": "DnPyGWCgpQChvoQrnXQRcC9FtN32mPGrcog2wcKHdkVn", "proofs": [ "5BzmuUYtUEpnS4HRWJDtAHJxdDx5svCjAEzSbJi2wUe7Ja5LbpTo59DchkgPQqEkucXbmfJqP2h4dHNgubm5be4F" ], "script": "base64:BgJgCAISAwoBCBIAEgQKAggBEgcKBQgICAgBEgQKAggIEgUKAwgIARIECgIICBIDCgEBEgMKAQESBAoCCAgSAwoBCBIAEgMKAQESABIDCgEIEgQKAggIEgQKAggIEgQKAggILwAJc2VwYXJhdG9yAgJfXwAOcG9vbFdlaWdodE11bHQAgMLXLwAPbWF4RGVwdGhEZWZhdWx0AAoAFmZpbmFsaXphdGlvblN0YWdlVG90YWwAAAAXZmluYWxpemF0aW9uU3RhZ2VTaGFyZXMAAQAOa2V5RXBvY2hMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgtlcG9jaExlbmd0aAUDbmlsBQlzZXBhcmF0b3IAD2tleUN1cnJlbnRFcG9jaAkAuQkCCQDMCAICAiVzCQDMCAICDGN1cnJlbnRFcG9jaAUDbmlsBQlzZXBhcmF0b3IAC2tleU1heERlcHRoCQC5CQIJAMwIAgICJXMJAMwIAgIIbWF4RGVwdGgFA25pbAUJc2VwYXJhdG9yACJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUDbmlsBQlzZXBhcmF0b3IAEmtleUZhY3RvcnlDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICD2ZhY3RvcnlDb250cmFjdAUDbmlsBQlzZXBhcmF0b3IAE2tleUJvb3N0aW5nQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhBib29zdGluZ0NvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgASa2V5U3Rha2luZ0NvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIPc3Rha2luZ0NvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgAUa2V5RmluYWxpemF0aW9uU3RhZ2UJALkJAgkAzAgCAgIlcwkAzAgCAhFmaW5hbGl6YXRpb25TdGFnZQUDbmlsBQlzZXBhcmF0b3IAC2tleU5leHRQb29sCQC5CQIJAMwIAgICJXMJAMwIAgIIbmV4dFBvb2wFA25pbAUJc2VwYXJhdG9yAAtrZXlOZXh0VXNlcgkAuQkCCQDMCAICAiVzCQDMCAICCG5leHRVc2VyBQNuaWwFCXNlcGFyYXRvcgAOa2V5U3RhcnRIZWlnaHQJALkJAgkAzAgCAgIlcwkAzAgCAgtzdGFydEhlaWdodAUDbmlsBQlzZXBhcmF0b3IAEWtleUN1cnJlbnRFcG9jaFVpCQC5CQIJAMwIAgICJXMJAMwIAgIOY3VycmVudEVwb2NoVWkFA25pbAUJc2VwYXJhdG9yABBrZXlTdGFydEhlaWdodFVpCQC5CQIJAMwIAgICJXMJAMwIAgINc3RhcnRIZWlnaHRVaQUDbmlsBQlzZXBhcmF0b3IBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFZXBvY2gJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQxrZXlGaW5hbGl6ZWQBBWVwb2NoCQC5CQIJAMwIAgIEJXMlZAkAzAgCAglmaW5hbGl6ZWQJAMwIAgkApAMBBQVlcG9jaAUDbmlsBQlzZXBhcmF0b3IBCWtleUluTGlzdAEEcG9vbAQLJHQwMTQzNjE0NzYFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQskdDAxNDM2MTQ3NgJfMQQMcHJpY2VBc3NldElkCAULJHQwMTQzNjE0NzYCXzIJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGaW5MaXN0CQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFCXNlcGFyYXRvcgEHa2V5VXNlZAIHYWRkcmVzcwVlcG9jaAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgR1c2VkCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCCQCkAwEFBWVwb2NoBQNuaWwFCXNlcGFyYXRvcgEHa2V5Vm90ZQMEcG9vbAdhZGRyZXNzBWVwb2NoBAskdDAxNzUwMTc5MAUEcG9vbAQNYW1vdW50QXNzZXRJZAgFCyR0MDE3NTAxNzkwAl8xBAxwcmljZUFzc2V0SWQIBQskdDAxNzUwMTc5MAJfMgkAuQkCCQDMCAICCiVzJXMlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQ1hbW91bnRBc3NldElkCQDMCAIFDHByaWNlQXNzZXRJZAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgkApAMBBQVlcG9jaAUDbmlsBQlzZXBhcmF0b3IBD2tleVZvdGluZ1Jlc3VsdAIEcG9vbAVlcG9jaAQLJHQwMTk3MjIwMTIFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQskdDAxOTcyMjAxMgJfMQQMcHJpY2VBc3NldElkCAULJHQwMTk3MjIwMTICXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAgx2b3RpbmdSZXN1bHQJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQJAMwIAgkApAMBBQVlcG9jaAUDbmlsBQlzZXBhcmF0b3IBDGtleVBvb2xTaGFyZQIEcG9vbAVlcG9jaAQLJHQwMjE3NzIyMTcFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQskdDAyMTc3MjIxNwJfMQQMcHJpY2VBc3NldElkCAULJHQwMjE3NzIyMTcCXzIJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCAglwb29sU2hhcmUJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQJAMwIAgkApAMBBQVlcG9jaAUDbmlsBQlzZXBhcmF0b3IBDWtleVRvdGFsVm90ZXMBBWVwb2NoCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgp0b3RhbFZvdGVzCQDMCAIJAKQDAQUFZXBvY2gFA25pbAUJc2VwYXJhdG9yAQ5nZXRWYWx1ZU9yRmFpbAMHYWRkcmVzcwNrZXkEdHlwZQQFZXJyb3IJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIACQETdmFsdWVPckVycm9yTWVzc2FnZQIEByRtYXRjaDAFBHR5cGUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANzdHIFByRtYXRjaDAJAJ0IAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwCQCaCAIFB2FkZHJlc3MFA2tleQkAAgECEmludmFsaWQgZW50cnkgdHlwZQUFZXJyb3IBDGdldFN0ck9yRmFpbAIHYWRkcmVzcwNrZXkKAAFACQEOZ2V0VmFsdWVPckZhaWwDBQdhZGRyZXNzBQNrZXkCAAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBCQEOZ2V0VmFsdWVPckZhaWwDBQdhZGRyZXNzBQNrZXkCAAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CgABQAkBDmdldFZhbHVlT3JGYWlsAwUHYWRkcmVzcwUDa2V5AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQkBDmdldFZhbHVlT3JGYWlsAwUHYWRkcmVzcwUDa2V5AAACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAEMcG9vbFRvU3RyaW5nAQRwb29sCQCsAgIJAKwCAggFBHBvb2wCXzEFCXNlcGFyYXRvcggFBHBvb2wCXzIBDHN0cmluZ1RvUG9vbAEDc3RyBAVwYXJ0cwkAtQkCBQNzdHIFCXNlcGFyYXRvcgMJAAACCQCQAwEFBXBhcnRzAAIJAJQKAgkAkQMCBQVwYXJ0cwAACQCRAwIFBXBhcnRzAAEJAAIBAhNpbnZhbGlkIHBvb2wgc3RyaW5nAA1wb29sc0xpc3ROYW1lAgVwb29scwEQZ2V0Vm90ZXNMaXN0TmFtZQEEcG9vbAQLJHQwMzMyMzMzNjMFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQskdDAzMzIzMzM2MwJfMQQMcHJpY2VBc3NldElkCAULJHQwMzMyMzMzNjMCXzIJALkJAgkAzAgCAgV2b3RlcwkAzAgCBQ1hbW91bnRBc3NldElkCQDMCAIFDHByaWNlQXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IBC2tleUxpc3RIZWFkAQhsaXN0TmFtZQQEbWV0YQMJAAACBQhsaXN0TmFtZQUNcG9vbHNMaXN0TmFtZQIEJXMlcwIIJXMlcyVzJXMJALkJAgkAzAgCBQRtZXRhCQDMCAIFCGxpc3ROYW1lCQDMCAICBGhlYWQFA25pbAUJc2VwYXJhdG9yAQtrZXlMaXN0U2l6ZQEIbGlzdE5hbWUEBG1ldGEDCQAAAgUIbGlzdE5hbWUFDXBvb2xzTGlzdE5hbWUCBCVzJXMCCCVzJXMlcyVzCQC5CQIJAMwIAgUEbWV0YQkAzAgCBQhsaXN0TmFtZQkAzAgCAgRzaXplBQNuaWwFCXNlcGFyYXRvcgELa2V5TGlzdFByZXYCCGxpc3ROYW1lAmlkBARtZXRhAwkAAAIFCGxpc3ROYW1lBQ1wb29sc0xpc3ROYW1lAgglcyVzJXMlcwIKJXMlcyVzJXMlcwkAuQkCCQDMCAIFBG1ldGEJAMwIAgUIbGlzdE5hbWUJAMwIAgUCaWQJAMwIAgIEcHJldgUDbmlsBQlzZXBhcmF0b3IBC2tleUxpc3ROZXh0AghsaXN0TmFtZQJpZAQEbWV0YQMJAAACBQhsaXN0TmFtZQUNcG9vbHNMaXN0TmFtZQIIJXMlcyVzJXMCCiVzJXMlcyVzJXMJALkJAgkAzAgCBQRtZXRhCQDMCAIFCGxpc3ROYW1lCQDMCAIFAmlkCQDMCAICBG5leHQFA25pbAUJc2VwYXJhdG9yAQxjb250YWluc05vZGUCCGxpc3ROYW1lAmlkBApoZWFkT3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0SGVhZAEFCGxpc3ROYW1lBApwcmV2T3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lBQJpZAQKbmV4dE9yVW5pdAkAnQgCBQR0aGlzCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQUCaWQDAwkAAAIFAmlkCQELdmFsdWVPckVsc2UCBQpoZWFkT3JVbml0AgAGCQECIT0CBQpwcmV2T3JVbml0BQR1bml0BgkBAiE9AgUKbmV4dE9yVW5pdAUEdW5pdAERaW5zZXJ0Tm9kZUFjdGlvbnMCCGxpc3ROYW1lAmlkBApoZWFkT3JVbml0CQCdCAIFBHRoaXMJAQtrZXlMaXN0SGVhZAEFCGxpc3ROYW1lBAhsaXN0U2l6ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQELa2V5TGlzdFNpemUBBQhsaXN0TmFtZQAABAljaGVja05vZGUDCQEBIQEJAQxjb250YWluc05vZGUCBQhsaXN0TmFtZQUCaWQGCQACAQILTm9kZSBleGlzdHMDCQAAAgUJY2hlY2tOb2RlBQljaGVja05vZGUJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELa2V5TGlzdFNpemUBBQhsaXN0TmFtZQkAZAIFCGxpc3RTaXplAAEFA25pbAMJAQIhPQIFCmhlYWRPclVuaXQFBHVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3ROZXh0AgUIbGlzdE5hbWUFAmlkCQEFdmFsdWUBBQpoZWFkT3JVbml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lCQEFdmFsdWUBBQpoZWFkT3JVbml0BQJpZAUDbmlsBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3RIZWFkAQUIbGlzdE5hbWUFAmlkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEWRlbGV0ZU5vZGVBY3Rpb25zAghsaXN0TmFtZQJpZAQKaGVhZE9yVW5pdAkAnQgCBQR0aGlzCQELa2V5TGlzdEhlYWQBBQhsaXN0TmFtZQQIbGlzdFNpemUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBC2tleUxpc3RTaXplAQUIbGlzdE5hbWUAAAQKcHJldk9yVW5pdAkAnQgCBQR0aGlzCQELa2V5TGlzdFByZXYCBQhsaXN0TmFtZQUCaWQECm5leHRPclVuaXQJAJ0IAgUEdGhpcwkBC2tleUxpc3ROZXh0AgUIbGlzdE5hbWUFAmlkCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtrZXlMaXN0U2l6ZQEFCGxpc3ROYW1lCQBlAgUIbGlzdFNpemUAAQUDbmlsAwMJAQIhPQIFCnByZXZPclVuaXQFBHVuaXQJAQIhPQIFCm5leHRPclVuaXQFBHVuaXQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlMaXN0TmV4dAIFCGxpc3ROYW1lCQEFdmFsdWUBBQpwcmV2T3JVbml0CQEFdmFsdWUBBQpuZXh0T3JVbml0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lCQEFdmFsdWUBBQpuZXh0T3JVbml0CQEFdmFsdWUBBQpwcmV2T3JVbml0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lBQJpZAkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQUCaWQFA25pbAMJAQIhPQIFCm5leHRPclVuaXQFBHVuaXQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleUxpc3RIZWFkAQUIbGlzdE5hbWUJAQV2YWx1ZQEFCm5leHRPclVuaXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleUxpc3ROZXh0AgUIbGlzdE5hbWUFAmlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lCQEFdmFsdWUBBQpuZXh0T3JVbml0BQNuaWwDCQECIT0CBQpwcmV2T3JVbml0BQR1bml0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQtrZXlMaXN0UHJldgIFCGxpc3ROYW1lBQJpZAkAzAgCCQELRGVsZXRlRW50cnkBCQELa2V5TGlzdE5leHQCBQhsaXN0TmFtZQkBBXZhbHVlAQUKcHJldk9yVW5pdAUDbmlsAwkAAAIFAmlkCQELdmFsdWVPckVsc2UCBQpoZWFkT3JVbml0AgAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBC2tleUxpc3RIZWFkAQUIbGlzdE5hbWUFA25pbAkAAgEJAKwCAgkArAICCQCsAgICDmludmFsaWQgbm9kZTogBQhsaXN0TmFtZQIBLgUCaWQBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAVcGVybWlzc2lvbkRlbmllZEVycm9yCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFFXBlcm1pc3Npb25EZW5pZWRFcnJvcgELbXVzdE1hbmFnZXIBAWkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUVcGVybWlzc2lvbkRlbmllZEVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQJAQhtdXN0VGhpcwEFAWkJAAIBAgtNYXRjaCBlcnJvchIBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0Agt1c2VyQWRkcmVzcwx0YXJnZXRIZWlnaHQEF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBDGdldFN0ck9yRmFpbAIFBHRoaXMFE2tleUJvb3N0aW5nQ29udHJhY3QCIWludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAlAoCBQNuaWwKAAFACQD8BwQFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzAiBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQx0YXJnZXRIZWlnaHQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEJAPwHBAUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDHRhcmdldEhlaWdodAUDbmlsBQNuaWwCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAFpAQtjb25zdHJ1Y3RvcgUPZmFjdG9yeUNvbnRyYWN0H3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QQYm9vc3RpbmdDb250cmFjdA9zdGFraW5nQ29udHJhY3QLZXBvY2hMZW5ndGgEBWNoZWtzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAQIhPQIJAKYIAQUPZmFjdG9yeUNvbnRyYWN0BQR1bml0BgIgaW52YWxpZCBmYWN0b3J5IGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUEdW5pdAYCMmludmFsaWQgdm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzCQDMCAIDCQECIT0CCQCmCAEFEGJvb3N0aW5nQ29udHJhY3QFBHVuaXQGAiFpbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQIhPQIJAKYIAQUPc3Rha2luZ0NvbnRyYWN0BQR1bml0BgIgaW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQtlcG9jaExlbmd0aAAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUFY2hla3MFBWNoZWtzCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUSa2V5RmFjdG9yeUNvbnRyYWN0BQ9mYWN0b3J5Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCBRNrZXlCb29zdGluZ0NvbnRyYWN0BRBib29zdGluZ0NvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFEmtleVN0YWtpbmdDb250cmFjdAUPc3Rha2luZ0NvbnRyYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rZXlFcG9jaExlbmd0aAULZXBvY2hMZW5ndGgFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZjcmVhdGUCDWFtb3VudEFzc2V0SWQMcHJpY2VBc3NldElkBAZjaGVja3MJAMwIAgMJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUia2V5Vm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAIABgkBC211c3RNYW5hZ2VyAQUBaQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBARwb29sCQCUCgIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAQNaW5MaXN0QWN0aW9ucwkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5SW5MaXN0AQUEcG9vbAYFA25pbAkBEWluc2VydE5vZGVBY3Rpb25zAgUNcG9vbHNMaXN0TmFtZQkBDHBvb2xUb1N0cmluZwEFBHBvb2wEGGN1cnJlbnRFcG9jaElzTm90RGVmaW5lZAkAAAIJAJoIAgUEdGhpcwUPa2V5Q3VycmVudEVwb2NoBQR1bml0BBJzdGFydEhlaWdodEFjdGlvbnMDBRhjdXJyZW50RXBvY2hJc05vdERlZmluZWQEBWVwb2NoAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUN1cnJlbnRFcG9jaAUFZXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlTdGFydEhlaWdodEJ5RXBvY2gBBQVlcG9jaAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rZXlTdGFydEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlDdXJyZW50RXBvY2hVaQUFZXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVN0YXJ0SGVpZ2h0VWkFBmhlaWdodAUDbmlsBQNuaWwJAJQKAgkAzggCBQ1pbkxpc3RBY3Rpb25zBRJzdGFydEhlaWdodEFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEdm90ZQMNYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQGYW1vdW50BARwb29sCQCUCgIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAQFZXBvY2gJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPa2V5Q3VycmVudEVwb2NoAAAEC3N0YXJ0SGVpZ2h0CQEMZ2V0SW50T3JGYWlsAgUEdGhpcwkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFBWVwb2NoBAtlcG9jaExlbmd0aAkBDGdldEludE9yRmFpbAIFBHRoaXMFDmtleUVwb2NoTGVuZ3RoBAllbmRIZWlnaHQJAGQCBQtzdGFydEhlaWdodAULZXBvY2hMZW5ndGgEF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0CQCaCAIFBHRoaXMFFGtleUZpbmFsaXphdGlvblN0YWdlBAR1c2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQdrZXlVc2VkAggFAWkGY2FsbGVyBQVlcG9jaAAABAR2b3RlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQdrZXlWb3RlAwUEcG9vbAgFAWkGY2FsbGVyBQVlcG9jaAAABApwb29sUmVzdWx0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQVlcG9jaAAABAp0b3RhbFZvdGVzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ1rZXlUb3RhbFZvdGVzAQUFZXBvY2gAAAQTZ3d4QW1vdW50QXRFbmRUb3RhbAoAAUAJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCBQllbmRIZWlnaHQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCBQllbmRIZWlnaHQFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQECWF2YWlsYWJsZQkAZQIFE2d3eEFtb3VudEF0RW5kVG90YWwFBHVzZWQEB25ld1ZvdGUJAGQCBQR2b3RlBQZhbW91bnQEBmNoZWNrcwkAzAgCAwkBAiE9AgkAoAgBCQEJa2V5SW5MaXN0AQUEcG9vbAUEdW5pdAYJAAIBAg5pbnZhbGlkIGFzc2V0cwkAzAgCAwkAZgIFCWVuZEhlaWdodAUGaGVpZ2h0BgkAAgECDmludmFsaWQgaGVpZ2h0CQDMCAIDCQAAAgUXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQFBHVuaXQGCQACAQIYZmluYWxpemF0aW9uIGluIHByb2dyZXNzCQDMCAIDCQBmAgUTZ3d4QW1vdW50QXRFbmRUb3RhbAAABgkAAgECE3lvdSBkbyBub3QgaGF2ZSBnV1gJAMwIAgMDCQBmAgUGYW1vdW50AAAJAGcCBQlhdmFpbGFibGUFBmFtb3VudAcGCQACAQIOaW52YWxpZCBhbW91bnQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNdm90ZXNMaXN0TmFtZQkBEGdldFZvdGVzTGlzdE5hbWUBBQRwb29sBA51c2VyQWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEEHZvdGVzTGlzdEFjdGlvbnMDCQEMY29udGFpbnNOb2RlAgUNdm90ZXNMaXN0TmFtZQUOdXNlckFkZHJlc3NTdHIFA25pbAkBEWluc2VydE5vZGVBY3Rpb25zAgUNdm90ZXNMaXN0TmFtZQUOdXNlckFkZHJlc3NTdHIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5VXNlZAIIBQFpBmNhbGxlcgUFZXBvY2gJAGQCBQR1c2VkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlWb3RlAwUEcG9vbAgFAWkGY2FsbGVyBQVlcG9jaAUHbmV3Vm90ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAIFBHBvb2wFBWVwb2NoCQBkAgUKcG9vbFJlc3VsdAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5VG90YWxWb3RlcwEFBWVwb2NoCQBkAgUKdG90YWxWb3RlcwUGYW1vdW50BQNuaWwFEHZvdGVzTGlzdEFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsVm90ZQINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQEBHBvb2wJAJQKAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBAVlcG9jaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlDdXJyZW50RXBvY2gAAAQLc3RhcnRIZWlnaHQJAQxnZXRJbnRPckZhaWwCBQR0aGlzCQEVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAQUFZXBvY2gEC2Vwb2NoTGVuZ3RoCQEMZ2V0SW50T3JGYWlsAgUEdGhpcwUOa2V5RXBvY2hMZW5ndGgECWVuZEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQtlcG9jaExlbmd0aAQXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQJAJoIAgUEdGhpcwUUa2V5RmluYWxpemF0aW9uU3RhZ2UEBHVzZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBB2tleVVzZWQCCAUBaQZjYWxsZXIFBWVwb2NoAAAEBHZvdGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBB2tleVZvdGUDBQRwb29sCAUBaQZjYWxsZXIFBWVwb2NoAAAECnBvb2xSZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleVZvdGluZ1Jlc3VsdAIFBHBvb2wFBWVwb2NoAAAECnRvdGFsVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDWtleVRvdGFsVm90ZXMBBQVlcG9jaAAABAZjaGVja3MJAMwIAgMJAQIhPQIJAKAIAQkBCWtleUluTGlzdAEFBHBvb2wFBHVuaXQGCQACAQIOaW52YWxpZCBhc3NldHMJAMwIAgMJAGYCBQllbmRIZWlnaHQFBmhlaWdodAYJAAIBAg5pbnZhbGlkIGhlaWdodAkAzAgCAwkAAAIFF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BQR1bml0BgkAAgECGGZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcwkAzAgCAwkAZgIFBHZvdGUAAAYJAAIBAgdubyB2b3RlBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDXZvdGVzTGlzdE5hbWUJARBnZXRWb3Rlc0xpc3ROYW1lAQUEcG9vbAQOdXNlckFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleVVzZWQCCAUBaQZjYWxsZXIFBWVwb2NoCQCWAwEJAMwIAgkAZQIFBHVzZWQFBHZvdGUJAMwIAgAABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVZvdGUDBQRwb29sCAUBaQZjYWxsZXIFBWVwb2NoCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5Vm90aW5nUmVzdWx0AgUEcG9vbAUFZXBvY2gJAGUCBQpwb29sUmVzdWx0BQR2b3RlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5VG90YWxWb3RlcwEFBWVwb2NoCQBlAgUKdG90YWxWb3RlcwUEdm90ZQUDbmlsCQERZGVsZXRlTm9kZUFjdGlvbnMCBQ12b3Rlc0xpc3ROYW1lBQ51c2VyQWRkcmVzc1N0cgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zZXRFcG9jaExlbmd0aAEObmV3RXBvY2hMZW5ndGgEBWNoZWtzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAGYCBQ5uZXdFcG9jaExlbmd0aAAABgkAAgECFGludmFsaWQgZXBvY2ggbGVuZ3RoBQNuaWwDCQAAAgUFY2hla3MFBWNoZWtzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleUVwb2NoTGVuZ3RoBQ5uZXdFcG9jaExlbmd0aAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE1heERlcHRoAQtuZXdNYXhEZXB0aAQFY2hla3MJAMwIAgkBC211c3RNYW5hZ2VyAQUBaQkAzAgCAwkAZgIFC25ld01heERlcHRoAAAGCQACAQIRaW52YWxpZCBtYXggZGVwdGgFA25pbAMJAAACBQVjaGVrcwUFY2hla3MJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgULa2V5TWF4RGVwdGgFC25ld01heERlcHRoBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETcHJvY2Vzc1ZvdGVJTlRFUk5BTAIHcG9vbFN0cg51c2VyQWRkcmVzc1N0cgQLY2hlY2tDYWxsZXIJAQhtdXN0VGhpcwEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFDnVzZXJBZGRyZXNzU3RyCQCsAgICKnByb2Nlc3NWb3RlSU5URVJOQUw6IGludmFsaWQgdXNlciBhZGRyZXNzIAUOdXNlckFkZHJlc3NTdHIEBWVwb2NoCQEMZ2V0SW50T3JGYWlsAgUEdGhpcwUPa2V5Q3VycmVudEVwb2NoBA1lcG9jaFByZXZpb3VzCQBlAgUFZXBvY2gAAQQLZXBvY2hMZW5ndGgJAQxnZXRJbnRPckZhaWwCBQR0aGlzBQ5rZXlFcG9jaExlbmd0aAQLc3RhcnRIZWlnaHQJAQxnZXRJbnRPckZhaWwCBQR0aGlzCQEVa2V5U3RhcnRIZWlnaHRCeUVwb2NoAQUFZXBvY2gECWVuZEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQtlcG9jaExlbmd0aAQTc3RhcnRIZWlnaHRQcmV2aW91cwkBDGdldEludE9yRmFpbAIFBHRoaXMJARVrZXlTdGFydEhlaWdodEJ5RXBvY2gBBQ1lcG9jaFByZXZpb3VzBBFlbmRIZWlnaHRQcmV2aW91cwkAZAIFE3N0YXJ0SGVpZ2h0UHJldmlvdXMFC2Vwb2NoTGVuZ3RoBBBjaGVja1RhcmdldEVwb2NoAwkAZwIFDWVwb2NoUHJldmlvdXMAAAYJAAIBAitwcm9jZXNzVm90ZUlOVEVSTkFMOiBpbnZhbGlkIHByZXZpb3VzIGVwb2NoAwkAAAIFEGNoZWNrVGFyZ2V0RXBvY2gFEGNoZWNrVGFyZ2V0RXBvY2gEBHBvb2wJAQxzdHJpbmdUb1Bvb2wBBQdwb29sU3RyBBNnd3hBbW91bnRBdEVuZFRvdGFsCgABQAkA/AcEBQR0aGlzAhhnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHQJAMwIAgUOdXNlckFkZHJlc3NTdHIJAMwIAgUJZW5kSGVpZ2h0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQ51c2VyQWRkcmVzc1N0cgkAzAgCBQllbmRIZWlnaHQFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEG2d3eEFtb3VudEF0RW5kVG90YWxQcmV2aW91cwoAAUAJAPwHBAUEdGhpcwIYZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0CQDMCAIFDnVzZXJBZGRyZXNzU3RyCQDMCAIFEWVuZEhlaWdodFByZXZpb3VzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCGGdldFVzZXJHd3hBbW91bnRBdEhlaWdodAkAzAgCBQ51c2VyQWRkcmVzc1N0cgkAzAgCBRFlbmRIZWlnaHRQcmV2aW91cwUDbmlsBQNuaWwCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQKdG90YWxWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQENa2V5VG90YWxWb3RlcwEFBWVwb2NoAAAEDHZvdGluZ1Jlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5Vm90aW5nUmVzdWx0AgUEcG9vbAUFZXBvY2gAAAQMdm90ZVByZXZpb3VzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkBB2tleVZvdGUDBQRwb29sBQt1c2VyQWRkcmVzcwUNZXBvY2hQcmV2aW91cwkArAICCQCsAgIJAKwCAgkArAICAhRwcm9jZXNzVm90ZUlOVEVSTkFMIAUHcG9vbFN0cgIBIAUOdXNlckFkZHJlc3NTdHICEjogbm8gcHJldmlvdXMgdm90ZQQEdXNlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEHa2V5VXNlZAIFC3VzZXJBZGRyZXNzBQVlcG9jaAAABAduZXdWb3RlCQBrAwUMdm90ZVByZXZpb3VzBRNnd3hBbW91bnRBdEVuZFRvdGFsBRtnd3hBbW91bnRBdEVuZFRvdGFsUHJldmlvdXMEB2FjdGlvbnMDCQBmAgUHbmV3Vm90ZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5Vm90ZQMFBHBvb2wFC3VzZXJBZGRyZXNzBQVlcG9jaAUHbmV3Vm90ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleVRvdGFsVm90ZXMBBQVlcG9jaAkAZAIFCnRvdGFsVm90ZXMFB25ld1ZvdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQVlcG9jaAkAZAIFDHZvdGluZ1Jlc3VsdAUHbmV3Vm90ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleVVzZWQCBQt1c2VyQWRkcmVzcwUFZXBvY2gJAGQCBQR1c2VkBQduZXdWb3RlBQNuaWwJARFkZWxldGVOb2RlQWN0aW9ucwIJARBnZXRWb3Rlc0xpc3ROYW1lAQUEcG9vbAUOdXNlckFkZHJlc3NTdHIJAJQKAgUHYWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNwcm9jZXNzUG9vbElOVEVSTkFMAQdwb29sU3RyBAtjaGVja0NhbGxlcgkBCG11c3RUaGlzAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3RhcmdldEVwb2NoCQBlAgkBDGdldEludE9yRmFpbAIFBHRoaXMFD2tleUN1cnJlbnRFcG9jaAABBBBjaGVja1RhcmdldEVwb2NoAwkAZwIFC3RhcmdldEVwb2NoAAAGCQACAQIpcHJvY2Vzc1Bvb2xJTlRFUk5BTDogaW52YWxpZCB0YXJnZXQgZXBvY2gDCQAAAgUQY2hlY2tUYXJnZXRFcG9jaAUQY2hlY2tUYXJnZXRFcG9jaAQEcG9vbAkBDHN0cmluZ1RvUG9vbAEFB3Bvb2xTdHIEDSR0MDE3MDMwMTcwNzAFBHBvb2wEDWFtb3VudEFzc2V0SWQIBQ0kdDAxNzAzMDE3MDcwAl8xBAxwcmljZUFzc2V0SWQIBQ0kdDAxNzAzMDE3MDcwAl8yBA9zdGFraW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQxnZXRTdHJPckZhaWwCBQR0aGlzBRJrZXlTdGFraW5nQ29udHJhY3QED2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBDGdldFN0ck9yRmFpbAIFBHRoaXMFEmtleUZhY3RvcnlDb250cmFjdAQNJHQwMTcyNDgxNzQyMgoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AjBnZXRQb29sQ29udHJhY3RBZGRyZXNzQW5kTHBBc3NldEJ5QXNzZXRzUkVBRE9OTFkJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDbmlsAwkAAQIFAUACEChTdHJpbmcsIFN0cmluZykFAUAJAAIBCQCsAgIJAAMBCQD8BwQFD2ZhY3RvcnlDb250cmFjdAIwZ2V0UG9vbENvbnRyYWN0QWRkcmVzc0FuZExwQXNzZXRCeUFzc2V0c1JFQURPTkxZCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFA25pbAIlIGNvdWxkbid0IGJlIGNhc3QgdG8gKFN0cmluZywgU3RyaW5nKQQTcG9vbENvbnRyYWN0QWRkcmVzcwgFDSR0MDE3MjQ4MTc0MjICXzEECWxwQXNzZXRJZAgFDSR0MDE3MjQ4MTc0MjICXzIEAXIKAAFACQD8BwQFD3N0YWtpbmdDb250cmFjdAISdXNlcnNMaXN0VHJhdmVyc2FsCQDMCAIFCWxwQXNzZXRJZAUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhJ1c2Vyc0xpc3RUcmF2ZXJzYWwJAMwIAgUJbHBBc3NldElkBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQFyBQFyAwUBcgkAlAoCBQNuaWwGBAp0b3RhbFZvdGVzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ1rZXlUb3RhbFZvdGVzAQULdGFyZ2V0RXBvY2gAAAQMdm90aW5nUmVzdWx0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlWb3RpbmdSZXN1bHQCBQRwb29sBQt0YXJnZXRFcG9jaAAABAVzaGFyZQMJAAACBQp0b3RhbFZvdGVzAAAAAAkAawMFDHZvdGluZ1Jlc3VsdAUOcG9vbFdlaWdodE11bHQFCnRvdGFsVm90ZXMED21vZGlmeVdlaWdodEludgkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCDG1vZGlmeVdlaWdodAkAzAgCBQlscEFzc2V0SWQJAMwIAgUFc2hhcmUFA25pbAUDbmlsAwkAAAIFD21vZGlmeVdlaWdodEludgUPbW9kaWZ5V2VpZ2h0SW52CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlQb29sU2hhcmUCBQRwb29sBQt0YXJnZXRFcG9jaAUFc2hhcmUFA25pbAcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABAVlcG9jaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ9rZXlDdXJyZW50RXBvY2gAAAQNcHJldmlvdXNFcG9jaAkAZQIFBWVwb2NoAAEEC3N0YXJ0SGVpZ2h0CQEMZ2V0SW50T3JGYWlsAgUEdGhpcwkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFBWVwb2NoBAtlcG9jaExlbmd0aAkBDGdldEludE9yRmFpbAIFBHRoaXMFDmtleUVwb2NoTGVuZ3RoBAllbmRIZWlnaHQJAGQCBQtzdGFydEhlaWdodAULZXBvY2hMZW5ndGgEF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0CQCaCAIFBHRoaXMFFGtleUZpbmFsaXphdGlvblN0YWdlAwkAZwIFBmhlaWdodAUJZW5kSGVpZ2h0BAhuZXdFcG9jaAkAZAIFBWVwb2NoAAEJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleVN0YXJ0SGVpZ2h0QnlFcG9jaAEFCG5ld0Vwb2NoBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFD2tleUN1cnJlbnRFcG9jaAUIbmV3RXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIFFGtleUZpbmFsaXphdGlvblN0YWdlBRZmaW5hbGl6YXRpb25TdGFnZVRvdGFsBQNuaWwGAwkAAAIFF2ZpbmFsaXphdGlvblN0YWdlT3JVbml0BQR1bml0CQCUCgIFA25pbAcDCQAAAgUXZmluYWxpemF0aW9uU3RhZ2VPclVuaXQFFmZpbmFsaXphdGlvblN0YWdlVG90YWwECnBvb2xPclVuaXQJAKIIAQULa2V5TmV4dFBvb2wECnVzZXJPclVuaXQJAKIIAQULa2V5TmV4dFVzZXIEByRtYXRjaDAFCnBvb2xPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAQHJG1hdGNoMQkAoggBCQELa2V5TGlzdEhlYWQBBQ1wb29sc0xpc3ROYW1lAwkAAQIFByRtYXRjaDECBFVuaXQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5RmluYWxpemF0aW9uU3RhZ2UFF2ZpbmFsaXphdGlvblN0YWdlU2hhcmVzCQDMCAIJAQtEZWxldGVFbnRyeQEFC2tleU5leHRQb29sCQDMCAIJAQtEZWxldGVFbnRyeQEFC2tleU5leHRVc2VyBQNuaWwGAwkAAQIFByRtYXRjaDECBlN0cmluZwQMcG9vbHNIZWFkU3RyBQckbWF0Y2gxCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5TmV4dFBvb2wFDHBvb2xzSGVhZFN0cgUDbmlsBgkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBlN0cmluZwQHcG9vbFN0cgUHJG1hdGNoMAQEcG9vbAkBDHN0cmluZ1RvUG9vbAEFB3Bvb2xTdHIEDm5leHRVc2VyT3JVbml0BAckbWF0Y2gxBQp1c2VyT3JVbml0AwkAAQIFByRtYXRjaDECBFVuaXQJAKIIAQkBC2tleUxpc3RIZWFkAQkBEGdldFZvdGVzTGlzdE5hbWUBBQRwb29sAwkAAQIFByRtYXRjaDECBlN0cmluZwQEdXNlcgUHJG1hdGNoMQQOcHJvY2Vzc1ZvdGVJbnYJAPwHBAUEdGhpcwITcHJvY2Vzc1ZvdGVJTlRFUk5BTAkAzAgCBQdwb29sU3RyCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFDnByb2Nlc3NWb3RlSW52BQ5wcm9jZXNzVm90ZUludgkAoggBCQELa2V5TGlzdE5leHQCCQEQZ2V0Vm90ZXNMaXN0TmFtZQEFBHBvb2wFBHVzZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMQUObmV4dFVzZXJPclVuaXQDCQABAgUHJG1hdGNoMQIEVW5pdAQObmV4dFBvb2xPclVuaXQJAKIIAQkBC2tleUxpc3ROZXh0AgUNcG9vbHNMaXN0TmFtZQUHcG9vbFN0cgQHJG1hdGNoMgUObmV4dFBvb2xPclVuaXQDCQABAgUHJG1hdGNoMgIEVW5pdAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRrZXlGaW5hbGl6YXRpb25TdGFnZQUXZmluYWxpemF0aW9uU3RhZ2VTaGFyZXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQULa2V5TmV4dFBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQULa2V5TmV4dFVzZXIFA25pbAYDCQABAgUHJG1hdGNoMgIGU3RyaW5nBAFzBQckbWF0Y2gyCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5TmV4dFBvb2wFAXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQULa2V5TmV4dFVzZXIFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gxAgZTdHJpbmcECG5leHRVc2VyBQckbWF0Y2gxCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5TmV4dFVzZXIFCG5leHRVc2VyBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAgtNYXRjaCBlcnJvcgMJAAACBRdmaW5hbGl6YXRpb25TdGFnZU9yVW5pdAUXZmluYWxpemF0aW9uU3RhZ2VTaGFyZXMECnBvb2xPclVuaXQJAKIIAQULa2V5TmV4dFBvb2wEByRtYXRjaDAFCnBvb2xPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAQHJG1hdGNoMQkAoggBCQELa2V5TGlzdEhlYWQBBQ1wb29sc0xpc3ROYW1lAwkAAQIFByRtYXRjaDECBFVuaXQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBBRRrZXlGaW5hbGl6YXRpb25TdGFnZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDGtleUZpbmFsaXplZAEFDXByZXZpb3VzRXBvY2gGCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlDdXJyZW50RXBvY2hVaQUFZXBvY2gJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVN0YXJ0SGVpZ2h0VWkFC3N0YXJ0SGVpZ2h0BQNuaWwGAwkAAQIFByRtYXRjaDECBlN0cmluZwQLbmV4dFBvb2xTdHIFByRtYXRjaDEJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQtrZXlOZXh0UG9vbAULbmV4dFBvb2xTdHIFA25pbAYJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEB3Bvb2xTdHIFByRtYXRjaDAEAXIKAAFACQD8BwQFBHRoaXMCE3Byb2Nlc3NQb29sSU5URVJOQUwJAMwIAgUHcG9vbFN0cgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwITcHJvY2Vzc1Bvb2xJTlRFUk5BTAkAzAgCBQdwb29sU3RyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQFyBQFyAwUBcgkAlAoCBQNuaWwGBA5uZXh0UG9vbE9yVW5pdAkAoggBCQELa2V5TGlzdE5leHQCBQ1wb29sc0xpc3ROYW1lBQdwb29sU3RyBAckbWF0Y2gxBQ5uZXh0UG9vbE9yVW5pdAMJAAECBQckbWF0Y2gxAgRVbml0CQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUUa2V5RmluYWxpemF0aW9uU3RhZ2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQxrZXlGaW5hbGl6ZWQBBQ1wcmV2aW91c0Vwb2NoBgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5Q3VycmVudEVwb2NoVWkFBWVwb2NoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlTdGFydEhlaWdodFVpBQtzdGFydEhlaWdodAkAzAgCCQELRGVsZXRlRW50cnkBBQtrZXlOZXh0UG9vbAUDbmlsBgMJAAECBQckbWF0Y2gxAgZTdHJpbmcEC25leHRQb29sU3RyBQckbWF0Y2gxCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgULa2V5TmV4dFBvb2wFC25leHRQb29sU3RyBQNuaWwGCQACAQILTWF0Y2ggZXJyb3IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtNYXRjaCBlcnJvcgkAAgECFmZpbmFsaXphdGlvbiBpcyBicm9rZW4BaQEPZmluYWxpemVXcmFwcGVyAQdjb3VudGVyBAZyZXN1bHQKAAFACQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUGcmVzdWx0BQZyZXN1bHQDCQEBIQEFBnJlc3VsdAMJAAACBQdjb3VudGVyAAAJAAIBAh5DdXJyZW50IHZvdGluZyBpcyBub3Qgb3ZlciB5ZXQJAJQKAgUDbmlsBQR1bml0BAhtYXhEZXB0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlNYXhEZXB0aAUPbWF4RGVwdGhEZWZhdWx0AwkAZgIFCG1heERlcHRoBQdjb3VudGVyBANpbnYJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGQCBQdjb3VudGVyAAEFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpemUABANpbnYJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEm9uVmVyaWZpY2F0aW9uTG9zcwEHYXNzZXRJZAkAlAoCBQNuaWwFBHVuaXQBaQEUY29udGFpbnNOb2RlUkVBRE9OTFkCCGxpc3ROYW1lAmlkCQCUCgIFA25pbAkBDGNvbnRhaW5zTm9kZQIFCGxpc3ROYW1lBQJpZAFpAQppbnNlcnROb2RlAghsaXN0TmFtZQJpZAQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJARFpbnNlcnROb2RlQWN0aW9ucwIFCGxpc3ROYW1lBQJpZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZWxldGVOb2RlAghsaXN0TmFtZQJpZAQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQCUCgIJARFkZWxldGVOb2RlQWN0aW9ucwIFCGxpc3ROYW1lBQJpZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleXF/J7M=", "chainId": 84, "height": 2107539, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ELK4b5o9ABp9H6iJxgTtC9s365ch86usH4mwKL82yXw2 Next: 5onWkaJRBHfGjUcqGk4tUz1cA8dbDDN5R6GxnRP47dPB Diff:
OldNewDifferences
511511 let amountAssetId = $t01703017070._1
512512 let priceAssetId = $t01703017070._2
513513 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
514+ let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
515+ let $t01724817422 = {
516+ let @ = invoke(factoryContract, "getPoolContractAddressAndLpAssetByAssetsREADONLY", [amountAssetId, priceAssetId], nil)
517+ if ($isInstanceOf(@, "(String, String)"))
518+ then @
519+ else throw(($getType(invoke(factoryContract, "getPoolContractAddressAndLpAssetByAssetsREADONLY", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to (String, String)"))
520+ }
521+ let poolContractAddress = $t01724817422._1
522+ let lpAssetId = $t01724817422._2
514523 let r = {
515- let @ = invoke(stakingContract, "usersListTraversal", [amountAssetId, priceAssetId], nil)
524+ let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
516525 if ($isInstanceOf(@, "Boolean"))
517526 then @
518- else throw(($getType(invoke(stakingContract, "usersListTraversal", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to Boolean"))
527+ else throw(($getType(invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)) + " couldn't be cast to Boolean"))
519528 }
520529 if ((r == r))
521530 then if (r)
526535 let share = if ((totalVotes == 0))
527536 then 0
528537 else fraction(votingResult, poolWeightMult, totalVotes)
529- let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
530- let modifyWeightInv = invoke(factoryContract, "modifyWeight", [amountAssetId, priceAssetId, share], nil)
538+ let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
531539 if ((modifyWeightInv == modifyWeightInv))
532540 then $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], false)
533541 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let poolWeightMult = 100000000
77
88 let maxDepthDefault = 10
99
1010 let finalizationStageTotal = 0
1111
1212 let finalizationStageShares = 1
1313
1414 let keyEpochLength = makeString(["%s", "epochLength"], separator)
1515
1616 let keyCurrentEpoch = makeString(["%s", "currentEpoch"], separator)
1717
1818 let keyMaxDepth = makeString(["%s", "maxDepth"], separator)
1919
2020 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], separator)
2121
2222 let keyFactoryContract = makeString(["%s", "factoryContract"], separator)
2323
2424 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
2525
2626 let keyStakingContract = makeString(["%s", "stakingContract"], separator)
2727
2828 let keyFinalizationStage = makeString(["%s", "finalizationStage"], separator)
2929
3030 let keyNextPool = makeString(["%s", "nextPool"], separator)
3131
3232 let keyNextUser = makeString(["%s", "nextUser"], separator)
3333
3434 let keyStartHeight = makeString(["%s", "startHeight"], separator)
3535
3636 let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], separator)
3737
3838 let keyStartHeightUi = makeString(["%s", "startHeightUi"], separator)
3939
4040 func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], separator)
4141
4242
4343 func keyFinalized (epoch) = makeString(["%s%d", "finalized", toString(epoch)], separator)
4444
4545
4646 func keyInList (pool) = {
4747 let $t014361476 = pool
4848 let amountAssetId = $t014361476._1
4949 let priceAssetId = $t014361476._2
5050 makeString(["%s%s%s", "inList", amountAssetId, priceAssetId], separator)
5151 }
5252
5353
5454 func keyUsed (address,epoch) = makeString(["%s%s%d", "used", toString(address), toString(epoch)], separator)
5555
5656
5757 func keyVote (pool,address,epoch) = {
5858 let $t017501790 = pool
5959 let amountAssetId = $t017501790._1
6060 let priceAssetId = $t017501790._2
6161 makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], separator)
6262 }
6363
6464
6565 func keyVotingResult (pool,epoch) = {
6666 let $t019722012 = pool
6767 let amountAssetId = $t019722012._1
6868 let priceAssetId = $t019722012._2
6969 makeString(["%s%s%s%d", "votingResult", amountAssetId, priceAssetId, toString(epoch)], separator)
7070 }
7171
7272
7373 func keyPoolShare (pool,epoch) = {
7474 let $t021772217 = pool
7575 let amountAssetId = $t021772217._1
7676 let priceAssetId = $t021772217._2
7777 makeString(["%s%s%s%d", "poolShare", amountAssetId, priceAssetId, toString(epoch)], separator)
7878 }
7979
8080
8181 func keyTotalVotes (epoch) = makeString(["%s%d", "totalVotes", toString(epoch)], separator)
8282
8383
8484 func getValueOrFail (address,key,type) = {
8585 let error = makeString(["mandatory ", toString(address), ".", key, " is not defined"], "")
8686 valueOrErrorMessage( match type {
8787 case str: String =>
8888 getString(address, key)
8989 case int: Int =>
9090 getInteger(address, key)
9191 case _ =>
9292 throw("invalid entry type")
9393 }, error)
9494 }
9595
9696
9797 func getStrOrFail (address,key) = {
9898 let @ = getValueOrFail(address, key, "")
9999 if ($isInstanceOf(@, "String"))
100100 then @
101101 else throw(($getType(getValueOrFail(address, key, "")) + " couldn't be cast to String"))
102102 }
103103
104104
105105 func getIntOrFail (address,key) = {
106106 let @ = getValueOrFail(address, key, 0)
107107 if ($isInstanceOf(@, "Int"))
108108 then @
109109 else throw(($getType(getValueOrFail(address, key, 0)) + " couldn't be cast to Int"))
110110 }
111111
112112
113113 func poolToString (pool) = ((pool._1 + separator) + pool._2)
114114
115115
116116 func stringToPool (str) = {
117117 let parts = split(str, separator)
118118 if ((size(parts) == 2))
119119 then $Tuple2(parts[0], parts[1])
120120 else throw("invalid pool string")
121121 }
122122
123123
124124 let poolsListName = "pools"
125125
126126 func getVotesListName (pool) = {
127127 let $t033233363 = pool
128128 let amountAssetId = $t033233363._1
129129 let priceAssetId = $t033233363._2
130130 makeString(["votes", amountAssetId, priceAssetId], separator)
131131 }
132132
133133
134134 func keyListHead (listName) = {
135135 let meta = if ((listName == poolsListName))
136136 then "%s%s"
137137 else "%s%s%s%s"
138138 makeString([meta, listName, "head"], separator)
139139 }
140140
141141
142142 func keyListSize (listName) = {
143143 let meta = if ((listName == poolsListName))
144144 then "%s%s"
145145 else "%s%s%s%s"
146146 makeString([meta, listName, "size"], separator)
147147 }
148148
149149
150150 func keyListPrev (listName,id) = {
151151 let meta = if ((listName == poolsListName))
152152 then "%s%s%s%s"
153153 else "%s%s%s%s%s"
154154 makeString([meta, listName, id, "prev"], separator)
155155 }
156156
157157
158158 func keyListNext (listName,id) = {
159159 let meta = if ((listName == poolsListName))
160160 then "%s%s%s%s"
161161 else "%s%s%s%s%s"
162162 makeString([meta, listName, id, "next"], separator)
163163 }
164164
165165
166166 func containsNode (listName,id) = {
167167 let headOrUnit = getString(this, keyListHead(listName))
168168 let prevOrUnit = getString(this, keyListPrev(listName, id))
169169 let nextOrUnit = getString(this, keyListNext(listName, id))
170170 if (if ((id == valueOrElse(headOrUnit, "")))
171171 then true
172172 else (prevOrUnit != unit))
173173 then true
174174 else (nextOrUnit != unit)
175175 }
176176
177177
178178 func insertNodeActions (listName,id) = {
179179 let headOrUnit = getString(this, keyListHead(listName))
180180 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
181181 let checkNode = if (!(containsNode(listName, id)))
182182 then true
183183 else throw("Node exists")
184184 if ((checkNode == checkNode))
185185 then (([IntegerEntry(keyListSize(listName), (listSize + 1))] ++ (if ((headOrUnit != unit))
186186 then [StringEntry(keyListNext(listName, id), value(headOrUnit)), StringEntry(keyListPrev(listName, value(headOrUnit)), id)]
187187 else nil)) ++ [StringEntry(keyListHead(listName), id)])
188188 else throw("Strict value is not equal to itself.")
189189 }
190190
191191
192192 func deleteNodeActions (listName,id) = {
193193 let headOrUnit = getString(this, keyListHead(listName))
194194 let listSize = valueOrElse(getInteger(this, keyListSize(listName)), 0)
195195 let prevOrUnit = getString(this, keyListPrev(listName, id))
196196 let nextOrUnit = getString(this, keyListNext(listName, id))
197197 ([IntegerEntry(keyListSize(listName), (listSize - 1))] ++ (if (if ((prevOrUnit != unit))
198198 then (nextOrUnit != unit)
199199 else false)
200200 then [StringEntry(keyListNext(listName, value(prevOrUnit)), value(nextOrUnit)), StringEntry(keyListPrev(listName, value(nextOrUnit)), value(prevOrUnit)), DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, id))]
201201 else if ((nextOrUnit != unit))
202202 then [StringEntry(keyListHead(listName), value(nextOrUnit)), DeleteEntry(keyListNext(listName, id)), DeleteEntry(keyListPrev(listName, value(nextOrUnit)))]
203203 else if ((prevOrUnit != unit))
204204 then [DeleteEntry(keyListPrev(listName, id)), DeleteEntry(keyListNext(listName, value(prevOrUnit)))]
205205 else if ((id == valueOrElse(headOrUnit, "")))
206206 then [DeleteEntry(keyListHead(listName))]
207207 else throw(((("invalid node: " + listName) + ".") + id))))
208208 }
209209
210210
211211 func keyManagerPublicKey () = "%s__managerPublicKey"
212212
213213
214214 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
215215
216216
217217 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
218218 case s: String =>
219219 fromBase58String(s)
220220 case _: Unit =>
221221 unit
222222 case _ =>
223223 throw("Match error")
224224 }
225225
226226
227227 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
228228 case s: String =>
229229 fromBase58String(s)
230230 case _: Unit =>
231231 unit
232232 case _ =>
233233 throw("Match error")
234234 }
235235
236236
237237 let permissionDeniedError = throw("Permission denied")
238238
239239 func mustThis (i) = if ((i.caller == this))
240240 then true
241241 else permissionDeniedError
242242
243243
244244 func mustManager (i) = match managerPublicKeyOrUnit() {
245245 case pk: ByteVector =>
246246 if ((i.callerPublicKey == pk))
247247 then true
248248 else permissionDeniedError
249249 case _: Unit =>
250250 mustThis(i)
251251 case _ =>
252252 throw("Match error")
253253 }
254254
255255
256256 @Callable(i)
257257 func setManager (pendingManagerPublicKey) = {
258258 let checkCaller = mustManager(i)
259259 if ((checkCaller == checkCaller))
260260 then {
261261 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
262262 if ((checkManagerPublicKey == checkManagerPublicKey))
263263 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
264264 else throw("Strict value is not equal to itself.")
265265 }
266266 else throw("Strict value is not equal to itself.")
267267 }
268268
269269
270270
271271 @Callable(i)
272272 func confirmManager () = {
273273 let pm = pendingManagerPublicKeyOrUnit()
274274 let hasPM = if (isDefined(pm))
275275 then true
276276 else throw("No pending manager")
277277 if ((hasPM == hasPM))
278278 then {
279279 let checkPM = if ((i.callerPublicKey == value(pm)))
280280 then true
281281 else throw("You are not pending manager")
282282 if ((checkPM == checkPM))
283283 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
284284 else throw("Strict value is not equal to itself.")
285285 }
286286 else throw("Strict value is not equal to itself.")
287287 }
288288
289289
290290
291291 @Callable(i)
292292 func getUserGwxAmountAtHeight (userAddress,targetHeight) = {
293293 let boostingContractAddress = valueOrErrorMessage(addressFromString(getStrOrFail(this, keyBoostingContract)), "invalid boosting contract address")
294294 $Tuple2(nil, {
295295 let @ = invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)
296296 if ($isInstanceOf(@, "Int"))
297297 then @
298298 else throw(($getType(invoke(boostingContractAddress, "getUserGwxAmountAtHeightREADONLY", [userAddress, targetHeight], nil)) + " couldn't be cast to Int"))
299299 })
300300 }
301301
302302
303303
304304 @Callable(i)
305305 func constructor (factoryContract,votingEmissionCandidateContract,boostingContract,stakingContract,epochLength) = {
306306 let cheks = [mustManager(i), if ((addressFromString(factoryContract) != unit))
307307 then true
308308 else "invalid factory contract address", if ((addressFromString(votingEmissionCandidateContract) != unit))
309309 then true
310310 else "invalid voting emission candidate contract address", if ((addressFromString(boostingContract) != unit))
311311 then true
312312 else "invalid boosting contract address", if ((addressFromString(stakingContract) != unit))
313313 then true
314314 else "invalid staking contract address", if ((epochLength > 0))
315315 then true
316316 else throw("invalid epoch length")]
317317 if ((cheks == cheks))
318318 then $Tuple2([StringEntry(keyFactoryContract, factoryContract), StringEntry(keyVotingEmissionCandidateContract, votingEmissionCandidateContract), StringEntry(keyBoostingContract, boostingContract), StringEntry(keyStakingContract, stakingContract), IntegerEntry(keyEpochLength, epochLength)], unit)
319319 else throw("Strict value is not equal to itself.")
320320 }
321321
322322
323323
324324 @Callable(i)
325325 func create (amountAssetId,priceAssetId) = {
326326 let checks = [if ((toBase58String(i.caller.bytes) == valueOrElse(getString(this, keyVotingEmissionCandidateContract), "")))
327327 then true
328328 else mustManager(i)]
329329 if ((checks == checks))
330330 then {
331331 let pool = $Tuple2(amountAssetId, priceAssetId)
332332 let inListActions = ([BooleanEntry(keyInList(pool), true)] ++ insertNodeActions(poolsListName, poolToString(pool)))
333333 let currentEpochIsNotDefined = (getInteger(this, keyCurrentEpoch) == unit)
334334 let startHeightActions = if (currentEpochIsNotDefined)
335335 then {
336336 let epoch = 0
337337 [IntegerEntry(keyCurrentEpoch, epoch), IntegerEntry(keyStartHeightByEpoch(epoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, height)]
338338 }
339339 else nil
340340 $Tuple2((inListActions ++ startHeightActions), unit)
341341 }
342342 else throw("Strict value is not equal to itself.")
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func vote (amountAssetId,priceAssetId,amount) = {
349349 let pool = $Tuple2(amountAssetId, priceAssetId)
350350 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
351351 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
352352 let epochLength = getIntOrFail(this, keyEpochLength)
353353 let endHeight = (startHeight + epochLength)
354354 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
355355 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
356356 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
357357 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
358358 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
359359 let gwxAmountAtEndTotal = {
360360 let @ = invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)
361361 if ($isInstanceOf(@, "Int"))
362362 then @
363363 else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [toBase58String(i.caller.bytes), endHeight], nil)) + " couldn't be cast to Int"))
364364 }
365365 let available = (gwxAmountAtEndTotal - used)
366366 let newVote = (vote + amount)
367367 let checks = [if ((getBoolean(keyInList(pool)) != unit))
368368 then true
369369 else throw("invalid assets"), if ((endHeight > height))
370370 then true
371371 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
372372 then true
373373 else throw("finalization in progress"), if ((gwxAmountAtEndTotal > 0))
374374 then true
375375 else throw("you do not have gWX"), if (if ((amount > 0))
376376 then (available >= amount)
377377 else false)
378378 then true
379379 else throw("invalid amount")]
380380 if ((checks == checks))
381381 then {
382382 let votesListName = getVotesListName(pool)
383383 let userAddressStr = toString(i.caller)
384384 let votesListActions = if (containsNode(votesListName, userAddressStr))
385385 then nil
386386 else insertNodeActions(votesListName, userAddressStr)
387387 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), (used + amount)), IntegerEntry(keyVote(pool, i.caller, epoch), newVote), IntegerEntry(keyVotingResult(pool, epoch), (poolResult + amount)), IntegerEntry(keyTotalVotes(epoch), (totalVotes + amount))] ++ votesListActions), unit)
388388 }
389389 else throw("Strict value is not equal to itself.")
390390 }
391391
392392
393393
394394 @Callable(i)
395395 func cancelVote (amountAssetId,priceAssetId) = {
396396 let pool = $Tuple2(amountAssetId, priceAssetId)
397397 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
398398 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
399399 let epochLength = getIntOrFail(this, keyEpochLength)
400400 let endHeight = (startHeight + epochLength)
401401 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
402402 let used = valueOrElse(getInteger(this, keyUsed(i.caller, epoch)), 0)
403403 let vote = valueOrElse(getInteger(this, keyVote(pool, i.caller, epoch)), 0)
404404 let poolResult = valueOrElse(getInteger(this, keyVotingResult(pool, epoch)), 0)
405405 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(epoch)), 0)
406406 let checks = [if ((getBoolean(keyInList(pool)) != unit))
407407 then true
408408 else throw("invalid assets"), if ((endHeight > height))
409409 then true
410410 else throw("invalid height"), if ((finalizationStageOrUnit == unit))
411411 then true
412412 else throw("finalization in progress"), if ((vote > 0))
413413 then true
414414 else throw("no vote")]
415415 if ((checks == checks))
416416 then {
417417 let votesListName = getVotesListName(pool)
418418 let userAddressStr = toString(i.caller)
419419 $Tuple2(([IntegerEntry(keyUsed(i.caller, epoch), max([(used - vote), 0])), DeleteEntry(keyVote(pool, i.caller, epoch)), IntegerEntry(keyVotingResult(pool, epoch), (poolResult - vote)), IntegerEntry(keyTotalVotes(epoch), (totalVotes - vote))] ++ deleteNodeActions(votesListName, userAddressStr)), unit)
420420 }
421421 else throw("Strict value is not equal to itself.")
422422 }
423423
424424
425425
426426 @Callable(i)
427427 func setEpochLength (newEpochLength) = {
428428 let cheks = [mustManager(i), if ((newEpochLength > 0))
429429 then true
430430 else throw("invalid epoch length")]
431431 if ((cheks == cheks))
432432 then $Tuple2([IntegerEntry(keyEpochLength, newEpochLength)], unit)
433433 else throw("Strict value is not equal to itself.")
434434 }
435435
436436
437437
438438 @Callable(i)
439439 func setMaxDepth (newMaxDepth) = {
440440 let cheks = [mustManager(i), if ((newMaxDepth > 0))
441441 then true
442442 else throw("invalid max depth")]
443443 if ((cheks == cheks))
444444 then $Tuple2([IntegerEntry(keyMaxDepth, newMaxDepth)], unit)
445445 else throw("Strict value is not equal to itself.")
446446 }
447447
448448
449449
450450 @Callable(i)
451451 func processVoteINTERNAL (poolStr,userAddressStr) = {
452452 let checkCaller = mustThis(i)
453453 if ((checkCaller == checkCaller))
454454 then {
455455 let userAddress = valueOrErrorMessage(addressFromString(userAddressStr), ("processVoteINTERNAL: invalid user address " + userAddressStr))
456456 let epoch = getIntOrFail(this, keyCurrentEpoch)
457457 let epochPrevious = (epoch - 1)
458458 let epochLength = getIntOrFail(this, keyEpochLength)
459459 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
460460 let endHeight = (startHeight + epochLength)
461461 let startHeightPrevious = getIntOrFail(this, keyStartHeightByEpoch(epochPrevious))
462462 let endHeightPrevious = (startHeightPrevious + epochLength)
463463 let checkTargetEpoch = if ((epochPrevious >= 0))
464464 then true
465465 else throw("processVoteINTERNAL: invalid previous epoch")
466466 if ((checkTargetEpoch == checkTargetEpoch))
467467 then {
468468 let pool = stringToPool(poolStr)
469469 let gwxAmountAtEndTotal = {
470470 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)
471471 if ($isInstanceOf(@, "Int"))
472472 then @
473473 else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeight], nil)) + " couldn't be cast to Int"))
474474 }
475475 let gwxAmountAtEndTotalPrevious = {
476476 let @ = invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)
477477 if ($isInstanceOf(@, "Int"))
478478 then @
479479 else throw(($getType(invoke(this, "getUserGwxAmountAtHeight", [userAddressStr, endHeightPrevious], nil)) + " couldn't be cast to Int"))
480480 }
481481 let totalVotes = valueOrElse(getInteger(keyTotalVotes(epoch)), 0)
482482 let votingResult = valueOrElse(getInteger(keyVotingResult(pool, epoch)), 0)
483483 let votePrevious = valueOrErrorMessage(getInteger(keyVote(pool, userAddress, epochPrevious)), (((("processVoteINTERNAL " + poolStr) + " ") + userAddressStr) + ": no previous vote"))
484484 let used = valueOrElse(getInteger(this, keyUsed(userAddress, epoch)), 0)
485485 let newVote = fraction(votePrevious, gwxAmountAtEndTotal, gwxAmountAtEndTotalPrevious)
486486 let actions = if ((newVote > 0))
487487 then [IntegerEntry(keyVote(pool, userAddress, epoch), newVote), IntegerEntry(keyTotalVotes(epoch), (totalVotes + newVote)), IntegerEntry(keyVotingResult(pool, epoch), (votingResult + newVote)), IntegerEntry(keyUsed(userAddress, epoch), (used + newVote))]
488488 else deleteNodeActions(getVotesListName(pool), userAddressStr)
489489 $Tuple2(actions, unit)
490490 }
491491 else throw("Strict value is not equal to itself.")
492492 }
493493 else throw("Strict value is not equal to itself.")
494494 }
495495
496496
497497
498498 @Callable(i)
499499 func processPoolINTERNAL (poolStr) = {
500500 let checkCaller = mustThis(i)
501501 if ((checkCaller == checkCaller))
502502 then {
503503 let targetEpoch = (getIntOrFail(this, keyCurrentEpoch) - 1)
504504 let checkTargetEpoch = if ((targetEpoch >= 0))
505505 then true
506506 else throw("processPoolINTERNAL: invalid target epoch")
507507 if ((checkTargetEpoch == checkTargetEpoch))
508508 then {
509509 let pool = stringToPool(poolStr)
510510 let $t01703017070 = pool
511511 let amountAssetId = $t01703017070._1
512512 let priceAssetId = $t01703017070._2
513513 let stakingContract = addressFromStringValue(getStrOrFail(this, keyStakingContract))
514+ let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
515+ let $t01724817422 = {
516+ let @ = invoke(factoryContract, "getPoolContractAddressAndLpAssetByAssetsREADONLY", [amountAssetId, priceAssetId], nil)
517+ if ($isInstanceOf(@, "(String, String)"))
518+ then @
519+ else throw(($getType(invoke(factoryContract, "getPoolContractAddressAndLpAssetByAssetsREADONLY", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to (String, String)"))
520+ }
521+ let poolContractAddress = $t01724817422._1
522+ let lpAssetId = $t01724817422._2
514523 let r = {
515- let @ = invoke(stakingContract, "usersListTraversal", [amountAssetId, priceAssetId], nil)
524+ let @ = invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)
516525 if ($isInstanceOf(@, "Boolean"))
517526 then @
518- else throw(($getType(invoke(stakingContract, "usersListTraversal", [amountAssetId, priceAssetId], nil)) + " couldn't be cast to Boolean"))
527+ else throw(($getType(invoke(stakingContract, "usersListTraversal", [lpAssetId], nil)) + " couldn't be cast to Boolean"))
519528 }
520529 if ((r == r))
521530 then if (r)
522531 then $Tuple2(nil, true)
523532 else {
524533 let totalVotes = valueOrElse(getInteger(this, keyTotalVotes(targetEpoch)), 0)
525534 let votingResult = valueOrElse(getInteger(this, keyVotingResult(pool, targetEpoch)), 0)
526535 let share = if ((totalVotes == 0))
527536 then 0
528537 else fraction(votingResult, poolWeightMult, totalVotes)
529- let factoryContract = addressFromStringValue(getStrOrFail(this, keyFactoryContract))
530- let modifyWeightInv = invoke(factoryContract, "modifyWeight", [amountAssetId, priceAssetId, share], nil)
538+ let modifyWeightInv = invoke(factoryContract, "modifyWeight", [lpAssetId, share], nil)
531539 if ((modifyWeightInv == modifyWeightInv))
532540 then $Tuple2([IntegerEntry(keyPoolShare(pool, targetEpoch), share)], false)
533541 else throw("Strict value is not equal to itself.")
534542 }
535543 else throw("Strict value is not equal to itself.")
536544 }
537545 else throw("Strict value is not equal to itself.")
538546 }
539547 else throw("Strict value is not equal to itself.")
540548 }
541549
542550
543551
544552 @Callable(i)
545553 func finalizeHelper () = {
546554 let epoch = valueOrElse(getInteger(this, keyCurrentEpoch), 0)
547555 let previousEpoch = (epoch - 1)
548556 let startHeight = getIntOrFail(this, keyStartHeightByEpoch(epoch))
549557 let epochLength = getIntOrFail(this, keyEpochLength)
550558 let endHeight = (startHeight + epochLength)
551559 let finalizationStageOrUnit = getInteger(this, keyFinalizationStage)
552560 if ((height >= endHeight))
553561 then {
554562 let newEpoch = (epoch + 1)
555563 $Tuple2([IntegerEntry(keyStartHeightByEpoch(newEpoch), height), IntegerEntry(keyStartHeight, height), IntegerEntry(keyCurrentEpoch, newEpoch), IntegerEntry(keyFinalizationStage, finalizationStageTotal)], true)
556564 }
557565 else if ((finalizationStageOrUnit == unit))
558566 then $Tuple2(nil, false)
559567 else if ((finalizationStageOrUnit == finalizationStageTotal))
560568 then {
561569 let poolOrUnit = getString(keyNextPool)
562570 let userOrUnit = getString(keyNextUser)
563571 match poolOrUnit {
564572 case _: Unit =>
565573 match getString(keyListHead(poolsListName)) {
566574 case _: Unit =>
567575 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
568576 case poolsHeadStr: String =>
569577 $Tuple2([StringEntry(keyNextPool, poolsHeadStr)], true)
570578 case _ =>
571579 throw("Match error")
572580 }
573581 case poolStr: String =>
574582 let pool = stringToPool(poolStr)
575583 let nextUserOrUnit = match userOrUnit {
576584 case _: Unit =>
577585 getString(keyListHead(getVotesListName(pool)))
578586 case user: String =>
579587 let processVoteInv = invoke(this, "processVoteINTERNAL", [poolStr, user], nil)
580588 if ((processVoteInv == processVoteInv))
581589 then getString(keyListNext(getVotesListName(pool), user))
582590 else throw("Strict value is not equal to itself.")
583591 case _ =>
584592 throw("Match error")
585593 }
586594 match nextUserOrUnit {
587595 case _: Unit =>
588596 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
589597 match nextPoolOrUnit {
590598 case _: Unit =>
591599 $Tuple2([IntegerEntry(keyFinalizationStage, finalizationStageShares), DeleteEntry(keyNextPool), DeleteEntry(keyNextUser)], true)
592600 case s: String =>
593601 $Tuple2([StringEntry(keyNextPool, s), DeleteEntry(keyNextUser)], true)
594602 case _ =>
595603 throw("Match error")
596604 }
597605 case nextUser: String =>
598606 $Tuple2([StringEntry(keyNextUser, nextUser)], true)
599607 case _ =>
600608 throw("Match error")
601609 }
602610 case _ =>
603611 throw("Match error")
604612 }
605613 }
606614 else if ((finalizationStageOrUnit == finalizationStageShares))
607615 then {
608616 let poolOrUnit = getString(keyNextPool)
609617 match poolOrUnit {
610618 case _: Unit =>
611619 match getString(keyListHead(poolsListName)) {
612620 case _: Unit =>
613621 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight)], true)
614622 case nextPoolStr: String =>
615623 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
616624 case _ =>
617625 throw("Match error")
618626 }
619627 case poolStr: String =>
620628 let r = {
621629 let @ = invoke(this, "processPoolINTERNAL", [poolStr], nil)
622630 if ($isInstanceOf(@, "Boolean"))
623631 then @
624632 else throw(($getType(invoke(this, "processPoolINTERNAL", [poolStr], nil)) + " couldn't be cast to Boolean"))
625633 }
626634 if ((r == r))
627635 then if (r)
628636 then $Tuple2(nil, true)
629637 else {
630638 let nextPoolOrUnit = getString(keyListNext(poolsListName, poolStr))
631639 match nextPoolOrUnit {
632640 case _: Unit =>
633641 $Tuple2([DeleteEntry(keyFinalizationStage), BooleanEntry(keyFinalized(previousEpoch), true), IntegerEntry(keyCurrentEpochUi, epoch), IntegerEntry(keyStartHeightUi, startHeight), DeleteEntry(keyNextPool)], true)
634642 case nextPoolStr: String =>
635643 $Tuple2([StringEntry(keyNextPool, nextPoolStr)], true)
636644 case _ =>
637645 throw("Match error")
638646 }
639647 }
640648 else throw("Strict value is not equal to itself.")
641649 case _ =>
642650 throw("Match error")
643651 }
644652 }
645653 else throw("finalization is broken")
646654 }
647655
648656
649657
650658 @Callable(i)
651659 func finalizeWrapper (counter) = {
652660 let result = {
653661 let @ = invoke(this, "finalizeHelper", nil, nil)
654662 if ($isInstanceOf(@, "Boolean"))
655663 then @
656664 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
657665 }
658666 if ((result == result))
659667 then if (!(result))
660668 then if ((counter == 0))
661669 then throw("Current voting is not over yet")
662670 else $Tuple2(nil, unit)
663671 else {
664672 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
665673 if ((maxDepth > counter))
666674 then {
667675 let inv = invoke(this, "finalizeWrapper", [(counter + 1)], nil)
668676 if ((inv == inv))
669677 then $Tuple2(nil, unit)
670678 else throw("Strict value is not equal to itself.")
671679 }
672680 else $Tuple2(nil, unit)
673681 }
674682 else throw("Strict value is not equal to itself.")
675683 }
676684
677685
678686
679687 @Callable(i)
680688 func finalize () = {
681689 let inv = invoke(this, "finalizeWrapper", [0], nil)
682690 if ((inv == inv))
683691 then $Tuple2(nil, unit)
684692 else throw("Strict value is not equal to itself.")
685693 }
686694
687695
688696
689697 @Callable(i)
690698 func onVerificationLoss (assetId) = $Tuple2(nil, unit)
691699
692700
693701
694702 @Callable(i)
695703 func containsNodeREADONLY (listName,id) = $Tuple2(nil, containsNode(listName, id))
696704
697705
698706
699707 @Callable(i)
700708 func insertNode (listName,id) = {
701709 let checkCaller = mustManager(i)
702710 if ((checkCaller == checkCaller))
703711 then $Tuple2(insertNodeActions(listName, id), unit)
704712 else throw("Strict value is not equal to itself.")
705713 }
706714
707715
708716
709717 @Callable(i)
710718 func deleteNode (listName,id) = {
711719 let checkCaller = mustManager(i)
712720 if ((checkCaller == checkCaller))
713721 then $Tuple2(deleteNodeActions(listName, id), unit)
714722 else throw("Strict value is not equal to itself.")
715723 }
716724
717725
718726 @Verifier(tx)
719727 func verify () = {
720728 let targetPublicKey = match managerPublicKeyOrUnit() {
721729 case pk: ByteVector =>
722730 pk
723731 case _: Unit =>
724732 tx.senderPublicKey
725733 case _ =>
726734 throw("Match error")
727735 }
728736 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
729737 }
730738

github/deemru/w8io/169f3d6 
97.64 ms