tx · 2KQoYrfWWQ4bGEJp5CrCPPejaajdrrHJVqsh4hNGn9E6

3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW:  -0.02400000 Waves

2024.03.20 17:48 [4092352] smart account 3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW > SELF 0.00000000 Waves

{ "type": 13, "id": "2KQoYrfWWQ4bGEJp5CrCPPejaajdrrHJVqsh4hNGn9E6", "fee": 2400000, "feeAssetId": null, "timestamp": 1710946091981, "version": 2, "chainId": 87, "sender": "3PAETTtuW7aSiyKtn9GuML3RgtV1xdq1mQW", "senderPublicKey": "DSNxHVyf38CbPoz2oSJ1b4FWqRvqFsAphCzdtrPeWPHa", "proofs": [ "32VfrshemSrMpPXgFyhPoAJPtBpUeC8MYYHhnsU5pwzgQj2XAzeMpxg7SZko58jQRcZoMXN7q7CRywwYh5BwvH2i", "4UmFabmnEdXZqB7i4n4J8sAcp3ahyuXxqJuN17LUottGsrztjmxRqPtM8ytdHUXbPERQB8Znig9EneH5GgSVD8Th" ], "script": "base64:BgI3CAISAwoBCBIAEgQKAggIEgQKAggIEgASABIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCEUACnBlcmNoUHJpY2UJAGgCAGQAwIQ9AAVzY2FsZQCQTgAGc2NhbGUyAMCEPQEKaXNTaWNrRHVjawEGZHVja0lkCQCsAgIFBmR1Y2tJZAIFX3NpY2sBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwACFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAhlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwACFnN0YXRpY19tZXRhUmFjZUFkZHJlc3MBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwACGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwACHHN0YXRpY19wcm94eVN0YWtpbmdDb250cmFjdHMBFXN0YXRpY0tleV9tYWludGVuYW5jZQACEnN0YXRpY19tYWludGVuYW5jZQEZc3RhdGljS2V5X2NmTWFzdGVyQWRkcmVzcwACFnN0YXRpY19jZk1hc3RlckFkZHJlc3MBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgACEnN0YXRpY19kdWNrV3JhcHBlcgEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAAhJzdGF0aWNfYnVybkFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEVc3RhdGljS2V5X2h1bnRBZGRyZXNzAAISc3RhdGljX2h1bnRBZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAARFnZXRSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwABF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAERZ2V0QnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAARVnZXRSZWZDb250cmFjdEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEmdldE1ldGFyYWNlQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGXN0YXRpY0tleV9tZXRhUmFjZUFkZHJlc3MAARRnZXRBY2NCb29zdGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwABD2dldFByb3h5U3Rha2luZwAJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwABDmdldE1haW50ZW5hbmNlAAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfbWFpbnRlbmFuY2UAARJnZXRDZk1hc3RlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARlzdGF0aWNLZXlfY2ZNYXN0ZXJBZGRyZXNzAAEQZ2V0RHVja1dyYXBwZXJTYwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAQ5nZXRIdW50QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9odW50QWRkcmVzcwAADVJlZmVyZXJSZXdhcmQABQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxGQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARFnZXRSZXdhcmRQZXJCbG9jawAAkgIBCGlzTG9ja2VkAAMJAQIhPQIJAQ5nZXRNYWludGVuYW5jZQACAAkAAgEJAQ5nZXRNYWludGVuYW5jZQAAAAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEVdHJ5R2V0Qm9vbGVhbkV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmwgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDmdldEFzc2V0T3JpZ2luAQpnZW5lcmF0aW9uAwkAAAIFCmdlbmVyYXRpb24CAUcJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBEWdldEJyZWVkZXJBZGRyZXNzAAEOZ2V0QXNzZXRSYXJpdHkCCGdlbm90eXBlCmdlbmVyYXRpb24ECHF1YW50aXR5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkBDmdldEFzc2V0T3JpZ2luAQUKZ2VuZXJhdGlvbgkArAICCQCsAgICBnN0YXRzXwUIZ2Vub3R5cGUCCV9xdWFudGl0eQkArAICCQCsAgICBnN0YXRzXwUIZ2Vub3R5cGUCE19xdWFudGl0eSBub3QgZm91bmQEBXBvd2VyCQBsBgkAaQIAkE4FCHF1YW50aXR5AAQABQABAAIFBUZMT09SAwkAZgIFBXBvd2VyAAAFBXBvd2VyAAIBCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAFBnN0cmluZwkAAgECIUZBUzogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IFN0cmluZwEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIeRkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQlhc0Jvb2xlYW4BBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAdib29sZWFuBQckbWF0Y2gwBQdib29sZWFuCQACAQIiRkFCOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogQm9vbGVhbgEUZ2V0QXNzZXRGYXJtaW5nUG93ZXICB2Fzc2V0SWQHYWRkcmVzcwMDCQAAAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJARFnZXRCcmVlZGVyQWRkcmVzcwAGCQAAAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAQJZmFybUJvb3N0CQEFYXNJbnQBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhpjYWxjdWxhdGVGYXJtaW5nUG93ZXJCb29zdAkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUJZmFybUJvb3N0BQlmYXJtQm9vc3QECWFzc2V0TmFtZQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBAlpc0phY2twb3QJAAACCQCyAgIJAQV2YWx1ZQEFCWFzc2V0TmFtZQABAgFVBAdmYXJtR2VuAwUJaXNKYWNrcG90AgAJAQhhc1N0cmluZwEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIOZ2V0R2VuRnJvbU5hbWUJAMwIAgUJYXNzZXROYW1lBQNuaWwFA25pbAMJAAACBQdmYXJtR2VuBQdmYXJtR2VuBAZyYXJpdHkDBQlpc0phY2twb3QAZAQKZ2VuZXJhdGlvbgkArwICCQCyAgIFCWFzc2V0TmFtZQACAAEJAQ5nZXRBc3NldFJhcml0eQIFB2Zhcm1HZW4FCmdlbmVyYXRpb24EEXRvdGFsRmFybWluZ1Bvd2VyCQBkAgUGcmFyaXR5CQBrAwUGcmFyaXR5BQlmYXJtQm9vc3QAZAkAlAoCBQdmYXJtR2VuBRF0b3RhbEZhcm1pbmdQb3dlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECDW5vdCB2YWxpZCBORlQBHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAgdhZGRyZXNzB2Fzc2V0SWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUHYXNzZXRJZAINX2Zhcm1pbmdQb3dlcgEMY2FsY0ludGVyZXN0AxBwcmV2aW91c0ludGVyZXN0FnByZXZpb3VzSW50ZXJlc3RIZWlnaHQRdG90YWxGYXJtaW5nUG93ZXIJAGQCBRBwcmV2aW91c0ludGVyZXN0CQBpAgkAaAIJAGgCBQVzY2FsZQkBEWdldFJld2FyZFBlckJsb2NrAAkAZQIFBmhlaWdodAUWcHJldmlvdXNJbnRlcmVzdEhlaWdodAURdG90YWxGYXJtaW5nUG93ZXIBEmdldEN1cnJlbnRJbnRlcmVzdAADCQBmAgkBDXRyeUdldEludGVnZXIBAhJ0b3RhbF9mYXJtaW5nUG93ZXIAAAQQcHJldmlvdXNJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBAhd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAQWcHJldmlvdXNJbnRlcmVzdEhlaWdodAkBDXRyeUdldEludGVnZXIBAh10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAQRdG90YWxGYXJtaW5nUG93ZXIJAQ10cnlHZXRJbnRlZ2VyAQISdG90YWxfZmFybWluZ1Bvd2VyCQEMY2FsY0ludGVyZXN0AwUQcHJldmlvdXNJbnRlcmVzdAUWcHJldmlvdXNJbnRlcmVzdEhlaWdodAURdG90YWxGYXJtaW5nUG93ZXIDCQECIT0CCQENdHJ5R2V0SW50ZWdlcgECEXRvdGFsX3N0YXJ0SGVpZ2h0AAAJAQ10cnlHZXRJbnRlZ2VyAQIXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QJAAIBAhxmYXJtaW5nIGlzIG5vdCBsYXVuY2hlZCwgeWV0ARRjYWxjQXNzZXRSZXdhcmREZWx0YQMHYWRkcmVzcwdhc3NldElkEWFzc2V0RmFybWluZ1Bvd2VyBBZsYXN0Q2hlY2tBc3NldEludGVyZXN0CQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FB2Fzc2V0SWQCEl9sYXN0Q2hlY2tJbnRlcmVzdAQPY3VycmVudEludGVyZXN0CQESZ2V0Q3VycmVudEludGVyZXN0AAkAaAIFEWFzc2V0RmFybWluZ1Bvd2VyCQBlAgUPY3VycmVudEludGVyZXN0BRZsYXN0Q2hlY2tBc3NldEludGVyZXN0ARRhZGRBc3NldElkVG9HZW5FbnRyeQIHYXNzZXRJZAhhc3NldEdlbgQMY3VycmVudFZhbHVlCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgICB2Fzc2V0c18FCGFzc2V0R2VuAgdfbG9ja2VkAwkAAAIFDGN1cnJlbnRWYWx1ZQIABQdhc3NldElkCQCsAgIJAKwCAgUMY3VycmVudFZhbHVlAgEsBQdhc3NldElkAQ5nZXRTdGFrZVJlc3VsdAQHYWRkcmVzcwdhc3NldElkEWFzc2V0RmFybWluZ1Bvd2VyCHVuc3Rha2VyBAVhc3NldAkA2AQBBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhJ0b3RhbF9mYXJtaW5nUG93ZXIJAGQCCQENdHJ5R2V0SW50ZWdlcgECEnRvdGFsX2Zhcm1pbmdQb3dlcgURYXNzZXRGYXJtaW5nUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQICF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQESZ2V0Q3VycmVudEludGVyZXN0AAkAzAgCCQEMSW50ZWdlckVudHJ5AgIddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIGYXNzZXRfBQVhc3NldAIGX293bmVyBQdhZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAINX2Zhcm1pbmdQb3dlcgURYXNzZXRGYXJtaW5nUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhJfbGFzdENoZWNrSW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AglfdW5zdGFrZXIFCHVuc3Rha2VyBQNuaWwBEGdldFVuc3Rha2VSZXN1bHQGB2FkZHJlc3MHYXNzZXRJZAVjb2xvcgZjYWxsZXIKcmVhbENhbGxlcgljbGFpbUVnZ3MEBmxvY2tlZAkBCGlzTG9ja2VkAAMJAAACBQZsb2NrZWQFBmxvY2tlZAQFYXNzZXQJANgEAQUHYXNzZXRJZAQIdW5zdGFrZXIJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIJX3Vuc3Rha2VyAwMJAQIhPQIFCHVuc3Rha2VyAgAJAQIhPQIFCHVuc3Rha2VyBQpyZWFsQ2FsbGVyBwkAAgECV0ZVTjogSXQgc2VlbXMgZHVjayB3YXMgc3Rha2VkIHRocm91aCBhIGRhcHAsIG5vdCBkaXJlY3RseSwgcGxlYXNlIHVuc3Rha2UgdGhyb3VnaCBkYXBwIQQRYXNzZXRGYXJtaW5nUG93ZXIJAR1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgIFB2FkZHJlc3MFBWFzc2V0AwkBASEBCQBmAgURYXNzZXRGYXJtaW5nUG93ZXIAAAkAAgECKkZHVTogQXNzZXQgZmFybWluZyBwb3dlciBub3QgYmlnZ2VyIHRoZW4gMAQQYXNzZXRSZXdhcmREZWx0YQkBFGNhbGNBc3NldFJld2FyZERlbHRhAwUHYWRkcmVzcwUFYXNzZXQFEWFzc2V0RmFybWluZ1Bvd2VyBAxmYXJtZWRBbW91bnQJAGQCBRBhc3NldFJld2FyZERlbHRhCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhZfbGFzdENoZWNrRmFybWVkQW1vdW50BA93aXRoZHJhd25BbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEF93aXRoZHJhd25BbW91bnQEBnJld2FyZAkAaQIJAGUCBQxmYXJtZWRBbW91bnQFD3dpdGhkcmF3bkFtb3VudAkAaAIFBXNjYWxlAGQEDmlzV2l0aG91dFBlcmNoCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0Ag5fd2l0aG91dF9wZXJjaAQTcmV3YXJkQWZ0ZXJTaWNrTmVzcwUGcmV3YXJkBA1hcHBlbmRQZXJjaGVzAwUOaXNXaXRob3V0UGVyY2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCDl93aXRob3V0X3BlcmNoBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwISX3BlcmNoZXNBdmFpbGFibGVfBQVjb2xvcgABBQNuaWwEBnNlbmRUeAMFCWNsYWltRWdncwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAaAIFE3Jld2FyZEFmdGVyU2lja05lc3MAwIQ9CQENZ2V0RWdnQXNzZXRJZAAFA25pbAkAaAIFE3Jld2FyZEFmdGVyU2lja05lc3MAwIQ9CQCUCgIFA25pbAAACQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQICEnRvdGFsX2Zhcm1pbmdQb3dlcgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQISdG90YWxfZmFybWluZ1Bvd2VyBRFhc3NldEZhcm1pbmdQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQDMCAIJAQxJbnRlZ2VyRW50cnkCAh10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgZhc3NldF8FBWFzc2V0AgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCCV91bnN0YWtlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCDV9mYXJtaW5nUG93ZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEl9sYXN0Q2hlY2tJbnRlcmVzdAkBEmdldEN1cnJlbnRJbnRlcmVzdAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhBfd2l0aGRyYXduQW1vdW50CQBkAgUPd2l0aGRyYXduQW1vdW50CQBoAgUTcmV3YXJkQWZ0ZXJTaWNrTmVzcwUGc2NhbGUyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQFEGFzc2V0UmV3YXJkRGVsdGEFA25pbAUNYXBwZW5kUGVyY2hlcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsCAUGc2VuZFR4Al8xCAUGc2VuZFR4Al8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARNjYWxjdWxhdGVQZXJjaFByaWNlAQdhZGRyZXNzBBFoYXNBcnRlZmFjdFN0YWtlZAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBFGdldEFjY0Jvb3N0ZXJBZGRyZXNzAAkArAICCQCsAgICC0FSVC1YTUlTVExfBQdhZGRyZXNzAgZfb3duZXIDCQAAAgURaGFzQXJ0ZWZhY3RTdGFrZWQCAAUKcGVyY2hQcmljZQkAaAIJAGkCBQpwZXJjaFByaWNlAAoACQEQaXNQcm94eVN0YWtpbmdTYwEHYWRkcmVzcwQQYWxsb3dlZENvbnRyYWN0cwkBD2dldFByb3h5U3Rha2luZwAEFGFsbG93ZWRDb250cmFjdHNMaXN0CQC1CQIFEGFsbG93ZWRDb250cmFjdHMCATsJAQIhPQIJAM8IAgUUYWxsb3dlZENvbnRyYWN0c0xpc3QFB2FkZHJlc3MFBHVuaXQBEnVuc3Rha2VORlRJbnRlcm5hbAMFYXNzZXQBaQhjbGFpbUVnZwQHYXNzZXRJZAkA2QQBBQVhc3NldAQKcmVhbENhbGxlcgkApQgBCAUBaQZjYWxsZXIEB2FkZHJlc3MDCQEQaXNQcm94eVN0YWtpbmdTYwEJAKUIAQgFAWkGY2FsbGVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgUKcmVhbENhbGxlcgQFY29sb3IJALICAggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lAAEDCQAAAgUFY29sb3ICAVUJAAIBAjBGVU46IHVzZSBhbm90aGVyIGZ1bmN0aW9uIHRvIHVuc3Rha2UgSmFja3BvdCBORlQEBnJlc3VsdAkBEGdldFVuc3Rha2VSZXN1bHQGBQdhZGRyZXNzBQdhc3NldElkBQVjb2xvcggFAWkGY2FsbGVyBQpyZWFsQ2FsbGVyBQhjbGFpbUVnZwUGcmVzdWx0ARZ1bnN0YWtlSmFja3BvdEludGVybmFsAwVhc3NldAFpCGNsYWltRWdnBAdhc3NldElkCQDZBAEFBWFzc2V0BApyZWFsQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQHYWRkcmVzcwMJARBpc1Byb3h5U3Rha2luZ1NjAQkApQgBCAUBaQZjYWxsZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQpyZWFsQ2FsbGVyBAVjb2xvcgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AgtfcGVyY2hDb2xvcgMJAQIhPQIJALICAgkBBXZhbHVlAQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lAAECAVUJAAIBAgxqYWNrcG90IG9ubHkEBnJlc3VsdAkBEGdldFVuc3Rha2VSZXN1bHQGBQdhZGRyZXNzBQdhc3NldElkBQVjb2xvcggFAWkGY2FsbGVyBQpyZWFsQ2FsbGVyBQhjbGFpbUVnZwUGcmVzdWx0AQdnZXRCb29sAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQlpc1Rlc3RFbnYACQEHZ2V0Qm9vbAECB1RFU1RFTlYMAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPRkNPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAFBm9yYWNsZQUDbmlsAWkBBGluaXQAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIORkk6IGFkbWluIG9ubHkJAMwIAgkBDEludGVnZXJFbnRyeQICEXRvdGFsX3N0YXJ0SGVpZ2h0BQZoZWlnaHQFA25pbAFpAQhidXlQZXJjaAIGY29sb3JJDnJlZmVyZXJBZGRyZXNzBAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMDCQAAAggFAWkGY2FsbGVyCQEOZ2V0SHVudEFkZHJlc3MABgkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEBWNvbG9yAwkAAAIFBmNvbG9ySQIBVQIBQgUGY29sb3JJAwkAZgIAAAkBBXZhbHVlAQkAzwgCCQDMCAICAUIJAMwIAgIBUgkAzAgCAgFHCQDMCAICAVkFA25pbAUFY29sb3IJAAIBAh55b3UgbmVlZCB0byBzZXQgY29sb3IgcHJvcGVybHkECmV4YWN0UHJpY2UJARNjYWxjdWxhdGVQZXJjaFByaWNlAQkApQgBCAUBaQZjYWxsZXIECWxlZnRUb1BheQMJAAACCAUBaQxvcmlnaW5DYWxsZXIIBQFpBmNhbGxlcgQTYW1vdW50UGFpZEJ5Q291cG9ucwkBBWFzSW50AQkA/AcECQERZ2V0Q291cG9uc0FkZHJlc3MAAgp1c2VDb3Vwb25zCQDMCAIFCmV4YWN0UHJpY2UFA25pbAUDbmlsAwkAAAIFE2Ftb3VudFBhaWRCeUNvdXBvbnMFE2Ftb3VudFBhaWRCeUNvdXBvbnMJAGUCBQpleGFjdFByaWNlBRNhbW91bnRQYWlkQnlDb3Vwb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQpleGFjdFByaWNlBAdwYXltZW50AwkBAiE9AgUJbGVmdFRvUGF5AAAEDGZpcnN0UGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAIJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFDGZpcnN0UGF5bWVudAdhc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBCQCsAgICQUZCUDogWW91IGNhbiBhdHRhY2ggb25seSBFR0cgdG9rZW5zIHdpdGggdGhlIGZvbGxvd2luZyBhc3NldCBpZDogCQDYBAEJAQ1nZXRFZ2dBc3NldElkAAMJAQIhPQIIBQxmaXJzdFBheW1lbnQGYW1vdW50BQlsZWZ0VG9QYXkJAAIBCQCsAgIJAKwCAgkArAICAkhGQlA6IFRvIGJ1eSBhIHBlcmNoIHlvdSBjdXJyZW50bHkgbmVlZCB0aGUgZm9sbG93aW5nIGFtb3VudCBvZiBFR0dsZXRzOiAJAKQDAQUJbGVmdFRvUGF5AgEgCQClCAEIBQFpBmNhbGxlcgQVcmVmZXJlclJld2FyZEZvclBlcmNoCQBrAwUJbGVmdFRvUGF5BQ1SZWZlcmVyUmV3YXJkAGQEB3JlZkNhbGwJAQlhc0Jvb2xlYW4BCQD8BwQJARVnZXRSZWZDb250cmFjdEFkZHJlc3MAAgpyZWZQYXltZW50CQDMCAIFDnJlZmVyZXJBZGRyZXNzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAUVcmVmZXJlclJld2FyZEZvclBlcmNoBQNuaWwDCQAAAgUHcmVmQ2FsbAUHcmVmQ2FsbAQGdG9CdXJuAwUHcmVmQ2FsbAkAZQIFCWxlZnRUb1BheQUVcmVmZXJlclJld2FyZEZvclBlcmNoBQlsZWZ0VG9QYXkECGJ1cm5DYWxsCQD8BwQJAQ5nZXRCdXJuQWRkcmVzcwACFGJ1cm5BdHRhY2hlZFBheW1lbnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRFZ2dBc3NldElkAAUGdG9CdXJuBQNuaWwDCQAAAgUIYnVybkNhbGwFCGJ1cm5DYWxsBQlsZWZ0VG9QYXkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAMJAAACBQdwYXltZW50BQdwYXltZW50BA5wZXJjaEFtb3VudEtleQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18JAKUIAQgFAWkGY2FsbGVyAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yBAtwZXJjaEFtb3VudAkBDXRyeUdldEludGVnZXIBBQ5wZXJjaEFtb3VudEtleQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5wZXJjaEFtb3VudEtleQkAZAIFC3BlcmNoQW1vdW50AAEFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGFkZEZyZWVQZXJjaAIHYWRkcmVzcwVjb2xvcgQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkAwkAZgIAAAkBBXZhbHVlAQkAzwgCCQDMCAICAUIJAMwIAgIBUgkAzAgCAgFHCQDMCAICAVkFA25pbAUFY29sb3IJAAIBAh55b3UgbmVlZCB0byBzZXQgY29sb3IgcHJvcGVybHkDAwMJAQIhPQIIBQFpBmNhbGxlcgkBEWdldFJlYmlydGhBZGRyZXNzAAkBAiE9AggFAWkGY2FsbGVyCQEXZ2V0VHVydGxlUmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzBwkAAgECG3JlYmlydGggYW5kIHN3b3AgcHJvbW8gb25seQQOcGVyY2hBbW91bnRLZXkJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yBAtwZXJjaEFtb3VudAkBDXRyeUdldEludGVnZXIBBQ5wZXJjaEFtb3VudEtleQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5wZXJjaEFtb3VudEtleQkAZAIFC3BlcmNoQW1vdW50AAEFA25pbAIACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHN0YWtlTkZUAAQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkBAx2YWxpZFBheW1lbnQDAwkAAAIIBQFpBmNhbGxlcgkBDmdldEh1bnRBZGRyZXNzAAYJAAACCAUBaQZjYWxsZXIJARJnZXRNZXRhcmFjZUFkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwABAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBApyZWFsQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQHYWRkcmVzcwMJARBpc1Byb3h5U3Rha2luZ1NjAQkApQgBCAUBaQZjYWxsZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQpyZWFsQ2FsbGVyBAVjb2xvcgkAsgICCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQQQYXZhaWxhYmxlUGVyY2hlcwkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwISX3BlcmNoZXNBdmFpbGFibGVfBQVjb2xvcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkAwkAZwIAAAUQYXZhaWxhYmxlUGVyY2hlcwkAAgEJAKwCAgIjbm8gcGVyY2hlcyBhdmFpbGFibGUgZm9yIHRoZSBjb2xvciAFBWNvbG9yBA0kdDAxNjYwNjE2Njc5CQEUZ2V0QXNzZXRGYXJtaW5nUG93ZXICBQdhc3NldElkBQdhZGRyZXNzBAhhc3NldEdlbggFDSR0MDE2NjA2MTY2NzkCXzEEEWFzc2V0RmFybWluZ1Bvd2VyCAUNJHQwMTY2MDYxNjY3OQJfMgkAzggCCQDOCAIJAQ5nZXRTdGFrZVJlc3VsdAQFB2FkZHJlc3MFB2Fzc2V0SWQFEWFzc2V0RmFybWluZ1Bvd2VyBQpyZWFsQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwISX3BlcmNoZXNBdmFpbGFibGVfBQVjb2xvcgkAZQIFEGF2YWlsYWJsZVBlcmNoZXMAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUc3Rha2VORlRXaXRob3V0UGVyY2gABAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQECmRhcHBUb0NhbGwJAKUIAQgFAWkGY2FsbGVyAwkBASEBCQEQaXNQcm94eVN0YWtpbmdTYwEFCmRhcHBUb0NhbGwJAAIBAj5GU05XUDogT25seSB0cnVzdGVkIHNtYXJ0IGNvbnRyYWN0cyBjYW4gc3Rha2Ugd2l0aG91dCBhIHBlcmNoIQQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEB2Fzc2V0SWQJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQHYWRkcmVzcwkApQgBCAUBaQxvcmlnaW5DYWxsZXIDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQNJHQwMTczMTcxNzM5MAkBFGdldEFzc2V0RmFybWluZ1Bvd2VyAgUHYXNzZXRJZAUHYWRkcmVzcwQIYXNzZXRHZW4IBQ0kdDAxNzMxNzE3MzkwAl8xBBFhc3NldEZhcm1pbmdQb3dlcggFDSR0MDE3MzE3MTczOTACXzIEBWFzc2V0CQDYBAEFB2Fzc2V0SWQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyCQDOCAIJAQ5nZXRTdGFrZVJlc3VsdAQFB2FkZHJlc3MFB2Fzc2V0SWQFEWFzc2V0RmFybWluZ1Bvd2VyBQpyZWFsQ2FsbGVyCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIOX3dpdGhvdXRfcGVyY2gGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKdW5zdGFrZU5GVAEFYXNzZXQEDHZhbGlkUGF5bWVudAMJAAACCAUBaQZjYWxsZXIJARJnZXRNZXRhcmFjZUFkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAZyZXN1bHQJARJ1bnN0YWtlTkZUSW50ZXJuYWwDBQVhc3NldAUBaQYJAJQKAgkAzggCCAUGcmVzdWx0Al8xBQx2YWxpZFBheW1lbnQIBQZyZXN1bHQCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWdW5zdGFrZU5GVFdpdGhvdXRDbGFpbQEFYXNzZXQJARJ1bnN0YWtlTkZUSW50ZXJuYWwDBQVhc3NldAUBaQcBaQEMc3Rha2VKYWNrcG90AQVjb2xvcgQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkBAx2YWxpZFBheW1lbnQDAwkAAAIIBQFpBmNhbGxlcgkBDmdldEh1bnRBZGRyZXNzAAYJAAACCAUBaQZjYWxsZXIJARJnZXRNZXRhcmFjZUFkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwABAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBApyZWFsQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQHYWRkcmVzcwMJARBpc1Byb3h5U3Rha2luZ1NjAQkApQgBCAUBaQZjYWxsZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQpyZWFsQ2FsbGVyBBBhdmFpbGFibGVQZXJjaGVzCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yBAthc3NldElzc3VlcggJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAZpc3N1ZXIDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAMDCQAAAgULYXNzZXRJc3N1ZXIJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAYJAAACBQthc3NldElzc3VlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAMJAQIhPQIJALICAgkBBXZhbHVlAQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lAAECAVUJAAIBAgxqYWNrcG90IG9ubHkDCQBnAgAABRBhdmFpbGFibGVQZXJjaGVzCQACAQkArAICAihGU0o6IG5vIHBlcmNoZXMgYXZhaWxhYmxlIGZvciB0aGUgY29sb3IgBQVjb2xvcgQMZmFybWluZ1Bvd2VyCQEUZ2V0QXNzZXRGYXJtaW5nUG93ZXICBQdhc3NldElkBQdhZGRyZXNzCQDOCAIJAM4IAgkBDmdldFN0YWtlUmVzdWx0BAUHYWRkcmVzcwUHYXNzZXRJZAgFDGZhcm1pbmdQb3dlcgJfMgUKcmVhbENhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IJAGUCBRBhdmFpbGFibGVQZXJjaGVzAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwkA2AQBBQdhc3NldElkAgtfcGVyY2hDb2xvcgUFY29sb3IFA25pbAUMdmFsaWRQYXltZW50CQACAQISYXNzZXQgaXMgbm90IHZhbGlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVuc3Rha2VKYWNrcG90AQVhc3NldAQMdmFsaWRQYXltZW50CQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQGcmVzdWx0CQEWdW5zdGFrZUphY2twb3RJbnRlcm5hbAMFBWFzc2V0BQFpBgkAlAoCCQDOCAIIBQZyZXN1bHQCXzEFDHZhbGlkUGF5bWVudAgFBnJlc3VsdAJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR11bnN0YWtlSmFja3BvdFdpdGhvdXRDbGFpbUVnZwEFYXNzZXQJARZ1bnN0YWtlSmFja3BvdEludGVybmFsAwUFYXNzZXQFAWkHAWkBC2NsYWltUmV3YXJkAQVhc3NldAQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkBAx2YWxpZFBheW1lbnQDCQAAAggFAWkMb3JpZ2luQ2FsbGVyCQESZ2V0Q2ZNYXN0ZXJBZGRyZXNzAAUDbmlsCQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQHYWRkcmVzcwMJAAACCAUBaQxvcmlnaW5DYWxsZXIJARJnZXRDZk1hc3RlckFkZHJlc3MACQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEB2Fzc2V0SWQJANkEAQUFYXNzZXQEEWFzc2V0RmFybWluZ1Bvd2VyCQEdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXICBQdhZGRyZXNzBQVhc3NldAQQYXNzZXRSZXdhcmREZWx0YQkBFGNhbGNBc3NldFJld2FyZERlbHRhAwUHYWRkcmVzcwUFYXNzZXQFEWFzc2V0RmFybWluZ1Bvd2VyBAxmYXJtZWRBbW91bnQJAGQCBRBhc3NldFJld2FyZERlbHRhCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhZfbGFzdENoZWNrRmFybWVkQW1vdW50BA93aXRoZHJhd25BbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEF93aXRoZHJhd25BbW91bnQEBnJld2FyZAkAaQIJAGUCBQxmYXJtZWRBbW91bnQFD3dpdGhkcmF3bkFtb3VudAkAaAIFBXNjYWxlAGQDCQBnAgAABQZyZXdhcmQJAAIBAiFGQ1I6IHlvdSBoYXZlIG5vIEVHR3MgdG8gd2l0aGRyYXcJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEF93aXRoZHJhd25BbW91bnQJAGgCBQZyZXdhcmQFBnNjYWxlMgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUHYWRkcmVzcwkAaAIFBnJld2FyZADAhD0JAQ1nZXRFZ2dBc3NldElkAAUDbmlsBQx2YWxpZFBheW1lbnQJAGgCBQZyZXdhcmQAwIQ9CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASDBbN+O7dONc4+Lovn6iQ/0dc1EG1RyUqO0nNJWpC3gdQQJdGhpcmRVc2VyASDnW/SOqtL5SZ5uhCa4+X4f3GeofdwruNTqe83yaArBJQQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIPRGF0YVRyYW5zYWN0aW9uBANkdHgFByRtYXRjaDAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAGcCBQ9zaWduYXR1cmVzQ291bnQAAolmYME=", "height": 4092352, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EAftr58bNMJ8rWEsx9DmYc6qXz2D5FUVtGpzvBt4xHXM Next: CmeJdTcTaa17egVU8mNKMw26VmeXYYY51DyxU5B6Q3fR Diff:
OldNewDifferences
144144 }
145145
146146
147-func getRewardPerBlock () = 0
147+func getRewardPerBlock () = 274
148148
149149
150150 func isLocked () = if ((getMaintenance() != ""))
506506 else if ((0 >= availablePerches))
507507 then throw(("no perches available for the color " + color))
508508 else {
509- let $t01660416677 = getAssetFarmingPower(assetId, address)
510- let assetGen = $t01660416677._1
511- let assetFarmingPower = $t01660416677._2
509+ let $t01660616679 = getAssetFarmingPower(assetId, address)
510+ let assetGen = $t01660616679._1
511+ let assetFarmingPower = $t01660616679._2
512512 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
513513 }
514514 }
534534 if ((pmt.amount != 1))
535535 then throw("NFT is not attached")
536536 else {
537- let $t01731517388 = getAssetFarmingPower(assetId, address)
538- let assetGen = $t01731517388._1
539- let assetFarmingPower = $t01731517388._2
537+ let $t01731717390 = getAssetFarmingPower(assetId, address)
538+ let assetGen = $t01731717390._1
539+ let assetFarmingPower = $t01731717390._2
540540 let asset = toBase58String(assetId)
541541 let realCaller = toString(i.caller)
542542 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let perchPrice = (100 * 1000000)
55
66 let scale = 10000
77
88 let scale2 = 1000000
99
1010 func isSickDuck (duckId) = (duckId + "_sick")
1111
1212
1313 func tryGetStringExternal (address,key) = match getString(address, key) {
1414 case a: String =>
1515 a
1616 case _ =>
1717 ""
1818 }
1919
2020
2121 func tryGetString (key) = tryGetStringExternal(this, key)
2222
2323
2424 func staticKey_oracleAddress () = "static_oracleAddress"
2525
2626
2727 func staticKey_eggAssetId () = "static_eggAssetId"
2828
2929
3030 func staticKey_incubatorAddress () = "static_incubatorAddress"
3131
3232
3333 func staticKey_rebirthAddress () = "static_rebirthAddress"
3434
3535
3636 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
3737
3838
3939 func staticKey_breederAddress () = "static_breederAddress"
4040
4141
4242 func staticKey_refContractAddress () = "static_refContractAddress"
4343
4444
4545 func staticKey_itemsAddress () = "static_itemsAddress"
4646
4747
4848 func staticKey_metaRaceAddress () = "static_metaRaceAddress"
4949
5050
5151 func staticKey_accBoosterAddress () = "static_accBoosterAddress"
5252
5353
5454 func staticKey_proxyStakingContracts () = "static_proxyStakingContracts"
5555
5656
5757 func staticKey_maintenance () = "static_maintenance"
5858
5959
6060 func staticKey_cfMasterAddress () = "static_cfMasterAddress"
6161
6262
6363 func staticKey_duckWrapper () = "static_duckWrapper"
6464
6565
6666 func staticKey_couponsAddress () = "static_couponsAddress"
6767
6868
6969 func staticKey_burnAddress () = "static_burnAddress"
7070
7171
7272 func staticKey_extraFee () = "static_extraFee"
7373
7474
7575 func staticKey_feeAggregator () = "static_feeAggregator"
7676
7777
7878 func staticKey_huntAddress () = "static_huntAddress"
7979
8080
8181 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8282
8383
8484 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8585
8686
8787 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8888
8989
9090 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
9191
9292
9393 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
9494
9595
9696 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
9797
9898
9999 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
100100
101101
102102 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
103103
104104
105105 func getMetaraceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_metaRaceAddress())))
106106
107107
108108 func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
109109
110110
111111 func getProxyStaking () = tryGetStringExternal(getOracle(), staticKey_proxyStakingContracts())
112112
113113
114114 func getMaintenance () = tryGetStringExternal(getOracle(), staticKey_maintenance())
115115
116116
117117 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_cfMasterAddress())))
118118
119119
120120 func getDuckWrapperSc () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckWrapper())))
121121
122122
123123 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
124124
125125
126126 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
127127
128128
129129 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
130130
131131
132132 func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
133133
134134
135135 let RefererReward = 5
136136
137137 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
138138 then throw("FCAP: Please attach waves")
139139 else {
140140 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
141141 if ((payment.amount != feeAmount))
142142 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
143143 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
144144 }
145145
146146
147-func getRewardPerBlock () = 0
147+func getRewardPerBlock () = 274
148148
149149
150150 func isLocked () = if ((getMaintenance() != ""))
151151 then throw(getMaintenance())
152152 else 0
153153
154154
155155 func tryGetInteger (key) = match getInteger(this, key) {
156156 case b: Int =>
157157 b
158158 case _ =>
159159 0
160160 }
161161
162162
163163 func tryGetBoolean (key) = match getBoolean(this, key) {
164164 case b: Boolean =>
165165 b
166166 case _ =>
167167 false
168168 }
169169
170170
171171 func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
172172 case b: Boolean =>
173173 b
174174 case _ =>
175175 false
176176 }
177177
178178
179179 func getAssetOrigin (generation) = if ((generation == "G"))
180180 then getIncubatorAddress()
181181 else getBreederAddress()
182182
183183
184184 func getAssetRarity (genotype,generation) = {
185185 let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
186186 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
187187 if ((power > 0))
188188 then power
189189 else 2
190190 }
191191
192192
193193 func asString (value) = match value {
194194 case string: String =>
195195 string
196196 case _ =>
197197 throw("FAS: wrong type, expected: String")
198198 }
199199
200200
201201 func asInt (value) = match value {
202202 case int: Int =>
203203 int
204204 case _ =>
205205 throw("FAI: wrong type, expected: Int")
206206 }
207207
208208
209209 func asBoolean (value) = match value {
210210 case boolean: Boolean =>
211211 boolean
212212 case _ =>
213213 throw("FAB: wrong type, expected: Boolean")
214214 }
215215
216216
217217 func getAssetFarmingPower (assetId,address) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
218218 then true
219219 else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
220220 then {
221221 let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [toBase58String(assetId), address], nil))
222222 if ((farmBoost == farmBoost))
223223 then {
224224 let assetName = value(assetInfo(assetId)).name
225225 let isJackpot = (takeRight(value(assetName), 1) == "U")
226226 let farmGen = if (isJackpot)
227227 then ""
228228 else asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
229229 if ((farmGen == farmGen))
230230 then {
231231 let rarity = if (isJackpot)
232232 then 100
233233 else {
234234 let generation = take(takeRight(assetName, 2), 1)
235235 getAssetRarity(farmGen, generation)
236236 }
237237 let totalFarmingPower = (rarity + fraction(rarity, farmBoost, 100))
238238 $Tuple2(farmGen, totalFarmingPower)
239239 }
240240 else throw("Strict value is not equal to itself.")
241241 }
242242 else throw("Strict value is not equal to itself.")
243243 }
244244 else throw("not valid NFT")
245245
246246
247247 func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
248248
249249
250250 func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
251251
252252
253253 func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
254254 then {
255255 let previousInterest = tryGetInteger("total_lastCheckInterest")
256256 let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
257257 let totalFarmingPower = tryGetInteger("total_farmingPower")
258258 calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
259259 }
260260 else if ((tryGetInteger("total_startHeight") != 0))
261261 then tryGetInteger("total_lastCheckInterest")
262262 else throw("farming is not launched, yet")
263263
264264
265265 func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
266266 let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
267267 let currentInterest = getCurrentInterest()
268268 (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
269269 }
270270
271271
272272 func addAssetIdToGenEntry (assetId,assetGen) = {
273273 let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
274274 if ((currentValue == ""))
275275 then assetId
276276 else ((currentValue + ",") + assetId)
277277 }
278278
279279
280280 func getStakeResult (address,assetId,assetFarmingPower,unstaker) = {
281281 let asset = toBase58String(assetId)
282282 [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), StringEntry((("asset_" + asset) + "_owner"), address), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), StringEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker"), unstaker)]
283283 }
284284
285285
286286 func getUnstakeResult (address,assetId,color,caller,realCaller,claimEggs) = {
287287 let locked = isLocked()
288288 if ((locked == locked))
289289 then {
290290 let asset = toBase58String(assetId)
291291 let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker"))
292292 if (if ((unstaker != ""))
293293 then (unstaker != realCaller)
294294 else false)
295295 then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!")
296296 else {
297297 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
298298 if (!((assetFarmingPower > 0)))
299299 then throw("FGU: Asset farming power not bigger then 0")
300300 else {
301301 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
302302 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
303303 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
304304 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
305305 let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch"))
306306 let rewardAfterSickNess = reward
307307 let appendPerches = if (isWithoutPerch)
308308 then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))]
309309 else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))]
310310 let sendTx = if (claimEggs)
311311 then $Tuple2([ScriptTransfer(caller, (rewardAfterSickNess * 1000000), getEggAssetId())], (rewardAfterSickNess * 1000000))
312312 else $Tuple2(nil, 0)
313313 $Tuple2(((([IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), DeleteEntry((("asset_" + asset) + "_owner")), DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker")), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (withdrawnAmount + (rewardAfterSickNess * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + assetRewardDelta))] ++ appendPerches) ++ [ScriptTransfer(caller, 1, assetId)]) ++ sendTx._1), sendTx._2)
314314 }
315315 }
316316 }
317317 else throw("Strict value is not equal to itself.")
318318 }
319319
320320
321321 func calculatePerchPrice (address) = {
322322 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
323323 if ((hasArtefactStaked == ""))
324324 then perchPrice
325325 else ((perchPrice / 10) * 9)
326326 }
327327
328328
329329 func isProxyStakingSc (address) = {
330330 let allowedContracts = getProxyStaking()
331331 let allowedContractsList = split(allowedContracts, ";")
332332 (indexOf(allowedContractsList, address) != unit)
333333 }
334334
335335
336336 func unstakeNFTInternal (asset,i,claimEgg) = {
337337 let assetId = fromBase58String(asset)
338338 let realCaller = toString(i.caller)
339339 let address = if (isProxyStakingSc(toString(i.caller)))
340340 then toString(i.originCaller)
341341 else realCaller
342342 let color = takeRight(value(assetInfo(assetId)).name, 1)
343343 if ((color == "U"))
344344 then throw("FUN: use another function to unstake Jackpot NFT")
345345 else {
346346 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
347347 result
348348 }
349349 }
350350
351351
352352 func unstakeJackpotInternal (asset,i,claimEgg) = {
353353 let assetId = fromBase58String(asset)
354354 let realCaller = toString(i.caller)
355355 let address = if (isProxyStakingSc(toString(i.caller)))
356356 then toString(i.originCaller)
357357 else realCaller
358358 let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
359359 if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
360360 then throw("jackpot only")
361361 else {
362362 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
363363 result
364364 }
365365 }
366366
367367
368368 func getBool (key) = match getBoolean(this, key) {
369369 case b: Boolean =>
370370 b
371371 case _ =>
372372 false
373373 }
374374
375375
376376 func isTestEnv () = getBool("TESTENV")
377377
378378
379379 @Callable(i)
380380 func configureOracle (oracle) = if ((i.caller != this))
381381 then throw("FCO: admin only")
382382 else [StringEntry(staticKey_oracleAddress(), oracle)]
383383
384384
385385
386386 @Callable(i)
387387 func init () = if ((i.caller != this))
388388 then throw("FI: admin only")
389389 else [IntegerEntry("total_startHeight", height)]
390390
391391
392392
393393 @Callable(i)
394394 func buyPerch (colorI,refererAddress) = {
395395 let locked = isLocked()
396396 if ((locked == locked))
397397 then {
398398 let validPayment = if (if ((i.caller == getHuntAddress()))
399399 then true
400400 else (i.caller == getMetaraceAddress()))
401401 then nil
402402 else checkAdditionalPayment(i.payments[0])
403403 if ((validPayment == validPayment))
404404 then {
405405 let color = if ((colorI == "U"))
406406 then "B"
407407 else colorI
408408 if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
409409 then throw("you need to set color properly")
410410 else {
411411 let exactPrice = calculatePerchPrice(toString(i.caller))
412412 let leftToPay = if ((i.originCaller == i.caller))
413413 then {
414414 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
415415 if ((amountPaidByCoupons == amountPaidByCoupons))
416416 then (exactPrice - amountPaidByCoupons)
417417 else throw("Strict value is not equal to itself.")
418418 }
419419 else exactPrice
420420 let payment = if ((leftToPay != 0))
421421 then {
422422 let firstPayment = if ((size(i.payments) == 2))
423423 then value(i.payments[1])
424424 else value(i.payments[0])
425425 if ((firstPayment.assetId != getEggAssetId()))
426426 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
427427 else if ((firstPayment.amount != leftToPay))
428428 then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
429429 else {
430430 let refererRewardForPerch = fraction(leftToPay, RefererReward, 100)
431431 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
432432 if ((refCall == refCall))
433433 then {
434434 let toBurn = if (refCall)
435435 then (leftToPay - refererRewardForPerch)
436436 else leftToPay
437437 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
438438 if ((burnCall == burnCall))
439439 then leftToPay
440440 else throw("Strict value is not equal to itself.")
441441 }
442442 else throw("Strict value is not equal to itself.")
443443 }
444444 }
445445 else 0
446446 if ((payment == payment))
447447 then {
448448 let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
449449 let perchAmount = tryGetInteger(perchAmountKey)
450450 ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
451451 }
452452 else throw("Strict value is not equal to itself.")
453453 }
454454 }
455455 else throw("Strict value is not equal to itself.")
456456 }
457457 else throw("Strict value is not equal to itself.")
458458 }
459459
460460
461461
462462 @Callable(i)
463463 func addFreePerch (address,color) = {
464464 let locked = isLocked()
465465 if ((locked == locked))
466466 then if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
467467 then throw("you need to set color properly")
468468 else if (if (if ((i.caller != getRebirthAddress()))
469469 then (i.caller != getTurtleRebirthAddress())
470470 else false)
471471 then (i.caller != this)
472472 else false)
473473 then throw("rebirth and swop promo only")
474474 else {
475475 let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
476476 let perchAmount = tryGetInteger(perchAmountKey)
477477 $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "")
478478 }
479479 else throw("Strict value is not equal to itself.")
480480 }
481481
482482
483483
484484 @Callable(i)
485485 func stakeNFT () = {
486486 let locked = isLocked()
487487 if ((locked == locked))
488488 then {
489489 let validPayment = if (if ((i.caller == getHuntAddress()))
490490 then true
491491 else (i.caller == getMetaraceAddress()))
492492 then nil
493493 else checkAdditionalPayment(i.payments[1])
494494 if ((validPayment == validPayment))
495495 then {
496496 let pmt = value(i.payments[0])
497497 let assetId = value(value(i.payments[0]).assetId)
498498 let realCaller = toString(i.caller)
499499 let address = if (isProxyStakingSc(toString(i.caller)))
500500 then toString(i.originCaller)
501501 else realCaller
502502 let color = takeRight(value(assetInfo(assetId)).name, 1)
503503 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
504504 if ((pmt.amount != 1))
505505 then throw("NFT is not attached")
506506 else if ((0 >= availablePerches))
507507 then throw(("no perches available for the color " + color))
508508 else {
509- let $t01660416677 = getAssetFarmingPower(assetId, address)
510- let assetGen = $t01660416677._1
511- let assetFarmingPower = $t01660416677._2
509+ let $t01660616679 = getAssetFarmingPower(assetId, address)
510+ let assetGen = $t01660616679._1
511+ let assetFarmingPower = $t01660616679._2
512512 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
513513 }
514514 }
515515 else throw("Strict value is not equal to itself.")
516516 }
517517 else throw("Strict value is not equal to itself.")
518518 }
519519
520520
521521
522522 @Callable(i)
523523 func stakeNFTWithoutPerch () = {
524524 let locked = isLocked()
525525 if ((locked == locked))
526526 then {
527527 let dappToCall = toString(i.caller)
528528 if (!(isProxyStakingSc(dappToCall)))
529529 then throw("FSNWP: Only trusted smart contracts can stake without a perch!")
530530 else {
531531 let pmt = value(i.payments[0])
532532 let assetId = value(value(i.payments[0]).assetId)
533533 let address = toString(i.originCaller)
534534 if ((pmt.amount != 1))
535535 then throw("NFT is not attached")
536536 else {
537- let $t01731517388 = getAssetFarmingPower(assetId, address)
538- let assetGen = $t01731517388._1
539- let assetFarmingPower = $t01731517388._2
537+ let $t01731717390 = getAssetFarmingPower(assetId, address)
538+ let assetGen = $t01731717390._1
539+ let assetFarmingPower = $t01731717390._2
540540 let asset = toBase58String(assetId)
541541 let realCaller = toString(i.caller)
542542 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
543543 }
544544 }
545545 }
546546 else throw("Strict value is not equal to itself.")
547547 }
548548
549549
550550
551551 @Callable(i)
552552 func unstakeNFT (asset) = {
553553 let validPayment = if ((i.caller == getMetaraceAddress()))
554554 then nil
555555 else checkAdditionalPayment(i.payments[0])
556556 if ((validPayment == validPayment))
557557 then {
558558 let result = unstakeNFTInternal(asset, i, true)
559559 $Tuple2((result._1 ++ validPayment), result._2)
560560 }
561561 else throw("Strict value is not equal to itself.")
562562 }
563563
564564
565565
566566 @Callable(i)
567567 func unstakeNFTWithoutClaim (asset) = unstakeNFTInternal(asset, i, false)
568568
569569
570570
571571 @Callable(i)
572572 func stakeJackpot (color) = {
573573 let locked = isLocked()
574574 if ((locked == locked))
575575 then {
576576 let validPayment = if (if ((i.caller == getHuntAddress()))
577577 then true
578578 else (i.caller == getMetaraceAddress()))
579579 then nil
580580 else checkAdditionalPayment(i.payments[1])
581581 if ((validPayment == validPayment))
582582 then {
583583 let pmt = value(i.payments[0])
584584 let assetId = value(pmt.assetId)
585585 let realCaller = toString(i.caller)
586586 let address = if (isProxyStakingSc(toString(i.caller)))
587587 then toString(i.originCaller)
588588 else realCaller
589589 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
590590 let assetIssuer = value(assetInfo(assetId)).issuer
591591 if ((pmt.amount != 1))
592592 then throw("NFT is not attached")
593593 else if (if ((assetIssuer == getIncubatorAddress()))
594594 then true
595595 else (assetIssuer == getBreederAddress()))
596596 then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
597597 then throw("jackpot only")
598598 else if ((0 >= availablePerches))
599599 then throw(("FSJ: no perches available for the color " + color))
600600 else {
601601 let farmingPower = getAssetFarmingPower(assetId, address)
602602 ((getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) ++ validPayment)
603603 }
604604 else throw("asset is not valid")
605605 }
606606 else throw("Strict value is not equal to itself.")
607607 }
608608 else throw("Strict value is not equal to itself.")
609609 }
610610
611611
612612
613613 @Callable(i)
614614 func unstakeJackpot (asset) = {
615615 let validPayment = checkAdditionalPayment(i.payments[0])
616616 if ((validPayment == validPayment))
617617 then {
618618 let result = unstakeJackpotInternal(asset, i, true)
619619 $Tuple2((result._1 ++ validPayment), result._2)
620620 }
621621 else throw("Strict value is not equal to itself.")
622622 }
623623
624624
625625
626626 @Callable(i)
627627 func unstakeJackpotWithoutClaimEgg (asset) = unstakeJackpotInternal(asset, i, false)
628628
629629
630630
631631 @Callable(i)
632632 func claimReward (asset) = {
633633 let locked = isLocked()
634634 if ((locked == locked))
635635 then {
636636 let validPayment = if ((i.originCaller == getCfMasterAddress()))
637637 then nil
638638 else checkAdditionalPayment(i.payments[0])
639639 if ((validPayment == validPayment))
640640 then {
641641 let address = if ((i.originCaller == getCfMasterAddress()))
642642 then toString(i.caller)
643643 else toString(i.originCaller)
644644 let assetId = fromBase58String(asset)
645645 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
646646 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
647647 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
648648 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
649649 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
650650 if ((0 >= reward))
651651 then throw("FCR: you have no EGGs to withdraw")
652652 else $Tuple2(([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())] ++ validPayment), (reward * 1000000))
653653 }
654654 else throw("Strict value is not equal to itself.")
655655 }
656656 else throw("Strict value is not equal to itself.")
657657 }
658658
659659
660660 @Verifier(tx)
661661 func verify () = if (isTestEnv())
662662 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
663663 else {
664664 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
665665 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
666666 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
667667 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
668668 then 1
669669 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
670670 then 1
671671 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
672672 then 1
673673 else 0
674674 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
675675 then 1
676676 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
677677 then 1
678678 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
679679 then 1
680680 else 0
681681 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
682682 then 1
683683 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
684684 then 1
685685 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
686686 then 1
687687 else 0
688688 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
689689 match tx {
690690 case dtx: DataTransaction =>
691691 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
692692 case _ =>
693693 (signaturesCount >= 2)
694694 }
695695 }
696696

github/deemru/w8io/3ef1775 
67.70 ms