tx · 13x6zJHZgeSPRUKPxZHUgcUK1fBLrxgsZxsr3oc3FB3b

3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA:  -0.02400000 Waves

2024.03.16 22:17 [4086826] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves

{ "type": 13, "id": "13x6zJHZgeSPRUKPxZHUgcUK1fBLrxgsZxsr3oc3FB3b", "fee": 2400000, "feeAssetId": null, "timestamp": 1710616694471, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "3jGW4ZwuiL8cZ4sVdzK7hW1MaoSaF2G9on2zL5KW6cNqELMUHnKW3nF43NWvQzHzw2BFSznLasd4HFo1e1Wzc2Kp" ], "script": "base64:BgI3CAISAwoBCBIAEgQKAggIEgQKAggIEgASABIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCEUACnBlcmNoUHJpY2UJAGgCAGQAwIQ9AAVzY2FsZQCQTgAGc2NhbGUyAMCEPQEKaXNTaWNrRHVjawEGZHVja0lkCQCsAgIFBmR1Y2tJZAIFX3NpY2sBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwACFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAhlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwACFnN0YXRpY19tZXRhUmFjZUFkZHJlc3MBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwACGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwACHHN0YXRpY19wcm94eVN0YWtpbmdDb250cmFjdHMBFXN0YXRpY0tleV9tYWludGVuYW5jZQACEnN0YXRpY19tYWludGVuYW5jZQEZc3RhdGljS2V5X2NmTWFzdGVyQWRkcmVzcwACFnN0YXRpY19jZk1hc3RlckFkZHJlc3MBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgACEnN0YXRpY19kdWNrV3JhcHBlcgEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAAhJzdGF0aWNfYnVybkFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEVc3RhdGljS2V5X2h1bnRBZGRyZXNzAAISc3RhdGljX2h1bnRBZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAARFnZXRSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwABF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAERZ2V0QnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAARVnZXRSZWZDb250cmFjdEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEmdldE1ldGFyYWNlQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGXN0YXRpY0tleV9tZXRhUmFjZUFkZHJlc3MAARRnZXRBY2NCb29zdGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwABD2dldFByb3h5U3Rha2luZwAJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwABDmdldE1haW50ZW5hbmNlAAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfbWFpbnRlbmFuY2UAARJnZXRDZk1hc3RlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARlzdGF0aWNLZXlfY2ZNYXN0ZXJBZGRyZXNzAAEQZ2V0RHVja1dyYXBwZXJTYwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAQ5nZXRIdW50QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9odW50QWRkcmVzcwAADVJlZmVyZXJSZXdhcmQABQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxGQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARFnZXRSZXdhcmRQZXJCbG9jawAAAAEIaXNMb2NrZWQAAwkBAiE9AgkBDmdldE1haW50ZW5hbmNlAAIACQACAQkBDmdldE1haW50ZW5hbmNlAAAAAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHARV0cnlHZXRCb29sZWFuRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCbCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEOZ2V0QXNzZXRPcmlnaW4BCmdlbmVyYXRpb24DCQAAAgUKZ2VuZXJhdGlvbgIBRwkBE2dldEluY3ViYXRvckFkZHJlc3MACQERZ2V0QnJlZWRlckFkZHJlc3MAAQ5nZXRBc3NldFJhcml0eQIIZ2Vub3R5cGUKZ2VuZXJhdGlvbgQIcXVhbnRpdHkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQEOZ2V0QXNzZXRPcmlnaW4BBQpnZW5lcmF0aW9uCQCsAgIJAKwCAgIGc3RhdHNfBQhnZW5vdHlwZQIJX3F1YW50aXR5CQCsAgIJAKwCAgIGc3RhdHNfBQhnZW5vdHlwZQITX3F1YW50aXR5IG5vdCBmb3VuZAQFcG93ZXIJAGwGCQBpAgCQTgUIcXVhbnRpdHkABAAFAAEAAgUFRkxPT1IDCQBmAgUFcG93ZXIAAAUFcG93ZXIAAgEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAUGc3RyaW5nCQACAQIhRkFTOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAh5GQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBCWFzQm9vbGVhbgEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EB2Jvb2xlYW4FByRtYXRjaDAFB2Jvb2xlYW4JAAIBAiJGQUI6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBCb29sZWFuARRnZXRBc3NldEZhcm1pbmdQb3dlcgIHYXNzZXRJZAdhZGRyZXNzAwMJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAYJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MABAlmYXJtQm9vc3QJAQVhc0ludAEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACGmNhbGN1bGF0ZUZhcm1pbmdQb3dlckJvb3N0CQDMCAIJANgEAQUHYXNzZXRJZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAMJAAACBQlmYXJtQm9vc3QFCWZhcm1Cb29zdAQJYXNzZXROYW1lCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUECWlzSmFja3BvdAkAAAIJALICAgkBBXZhbHVlAQUJYXNzZXROYW1lAAECAVUEB2Zhcm1HZW4DBQlpc0phY2twb3QCAAkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQlhc3NldE5hbWUFA25pbAUDbmlsAwkAAAIFB2Zhcm1HZW4FB2Zhcm1HZW4EBnJhcml0eQMFCWlzSmFja3BvdABkBApnZW5lcmF0aW9uCQCvAgIJALICAgUJYXNzZXROYW1lAAIAAQkBDmdldEFzc2V0UmFyaXR5AgUHZmFybUdlbgUKZ2VuZXJhdGlvbgQRdG90YWxGYXJtaW5nUG93ZXIJAGQCBQZyYXJpdHkJAGsDBQZyYXJpdHkFCWZhcm1Cb29zdABkCQCUCgIFB2Zhcm1HZW4FEXRvdGFsRmFybWluZ1Bvd2VyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQINbm90IHZhbGlkIE5GVAEdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXICB2FkZHJlc3MHYXNzZXRJZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQdhc3NldElkAg1fZmFybWluZ1Bvd2VyAQxjYWxjSW50ZXJlc3QDEHByZXZpb3VzSW50ZXJlc3QWcHJldmlvdXNJbnRlcmVzdEhlaWdodBF0b3RhbEZhcm1pbmdQb3dlcgkAZAIFEHByZXZpb3VzSW50ZXJlc3QJAGkCCQBoAgkAaAIFBXNjYWxlCQERZ2V0UmV3YXJkUGVyQmxvY2sACQBlAgUGaGVpZ2h0BRZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BRF0b3RhbEZhcm1pbmdQb3dlcgESZ2V0Q3VycmVudEludGVyZXN0AAMJAGYCCQENdHJ5R2V0SW50ZWdlcgECEnRvdGFsX2Zhcm1pbmdQb3dlcgAABBBwcmV2aW91c0ludGVyZXN0CQENdHJ5R2V0SW50ZWdlcgECF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0BBZwcmV2aW91c0ludGVyZXN0SGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgECHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BBF0b3RhbEZhcm1pbmdQb3dlcgkBDXRyeUdldEludGVnZXIBAhJ0b3RhbF9mYXJtaW5nUG93ZXIJAQxjYWxjSW50ZXJlc3QDBRBwcmV2aW91c0ludGVyZXN0BRZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BRF0b3RhbEZhcm1pbmdQb3dlcgMJAQIhPQIJAQ10cnlHZXRJbnRlZ2VyAQIRdG90YWxfc3RhcnRIZWlnaHQAAAkBDXRyeUdldEludGVnZXIBAhd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkAAgECHGZhcm1pbmcgaXMgbm90IGxhdW5jaGVkLCB5ZXQBFGNhbGNBc3NldFJld2FyZERlbHRhAwdhZGRyZXNzB2Fzc2V0SWQRYXNzZXRGYXJtaW5nUG93ZXIEFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUHYXNzZXRJZAISX2xhc3RDaGVja0ludGVyZXN0BA9jdXJyZW50SW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQBoAgURYXNzZXRGYXJtaW5nUG93ZXIJAGUCBQ9jdXJyZW50SW50ZXJlc3QFFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QBFGFkZEFzc2V0SWRUb0dlbkVudHJ5Agdhc3NldElkCGFzc2V0R2VuBAxjdXJyZW50VmFsdWUJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIHYXNzZXRzXwUIYXNzZXRHZW4CB19sb2NrZWQDCQAAAgUMY3VycmVudFZhbHVlAgAFB2Fzc2V0SWQJAKwCAgkArAICBQxjdXJyZW50VmFsdWUCASwFB2Fzc2V0SWQBDmdldFN0YWtlUmVzdWx0BAdhZGRyZXNzB2Fzc2V0SWQRYXNzZXRGYXJtaW5nUG93ZXIIdW5zdGFrZXIEBWFzc2V0CQDYBAEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQICEnRvdGFsX2Zhcm1pbmdQb3dlcgkAZAIJAQ10cnlHZXRJbnRlZ2VyAQISdG90YWxfZmFybWluZ1Bvd2VyBRFhc3NldEZhcm1pbmdQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQDMCAIJAQxJbnRlZ2VyRW50cnkCAh10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FBWFzc2V0AgZfb3duZXIFB2FkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0Ag1fZmFybWluZ1Bvd2VyBRFhc3NldEZhcm1pbmdQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEl9sYXN0Q2hlY2tJbnRlcmVzdAkBEmdldEN1cnJlbnRJbnRlcmVzdAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCCV91bnN0YWtlcgUIdW5zdGFrZXIFA25pbAEQZ2V0VW5zdGFrZVJlc3VsdAYHYWRkcmVzcwdhc3NldElkBWNvbG9yBmNhbGxlcgpyZWFsQ2FsbGVyCWNsYWltRWdncwQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkBAVhc3NldAkA2AQBBQdhc3NldElkBAh1bnN0YWtlcgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AglfdW5zdGFrZXIDAwkBAiE9AgUIdW5zdGFrZXICAAkBAiE9AgUIdW5zdGFrZXIFCnJlYWxDYWxsZXIHCQACAQJXRlVOOiBJdCBzZWVtcyBkdWNrIHdhcyBzdGFrZWQgdGhyb3VoIGEgZGFwcCwgbm90IGRpcmVjdGx5LCBwbGVhc2UgdW5zdGFrZSB0aHJvdWdoIGRhcHAhBBFhc3NldEZhcm1pbmdQb3dlcgkBHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAgUHYWRkcmVzcwUFYXNzZXQDCQEBIQEJAGYCBRFhc3NldEZhcm1pbmdQb3dlcgAACQACAQIqRkdVOiBBc3NldCBmYXJtaW5nIHBvd2VyIG5vdCBiaWdnZXIgdGhlbiAwBBBhc3NldFJld2FyZERlbHRhCQEUY2FsY0Fzc2V0UmV3YXJkRGVsdGEDBQdhZGRyZXNzBQVhc3NldAURYXNzZXRGYXJtaW5nUG93ZXIEDGZhcm1lZEFtb3VudAkAZAIFEGFzc2V0UmV3YXJkRGVsdGEJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQED3dpdGhkcmF3bkFtb3VudAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAQGcmV3YXJkCQBpAgkAZQIFDGZhcm1lZEFtb3VudAUPd2l0aGRyYXduQW1vdW50CQBoAgUFc2NhbGUAZAQOaXNXaXRob3V0UGVyY2gJAQ10cnlHZXRCb29sZWFuAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCDl93aXRob3V0X3BlcmNoBBNyZXdhcmRBZnRlclNpY2tOZXNzBQZyZXdhcmQEDWFwcGVuZFBlcmNoZXMDBQ5pc1dpdGhvdXRQZXJjaAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIOX3dpdGhvdXRfcGVyY2gFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yAAEFA25pbAQGc2VuZFR4AwUJY2xhaW1FZ2dzCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBoAgUTcmV3YXJkQWZ0ZXJTaWNrTmVzcwDAhD0JAQ1nZXRFZ2dBc3NldElkAAUDbmlsCQBoAgUTcmV3YXJkQWZ0ZXJTaWNrTmVzcwDAhD0JAJQKAgUDbmlsAAAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgISdG90YWxfZmFybWluZ1Bvd2VyCQBlAgkBDXRyeUdldEludGVnZXIBAhJ0b3RhbF9mYXJtaW5nUG93ZXIFEWFzc2V0RmFybWluZ1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBEmdldEN1cnJlbnRJbnRlcmVzdAAJAMwIAgkBDEludGVnZXJFbnRyeQICHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmFzc2V0XwUFYXNzZXQCBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIJX3Vuc3Rha2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAINX2Zhcm1pbmdQb3dlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAISX2xhc3RDaGVja0ludGVyZXN0CQESZ2V0Q3VycmVudEludGVyZXN0AAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEF93aXRoZHJhd25BbW91bnQJAGQCBQ93aXRoZHJhd25BbW91bnQJAGgCBRNyZXdhcmRBZnRlclNpY2tOZXNzBQZzY2FsZTIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhZfbGFzdENoZWNrRmFybWVkQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAUQYXNzZXRSZXdhcmREZWx0YQUDbmlsBQ1hcHBlbmRQZXJjaGVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgABBQdhc3NldElkBQNuaWwIBQZzZW5kVHgCXzEIBQZzZW5kVHgCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2NhbGN1bGF0ZVBlcmNoUHJpY2UBB2FkZHJlc3MEEWhhc0FydGVmYWN0U3Rha2VkCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEUZ2V0QWNjQm9vc3RlckFkZHJlc3MACQCsAgIJAKwCAgILQVJULVhNSVNUTF8FB2FkZHJlc3MCBl9vd25lcgMJAAACBRFoYXNBcnRlZmFjdFN0YWtlZAIABQpwZXJjaFByaWNlCQBoAgkAaQIFCnBlcmNoUHJpY2UACgAJARBpc1Byb3h5U3Rha2luZ1NjAQdhZGRyZXNzBBBhbGxvd2VkQ29udHJhY3RzCQEPZ2V0UHJveHlTdGFraW5nAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwkBAiE9AgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUHYWRkcmVzcwUEdW5pdAESdW5zdGFrZU5GVEludGVybmFsAwVhc3NldAFpCGNsYWltRWdnBAdhc3NldElkCQDZBAEFBWFzc2V0BApyZWFsQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQHYWRkcmVzcwMJARBpc1Byb3h5U3Rha2luZ1NjAQkApQgBCAUBaQZjYWxsZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQpyZWFsQ2FsbGVyBAVjb2xvcgkAsgICCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQMJAAACBQVjb2xvcgIBVQkAAgECMEZVTjogdXNlIGFub3RoZXIgZnVuY3Rpb24gdG8gdW5zdGFrZSBKYWNrcG90IE5GVAQGcmVzdWx0CQEQZ2V0VW5zdGFrZVJlc3VsdAYFB2FkZHJlc3MFB2Fzc2V0SWQFBWNvbG9yCAUBaQZjYWxsZXIFCnJlYWxDYWxsZXIFCGNsYWltRWdnBQZyZXN1bHQBFnVuc3Rha2VKYWNrcG90SW50ZXJuYWwDBWFzc2V0AWkIY2xhaW1FZ2cEB2Fzc2V0SWQJANkEAQUFYXNzZXQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEBWNvbG9yCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCC19wZXJjaENvbG9yAwkBAiE9AgkAsgICCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQIBVQkAAgECDGphY2twb3Qgb25seQQGcmVzdWx0CQEQZ2V0VW5zdGFrZVJlc3VsdAYFB2FkZHJlc3MFB2Fzc2V0SWQFBWNvbG9yCAUBaQZjYWxsZXIFCnJlYWxDYWxsZXIFCGNsYWltRWdnBQZyZXN1bHQBB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBCWlzVGVzdEVudgAJAQdnZXRCb29sAQIHVEVTVEVOVgwBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9GQ086IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEEaW5pdAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5GSTogYWRtaW4gb25seQkAzAgCCQEMSW50ZWdlckVudHJ5AgIRdG90YWxfc3RhcnRIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGJ1eVBlcmNoAgZjb2xvckkOcmVmZXJlckFkZHJlc3MEBmxvY2tlZAkBCGlzTG9ja2VkAAMJAAACBQZsb2NrZWQFBmxvY2tlZAQMdmFsaWRQYXltZW50AwMJAAACCAUBaQZjYWxsZXIJAQ5nZXRIdW50QWRkcmVzcwAGCQAAAggFAWkGY2FsbGVyCQESZ2V0TWV0YXJhY2VBZGRyZXNzAAUDbmlsCQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQFY29sb3IDCQAAAgUGY29sb3JJAgFVAgFCBQZjb2xvckkDCQBmAgAACQEFdmFsdWUBCQDPCAIJAMwIAgIBQgkAzAgCAgFSCQDMCAICAUcJAMwIAgIBWQUDbmlsBQVjb2xvcgkAAgECHnlvdSBuZWVkIHRvIHNldCBjb2xvciBwcm9wZXJseQQKZXhhY3RQcmljZQkBE2NhbGN1bGF0ZVBlcmNoUHJpY2UBCQClCAEIBQFpBmNhbGxlcgQJbGVmdFRvUGF5AwkAAAIIBQFpDG9yaWdpbkNhbGxlcggFAWkGY2FsbGVyBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUKZXhhY3RQcmljZQUDbmlsBQNuaWwDCQAAAgUTYW1vdW50UGFpZEJ5Q291cG9ucwUTYW1vdW50UGFpZEJ5Q291cG9ucwkAZQIFCmV4YWN0UHJpY2UFE2Ftb3VudFBhaWRCeUNvdXBvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FCmV4YWN0UHJpY2UEB3BheW1lbnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQMZmlyc3RQYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAgkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgEJAKwCAgJBRkJQOiBZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJANgEAQkBDWdldEVnZ0Fzc2V0SWQAAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQFCWxlZnRUb1BheQkAAgEJAKwCAgkArAICCQCsAgICSEZCUDogVG8gYnV5IGEgcGVyY2ggeW91IGN1cnJlbnRseSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIEVHR2xldHM6IAkApAMBBQlsZWZ0VG9QYXkCASAJAKUIAQgFAWkGY2FsbGVyBBVyZWZlcmVyUmV3YXJkRm9yUGVyY2gJAGsDBQlsZWZ0VG9QYXkFDVJlZmVyZXJSZXdhcmQAZAQHcmVmQ2FsbAkBCWFzQm9vbGVhbgEJAPwHBAkBFWdldFJlZkNvbnRyYWN0QWRkcmVzcwACCnJlZlBheW1lbnQJAMwIAgUOcmVmZXJlckFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFA25pbAMJAAACBQdyZWZDYWxsBQdyZWZDYWxsBAZ0b0J1cm4DBQdyZWZDYWxsCQBlAgUJbGVmdFRvUGF5BRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFCWxlZnRUb1BheQQIYnVybkNhbGwJAPwHBAkBDmdldEJ1cm5BZGRyZXNzAAIUYnVybkF0dGFjaGVkUGF5bWVudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABQZ0b0J1cm4FA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwFCWxlZnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFB3BheW1lbnQFB3BheW1lbnQEDnBlcmNoQW1vdW50S2V5CQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwkApQgBCAUBaQZjYWxsZXICEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC3BlcmNoQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEFDnBlcmNoQW1vdW50S2V5CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnBlcmNoQW1vdW50S2V5CQBkAgULcGVyY2hBbW91bnQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYWRkRnJlZVBlcmNoAgdhZGRyZXNzBWNvbG9yBAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQDCQBmAgAACQEFdmFsdWUBCQDPCAIJAMwIAgIBQgkAzAgCAgFSCQDMCAICAUcJAMwIAgIBWQUDbmlsBQVjb2xvcgkAAgECHnlvdSBuZWVkIHRvIHNldCBjb2xvciBwcm9wZXJseQMDAwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MACQECIT0CCAUBaQZjYWxsZXIJARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMHCQACAQIbcmViaXJ0aCBhbmQgc3dvcCBwcm9tbyBvbmx5BA5wZXJjaEFtb3VudEtleQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC3BlcmNoQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEFDnBlcmNoQW1vdW50S2V5CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnBlcmNoQW1vdW50S2V5CQBkAgULcGVyY2hBbW91bnQAAQUDbmlsAgAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc3Rha2VORlQABAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMDCQAAAggFAWkGY2FsbGVyCQEOZ2V0SHVudEFkZHJlc3MABgkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEBWNvbG9yCQCyAgIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQABBBBhdmFpbGFibGVQZXJjaGVzCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQDCQBnAgAABRBhdmFpbGFibGVQZXJjaGVzCQACAQkArAICAiNubyBwZXJjaGVzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbG9yIAUFY29sb3IEDSR0MDE2NjA0MTY2NzcJARRnZXRBc3NldEZhcm1pbmdQb3dlcgIFB2Fzc2V0SWQFB2FkZHJlc3MECGFzc2V0R2VuCAUNJHQwMTY2MDQxNjY3NwJfMQQRYXNzZXRGYXJtaW5nUG93ZXIIBQ0kdDAxNjYwNDE2Njc3Al8yCQDOCAIJAM4IAgkBDmdldFN0YWtlUmVzdWx0BAUHYWRkcmVzcwUHYXNzZXRJZAURYXNzZXRGYXJtaW5nUG93ZXIFCnJlYWxDYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yCQBlAgUQYXZhaWxhYmxlUGVyY2hlcwABBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRzdGFrZU5GVFdpdGhvdXRQZXJjaAAEBmxvY2tlZAkBCGlzTG9ja2VkAAMJAAACBQZsb2NrZWQFBmxvY2tlZAQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQEBIQEJARBpc1Byb3h5U3Rha2luZ1NjAQUKZGFwcFRvQ2FsbAkAAgECPkZTTldQOiBPbmx5IHRydXN0ZWQgc21hcnQgY29udHJhY3RzIGNhbiBzdGFrZSB3aXRob3V0IGEgcGVyY2ghBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAdhZGRyZXNzCQClCAEIBQFpDG9yaWdpbkNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBA0kdDAxNzMxNTE3Mzg4CQEUZ2V0QXNzZXRGYXJtaW5nUG93ZXICBQdhc3NldElkBQdhZGRyZXNzBAhhc3NldEdlbggFDSR0MDE3MzE1MTczODgCXzEEEWFzc2V0RmFybWluZ1Bvd2VyCAUNJHQwMTczMTUxNzM4OAJfMgQFYXNzZXQJANgEAQUHYXNzZXRJZAQKcmVhbENhbGxlcgkApQgBCAUBaQZjYWxsZXIJAM4IAgkBDmdldFN0YWtlUmVzdWx0BAUHYWRkcmVzcwUHYXNzZXRJZAURYXNzZXRGYXJtaW5nUG93ZXIFCnJlYWxDYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0Ag5fd2l0aG91dF9wZXJjaAYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1bnN0YWtlTkZUAQVhc3NldAQMdmFsaWRQYXltZW50AwkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEBnJlc3VsdAkBEnVuc3Rha2VORlRJbnRlcm5hbAMFBWFzc2V0BQFpBgkAlAoCCQDOCAIIBQZyZXN1bHQCXzEFDHZhbGlkUGF5bWVudAgFBnJlc3VsdAJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZ1bnN0YWtlTkZUV2l0aG91dENsYWltAQVhc3NldAkBEnVuc3Rha2VORlRJbnRlcm5hbAMFBWFzc2V0BQFpBwFpAQxzdGFrZUphY2twb3QBBWNvbG9yBAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMDCQAAAggFAWkGY2FsbGVyCQEOZ2V0SHVudEFkZHJlc3MABgkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEEGF2YWlsYWJsZVBlcmNoZXMJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC2Fzc2V0SXNzdWVyCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkAwMJAAACBQthc3NldElzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MABgkAAAIFC2Fzc2V0SXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MAAwkBAiE9AgkAsgICCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQIBVQkAAgECDGphY2twb3Qgb25seQMJAGcCAAAFEGF2YWlsYWJsZVBlcmNoZXMJAAIBCQCsAgICKEZTSjogbm8gcGVyY2hlcyBhdmFpbGFibGUgZm9yIHRoZSBjb2xvciAFBWNvbG9yBAxmYXJtaW5nUG93ZXIJARRnZXRBc3NldEZhcm1pbmdQb3dlcgIFB2Fzc2V0SWQFB2FkZHJlc3MJAM4IAgkAzggCCQEOZ2V0U3Rha2VSZXN1bHQEBQdhZGRyZXNzBQdhc3NldElkCAUMZmFybWluZ1Bvd2VyAl8yBQpyZWFsQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwISX3BlcmNoZXNBdmFpbGFibGVfBQVjb2xvcgkAZQIFEGF2YWlsYWJsZVBlcmNoZXMAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfCQDYBAEFB2Fzc2V0SWQCC19wZXJjaENvbG9yBQVjb2xvcgUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAhJhc3NldCBpcyBub3QgdmFsaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOdW5zdGFrZUphY2twb3QBBWFzc2V0BAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAZyZXN1bHQJARZ1bnN0YWtlSmFja3BvdEludGVybmFsAwUFYXNzZXQFAWkGCQCUCgIJAM4IAggFBnJlc3VsdAJfMQUMdmFsaWRQYXltZW50CAUGcmVzdWx0Al8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXVuc3Rha2VKYWNrcG90V2l0aG91dENsYWltRWdnAQVhc3NldAkBFnVuc3Rha2VKYWNrcG90SW50ZXJuYWwDBQVhc3NldAUBaQcBaQELY2xhaW1SZXdhcmQBBWFzc2V0BAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMJAAACCAUBaQxvcmlnaW5DYWxsZXIJARJnZXRDZk1hc3RlckFkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAdhZGRyZXNzAwkAAAIIBQFpDG9yaWdpbkNhbGxlcgkBEmdldENmTWFzdGVyQWRkcmVzcwAJAKUIAQgFAWkGY2FsbGVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQHYXNzZXRJZAkA2QQBBQVhc3NldAQRYXNzZXRGYXJtaW5nUG93ZXIJAR1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgIFB2FkZHJlc3MFBWFzc2V0BBBhc3NldFJld2FyZERlbHRhCQEUY2FsY0Fzc2V0UmV3YXJkRGVsdGEDBQdhZGRyZXNzBQVhc3NldAURYXNzZXRGYXJtaW5nUG93ZXIEDGZhcm1lZEFtb3VudAkAZAIFEGFzc2V0UmV3YXJkRGVsdGEJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQED3dpdGhkcmF3bkFtb3VudAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAQGcmV3YXJkCQBpAgkAZQIFDGZhcm1lZEFtb3VudAUPd2l0aGRyYXduQW1vdW50CQBoAgUFc2NhbGUAZAMJAGcCAAAFBnJld2FyZAkAAgECIUZDUjogeW91IGhhdmUgbm8gRUdHcyB0byB3aXRoZHJhdwkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhBfd2l0aGRyYXduQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAkAaAIFBnJld2FyZAUGc2NhbGUyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQdhZGRyZXNzCQBoAgUGcmV3YXJkAMCEPQkBDWdldEVnZ0Fzc2V0SWQABQNuaWwFDHZhbGlkUGF5bWVudAkAaAIFBnJld2FyZADAhD0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAg9EYXRhVHJhbnNhY3Rpb24EA2R0eAUHJG1hdGNoMAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkAZwIFD3NpZ25hdHVyZXNDb3VudAACSCErKg==", "height": 4086826, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5eST5vCxiUD2Qd1V7xpAbyo3TZ8mLKzYAoVjekzvCs2W Next: BTEUMWfctZ81YiwuiYhSQ2ibVNUWiSzWDFEUkg8myUJM Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let perchPrice = (100 * 1000000)
144144 }
145145
146146
147-func getRewardPerBlock () = 274
147+func getRewardPerBlock () = 0
148148
149149
150150 func isLocked () = if ((getMaintenance() != ""))
245245
246246
247247 func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower"))
248-
249-
250-func getAssetsByGen (gen) = {
251- let s = tryGetString(("assets_" + gen))
252- if ((s == ""))
253- then nil
254- else split(s, ",")
255- }
256248
257249
258250 func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
514506 else if ((0 >= availablePerches))
515507 then throw(("no perches available for the color " + color))
516508 else {
517- let $t01672916802 = getAssetFarmingPower(assetId, address)
518- let assetGen = $t01672916802._1
519- let assetFarmingPower = $t01672916802._2
509+ let $t01660416677 = getAssetFarmingPower(assetId, address)
510+ let assetGen = $t01660416677._1
511+ let assetFarmingPower = $t01660416677._2
520512 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
521513 }
522514 }
542534 if ((pmt.amount != 1))
543535 then throw("NFT is not attached")
544536 else {
545- let $t01744017513 = getAssetFarmingPower(assetId, address)
546- let assetGen = $t01744017513._1
547- let assetFarmingPower = $t01744017513._2
537+ let $t01731517388 = getAssetFarmingPower(assetId, address)
538+ let assetGen = $t01731517388._1
539+ let assetFarmingPower = $t01731517388._2
548540 let asset = toBase58String(assetId)
549541 let realCaller = toString(i.caller)
550542 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
695687 else 0
696688 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
697689 match tx {
690+ case dtx: DataTransaction =>
691+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
698692 case _ =>
699693 (signaturesCount >= 2)
700694 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# 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 () = 274
147+func getRewardPerBlock () = 0
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"))
248-
249-
250-func getAssetsByGen (gen) = {
251- let s = tryGetString(("assets_" + gen))
252- if ((s == ""))
253- then nil
254- else split(s, ",")
255- }
256248
257249
258250 func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower))
259251
260252
261253 func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0))
262254 then {
263255 let previousInterest = tryGetInteger("total_lastCheckInterest")
264256 let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight")
265257 let totalFarmingPower = tryGetInteger("total_farmingPower")
266258 calcInterest(previousInterest, previousInterestHeight, totalFarmingPower)
267259 }
268260 else if ((tryGetInteger("total_startHeight") != 0))
269261 then tryGetInteger("total_lastCheckInterest")
270262 else throw("farming is not launched, yet")
271263
272264
273265 func calcAssetRewardDelta (address,assetId,assetFarmingPower) = {
274266 let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest"))
275267 let currentInterest = getCurrentInterest()
276268 (assetFarmingPower * (currentInterest - lastCheckAssetInterest))
277269 }
278270
279271
280272 func addAssetIdToGenEntry (assetId,assetGen) = {
281273 let currentValue = tryGetString((("assets_" + assetGen) + "_locked"))
282274 if ((currentValue == ""))
283275 then assetId
284276 else ((currentValue + ",") + assetId)
285277 }
286278
287279
288280 func getStakeResult (address,assetId,assetFarmingPower,unstaker) = {
289281 let asset = toBase58String(assetId)
290282 [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)]
291283 }
292284
293285
294286 func getUnstakeResult (address,assetId,color,caller,realCaller,claimEggs) = {
295287 let locked = isLocked()
296288 if ((locked == locked))
297289 then {
298290 let asset = toBase58String(assetId)
299291 let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker"))
300292 if (if ((unstaker != ""))
301293 then (unstaker != realCaller)
302294 else false)
303295 then throw("FUN: It seems duck was staked throuh a dapp, not directly, please unstake through dapp!")
304296 else {
305297 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
306298 if (!((assetFarmingPower > 0)))
307299 then throw("FGU: Asset farming power not bigger then 0")
308300 else {
309301 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
310302 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
311303 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
312304 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
313305 let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch"))
314306 let rewardAfterSickNess = reward
315307 let appendPerches = if (isWithoutPerch)
316308 then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))]
317309 else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))]
318310 let sendTx = if (claimEggs)
319311 then $Tuple2([ScriptTransfer(caller, (rewardAfterSickNess * 1000000), getEggAssetId())], (rewardAfterSickNess * 1000000))
320312 else $Tuple2(nil, 0)
321313 $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)
322314 }
323315 }
324316 }
325317 else throw("Strict value is not equal to itself.")
326318 }
327319
328320
329321 func calculatePerchPrice (address) = {
330322 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
331323 if ((hasArtefactStaked == ""))
332324 then perchPrice
333325 else ((perchPrice / 10) * 9)
334326 }
335327
336328
337329 func isProxyStakingSc (address) = {
338330 let allowedContracts = getProxyStaking()
339331 let allowedContractsList = split(allowedContracts, ";")
340332 (indexOf(allowedContractsList, address) != unit)
341333 }
342334
343335
344336 func unstakeNFTInternal (asset,i,claimEgg) = {
345337 let assetId = fromBase58String(asset)
346338 let realCaller = toString(i.caller)
347339 let address = if (isProxyStakingSc(toString(i.caller)))
348340 then toString(i.originCaller)
349341 else realCaller
350342 let color = takeRight(value(assetInfo(assetId)).name, 1)
351343 if ((color == "U"))
352344 then throw("FUN: use another function to unstake Jackpot NFT")
353345 else {
354346 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
355347 result
356348 }
357349 }
358350
359351
360352 func unstakeJackpotInternal (asset,i,claimEgg) = {
361353 let assetId = fromBase58String(asset)
362354 let realCaller = toString(i.caller)
363355 let address = if (isProxyStakingSc(toString(i.caller)))
364356 then toString(i.originCaller)
365357 else realCaller
366358 let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
367359 if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
368360 then throw("jackpot only")
369361 else {
370362 let result = getUnstakeResult(address, assetId, color, i.caller, realCaller, claimEgg)
371363 result
372364 }
373365 }
374366
375367
376368 func getBool (key) = match getBoolean(this, key) {
377369 case b: Boolean =>
378370 b
379371 case _ =>
380372 false
381373 }
382374
383375
384376 func isTestEnv () = getBool("TESTENV")
385377
386378
387379 @Callable(i)
388380 func configureOracle (oracle) = if ((i.caller != this))
389381 then throw("FCO: admin only")
390382 else [StringEntry(staticKey_oracleAddress(), oracle)]
391383
392384
393385
394386 @Callable(i)
395387 func init () = if ((i.caller != this))
396388 then throw("FI: admin only")
397389 else [IntegerEntry("total_startHeight", height)]
398390
399391
400392
401393 @Callable(i)
402394 func buyPerch (colorI,refererAddress) = {
403395 let locked = isLocked()
404396 if ((locked == locked))
405397 then {
406398 let validPayment = if (if ((i.caller == getHuntAddress()))
407399 then true
408400 else (i.caller == getMetaraceAddress()))
409401 then nil
410402 else checkAdditionalPayment(i.payments[0])
411403 if ((validPayment == validPayment))
412404 then {
413405 let color = if ((colorI == "U"))
414406 then "B"
415407 else colorI
416408 if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
417409 then throw("you need to set color properly")
418410 else {
419411 let exactPrice = calculatePerchPrice(toString(i.caller))
420412 let leftToPay = if ((i.originCaller == i.caller))
421413 then {
422414 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
423415 if ((amountPaidByCoupons == amountPaidByCoupons))
424416 then (exactPrice - amountPaidByCoupons)
425417 else throw("Strict value is not equal to itself.")
426418 }
427419 else exactPrice
428420 let payment = if ((leftToPay != 0))
429421 then {
430422 let firstPayment = if ((size(i.payments) == 2))
431423 then value(i.payments[1])
432424 else value(i.payments[0])
433425 if ((firstPayment.assetId != getEggAssetId()))
434426 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
435427 else if ((firstPayment.amount != leftToPay))
436428 then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
437429 else {
438430 let refererRewardForPerch = fraction(leftToPay, RefererReward, 100)
439431 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
440432 if ((refCall == refCall))
441433 then {
442434 let toBurn = if (refCall)
443435 then (leftToPay - refererRewardForPerch)
444436 else leftToPay
445437 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
446438 if ((burnCall == burnCall))
447439 then leftToPay
448440 else throw("Strict value is not equal to itself.")
449441 }
450442 else throw("Strict value is not equal to itself.")
451443 }
452444 }
453445 else 0
454446 if ((payment == payment))
455447 then {
456448 let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
457449 let perchAmount = tryGetInteger(perchAmountKey)
458450 ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
459451 }
460452 else throw("Strict value is not equal to itself.")
461453 }
462454 }
463455 else throw("Strict value is not equal to itself.")
464456 }
465457 else throw("Strict value is not equal to itself.")
466458 }
467459
468460
469461
470462 @Callable(i)
471463 func addFreePerch (address,color) = {
472464 let locked = isLocked()
473465 if ((locked == locked))
474466 then if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
475467 then throw("you need to set color properly")
476468 else if (if (if ((i.caller != getRebirthAddress()))
477469 then (i.caller != getTurtleRebirthAddress())
478470 else false)
479471 then (i.caller != this)
480472 else false)
481473 then throw("rebirth and swop promo only")
482474 else {
483475 let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
484476 let perchAmount = tryGetInteger(perchAmountKey)
485477 $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "")
486478 }
487479 else throw("Strict value is not equal to itself.")
488480 }
489481
490482
491483
492484 @Callable(i)
493485 func stakeNFT () = {
494486 let locked = isLocked()
495487 if ((locked == locked))
496488 then {
497489 let validPayment = if (if ((i.caller == getHuntAddress()))
498490 then true
499491 else (i.caller == getMetaraceAddress()))
500492 then nil
501493 else checkAdditionalPayment(i.payments[1])
502494 if ((validPayment == validPayment))
503495 then {
504496 let pmt = value(i.payments[0])
505497 let assetId = value(value(i.payments[0]).assetId)
506498 let realCaller = toString(i.caller)
507499 let address = if (isProxyStakingSc(toString(i.caller)))
508500 then toString(i.originCaller)
509501 else realCaller
510502 let color = takeRight(value(assetInfo(assetId)).name, 1)
511503 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
512504 if ((pmt.amount != 1))
513505 then throw("NFT is not attached")
514506 else if ((0 >= availablePerches))
515507 then throw(("no perches available for the color " + color))
516508 else {
517- let $t01672916802 = getAssetFarmingPower(assetId, address)
518- let assetGen = $t01672916802._1
519- let assetFarmingPower = $t01672916802._2
509+ let $t01660416677 = getAssetFarmingPower(assetId, address)
510+ let assetGen = $t01660416677._1
511+ let assetFarmingPower = $t01660416677._2
520512 ((getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) ++ validPayment)
521513 }
522514 }
523515 else throw("Strict value is not equal to itself.")
524516 }
525517 else throw("Strict value is not equal to itself.")
526518 }
527519
528520
529521
530522 @Callable(i)
531523 func stakeNFTWithoutPerch () = {
532524 let locked = isLocked()
533525 if ((locked == locked))
534526 then {
535527 let dappToCall = toString(i.caller)
536528 if (!(isProxyStakingSc(dappToCall)))
537529 then throw("FSNWP: Only trusted smart contracts can stake without a perch!")
538530 else {
539531 let pmt = value(i.payments[0])
540532 let assetId = value(value(i.payments[0]).assetId)
541533 let address = toString(i.originCaller)
542534 if ((pmt.amount != 1))
543535 then throw("NFT is not attached")
544536 else {
545- let $t01744017513 = getAssetFarmingPower(assetId, address)
546- let assetGen = $t01744017513._1
547- let assetFarmingPower = $t01744017513._2
537+ let $t01731517388 = getAssetFarmingPower(assetId, address)
538+ let assetGen = $t01731517388._1
539+ let assetFarmingPower = $t01731517388._2
548540 let asset = toBase58String(assetId)
549541 let realCaller = toString(i.caller)
550542 (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)])
551543 }
552544 }
553545 }
554546 else throw("Strict value is not equal to itself.")
555547 }
556548
557549
558550
559551 @Callable(i)
560552 func unstakeNFT (asset) = {
561553 let validPayment = if ((i.caller == getMetaraceAddress()))
562554 then nil
563555 else checkAdditionalPayment(i.payments[0])
564556 if ((validPayment == validPayment))
565557 then {
566558 let result = unstakeNFTInternal(asset, i, true)
567559 $Tuple2((result._1 ++ validPayment), result._2)
568560 }
569561 else throw("Strict value is not equal to itself.")
570562 }
571563
572564
573565
574566 @Callable(i)
575567 func unstakeNFTWithoutClaim (asset) = unstakeNFTInternal(asset, i, false)
576568
577569
578570
579571 @Callable(i)
580572 func stakeJackpot (color) = {
581573 let locked = isLocked()
582574 if ((locked == locked))
583575 then {
584576 let validPayment = if (if ((i.caller == getHuntAddress()))
585577 then true
586578 else (i.caller == getMetaraceAddress()))
587579 then nil
588580 else checkAdditionalPayment(i.payments[1])
589581 if ((validPayment == validPayment))
590582 then {
591583 let pmt = value(i.payments[0])
592584 let assetId = value(pmt.assetId)
593585 let realCaller = toString(i.caller)
594586 let address = if (isProxyStakingSc(toString(i.caller)))
595587 then toString(i.originCaller)
596588 else realCaller
597589 let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color))
598590 let assetIssuer = value(assetInfo(assetId)).issuer
599591 if ((pmt.amount != 1))
600592 then throw("NFT is not attached")
601593 else if (if ((assetIssuer == getIncubatorAddress()))
602594 then true
603595 else (assetIssuer == getBreederAddress()))
604596 then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U"))
605597 then throw("jackpot only")
606598 else if ((0 >= availablePerches))
607599 then throw(("FSJ: no perches available for the color " + color))
608600 else {
609601 let farmingPower = getAssetFarmingPower(assetId, address)
610602 ((getStakeResult(address, assetId, farmingPower._2, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) ++ validPayment)
611603 }
612604 else throw("asset is not valid")
613605 }
614606 else throw("Strict value is not equal to itself.")
615607 }
616608 else throw("Strict value is not equal to itself.")
617609 }
618610
619611
620612
621613 @Callable(i)
622614 func unstakeJackpot (asset) = {
623615 let validPayment = checkAdditionalPayment(i.payments[0])
624616 if ((validPayment == validPayment))
625617 then {
626618 let result = unstakeJackpotInternal(asset, i, true)
627619 $Tuple2((result._1 ++ validPayment), result._2)
628620 }
629621 else throw("Strict value is not equal to itself.")
630622 }
631623
632624
633625
634626 @Callable(i)
635627 func unstakeJackpotWithoutClaimEgg (asset) = unstakeJackpotInternal(asset, i, false)
636628
637629
638630
639631 @Callable(i)
640632 func claimReward (asset) = {
641633 let locked = isLocked()
642634 if ((locked == locked))
643635 then {
644636 let validPayment = if ((i.originCaller == getCfMasterAddress()))
645637 then nil
646638 else checkAdditionalPayment(i.payments[0])
647639 if ((validPayment == validPayment))
648640 then {
649641 let address = if ((i.originCaller == getCfMasterAddress()))
650642 then toString(i.caller)
651643 else toString(i.originCaller)
652644 let assetId = fromBase58String(asset)
653645 let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset)
654646 let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower)
655647 let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")))
656648 let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"))
657649 let reward = ((farmedAmount - withdrawnAmount) / (scale * 100))
658650 if ((0 >= reward))
659651 then throw("FCR: you have no EGGs to withdraw")
660652 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))
661653 }
662654 else throw("Strict value is not equal to itself.")
663655 }
664656 else throw("Strict value is not equal to itself.")
665657 }
666658
667659
668660 @Verifier(tx)
669661 func verify () = if (isTestEnv())
670662 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
671663 else {
672664 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
673665 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
674666 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
675667 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
676668 then 1
677669 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
678670 then 1
679671 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
680672 then 1
681673 else 0
682674 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
683675 then 1
684676 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
685677 then 1
686678 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
687679 then 1
688680 else 0
689681 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
690682 then 1
691683 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
692684 then 1
693685 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
694686 then 1
695687 else 0
696688 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
697689 match tx {
690+ case dtx: DataTransaction =>
691+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
698692 case _ =>
699693 (signaturesCount >= 2)
700694 }
701695 }
702696

github/deemru/w8io/3ef1775 
78.29 ms