tx · BTEUMWfctZ81YiwuiYhSQ2ibVNUWiSzWDFEUkg8myUJM

3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA:  -0.02400000 Waves

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

{ "type": 13, "id": "BTEUMWfctZ81YiwuiYhSQ2ibVNUWiSzWDFEUkg8myUJM", "fee": 2400000, "feeAssetId": null, "timestamp": 1710616710089, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "EG3FCTBuMFttjVSvyJFvMij4nJo9ni7hSYdqkpYRwXB55oRti74M4UzdeQrKpoCLbDLAKy54yximBymEqGEtHcp" ], "script": "base64:BgI3CAISAwoBCBIAEgQKAggIEgQKAggIEgASABIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCEUACnBlcmNoUHJpY2UJAGgCAGQAwIQ9AAVzY2FsZQCQTgAGc2NhbGUyAMCEPQEKaXNTaWNrRHVjawEGZHVja0lkCQCsAgIFBmR1Y2tJZAIFX3NpY2sBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAIXc3RhdGljX2luY3ViYXRvckFkZHJlc3MBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwACFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAhlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEZc3RhdGljS2V5X21ldGFSYWNlQWRkcmVzcwACFnN0YXRpY19tZXRhUmFjZUFkZHJlc3MBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwACGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwACHHN0YXRpY19wcm94eVN0YWtpbmdDb250cmFjdHMBFXN0YXRpY0tleV9tYWludGVuYW5jZQACEnN0YXRpY19tYWludGVuYW5jZQEZc3RhdGljS2V5X2NmTWFzdGVyQWRkcmVzcwACFnN0YXRpY19jZk1hc3RlckFkZHJlc3MBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgACEnN0YXRpY19kdWNrV3JhcHBlcgEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAAhJzdGF0aWNfYnVybkFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEVc3RhdGljS2V5X2h1bnRBZGRyZXNzAAISc3RhdGljX2h1bnRBZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARNnZXRJbmN1YmF0b3JBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAARFnZXRSZWJpcnRoQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwABF2dldFR1cnRsZVJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAERZ2V0QnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAARVnZXRSZWZDb250cmFjdEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEmdldE1ldGFyYWNlQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGXN0YXRpY0tleV9tZXRhUmFjZUFkZHJlc3MAARRnZXRBY2NCb29zdGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBG3N0YXRpY0tleV9hY2NCb29zdGVyQWRkcmVzcwABD2dldFByb3h5U3Rha2luZwAJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEfc3RhdGljS2V5X3Byb3h5U3Rha2luZ0NvbnRyYWN0cwABDmdldE1haW50ZW5hbmNlAAkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfbWFpbnRlbmFuY2UAARJnZXRDZk1hc3RlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARlzdGF0aWNLZXlfY2ZNYXN0ZXJBZGRyZXNzAAEQZ2V0RHVja1dyYXBwZXJTYwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9kdWNrV3JhcHBlcgABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAQ5nZXRIdW50QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9odW50QWRkcmVzcwAADVJlZmVyZXJSZXdhcmQABQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxGQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsARFnZXRSZXdhcmRQZXJCbG9jawAAAAEIaXNMb2NrZWQAAwkBAiE9AgkBDmdldE1haW50ZW5hbmNlAAIACQACAQkBDmdldE1haW50ZW5hbmNlAAAAAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHARV0cnlHZXRCb29sZWFuRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCbCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEOZ2V0QXNzZXRPcmlnaW4BCmdlbmVyYXRpb24DCQAAAgUKZ2VuZXJhdGlvbgIBRwkBE2dldEluY3ViYXRvckFkZHJlc3MACQERZ2V0QnJlZWRlckFkZHJlc3MAAQ5nZXRBc3NldFJhcml0eQIIZ2Vub3R5cGUKZ2VuZXJhdGlvbgQIcXVhbnRpdHkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQEOZ2V0QXNzZXRPcmlnaW4BBQpnZW5lcmF0aW9uCQCsAgIJAKwCAgIGc3RhdHNfBQhnZW5vdHlwZQIJX3F1YW50aXR5CQCsAgIJAKwCAgIGc3RhdHNfBQhnZW5vdHlwZQITX3F1YW50aXR5IG5vdCBmb3VuZAQFcG93ZXIJAGwGCQBpAgCQTgUIcXVhbnRpdHkABAAFAAEAAgUFRkxPT1IDCQBmAgUFcG93ZXIAAAUFcG93ZXIAAgEIYXNTdHJpbmcBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAUGc3RyaW5nCQACAQIhRkFTOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAh5GQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBCWFzQm9vbGVhbgEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EB2Jvb2xlYW4FByRtYXRjaDAFB2Jvb2xlYW4JAAIBAiJGQUI6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBCb29sZWFuARRnZXRBc3NldEZhcm1pbmdQb3dlcgIHYXNzZXRJZAdhZGRyZXNzAwMJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAYJAAACCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MABAlmYXJtQm9vc3QJAQVhc0ludAEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACGmNhbGN1bGF0ZUZhcm1pbmdQb3dlckJvb3N0CQDMCAIJANgEAQUHYXNzZXRJZAkAzAgCBQdhZGRyZXNzBQNuaWwFA25pbAMJAAACBQlmYXJtQm9vc3QFCWZhcm1Cb29zdAQJYXNzZXROYW1lCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUECWlzSmFja3BvdAkAAAIJALICAgkBBXZhbHVlAQUJYXNzZXROYW1lAAECAVUEB2Zhcm1HZW4DBQlpc0phY2twb3QCAAkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQlhc3NldE5hbWUFA25pbAUDbmlsAwkAAAIFB2Zhcm1HZW4FB2Zhcm1HZW4EBnJhcml0eQMFCWlzSmFja3BvdABkBApnZW5lcmF0aW9uCQCvAgIJALICAgUJYXNzZXROYW1lAAIAAQkBDmdldEFzc2V0UmFyaXR5AgUHZmFybUdlbgUKZ2VuZXJhdGlvbgQRdG90YWxGYXJtaW5nUG93ZXIJAGQCBQZyYXJpdHkJAGsDBQZyYXJpdHkFCWZhcm1Cb29zdABkCQCUCgIFB2Zhcm1HZW4FEXRvdGFsRmFybWluZ1Bvd2VyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQINbm90IHZhbGlkIE5GVAEdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXICB2FkZHJlc3MHYXNzZXRJZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQdhc3NldElkAg1fZmFybWluZ1Bvd2VyAQxjYWxjSW50ZXJlc3QDEHByZXZpb3VzSW50ZXJlc3QWcHJldmlvdXNJbnRlcmVzdEhlaWdodBF0b3RhbEZhcm1pbmdQb3dlcgkAZAIFEHByZXZpb3VzSW50ZXJlc3QJAGkCCQBoAgkAaAIFBXNjYWxlCQERZ2V0UmV3YXJkUGVyQmxvY2sACQBlAgUGaGVpZ2h0BRZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BRF0b3RhbEZhcm1pbmdQb3dlcgESZ2V0Q3VycmVudEludGVyZXN0AAMJAGYCCQENdHJ5R2V0SW50ZWdlcgECEnRvdGFsX2Zhcm1pbmdQb3dlcgAABBBwcmV2aW91c0ludGVyZXN0CQENdHJ5R2V0SW50ZWdlcgECF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0BBZwcmV2aW91c0ludGVyZXN0SGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgECHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BBF0b3RhbEZhcm1pbmdQb3dlcgkBDXRyeUdldEludGVnZXIBAhJ0b3RhbF9mYXJtaW5nUG93ZXIJAQxjYWxjSW50ZXJlc3QDBRBwcmV2aW91c0ludGVyZXN0BRZwcmV2aW91c0ludGVyZXN0SGVpZ2h0BRF0b3RhbEZhcm1pbmdQb3dlcgMJAQIhPQIJAQ10cnlHZXRJbnRlZ2VyAQIRdG90YWxfc3RhcnRIZWlnaHQAAAkBDXRyeUdldEludGVnZXIBAhd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkAAgECHGZhcm1pbmcgaXMgbm90IGxhdW5jaGVkLCB5ZXQBFGNhbGNBc3NldFJld2FyZERlbHRhAwdhZGRyZXNzB2Fzc2V0SWQRYXNzZXRGYXJtaW5nUG93ZXIEFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUHYXNzZXRJZAISX2xhc3RDaGVja0ludGVyZXN0BA9jdXJyZW50SW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQBoAgURYXNzZXRGYXJtaW5nUG93ZXIJAGUCBQ9jdXJyZW50SW50ZXJlc3QFFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QBFGFkZEFzc2V0SWRUb0dlbkVudHJ5Agdhc3NldElkCGFzc2V0R2VuBAxjdXJyZW50VmFsdWUJAQx0cnlHZXRTdHJpbmcBCQCsAgIJAKwCAgIHYXNzZXRzXwUIYXNzZXRHZW4CB19sb2NrZWQDCQAAAgUMY3VycmVudFZhbHVlAgAFB2Fzc2V0SWQJAKwCAgkArAICBQxjdXJyZW50VmFsdWUCASwFB2Fzc2V0SWQBDmdldFN0YWtlUmVzdWx0BAdhZGRyZXNzB2Fzc2V0SWQRYXNzZXRGYXJtaW5nUG93ZXIIdW5zdGFrZXIEBWFzc2V0CQDYBAEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQICEnRvdGFsX2Zhcm1pbmdQb3dlcgkAZAIJAQ10cnlHZXRJbnRlZ2VyAQISdG90YWxfZmFybWluZ1Bvd2VyBRFhc3NldEZhcm1pbmdQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgIXdG90YWxfbGFzdENoZWNrSW50ZXJlc3QJARJnZXRDdXJyZW50SW50ZXJlc3QACQDMCAIJAQxJbnRlZ2VyRW50cnkCAh10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FBWFzc2V0AgZfb3duZXIFB2FkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0Ag1fZmFybWluZ1Bvd2VyBRFhc3NldEZhcm1pbmdQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEl9sYXN0Q2hlY2tJbnRlcmVzdAkBEmdldEN1cnJlbnRJbnRlcmVzdAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCCV91bnN0YWtlcgUIdW5zdGFrZXIFA25pbAEQZ2V0VW5zdGFrZVJlc3VsdAYHYWRkcmVzcwdhc3NldElkBWNvbG9yBmNhbGxlcgpyZWFsQ2FsbGVyCWNsYWltRWdncwQGbG9ja2VkCQEIaXNMb2NrZWQAAwkAAAIFBmxvY2tlZAUGbG9ja2VkBAVhc3NldAkA2AQBBQdhc3NldElkBAh1bnN0YWtlcgkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AglfdW5zdGFrZXIDAwkBAiE9AgUIdW5zdGFrZXICAAkBAiE9AgUIdW5zdGFrZXIFCnJlYWxDYWxsZXIHCQACAQJXRlVOOiBJdCBzZWVtcyBkdWNrIHdhcyBzdGFrZWQgdGhyb3VoIGEgZGFwcCwgbm90IGRpcmVjdGx5LCBwbGVhc2UgdW5zdGFrZSB0aHJvdWdoIGRhcHAhBBFhc3NldEZhcm1pbmdQb3dlcgkBHWdldExhc3RLbm93bkFzc2V0RmFybWluZ1Bvd2VyAgUHYWRkcmVzcwUFYXNzZXQDCQEBIQEJAGYCBRFhc3NldEZhcm1pbmdQb3dlcgAACQACAQIqRkdVOiBBc3NldCBmYXJtaW5nIHBvd2VyIG5vdCBiaWdnZXIgdGhlbiAwBBBhc3NldFJld2FyZERlbHRhCQEUY2FsY0Fzc2V0UmV3YXJkRGVsdGEDBQdhZGRyZXNzBQVhc3NldAURYXNzZXRGYXJtaW5nUG93ZXIEDGZhcm1lZEFtb3VudAkAZAIFEGFzc2V0UmV3YXJkRGVsdGEJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQED3dpdGhkcmF3bkFtb3VudAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAQGcmV3YXJkCQBpAgkAZQIFDGZhcm1lZEFtb3VudAUPd2l0aGRyYXduQW1vdW50CQBoAgUFc2NhbGUAZAQOaXNXaXRob3V0UGVyY2gJAQ10cnlHZXRCb29sZWFuAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCDl93aXRob3V0X3BlcmNoBBNyZXdhcmRBZnRlclNpY2tOZXNzBQZyZXdhcmQEDWFwcGVuZFBlcmNoZXMDBQ5pc1dpdGhvdXRQZXJjaAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIOX3dpdGhvdXRfcGVyY2gFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yAAEFA25pbAQGc2VuZFR4AwUJY2xhaW1FZ2dzCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBoAgUTcmV3YXJkQWZ0ZXJTaWNrTmVzcwDAhD0JAQ1nZXRFZ2dBc3NldElkAAUDbmlsCQBoAgUTcmV3YXJkQWZ0ZXJTaWNrTmVzcwDAhD0JAJQKAgUDbmlsAAAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgISdG90YWxfZmFybWluZ1Bvd2VyCQBlAgkBDXRyeUdldEludGVnZXIBAhJ0b3RhbF9mYXJtaW5nUG93ZXIFEWFzc2V0RmFybWluZ1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBEmdldEN1cnJlbnRJbnRlcmVzdAAJAMwIAgkBDEludGVnZXJFbnRyeQICHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBmFzc2V0XwUFYXNzZXQCBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIJX3Vuc3Rha2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAINX2Zhcm1pbmdQb3dlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAISX2xhc3RDaGVja0ludGVyZXN0CQESZ2V0Q3VycmVudEludGVyZXN0AAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCEF93aXRoZHJhd25BbW91bnQJAGQCBQ93aXRoZHJhd25BbW91bnQJAGgCBRNyZXdhcmRBZnRlclNpY2tOZXNzBQZzY2FsZTIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhZfbGFzdENoZWNrRmFybWVkQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAUQYXNzZXRSZXdhcmREZWx0YQUDbmlsBQ1hcHBlbmRQZXJjaGVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgABBQdhc3NldElkBQNuaWwIBQZzZW5kVHgCXzEIBQZzZW5kVHgCXzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2NhbGN1bGF0ZVBlcmNoUHJpY2UBB2FkZHJlc3MEEWhhc0FydGVmYWN0U3Rha2VkCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEUZ2V0QWNjQm9vc3RlckFkZHJlc3MACQCsAgIJAKwCAgILQVJULVhNSVNUTF8FB2FkZHJlc3MCBl9vd25lcgMJAAACBRFoYXNBcnRlZmFjdFN0YWtlZAIABQpwZXJjaFByaWNlCQBoAgkAaQIFCnBlcmNoUHJpY2UACgAJARBpc1Byb3h5U3Rha2luZ1NjAQdhZGRyZXNzBBBhbGxvd2VkQ29udHJhY3RzCQEPZ2V0UHJveHlTdGFraW5nAAQUYWxsb3dlZENvbnRyYWN0c0xpc3QJALUJAgUQYWxsb3dlZENvbnRyYWN0cwIBOwkBAiE9AgkAzwgCBRRhbGxvd2VkQ29udHJhY3RzTGlzdAUHYWRkcmVzcwUEdW5pdAESdW5zdGFrZU5GVEludGVybmFsAwVhc3NldAFpCGNsYWltRWdnBAdhc3NldElkCQDZBAEFBWFzc2V0BApyZWFsQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQHYWRkcmVzcwMJARBpc1Byb3h5U3Rha2luZ1NjAQkApQgBCAUBaQZjYWxsZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBQpyZWFsQ2FsbGVyBAVjb2xvcgkAsgICCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQMJAAACBQVjb2xvcgIBVQkAAgECMEZVTjogdXNlIGFub3RoZXIgZnVuY3Rpb24gdG8gdW5zdGFrZSBKYWNrcG90IE5GVAQGcmVzdWx0CQEQZ2V0VW5zdGFrZVJlc3VsdAYFB2FkZHJlc3MFB2Fzc2V0SWQFBWNvbG9yCAUBaQZjYWxsZXIFCnJlYWxDYWxsZXIFCGNsYWltRWdnBQZyZXN1bHQBFnVuc3Rha2VKYWNrcG90SW50ZXJuYWwDBWFzc2V0AWkIY2xhaW1FZ2cEB2Fzc2V0SWQJANkEAQUFYXNzZXQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEBWNvbG9yCQEMdHJ5R2V0U3RyaW5nAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCC19wZXJjaENvbG9yAwkBAiE9AgkAsgICCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQIBVQkAAgECDGphY2twb3Qgb25seQQGcmVzdWx0CQEQZ2V0VW5zdGFrZVJlc3VsdAYFB2FkZHJlc3MFB2Fzc2V0SWQFBWNvbG9yCAUBaQZjYWxsZXIFCnJlYWxDYWxsZXIFCGNsYWltRWdnBQZyZXN1bHQBB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBCWlzVGVzdEVudgAJAQdnZXRCb29sAQIHVEVTVEVOVgwBaQEPY29uZmlndXJlT3JhY2xlAQZvcmFjbGUDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg9GQ086IGFkbWluIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAUGb3JhY2xlBQNuaWwBaQEEaW5pdAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5GSTogYWRtaW4gb25seQkAzAgCCQEMSW50ZWdlckVudHJ5AgIRdG90YWxfc3RhcnRIZWlnaHQFBmhlaWdodAUDbmlsAWkBCGJ1eVBlcmNoAgZjb2xvckkOcmVmZXJlckFkZHJlc3MEBmxvY2tlZAkBCGlzTG9ja2VkAAMJAAACBQZsb2NrZWQFBmxvY2tlZAQMdmFsaWRQYXltZW50AwMJAAACCAUBaQZjYWxsZXIJAQ5nZXRIdW50QWRkcmVzcwAGCQAAAggFAWkGY2FsbGVyCQESZ2V0TWV0YXJhY2VBZGRyZXNzAAUDbmlsCQEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEJAJEDAggFAWkIcGF5bWVudHMAAAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQFY29sb3IDCQAAAgUGY29sb3JJAgFVAgFCBQZjb2xvckkDCQBmAgAACQEFdmFsdWUBCQDPCAIJAMwIAgIBQgkAzAgCAgFSCQDMCAICAUcJAMwIAgIBWQUDbmlsBQVjb2xvcgkAAgECHnlvdSBuZWVkIHRvIHNldCBjb2xvciBwcm9wZXJseQQKZXhhY3RQcmljZQkBE2NhbGN1bGF0ZVBlcmNoUHJpY2UBCQClCAEIBQFpBmNhbGxlcgQJbGVmdFRvUGF5AwkAAAIIBQFpDG9yaWdpbkNhbGxlcggFAWkGY2FsbGVyBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUKZXhhY3RQcmljZQUDbmlsBQNuaWwDCQAAAgUTYW1vdW50UGFpZEJ5Q291cG9ucwUTYW1vdW50UGFpZEJ5Q291cG9ucwkAZQIFCmV4YWN0UHJpY2UFE2Ftb3VudFBhaWRCeUNvdXBvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FCmV4YWN0UHJpY2UEB3BheW1lbnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQMZmlyc3RQYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAgkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAkAAgEJAKwCAgJBRkJQOiBZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJANgEAQkBDWdldEVnZ0Fzc2V0SWQAAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQFCWxlZnRUb1BheQkAAgEJAKwCAgkArAICCQCsAgICSEZCUDogVG8gYnV5IGEgcGVyY2ggeW91IGN1cnJlbnRseSBuZWVkIHRoZSBmb2xsb3dpbmcgYW1vdW50IG9mIEVHR2xldHM6IAkApAMBBQlsZWZ0VG9QYXkCASAJAKUIAQgFAWkGY2FsbGVyBBVyZWZlcmVyUmV3YXJkRm9yUGVyY2gJAGsDBQlsZWZ0VG9QYXkFDVJlZmVyZXJSZXdhcmQAZAQHcmVmQ2FsbAkBCWFzQm9vbGVhbgEJAPwHBAkBFWdldFJlZkNvbnRyYWN0QWRkcmVzcwACCnJlZlBheW1lbnQJAMwIAgUOcmVmZXJlckFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFA25pbAMJAAACBQdyZWZDYWxsBQdyZWZDYWxsBAZ0b0J1cm4DBQdyZWZDYWxsCQBlAgUJbGVmdFRvUGF5BRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFCWxlZnRUb1BheQQIYnVybkNhbGwJAPwHBAkBDmdldEJ1cm5BZGRyZXNzAAIUYnVybkF0dGFjaGVkUGF5bWVudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABQZ0b0J1cm4FA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwFCWxlZnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFB3BheW1lbnQFB3BheW1lbnQEDnBlcmNoQW1vdW50S2V5CQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwkApQgBCAUBaQZjYWxsZXICEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC3BlcmNoQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEFDnBlcmNoQW1vdW50S2V5CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnBlcmNoQW1vdW50S2V5CQBkAgULcGVyY2hBbW91bnQAAQUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMYWRkRnJlZVBlcmNoAgdhZGRyZXNzBWNvbG9yBAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQDCQBmAgAACQEFdmFsdWUBCQDPCAIJAMwIAgIBQgkAzAgCAgFSCQDMCAICAUcJAMwIAgIBWQUDbmlsBQVjb2xvcgkAAgECHnlvdSBuZWVkIHRvIHNldCBjb2xvciBwcm9wZXJseQMDAwkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MACQECIT0CCAUBaQZjYWxsZXIJARdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAHCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMHCQACAQIbcmViaXJ0aCBhbmQgc3dvcCBwcm9tbyBvbmx5BA5wZXJjaEFtb3VudEtleQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC3BlcmNoQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEFDnBlcmNoQW1vdW50S2V5CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnBlcmNoQW1vdW50S2V5CQBkAgULcGVyY2hBbW91bnQAAQUDbmlsAgAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc3Rha2VORlQABAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMDCQAAAggFAWkGY2FsbGVyCQEOZ2V0SHVudEFkZHJlc3MABgkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEBWNvbG9yCQCyAgIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQABBBBhdmFpbGFibGVQZXJjaGVzCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQDCQBnAgAABRBhdmFpbGFibGVQZXJjaGVzCQACAQkArAICAiNubyBwZXJjaGVzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbG9yIAUFY29sb3IEDSR0MDE2NjA0MTY2NzcJARRnZXRBc3NldEZhcm1pbmdQb3dlcgIFB2Fzc2V0SWQFB2FkZHJlc3MECGFzc2V0R2VuCAUNJHQwMTY2MDQxNjY3NwJfMQQRYXNzZXRGYXJtaW5nUG93ZXIIBQ0kdDAxNjYwNDE2Njc3Al8yCQDOCAIJAM4IAgkBDmdldFN0YWtlUmVzdWx0BAUHYWRkcmVzcwUHYXNzZXRJZAURYXNzZXRGYXJtaW5nUG93ZXIFCnJlYWxDYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAhJfcGVyY2hlc0F2YWlsYWJsZV8FBWNvbG9yCQBlAgUQYXZhaWxhYmxlUGVyY2hlcwABBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRzdGFrZU5GVFdpdGhvdXRQZXJjaAAEBmxvY2tlZAkBCGlzTG9ja2VkAAMJAAACBQZsb2NrZWQFBmxvY2tlZAQKZGFwcFRvQ2FsbAkApQgBCAUBaQZjYWxsZXIDCQEBIQEJARBpc1Byb3h5U3Rha2luZ1NjAQUKZGFwcFRvQ2FsbAkAAgECPkZTTldQOiBPbmx5IHRydXN0ZWQgc21hcnQgY29udHJhY3RzIGNhbiBzdGFrZSB3aXRob3V0IGEgcGVyY2ghBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAdhZGRyZXNzCQClCAEIBQFpDG9yaWdpbkNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBA0kdDAxNzMxNTE3Mzg4CQEUZ2V0QXNzZXRGYXJtaW5nUG93ZXICBQdhc3NldElkBQdhZGRyZXNzBAhhc3NldEdlbggFDSR0MDE3MzE1MTczODgCXzEEEWFzc2V0RmFybWluZ1Bvd2VyCAUNJHQwMTczMTUxNzM4OAJfMgQFYXNzZXQJANgEAQUHYXNzZXRJZAQKcmVhbENhbGxlcgkApQgBCAUBaQZjYWxsZXIJAM4IAgkBDmdldFN0YWtlUmVzdWx0BAUHYWRkcmVzcwUHYXNzZXRJZAURYXNzZXRGYXJtaW5nUG93ZXIFCnJlYWxDYWxsZXIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0Ag5fd2l0aG91dF9wZXJjaAYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp1bnN0YWtlTkZUAQVhc3NldAQMdmFsaWRQYXltZW50AwkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEBnJlc3VsdAkBEnVuc3Rha2VORlRJbnRlcm5hbAMFBWFzc2V0BQFpBgkAlAoCCQDOCAIIBQZyZXN1bHQCXzEFDHZhbGlkUGF5bWVudAgFBnJlc3VsdAJfMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZ1bnN0YWtlTkZUV2l0aG91dENsYWltAQVhc3NldAkBEnVuc3Rha2VORlRJbnRlcm5hbAMFBWFzc2V0BQFpBwFpAQxzdGFrZUphY2twb3QBBWNvbG9yBAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMDCQAAAggFAWkGY2FsbGVyCQEOZ2V0SHVudEFkZHJlc3MABgkAAAIIBQFpBmNhbGxlcgkBEmdldE1ldGFyYWNlQWRkcmVzcwAFA25pbAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQECnJlYWxDYWxsZXIJAKUIAQgFAWkGY2FsbGVyBAdhZGRyZXNzAwkBEGlzUHJveHlTdGFraW5nU2MBCQClCAEIBQFpBmNhbGxlcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIFCnJlYWxDYWxsZXIEEGF2YWlsYWJsZVBlcmNoZXMJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCEl9wZXJjaGVzQXZhaWxhYmxlXwUFY29sb3IEC2Fzc2V0SXNzdWVyCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBmlzc3VlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkAwMJAAACBQthc3NldElzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MABgkAAAIFC2Fzc2V0SXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MAAwkBAiE9AgkAsgICCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUAAQIBVQkAAgECDGphY2twb3Qgb25seQMJAGcCAAAFEGF2YWlsYWJsZVBlcmNoZXMJAAIBCQCsAgICKEZTSjogbm8gcGVyY2hlcyBhdmFpbGFibGUgZm9yIHRoZSBjb2xvciAFBWNvbG9yBAxmYXJtaW5nUG93ZXIJARRnZXRBc3NldEZhcm1pbmdQb3dlcgIFB2Fzc2V0SWQFB2FkZHJlc3MJAM4IAgkAzggCCQEOZ2V0U3Rha2VSZXN1bHQEBQdhZGRyZXNzBQdhc3NldElkCAUMZmFybWluZ1Bvd2VyAl8yBQpyZWFsQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwISX3BlcmNoZXNBdmFpbGFibGVfBQVjb2xvcgkAZQIFEGF2YWlsYWJsZVBlcmNoZXMAAQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfCQDYBAEFB2Fzc2V0SWQCC19wZXJjaENvbG9yBQVjb2xvcgUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAhJhc3NldCBpcyBub3QgdmFsaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOdW5zdGFrZUphY2twb3QBBWFzc2V0BAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAZyZXN1bHQJARZ1bnN0YWtlSmFja3BvdEludGVybmFsAwUFYXNzZXQFAWkGCQCUCgIJAM4IAggFBnJlc3VsdAJfMQUMdmFsaWRQYXltZW50CAUGcmVzdWx0Al8yCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXVuc3Rha2VKYWNrcG90V2l0aG91dENsYWltRWdnAQVhc3NldAkBFnVuc3Rha2VKYWNrcG90SW50ZXJuYWwDBQVhc3NldAUBaQcBaQELY2xhaW1SZXdhcmQBBWFzc2V0BAZsb2NrZWQJAQhpc0xvY2tlZAADCQAAAgUGbG9ja2VkBQZsb2NrZWQEDHZhbGlkUGF5bWVudAMJAAACCAUBaQxvcmlnaW5DYWxsZXIJARJnZXRDZk1hc3RlckFkZHJlc3MABQNuaWwJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAdhZGRyZXNzAwkAAAIIBQFpDG9yaWdpbkNhbGxlcgkBEmdldENmTWFzdGVyQWRkcmVzcwAJAKUIAQgFAWkGY2FsbGVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQHYXNzZXRJZAkA2QQBBQVhc3NldAQRYXNzZXRGYXJtaW5nUG93ZXIJAR1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgIFB2FkZHJlc3MFBWFzc2V0BBBhc3NldFJld2FyZERlbHRhCQEUY2FsY0Fzc2V0UmV3YXJkRGVsdGEDBQdhZGRyZXNzBQVhc3NldAURYXNzZXRGYXJtaW5nUG93ZXIEDGZhcm1lZEFtb3VudAkAZAIFEGFzc2V0UmV3YXJkRGVsdGEJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIHX2Fzc2V0XwUFYXNzZXQCFl9sYXN0Q2hlY2tGYXJtZWRBbW91bnQED3dpdGhkcmF3bkFtb3VudAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAQGcmV3YXJkCQBpAgkAZQIFDGZhcm1lZEFtb3VudAUPd2l0aGRyYXduQW1vdW50CQBoAgUFc2NhbGUAZAMJAGcCAAAFBnJld2FyZAkAAgECIUZDUjogeW91IGhhdmUgbm8gRUdHcyB0byB3aXRoZHJhdwkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCB19hc3NldF8FBWFzc2V0AhBfd2l0aGRyYXduQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAgdfYXNzZXRfBQVhc3NldAIQX3dpdGhkcmF3bkFtb3VudAkAaAIFBnJld2FyZAUGc2NhbGUyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQdhZGRyZXNzCQBoAgUGcmV3YXJkAMCEPQkBDWdldEVnZ0Fzc2V0SWQABQNuaWwFDHZhbGlkUGF5bWVudAkAaAIFBnJld2FyZADAhD0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAg9EYXRhVHJhbnNhY3Rpb24EA2R0eAUHJG1hdGNoMAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkAZwIFD3NpZ25hdHVyZXNDb3VudAACSCErKg==", "height": 4086826, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 13x6zJHZgeSPRUKPxZHUgcUK1fBLrxgsZxsr3oc3FB3b Next: Dn3SHDyrDumRV6GN8n6HZw1J5Bd2NWrxTpMwXiTj9yJX 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
147147 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"))
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 {
509509 let $t01660416677 = getAssetFarmingPower(assetId, address)
510510 let assetGen = $t01660416677._1
511511 let assetFarmingPower = $t01660416677._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 {
537537 let $t01731517388 = getAssetFarmingPower(assetId, address)
538538 let assetGen = $t01731517388._1
539539 let assetFarmingPower = $t01731517388._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/6500d08 
79.69 ms