tx · 3k5mcbxkMgBLAmJ8ADmseSKeoGV3LiHCy1rCNr7wvxEr

3MrfG1u5zL5XrFLjBMK8wsbDjs5WPhZoEV3:  -0.03100000 Waves

2024.10.03 13:02 [3310523] smart account 3MrfG1u5zL5XrFLjBMK8wsbDjs5WPhZoEV3 > SELF 0.00000000 Waves

{ "type": 13, "id": "3k5mcbxkMgBLAmJ8ADmseSKeoGV3LiHCy1rCNr7wvxEr", "fee": 3100000, "feeAssetId": null, "timestamp": 1727949785126, "version": 2, "chainId": 84, "sender": "3MrfG1u5zL5XrFLjBMK8wsbDjs5WPhZoEV3", "senderPublicKey": "939Lb5B2Z7CNzPKMFvQni9fWhmhqWdhHR5sm54NHaHPe", "proofs": [ "2LPWzQDW1NuSPUzVbF1Z3ncxP6ULX1jfFRVF7cduqEzPYf1GKu57r31cBe9xsGeMTQomRp63V1iLCx4NeidYvac1" ], "script": "base64:BgJECAISAwoBCBIICgYCAQEBCAESAwoBCBIDCgEIEgUKAwIIARIDCgEIEgMKAQgSBAoCCAgSBQoDCAEBEgMKAQgSBAoCCAhOABBkZWxheUZvckhhdGNoaW5nAAIAD0hhdGNoaW5nU3RhcnRlZAIQQlJFRURJTkdfU1RBUlRFRAAQSGF0Y2hpbmdGaW5pc2hlZAIRQlJFRURJTkdfRklOSVNIRUQBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABFXRyeUdldEludGVnZXJFeHRlcm5hbAIHYWRkcmVzcwNrZXkEByRtYXRjaDAJAJoIAgUHYWRkcmVzcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5ARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARpzdGF0aWNLZXlfaW5jdWJhdG9yQWRkcmVzcwACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARhzdGF0aWNLZXlfcmViaXJ0aEFkZHJlc3MAAhVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAhNzdGF0aWNfaXRlbXNBZGRyZXNzARRzdGF0aWNLZXlfZWdnQXNzZXRJZAACEXN0YXRpY19lZ2dBc3NldElkASFzdGF0aWNLZXlfYmFieUR1Y2tCcmVlZGluZ0FkZHJlc3MAAh5zdGF0aWNfYmFieUR1Y2tCcmVlZGluZ0FkZHJlc3MBF3N0YXRpY0tleV9kdWNrbGluZ1ByaWNlAAIUc3RhdGljX2R1Y2tsaW5nUHJpY2UBGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwACFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAISc3RhdGljX2J1cm5BZGRyZXNzARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAIZc3RhdGljX3JlZkNvbnRyYWN0QWRkcmVzcwESc3RhdGljS2V5X2V4dHJhRmVlAAIPc3RhdGljX2V4dHJhRmVlARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgACFHN0YXRpY19mZWVBZ2dyZWdhdG9yARZzdGF0aWNLZXlfc3BpY2VBc3NldElkAAITc3RhdGljX3NwaWNlQXNzZXRJZAEec3RhdGljS2V5X3R1cnRsZVN0YWtpbmdBZGRyZXNzAAIbc3RhdGljX3R1cnRsZVN0YWtpbmdBZGRyZXNzAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABE2dldEluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARpzdGF0aWNLZXlfaW5jdWJhdG9yQWRkcmVzcwABEWdldFJlYmlydGhBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X3JlYmlydGhBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAARpnZXRCYWJ5RHVja0JyZWVkaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBIXN0YXRpY0tleV9iYWJ5RHVja0JyZWVkaW5nQWRkcmVzcwABEGdldER1Y2tsaW5nUHJpY2UACQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZHVja2xpbmdQcmljZQABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEOZ2V0QnVybkFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfYnVybkFkZHJlc3MAARVnZXRSZWZDb250cmFjdEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfcmVmQ29udHJhY3RBZGRyZXNzAAEQZ2V0RmVlQWdncmVnYXRvcgAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAEPZ2V0U3BpY2VBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAARdnZXRUdXJ0bGVTdGFraW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHnN0YXRpY0tleV90dXJ0bGVTdGFraW5nQWRkcmVzcwABFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBB3BheW1lbnQDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECGUJDQVA6IFBsZWFzZSBhdHRhY2ggd2F2ZXMECWZlZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgkBCWdldE9yYWNsZQAJARJzdGF0aWNLZXlfZXh0cmFGZWUAAwkBAiE9AggFB3BheW1lbnQGYW1vdW50BQlmZWVBbW91bnQJAAIBCQCsAgIJAKwCAgIcQkNBUDogUGxlYXNlIGF0dGFjaCBleGFjdGx5IAkApAMBBQlmZWVBbW91bnQCEyBhbW91bnQgb2Ygd2F2ZWxldHMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEGdldEZlZUFnZ3JlZ2F0b3IABQlmZWVBbW91bnQFBHVuaXQFA25pbAANTWF4R2VuZXJhdGlvbgAHAAtHZW5lcmF0aW9ucwkAzAgCAgFHCQDMCAICAUgJAMwIAgIBSQkAzAgCAgFLCQDMCAICAUwJAMwIAgIBTQkAzAgCAgFOCQDMCAICAU8FA25pbAETZ2V0UHJvY2Vzc1N0YXR1c0tleQIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfCQDYBAEFBHR4SWQCB19zdGF0dXMBDmdldER1Y2tsaW5nS2V5AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAIJX2R1Y2tsaW5nARlnZXRQcm9jZXNzRmluaXNoSGVpZ2h0S2V5AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAIDX2ZoARBnZXREdWNrUGFyZW50S2V5AgR0eElkCXBhcmVudE51bQkArAICCQCsAgIJAKwCAgIHaW5pdHR4XwkA2AQBBQR0eElkAgdfcGFyZW50CQCkAwEFCXBhcmVudE51bQEMZ2V0RHVja0lkS2V5AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8JANgEAQUEdHhJZAIDX2RpAQ9nZXREdWNrU3RhdHNLZXkBCWdlblN0cmluZwkArAICCQCsAgICBnN0YXRzXwUJZ2VuU3RyaW5nAgdfYW1vdW50AQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAKAIAQUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQ10cnlHZXRJbnRlZ2VyAQNrZXkEA3ZhbAQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAAFA3ZhbAETZGV0ZXJtaW5lR2VuZXJhdGlvbgICZzECZzIEBmdJbmRleAkAlgMBCQDMCAIJAQV2YWx1ZQEJAM8IAgULR2VuZXJhdGlvbnMFAmcxCQDMCAIJAQV2YWx1ZQEJAM8IAgULR2VuZXJhdGlvbnMFAmcyBQNuaWwJAJEDAgULR2VuZXJhdGlvbnMJAGQCBQZnSW5kZXgAAQEPZ2V0UmFuZG9tTnVtYmVyBAh2YXJpYW50cwR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAABBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBDGdldFJhbmRvbUdlbgkEZ2VuMQRnZW4yBHN0ZXAEdHhJZBRoYXRjaGluZ0ZpbmlzaEhlaWdodA5nZW5lRnJvbVBhcmVudAtnZW5lUG9zdGlvbg5zcGVjaWZpcXVlR2VuZRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uAwMJAQIhPQIFDmdlbmVGcm9tUGFyZW50AAAJAAACBQtnZW5lUG9zdGlvbgUEc3RlcAcDCQAAAgUOZ2VuZUZyb21QYXJlbnQAAQUEZ2VuMQMJAAACBQ5nZW5lRnJvbVBhcmVudAACBQRnZW4yCQACAQIgUGFyZW50IGVpdGhlciBuZWVkcyB0byBiZSAxIG9yIDIDAwkBAiE9AgUOc3BlY2lmaXF1ZUdlbmUCAAkAAAIFFnNwZWNpZmlxdWVHZW5lUG9zaXRpb24FBHN0ZXAHBQ5zcGVjaWZpcXVlR2VuZQQJcmFuZG9tTnVtCQEPZ2V0UmFuZG9tTnVtYmVyBAACBQR0eElkBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAUEc3RlcAQDZ2VuAwkAAAIFCXJhbmRvbU51bQAABQRnZW4xBQRnZW4yBQNnZW4BFWNoZWNrQXNzZXRJbkluY3ViYXRvcgEHYXNzZXRJZAQGcmVzdWx0BAckbWF0Y2gwCQCdCAIJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAGBwQHcmVzdWx0MgQHJG1hdGNoMAkAnQgCBQR0aGlzBQdhc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYwUHJG1hdGNoMAYHAwUGcmVzdWx0BgUHcmVzdWx0MgEMY2FuQmVCcmVlZGVkAghhc3NldDFJZAhhc3NldDJJZAQJYXNzZXQxR2VuCQC1CQIICQEFdmFsdWUBCQDsBwEFCGFzc2V0MUlkBG5hbWUCAAQJYXNzZXQyR2VuCQC1CQIICQEFdmFsdWUBCQDsBwEFCGFzc2V0MklkBG5hbWUCAAMJAGcCCQEFdmFsdWUBCQDPCAIFC0dlbmVyYXRpb25zCQCRAwIFCWFzc2V0MUdlbgAOBQ1NYXhHZW5lcmF0aW9uCQCsAgIJAKwCAgIpeW91IGNhbiBvbmx5IGJyZWVkIGR1Y2tzIHdpdGggZ2VuZXJhdGlvbiAJAJEDAgULR2VuZXJhdGlvbnMFDU1heEdlbmVyYXRpb24CCiBhbmQgbG93ZXIDCQBnAgkBBXZhbHVlAQkAzwgCBQtHZW5lcmF0aW9ucwkAkQMCBQlhc3NldDJHZW4ADgUNTWF4R2VuZXJhdGlvbgkArAICCQCsAgICKXlvdSBjYW4gb25seSBicmVlZCBkdWNrcyB3aXRoIGdlbmVyYXRpb24gCQCRAwIFC0dlbmVyYXRpb25zBQ1NYXhHZW5lcmF0aW9uAgogYW5kIGxvd2VyAgR0cnVlAQlpc1N5bWJvbEECC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAUEJAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xCAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFCCQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sQwILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBQwkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAAQlpc1N5bWJvbEQCC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAUQJAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xFAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFFCQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sRgILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBRgkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAAQlpc1N5bWJvbEcCC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAUcJAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xIAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFICQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sSQILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBSQkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAAQlpc1N5bWJvbEsCC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAUsJAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xMAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFMCQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sTQILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBTQkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAAQlpc1N5bWJvbE4CC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAU4JAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xPAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFPCQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sUAILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBUAkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAAQlpc1N5bWJvbFMCC2FjY3VtdWxhdGVkA3N5bQMJAAACBQNzeW0CAVMJAGQCBQthY2N1bXVsYXRlZAABCQBkAgULYWNjdW11bGF0ZWQAAAEJaXNTeW1ib2xUAgthY2N1bXVsYXRlZANzeW0DCQAAAgUDc3ltAgFUCQBkAgULYWNjdW11bGF0ZWQAAQkAZAIFC2FjY3VtdWxhdGVkAAABCWlzU3ltYm9sWgILYWNjdW11bGF0ZWQDc3ltAwkAAAIFA3N5bQIBWgkAZAIFC2FjY3VtdWxhdGVkAAEJAGQCBQthY2N1bXVsYXRlZAAAARBnZXRBbW91bnRPckNsZWFyAQZhbW91bnQDCQEIY29udGFpbnMCBQZhbW91bnQCATACAAUGYW1vdW50AQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQlhc0Jvb2xlYW4BBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAdib29sZWFuBQckbWF0Y2gwBQdib29sZWFuCQACAQIiQkRBOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogQm9vbGVhbgESY29tcG9zZUdlbmVyaWNEYXRhBAdkdWNrR2VuCWR1Y2tJZEtleQdhc3NldElkBWFzc2V0BAdmYXJtR2VuCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCDmdldEdlbkZyb21OYW1lCQDMCAIFB2R1Y2tHZW4FA25pbAUDbmlsAwkAAAIFB2Zhcm1HZW4FB2Zhcm1HZW4EBmFtb3VudAkBDXRyeUdldEludGVnZXIBCQEPZ2V0RHVja1N0YXRzS2V5AQUHZHVja0dlbgQIcXVhbnRpdHkJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBnN0YXRzXwUHZmFybUdlbgIJX3F1YW50aXR5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCWR1Y2tJZEtleQkA2AQBBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJANgEAQUHYXNzZXRJZAUJZHVja0lkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPZ2V0RHVja1N0YXRzS2V5AQUHZHVja0dlbgkAZAIFBmFtb3VudAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGc3RhdHNfBQdmYXJtR2VuAglfcXVhbnRpdHkJAGQCBQhxdWFudGl0eQABCQDMCAIFBWFzc2V0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2ZpbmlzaER1Y2tIYXRjaAMHdHhJZFN0cgVvd25lcg9kdWNrR2VuZXNTdHJpbmcEBHR4SWQJANkEAQUHdHhJZFN0cgQQcHJvY2Vzc1N0YXR1c0tleQkBE2dldFByb2Nlc3NTdGF0dXNLZXkCBQVvd25lcgUEdHhJZAQJZHVja0lkS2V5CQEMZ2V0RHVja0lkS2V5AgUFb3duZXIFBHR4SWQED3Byb2Nlc3NUeFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUQcHJvY2Vzc1N0YXR1c0tleQQPZmluaXNoSGVpZ2h0S2V5CQEZZ2V0UHJvY2Vzc0ZpbmlzaEhlaWdodEtleQIFBW93bmVyBQR0eElkBBNwcm9jZXNzRmluaXNoSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ9maW5pc2hIZWlnaHRLZXkDCQAAAgUPcHJvY2Vzc1R4U3RhdHVzBRBIYXRjaGluZ0ZpbmlzaGVkBAZkdWNrSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQxnZXREdWNrSWRLZXkCBQVvd25lcgUEdHhJZAkAAgEJAKwCAgJAVGhlIGR1Y2sgd2FzIGJyZWVkZWQgYW5kIGNsYWltZWQgYWxyZWFkeSwgaGVyZSBpcyB0aGUgZm9sb3dpbmc6IAUGZHVja0lkAwkAZgIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQFBmhlaWdodAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIdQnJlZWRpbmcgaXMgbm90IGZpbmlzaGVkIHlldCAJAKQDAQkAZQIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQFBmhlaWdodAInIGJsb2NrcyByZW1haW5pbmcsIGl0IHdpbGwgdGFrZSBhcm91bmQgCQCkAwEJAGUCBRNwcm9jZXNzRmluaXNoSGVpZ2h0BQZoZWlnaHQCCCBtaW51dGVzBAdkdWNrR2VuAwkAAAIFD2R1Y2tHZW5lc1N0cmluZwIACQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCDGdlbmVyYXRlRHVjawkAzAgCBQR0eElkCQDMCAIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAMwIAgAACQDMCAIAAAkAzAgCAgAJAMwIAgAABQNuaWwFA25pbAUPZHVja0dlbmVzU3RyaW5nAwkAAAIFB2R1Y2tHZW4FB2R1Y2tHZW4EC2Rlc2NyaXB0aW9uCQCsAgIJAKwCAgIOeyJnZW5vdHlwZSI6ICIFB2R1Y2tHZW4CGSIsICJjcm9zc2JyZWVkaW5nIjogdHJ1ZX0EBWFzc2V0CQDDCAcFB2R1Y2tHZW4FC2Rlc2NyaXB0aW9uAAEAAAcFBHVuaXQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQEB2Fzc2V0SWQJALgIAQUFYXNzZXQJAM4IAgkBEmNvbXBvc2VHZW5lcmljRGF0YQQFB2R1Y2tHZW4FCWR1Y2tJZEtleQUHYXNzZXRJZAUFYXNzZXQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQcHJvY2Vzc1N0YXR1c0tleQUQSGF0Y2hpbmdGaW5pc2hlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgABBQdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBCWlzVGVzdEVudgAJAQdnZXRCb29sAQIHVEVTVEVOVgAJZnJlZUdlbmVzCQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGCQDMCAICAUcJAMwIAgIBSAkAzAgCAgFJCQDMCAICAUsJAMwIAgIBTAUDbmlsAQ5nZXRSYW5kb21HZW5lcwIEdHhJZAFoBAxyYW5kb21OdW1iZXIJAQ9nZXRSYW5kb21OdW1iZXIECQCQAwEFCWZyZWVHZW5lcwUEdHhJZAUBaAACCQCRAwIFCWZyZWVHZW5lcwUMcmFuZG9tTnVtYmVyARdmaW5pc2hEdWNrSGF0Y2hpbmdJdGVtcwUHdHhJZFN0cg9kdWNrR2VuZXNTdHJpbmcIcGF5bWVudDEIcGF5bWVudDIFb3duZXIEC2luc3RhbnRQYWlkCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgIMaW5zdGFudFBhaWRfBQd0eElkU3RyAwULaW5zdGFudFBhaWQJAQ9maW5pc2hEdWNrSGF0Y2gDBQd0eElkU3RyBQVvd25lcgUPZHVja0dlbmVzU3RyaW5nBA5kdWNrbGluZ0ZpbmlzaAkBCGFzU3RyaW5nAQkA/AcECQEaZ2V0QmFieUR1Y2tCcmVlZGluZ0FkZHJlc3MAAhR0dXJuRHVja2xpbmdJbnRvRHVjawUDbmlsCQDMCAIFCHBheW1lbnQxCQDMCAIFCHBheW1lbnQyBQNuaWwDCQAAAgUOZHVja2xpbmdGaW5pc2gFDmR1Y2tsaW5nRmluaXNoBA5kdWNrbGluZ0xpbmtlZAkBDHRyeUdldFN0cmluZwEJAQ5nZXREdWNrbGluZ0tleQIFBW93bmVyCQDZBAEFB3R4SWRTdHIDCQECIT0CBQ5kdWNrbGluZ0xpbmtlZAUOZHVja2xpbmdGaW5pc2gJAAIBAiNQbGVhc2UgYXR0YWNoIHRoZSBjb3JyZWN0IGR1Y2tsaW5nIQkBD2ZpbmlzaER1Y2tIYXRjaAMFB3R4SWRTdHIFBW93bmVyBQ9kdWNrR2VuZXNTdHJpbmcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4LAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwBaQEMZ2VuZXJhdGVEdWNrBgR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0DmdlbmVGcm9tUGFyZW50C2dlbmVQb3N0aW9uDnNwZWNpZmlxdWVHZW5lFnNwZWNpZmlxdWVHZW5lUG9zaXRpb24EC2NvbG9yUmFuZG9tCQEPZ2V0UmFuZG9tTnVtYmVyBAAEBQR0eElkBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAALBAVjb2xvcgMJAAACBQtjb2xvclJhbmRvbQAAAgFZAwkAAAIFC2NvbG9yUmFuZG9tAAECAUcDCQAAAgULY29sb3JSYW5kb20AAgIBQgIBUgQJcGFyZW50MUlkCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEQZ2V0RHVja1BhcmVudEtleQIFBHR4SWQAAQQJcGFyZW50MklkCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEQZ2V0RHVja1BhcmVudEtleQIFBHR4SWQAAgQKcGFyZW50MUdlbgkAtQkCCAkBBXZhbHVlAQkA7AcBBQlwYXJlbnQxSWQEbmFtZQIABApwYXJlbnQyR2VuCQC1CQIICQEFdmFsdWUBCQDsBwEFCXBhcmVudDJJZARuYW1lAgAEA2dlbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBURVQ0stCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAUJAJEDAgUKcGFyZW50MkdlbgAFAAAFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAYJAJEDAgUKcGFyZW50MkdlbgAGAAEFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAcJAJEDAgUKcGFyZW50MkdlbgAHAAIFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAgJAJEDAgUKcGFyZW50MkdlbgAIAAMFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAkJAJEDAgUKcGFyZW50MkdlbgAJAAQFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAoJAJEDAgUKcGFyZW50MkdlbgAKAAUFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAsJAJEDAgUKcGFyZW50MkdlbgALAAYFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uCQEMZ2V0UmFuZG9tR2VuCQkAkQMCBQpwYXJlbnQxR2VuAAwJAJEDAgUKcGFyZW50MkdlbgAMAAcFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQ5nZW5lRnJvbVBhcmVudAULZ2VuZVBvc3Rpb24FDnNwZWNpZmlxdWVHZW5lBRZzcGVjaWZpcXVlR2VuZVBvc2l0aW9uAgEtCQETZGV0ZXJtaW5lR2VuZXJhdGlvbgIJAJEDAgUKcGFyZW50MUdlbgAOCQCRAwIFCnBhcmVudDJHZW4ADgUFY29sb3IJAJQKAgUDbmlsBQNnZW4BaQEOZ2V0R2VuRnJvbU5hbWUBCWFzc2V0TmFtZQQIZ2Vub3R5cGUJALUJAgkAswICCQCwAgIFCWFzc2V0TmFtZQAFAAMCAAQKZ2VuZXJhdGlvbgkAkQMCCQC1CQIFCWFzc2V0TmFtZQIAAA4EA2dlbgkArAICCQCsAgIJAKwCAgkArAIC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AgkBBiRmMTdfMQIJAQYkZjE3XzECCQEGJGYxN18xAgkBBiRmMTdfMQIJAQYkZjE3XzECCQEGJGYxN18xAgkBBiRmMTdfMQIJAQYkZjE3XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAIBWgIBLQUKZ2VuZXJhdGlvbgkAlAoCBQNuaWwFA2dlbgFpARZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuAQdhc3NldElkAwkBASEBCQEVY2hlY2tBc3NldEluSW5jdWJhdG9yAQUHYXNzZXRJZAkAAgEJAKwCAgkArAICAiVZb3UgbmVlZCB0byBhdHRhY2ggYSB2YWxpZCBORlQtZHVjay4gBQdhc3NldElkAgwgaXMgaW52YWxpZCEECGNoaWxkcmVuCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgZhc3NldF8FB2Fzc2V0SWQCCV9jaGlsZHJlbgkAlAoCBQNuaWwFCGNoaWxkcmVuAWkBFmNyZWF0ZUR1Y2tTcGVjaWFsR2VuZXMDB2FkZHJlc3MHZHVja0dlbghjaGlsZHJlbgMDCQECIT0CCAUBaQZjYWxsZXIJAQ9nZXRJdGVtc0FkZHJlc3MACQECIT0CCAUBaQZjYWxsZXIFBHRoaXMHCQACAQITYWRtaW4gb3IgaXRlbXMgb25seQQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQLZGVzY3JpcHRpb24JAKwCAgkArAICAg57Imdlbm90eXBlIjogIgUHZHVja0dlbgIZIiwgImNyb3NzYnJlZWRpbmciOiB0cnVlfQQFYXNzZXQJAMIIBQUHZHVja0dlbgULZGVzY3JpcHRpb24AAQAABwQHYXNzZXRJZAkAuAgBBQVhc3NldAQJZHVja0lkS2V5CQEMZ2V0RHVja0lkS2V5AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEB2Zhcm1HZW4JAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIOZ2V0R2VuRnJvbU5hbWUJAMwIAgUHZHVja0dlbgUDbmlsBQNuaWwDCQAAAgUHZmFybUdlbgUHZmFybUdlbgkAzggCCQESY29tcG9zZUdlbmVyaWNEYXRhBAUHZHVja0dlbgUJZHVja0lkS2V5BQdhc3NldElkBQVhc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmFzc2V0XwkA2AQBBQdhc3NldElkAglfY2hpbGRyZW4FCGNoaWxkcmVuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUHYWRkcmVzcwABBQdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERc3RhcnREdWNrQnJlZWRpbmcBDnJlZmVyZXJBZGRyZXNzBAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwACAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50BAtpbnN0YW50UGFpZAMDCQBnAgkAkAMBCAUBaQhwYXltZW50cwAECQAAAggJAJEDAggFAWkIcGF5bWVudHMAAwdhc3NldElkCQEPZ2V0U3BpY2VBc3NldElkAAcGBwMJAAACBQtpbnN0YW50UGFpZAULaW5zdGFudFBhaWQEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQEDXNlY29uZEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAMDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABBgkBAiE9AggFDXNlY29uZFBheW1lbnQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgkBEGdldER1Y2tsaW5nUHJpY2UABQNuaWwFA25pbAMJAAACBRNhbW91bnRQYWlkQnlDb3Vwb25zBRNhbW91bnRQYWlkQnlDb3Vwb25zBAlsZWZ0VG9QYXkJAGUCCQEQZ2V0RHVja2xpbmdQcmljZQAFE2Ftb3VudFBhaWRCeUNvdXBvbnMEB3BheW1lbnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQMdGhpcmRQYXltZW50AwULaW5zdGFudFBhaWQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMABAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwADAwkBAiE9AggFDHRoaXJkUGF5bWVudAdhc3NldElkCQENZ2V0RWdnQXNzZXRJZAAJAAIBCQCsAgICQkJTREI6IFlvdSBjYW4gYXR0YWNoIG9ubHkgRUdHIHRva2VucyB3aXRoIHRoZSBmb2xsb3dpbmcgYXNzZXQgaWQ6IAkA2AQBCQENZ2V0RWdnQXNzZXRJZAADCQECIT0CCAUMdGhpcmRQYXltZW50BmFtb3VudAUJbGVmdFRvUGF5CQACAQkArAICAkNCU0RCOiBUbyBicmVlZCB5b3UgY3VycmVudGx5IG5lZWQgdGhlIGZvbGxvd2luZyBhbW91bnQgb2YgRUdHbGV0czogCQCkAwEFCWxlZnRUb1BheQQVcmVmZXJlclJld2FyZEZvclBlcmNoCQBrAwUJbGVmdFRvUGF5AAUAZAQHcmVmQ2FsbAkBCWFzQm9vbGVhbgEJAPwHBAkBFWdldFJlZkNvbnRyYWN0QWRkcmVzcwACCnJlZlBheW1lbnQJAMwIAgUOcmVmZXJlckFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFA25pbAMJAAACBQdyZWZDYWxsBQdyZWZDYWxsBAZ0b0J1cm4DBQdyZWZDYWxsCQBlAgUJbGVmdFRvUGF5BRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFCWxlZnRUb1BheQQIYnVybkNhbGwJAPwHBAkBDmdldEJ1cm5BZGRyZXNzAAIUYnVybkF0dGFjaGVkUGF5bWVudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABQZ0b0J1cm4FA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwFCWxlZnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFB3BheW1lbnQFB3BheW1lbnQECWNoaWxkcmVuMQkBBWFzSW50AQkA/AcEBQR0aGlzAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUJY2hpbGRyZW4xBQljaGlsZHJlbjEECWNoaWxkcmVuMgkBBWFzSW50AQkA/AcEBQR0aGlzAhZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQDMCAIFDXNlY29uZEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCWNoaWxkcmVuMgUJY2hpbGRyZW4yAwMJAGYCBQljaGlsZHJlbjEAAAYJAGYCBQljaGlsZHJlbjIAAAkAAgECPE9uZSBkdWNrIGNhbiBiZSB1c2VkIGZvciBicmVlZGluZyBvbmx5IG9uY2UgaW4gaXRzIGxpZmV0aW1lLgQNYnJlZWRlZFN0YXR1cwkBDGNhbkJlQnJlZWRlZAIJANkEAQUMZmlyc3RBc3NldElkCQDZBAEFDXNlY29uZEFzc2V0SWQDCQECIT0CBQ1icmVlZGVkU3RhdHVzAgR0cnVlCQACAQkArAICAh9UaGVzZSBkdWNrcyBjYW5ub3QgYmUgYnJlZWRlZDogBQ1icmVlZGVkU3RhdHVzBApwYXJlbnQxR2VuCQC1CQIICQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZARuYW1lAgAECnBhcmVudDJHZW4JALUJAggJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZARuYW1lAgAEBG5ld0cJARNkZXRlcm1pbmVHZW5lcmF0aW9uAgkAkQMCBQpwYXJlbnQxR2VuAA4JAJEDAgUKcGFyZW50MkdlbgAOBAtzcGljZUFtb3VudAkAaAIJAGQCCQEFdmFsdWUBCQDPCAIFC0dlbmVyYXRpb25zBQRuZXdHAAEAgJTr3AMEBnJlc3VsdAMFC2luc3RhbnRQYWlkAwMJAAACCAkAkQMCCAUBaQhwYXltZW50cwADBmFtb3VudAULc3BpY2VBbW91bnQJAAACCAkAkQMCCAUBaQhwYXltZW50cwADB2Fzc2V0SWQJAQ9nZXRTcGljZUFzc2V0SWQABwQFdG9wdXAJAPwHBAkBF2dldFR1cnRsZVN0YWtpbmdBZGRyZXNzAAILdG9wVXBSZXdhcmQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBD2dldFNwaWNlQXNzZXRJZAAJAGkCBQtzcGljZUFtb3VudAACBQNuaWwDCQAAAgUFdG9wdXAFBXRvcHVwCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgICDGluc3RhbnRQYWlkXwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIqUGxlYXNlIGF0dGFjaCB0aGUgY29ycmVjdCBhbW91bnQgb2Ygc3BpY2UhBANyZXMJAQhhc1N0cmluZwEJAPwHBAkBGmdldEJhYnlEdWNrQnJlZWRpbmdBZGRyZXNzAAINaXNzdWVEdWNrbGluZwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkAaQIFC3NwaWNlQW1vdW50AIDC1y8JAMwIAgUEbmV3RwUDbmlsBQNuaWwDCQAAAgUDcmVzBQNyZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmdldER1Y2tsaW5nS2V5AgkApQgBCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQFA3JlcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICAgxpbnN0YW50UGFpZF8JANgEAQgFAWkNdHJhbnNhY3Rpb25JZAcFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQZyZXN1bHQFBnJlc3VsdAkAzggCCQDOCAIFBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEQZ2V0RHVja1BhcmVudEtleQIIBQFpDXRyYW5zYWN0aW9uSWQAAQUMZmlyc3RBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBnZXREdWNrUGFyZW50S2V5AggFAWkNdHJhbnNhY3Rpb25JZAACBQ1zZWNvbmRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNnZXRQcm9jZXNzU3RhdHVzS2V5AgkApQgBCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQFD0hhdGNoaW5nU3RhcnRlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkCCQClCAEIBQFpBmNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAkAZAIFBmhlaWdodAUQZGVsYXlGb3JIYXRjaGluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmFzc2V0XwUMZmlyc3RBc3NldElkAglfY2hpbGRyZW4AAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBmFzc2V0XwUNc2Vjb25kQXNzZXRJZAIJX2NoaWxkcmVuAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQkBBXZhbHVlAQgFDXNlY29uZFBheW1lbnQHYXNzZXRJZAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESZmluaXNoRHVja0hhdGNoaW5nAQd0eElkU3RyBAVvd25lcgkApQgBCAUBaQZjYWxsZXIEC2luc3RhbnRQYWlkCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgIMaW5zdGFudFBhaWRfBQd0eElkU3RyBA5kdWNrbGluZ0xpbmtlZAkBDHRyeUdldFN0cmluZwEJAQ5nZXREdWNrbGluZ0tleQIFBW93bmVyCQDZBAEFB3R4SWRTdHIDBQtpbnN0YW50UGFpZAkBD2ZpbmlzaER1Y2tIYXRjaAMFB3R4SWRTdHIFBW93bmVyAgAEDmR1Y2tsaW5nRmluaXNoCQEIYXNTdHJpbmcBCQD8BwQJARpnZXRCYWJ5RHVja0JyZWVkaW5nQWRkcmVzcwACFHR1cm5EdWNrbGluZ0ludG9EdWNrBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFDmR1Y2tsaW5nRmluaXNoBQ5kdWNrbGluZ0ZpbmlzaAMJAQIhPQIFDmR1Y2tsaW5nTGlua2VkBQ5kdWNrbGluZ0ZpbmlzaAkAAgECI1BsZWFzZSBhdHRhY2ggdGhlIGNvcnJlY3QgZHVja2xpbmchCQEPZmluaXNoRHVja0hhdGNoAwUHdHhJZFN0cgUFb3duZXICAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdmaW5pc2hEdWNrSGF0Y2hpbmdBZG1pbgIHdHhJZFN0cgVvd25lcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECH0JGREg6IE9ubHkgYWRtaW5zIGNhbiBydW4gdGhpcyEJAQ9maW5pc2hEdWNrSGF0Y2gDBQd0eElkU3RyBQVvd25lcgIAAWkBCWZpeGVkR2VuZQMHdHhJZFN0cg9wYXJlbnRGaXhlZEdlbmURcG9zaXRpb25GaXhlZEdlbmUDAwkBAiE9AgUPcGFyZW50Rml4ZWRHZW5lAAEJAQIhPQIFD3BhcmVudEZpeGVkR2VuZQACBwkAAgECKEZHOiBQYXJlbnQgZml4ZWQgZ2VuZSBjYW4gYmUgb25seSAxIG9yIDIEDGZpcnN0UGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAxmaXJzdEFzc2V0SWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQkAAgECE05GVCBpcyBub3QgYXR0YWNoZWQECGFydGVmYWN0CQEIYXNTdHJpbmcBCQD8BwQJAQ9nZXRJdGVtc0FkZHJlc3MAAhRjaGVja0FydGVmYWN0RGV0YWlscwkAzAgCBQxmaXJzdEFzc2V0SWQFA25pbAUDbmlsAwkAAAIFCGFydGVmYWN0BQhhcnRlZmFjdAMJAQIhPQIFCGFydGVmYWN0AgtBUlQtRklYR0VORQkAAgECKVlvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GSVhHRU5FIGFydGVmYWN0BAR0eElkCQDZBAEFB3R4SWRTdHIED2ZpbmlzaEhlaWdodEtleQkBGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkCCQClCAEIBQFpBmNhbGxlcgUEdHhJZAQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUPZmluaXNoSGVpZ2h0S2V5BA9kdWNrR2VuZXNTdHJpbmcJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIMZ2VuZXJhdGVEdWNrCQDMCAIFBHR4SWQJAMwIAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAkAzAgCBQ9wYXJlbnRGaXhlZEdlbmUJAMwIAgURcG9zaXRpb25GaXhlZEdlbmUJAMwIAgIACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUPZHVja0dlbmVzU3RyaW5nBQ9kdWNrR2VuZXNTdHJpbmcEDHN0cmljdEZpbmlzaAkBF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zBQUHdHhJZFN0cgUPZHVja0dlbmVzU3RyaW5nCQCRAwIIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAgkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAM4IAgkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABBQNuaWwFDHN0cmljdEZpbmlzaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmcmVlR2VuZQEHdHhJZFN0cgQMZmlyc3RQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEDGZpcnN0QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQDCQECIT0CCAUMZmlyc3RQYXltZW50BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAQIYXJ0ZWZhY3QJAQhhc1N0cmluZwEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIFDGZpcnN0QXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUIYXJ0ZWZhY3QFCGFydGVmYWN0AwkBAiE9AgUIYXJ0ZWZhY3QCDEFSVC1GUkVFR0VORQkAAgECKllvdSBuZWVkIHRvIGF0dGFjaCBhIEFSVC1GUkVFR0VORSBhcnRlZmFjdAQEdHhJZAkA2QQBBQd0eElkU3RyBA9maW5pc2hIZWlnaHRLZXkJARlnZXRQcm9jZXNzRmluaXNoSGVpZ2h0S2V5AgkApQgBCAUBaQZjYWxsZXIFBHR4SWQEE3Byb2Nlc3NGaW5pc2hIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFD2ZpbmlzaEhlaWdodEtleQQMc2VsZWN0ZWRHZW5lCQEOZ2V0UmFuZG9tR2VuZXMCBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0BA5yYW5kb21Qb3NpdGlvbgkBD2dldFJhbmRvbU51bWJlcgQACAUEdHhJZAUTcHJvY2Vzc0ZpbmlzaEhlaWdodAADBA9kdWNrR2VuZXNTdHJpbmcJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIMZ2VuZXJhdGVEdWNrCQDMCAIFBHR4SWQJAMwIAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAkAzAgCAAAJAMwIAgAACQDMCAIFDHNlbGVjdGVkR2VuZQkAzAgCBQ5yYW5kb21Qb3NpdGlvbgUDbmlsBQNuaWwDCQAAAgUPZHVja0dlbmVzU3RyaW5nBQ9kdWNrR2VuZXNTdHJpbmcEDHN0cmljdEZpbmlzaAkBF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zBQUHdHhJZFN0cgUPZHVja0dlbmVzU3RyaW5nCQCRAwIIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAgkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAM4IAgkAzAgCCQEEQnVybgIJAQV2YWx1ZQEIBQxmaXJzdFBheW1lbnQHYXNzZXRJZAABBQNuaWwFDHN0cmljdEZpbmlzaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxyZWR1Y2VSYXJpdHkCB2Fzc2V0SWQHZmFybUdlbgQFYXNzZXQJANkEAQUHYXNzZXRJZAMDAwkBAiE9AggFAWkGY2FsbGVyCQEPZ2V0SXRlbXNBZGRyZXNzAAkBAiE9AggFAWkGY2FsbGVyCQERZ2V0UmViaXJ0aEFkZHJlc3MABwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzBwkAAgECHGFkbWluLCBpdGVtcyBvciByZWJpcnRoIG9ubHkEB2R1Y2tHZW4ICQEFdmFsdWUBCQDsBwEFBWFzc2V0BG5hbWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9nZXREdWNrU3RhdHNLZXkBBQdkdWNrR2VuCQBlAgkBDXRyeUdldEludGVnZXIBCQEPZ2V0RHVja1N0YXRzS2V5AQUHZHVja0dlbgABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGc3RhdHNfBQdmYXJtR2VuAglfcXVhbnRpdHkJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgZzdGF0c18FB2Zhcm1HZW4CCV9xdWFudGl0eQABBQNuaWwBAnR4AQZ2ZXJpZnkAAwkBCWlzVGVzdEVudgAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkECWZpcnN0VXNlcgEgURzk/Wb/EmnS8VoUnzuy4vQ7f8HLaCeiNF5sONdX3W0ECnNlY29uZFVzZXIBIMFs347t041zj4ui+fqJD/R1zUQbVHJSo7Sc0lakLeB1BAl0aGlyZFVzZXIBIOdb9I6q0vlJnm6EJrj5fh/cZ6h93Cu41Op7zfJoCsElBA9maXJzdFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCWZpcnN0VXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJZmlyc3RVc2VyAAEAAAQQc2Vjb25kVXNlclNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCnNlY29uZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCnNlY29uZFVzZXIAAQAABA90aGlyZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFCXRoaXJkVXNlcgABAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgUJdGhpcmRVc2VyAAEAAAQPc2lnbmF0dXJlc0NvdW50CQBkAgkAZAIFD2ZpcnN0VXNlclNpZ25lZAUQc2Vjb25kVXNlclNpZ25lZAUPdGhpcmRVc2VyU2lnbmVkBAckbWF0Y2gwBQJ0eAkAZwIFD3NpZ25hdHVyZXNDb3VudAACT+R8+A==", "height": 3310523, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G8Rnw5eKgWxtCFnxhzWBsyXDMhy6joas9hToCJpHMUtB Next: DobkNLKCTyiz3CgXrbgzd5LsoFYEwz9hKBBQjJicq3Gc Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let delayForHatching = 2
55
66 let HatchingStarted = "BREEDING_STARTED"
77
88 let HatchingFinished = "BREEDING_FINISHED"
99
1010 func tryGetStringExternal (address,key) = match getString(address, key) {
1111 case a: String =>
1212 a
1313 case _ =>
1414 ""
1515 }
1616
1717
1818 func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
1919 case b: Int =>
2020 b
2121 case _ =>
2222 0
2323 }
2424
2525
2626 func tryGetString (key) = tryGetStringExternal(this, key)
2727
2828
2929 func staticKey_oracleAddress () = "static_oracleAddress"
3030
3131
3232 func staticKey_incubatorAddress () = "static_incubatorAddress"
3333
3434
3535 func staticKey_rebirthAddress () = "static_rebirthAddress"
3636
3737
3838 func staticKey_itemsAddress () = "static_itemsAddress"
3939
4040
4141 func staticKey_eggAssetId () = "static_eggAssetId"
4242
4343
4444 func staticKey_babyDuckBreedingAddress () = "static_babyDuckBreedingAddress"
4545
4646
4747 func staticKey_ducklingPrice () = "static_ducklingPrice"
4848
4949
5050 func staticKey_couponsAddress () = "static_couponsAddress"
5151
5252
5353 func staticKey_burnAddress () = "static_burnAddress"
5454
5555
5656 func staticKey_refContractAddress () = "static_refContractAddress"
5757
5858
5959 func staticKey_extraFee () = "static_extraFee"
6060
6161
6262 func staticKey_feeAggregator () = "static_feeAggregator"
6363
6464
6565 func staticKey_spiceAssetId () = "static_spiceAssetId"
6666
6767
6868 func staticKey_turtleStakingAddress () = "static_turtleStakingAddress"
6969
7070
7171 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
7272
7373
7474 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
7575
7676
7777 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
7878
7979
8080 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
8181
8282
8383 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
8484
8585
8686 func getBabyDuckBreedingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckBreedingAddress())))
8787
8888
8989 func getDucklingPrice () = tryGetIntegerExternal(getOracle(), staticKey_ducklingPrice())
9090
9191
9292 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
9393
9494
9595 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
9696
9797
9898 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
9999
100100
101101 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
102102
103103
104104 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
105105
106106
107107 func getTurtleStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleStakingAddress())))
108108
109109
110110 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
111111 then throw("BCAP: Please attach waves")
112112 else {
113113 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
114114 if ((payment.amount != feeAmount))
115115 then throw((("BCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
116116 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
117117 }
118118
119119
120120 let MaxGeneration = 7
121121
122122 let Generations = ["G", "H", "I", "K", "L", "M", "N", "O"]
123123
124124 func getProcessStatusKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_status")
125125
126126
127127 func getDucklingKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_duckling")
128128
129129
130130 func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
131131
132132
133133 func getDuckParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
134134
135135
136136 func getDuckIdKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_di")
137137
138138
139139 func getDuckStatsKey (genString) = (("stats_" + genString) + "_amount")
140140
141141
142142 func tryGetBoolean (key) = match getBoolean(key) {
143143 case b: Boolean =>
144144 b
145145 case _ =>
146146 false
147147 }
148148
149149
150150 func tryGetInteger (key) = {
151151 let val = match getInteger(this, key) {
152152 case b: Int =>
153153 b
154154 case _ =>
155155 0
156156 }
157157 val
158158 }
159159
160160
161161 func determineGeneration (g1,g2) = {
162162 let gIndex = max([value(indexOf(Generations, g1)), value(indexOf(Generations, g2))])
163163 Generations[(gIndex + 1)]
164164 }
165165
166166
167167 func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
168168 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
169169 let randomHash = sha256_16Kb((txId + value(randomSeedBlock.vrf)))
170170 (toInt(randomHash, offset) % variants)
171171 }
172172
173173
174174 func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = if (if ((geneFromParent != 0))
175175 then (genePostion == step)
176176 else false)
177177 then if ((geneFromParent == 1))
178178 then gen1
179179 else if ((geneFromParent == 2))
180180 then gen2
181181 else throw("Parent either needs to be 1 or 2")
182182 else if (if ((specifiqueGene != ""))
183183 then (specifiqueGenePosition == step)
184184 else false)
185185 then specifiqueGene
186186 else {
187187 let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
188188 let gen = if ((randomNum == 0))
189189 then gen1
190190 else gen2
191191 gen
192192 }
193193
194194
195195 func checkAssetInIncubator (assetId) = {
196196 let result = match getString(getIncubatorAddress(), assetId) {
197197 case b: String =>
198198 true
199199 case _ =>
200200 false
201201 }
202202 let result2 = match getString(this, assetId) {
203203 case c: String =>
204204 true
205205 case _ =>
206206 false
207207 }
208208 if (result)
209209 then true
210210 else result2
211211 }
212212
213213
214214 func canBeBreeded (asset1Id,asset2Id) = {
215215 let asset1Gen = split(value(assetInfo(asset1Id)).name, "")
216216 let asset2Gen = split(value(assetInfo(asset2Id)).name, "")
217217 if ((value(indexOf(Generations, asset1Gen[14])) >= MaxGeneration))
218218 then (("you can only breed ducks with generation " + Generations[MaxGeneration]) + " and lower")
219219 else if ((value(indexOf(Generations, asset2Gen[14])) >= MaxGeneration))
220220 then (("you can only breed ducks with generation " + Generations[MaxGeneration]) + " and lower")
221221 else "true"
222222 }
223223
224224
225225 func isSymbolA (accumulated,sym) = if ((sym == "A"))
226226 then (accumulated + 1)
227227 else (accumulated + 0)
228228
229229
230230 func isSymbolB (accumulated,sym) = if ((sym == "B"))
231231 then (accumulated + 1)
232232 else (accumulated + 0)
233233
234234
235235 func isSymbolC (accumulated,sym) = if ((sym == "C"))
236236 then (accumulated + 1)
237237 else (accumulated + 0)
238238
239239
240240 func isSymbolD (accumulated,sym) = if ((sym == "D"))
241241 then (accumulated + 1)
242242 else (accumulated + 0)
243243
244244
245245 func isSymbolE (accumulated,sym) = if ((sym == "E"))
246246 then (accumulated + 1)
247247 else (accumulated + 0)
248248
249249
250250 func isSymbolF (accumulated,sym) = if ((sym == "F"))
251251 then (accumulated + 1)
252252 else (accumulated + 0)
253253
254254
255255 func isSymbolG (accumulated,sym) = if ((sym == "G"))
256256 then (accumulated + 1)
257257 else (accumulated + 0)
258258
259259
260260 func isSymbolH (accumulated,sym) = if ((sym == "H"))
261261 then (accumulated + 1)
262262 else (accumulated + 0)
263263
264264
265265 func isSymbolI (accumulated,sym) = if ((sym == "I"))
266266 then (accumulated + 1)
267267 else (accumulated + 0)
268268
269269
270270 func isSymbolK (accumulated,sym) = if ((sym == "K"))
271271 then (accumulated + 1)
272272 else (accumulated + 0)
273273
274274
275275 func isSymbolL (accumulated,sym) = if ((sym == "L"))
276276 then (accumulated + 1)
277277 else (accumulated + 0)
278278
279279
280280 func isSymbolM (accumulated,sym) = if ((sym == "M"))
281281 then (accumulated + 1)
282282 else (accumulated + 0)
283283
284284
285285 func isSymbolN (accumulated,sym) = if ((sym == "N"))
286286 then (accumulated + 1)
287287 else (accumulated + 0)
288288
289289
290290 func isSymbolO (accumulated,sym) = if ((sym == "O"))
291291 then (accumulated + 1)
292292 else (accumulated + 0)
293293
294294
295295 func isSymbolP (accumulated,sym) = if ((sym == "P"))
296296 then (accumulated + 1)
297297 else (accumulated + 0)
298298
299299
300300 func isSymbolS (accumulated,sym) = if ((sym == "S"))
301301 then (accumulated + 1)
302302 else (accumulated + 0)
303303
304304
305305 func isSymbolT (accumulated,sym) = if ((sym == "T"))
306306 then (accumulated + 1)
307307 else (accumulated + 0)
308308
309309
310310 func isSymbolZ (accumulated,sym) = if ((sym == "Z"))
311311 then (accumulated + 1)
312312 else (accumulated + 0)
313313
314314
315315 func getAmountOrClear (amount) = if (contains(amount, "0"))
316316 then ""
317317 else amount
318318
319319
320320 func asString (value) = match value {
321321 case string: String =>
322322 string
323323 case _ =>
324324 throw("wrong type, expected: String")
325325 }
326326
327327
328328 func asInt (value) = match value {
329329 case int: Int =>
330330 int
331331 case _ =>
332332 throw("wrong type, expected: Int")
333333 }
334334
335335
336336 func asBoolean (value) = match value {
337337 case boolean: Boolean =>
338338 boolean
339339 case _ =>
340340 throw("BDA: wrong type, expected: Boolean")
341341 }
342342
343343
344344 func composeGenericData (duckGen,duckIdKey,assetId,asset) = {
345345 let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
346346 if ((farmGen == farmGen))
347347 then {
348348 let amount = tryGetInteger(getDuckStatsKey(duckGen))
349349 let quantity = tryGetInteger((("stats_" + farmGen) + "_quantity"))
350350 [StringEntry(duckIdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), duckIdKey), IntegerEntry(getDuckStatsKey(duckGen), (amount + 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (quantity + 1)), asset]
351351 }
352352 else throw("Strict value is not equal to itself.")
353353 }
354354
355355
356356 func finishDuckHatch (txIdStr,owner,duckGenesString) = {
357357 let txId = fromBase58String(txIdStr)
358358 let processStatusKey = getProcessStatusKey(owner, txId)
359359 let duckIdKey = getDuckIdKey(owner, txId)
360360 let processTxStatus = getStringValue(this, processStatusKey)
361361 let finishHeightKey = getProcessFinishHeightKey(owner, txId)
362362 let processFinishHeight = getIntegerValue(this, finishHeightKey)
363363 if ((processTxStatus == HatchingFinished))
364364 then {
365365 let duckId = getStringValue(this, getDuckIdKey(owner, txId))
366366 throw(("The duck was breeded and claimed already, here is the folowing: " + duckId))
367367 }
368368 else if ((processFinishHeight > height))
369369 then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
370370 else {
371371 let duckGen = if ((duckGenesString == ""))
372372 then asString(invoke(this, "generateDuck", [txId, processFinishHeight, 0, 0, "", 0], nil))
373373 else duckGenesString
374374 if ((duckGen == duckGen))
375375 then {
376376 let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
377377 let asset = Issue(duckGen, description, 1, 0, false, unit, processFinishHeight)
378378 let assetId = calculateAssetId(asset)
379379 (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [StringEntry(processStatusKey, HatchingFinished), ScriptTransfer(addressFromStringValue(owner), 1, assetId)])
380380 }
381381 else throw("Strict value is not equal to itself.")
382382 }
383383 }
384384
385385
386386 func getBool (key) = match getBoolean(this, key) {
387387 case b: Boolean =>
388388 b
389389 case _ =>
390390 false
391391 }
392392
393393
394394 func isTestEnv () = getBool("TESTENV")
395395
396396
397397 let freeGenes = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L"]
398398
399399 func getRandomGenes (txId,h) = {
400400 let randomNumber = getRandomNumber(size(freeGenes), txId, h, 2)
401401 freeGenes[randomNumber]
402402 }
403403
404404
405405 func finishDuckHatchingItems (txIdStr,duckGenesString,payment1,payment2,owner) = {
406406 let instantPaid = tryGetBoolean(("instantPaid_" + txIdStr))
407407 if (instantPaid)
408408 then finishDuckHatch(txIdStr, owner, duckGenesString)
409409 else {
410410 let ducklingFinish = asString(invoke(getBabyDuckBreedingAddress(), "turnDucklingIntoDuck", nil, [payment1, payment2]))
411411 if ((ducklingFinish == ducklingFinish))
412412 then {
413413 let ducklingLinked = tryGetString(getDucklingKey(owner, fromBase58String(txIdStr)))
414414 if ((ducklingLinked != ducklingFinish))
415415 then throw("Please attach the correct duckling!")
416416 else finishDuckHatch(txIdStr, owner, duckGenesString)
417417 }
418418 else throw("Strict value is not equal to itself.")
419419 }
420420 }
421421
422422
423423 @Callable(i)
424424 func configureOracle (oracle) = if ((i.caller != this))
425425 then throw("admin only")
426426 else [StringEntry("static_oracleAddress", oracle)]
427427
428428
429429
430430 @Callable(i)
431431 func generateDuck (txId,hatchingFinishHeight,geneFromParent,genePostion,specifiqueGene,specifiqueGenePosition) = {
432432 let colorRandom = getRandomNumber(4, txId, hatchingFinishHeight, 11)
433433 let color = if ((colorRandom == 0))
434434 then "Y"
435435 else if ((colorRandom == 1))
436436 then "G"
437437 else if ((colorRandom == 2))
438438 then "B"
439439 else "R"
440440 let parent1Id = fromBase58String(tryGetString(getDuckParentKey(txId, 1)))
441441 let parent2Id = fromBase58String(tryGetString(getDuckParentKey(txId, 2)))
442442 let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
443443 let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
444444 let gen = ((((((((((("DUCK-" + getRandomGen(parent1Gen[5], parent2Gen[5], 0, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[6], parent2Gen[6], 1, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[7], parent2Gen[7], 2, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[8], parent2Gen[8], 3, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[9], parent2Gen[9], 4, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[10], parent2Gen[10], 5, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[11], parent2Gen[11], 6, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + getRandomGen(parent1Gen[12], parent2Gen[12], 7, txId, hatchingFinishHeight, geneFromParent, genePostion, specifiqueGene, specifiqueGenePosition)) + "-") + determineGeneration(parent1Gen[14], parent2Gen[14])) + color)
445445 $Tuple2(nil, gen)
446446 }
447447
448448
449449
450450 @Callable(i)
451451 func getGenFromName (assetName) = {
452452 let genotype = split(dropRight(drop(assetName, 5), 3), "")
453453 let generation = split(assetName, "")[14]
454454 let gen = (((((((((((((((((((getAmountOrClear((toString({
455455 let $l = genotype
456456 let $s = size($l)
457457 let $acc0 = 0
458458 func $f0_1 ($a,$i) = if (($i >= $s))
459459 then $a
460460 else isSymbolA($a, $l[$i])
461461
462462 func $f0_2 ($a,$i) = if (($i >= $s))
463463 then $a
464464 else throw("List size exceeds 8")
465465
466466 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
467467 }) + "A")) + getAmountOrClear((toString({
468468 let $l = genotype
469469 let $s = size($l)
470470 let $acc0 = 0
471471 func $f1_1 ($a,$i) = if (($i >= $s))
472472 then $a
473473 else isSymbolB($a, $l[$i])
474474
475475 func $f1_2 ($a,$i) = if (($i >= $s))
476476 then $a
477477 else throw("List size exceeds 8")
478478
479479 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
480480 }) + "B"))) + getAmountOrClear((toString({
481481 let $l = genotype
482482 let $s = size($l)
483483 let $acc0 = 0
484484 func $f2_1 ($a,$i) = if (($i >= $s))
485485 then $a
486486 else isSymbolC($a, $l[$i])
487487
488488 func $f2_2 ($a,$i) = if (($i >= $s))
489489 then $a
490490 else throw("List size exceeds 8")
491491
492492 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
493493 }) + "C"))) + getAmountOrClear((toString({
494494 let $l = genotype
495495 let $s = size($l)
496496 let $acc0 = 0
497497 func $f3_1 ($a,$i) = if (($i >= $s))
498498 then $a
499499 else isSymbolD($a, $l[$i])
500500
501501 func $f3_2 ($a,$i) = if (($i >= $s))
502502 then $a
503503 else throw("List size exceeds 8")
504504
505505 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
506506 }) + "D"))) + getAmountOrClear((toString({
507507 let $l = genotype
508508 let $s = size($l)
509509 let $acc0 = 0
510510 func $f4_1 ($a,$i) = if (($i >= $s))
511511 then $a
512512 else isSymbolE($a, $l[$i])
513513
514514 func $f4_2 ($a,$i) = if (($i >= $s))
515515 then $a
516516 else throw("List size exceeds 8")
517517
518518 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
519519 }) + "E"))) + getAmountOrClear((toString({
520520 let $l = genotype
521521 let $s = size($l)
522522 let $acc0 = 0
523523 func $f5_1 ($a,$i) = if (($i >= $s))
524524 then $a
525525 else isSymbolF($a, $l[$i])
526526
527527 func $f5_2 ($a,$i) = if (($i >= $s))
528528 then $a
529529 else throw("List size exceeds 8")
530530
531531 $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
532532 }) + "F"))) + getAmountOrClear((toString({
533533 let $l = genotype
534534 let $s = size($l)
535535 let $acc0 = 0
536536 func $f6_1 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else isSymbolG($a, $l[$i])
539539
540540 func $f6_2 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else throw("List size exceeds 8")
543543
544544 $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
545545 }) + "G"))) + getAmountOrClear((toString({
546546 let $l = genotype
547547 let $s = size($l)
548548 let $acc0 = 0
549549 func $f7_1 ($a,$i) = if (($i >= $s))
550550 then $a
551551 else isSymbolH($a, $l[$i])
552552
553553 func $f7_2 ($a,$i) = if (($i >= $s))
554554 then $a
555555 else throw("List size exceeds 8")
556556
557557 $f7_2($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($f7_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
558558 }) + "H"))) + getAmountOrClear((toString({
559559 let $l = genotype
560560 let $s = size($l)
561561 let $acc0 = 0
562562 func $f8_1 ($a,$i) = if (($i >= $s))
563563 then $a
564564 else isSymbolI($a, $l[$i])
565565
566566 func $f8_2 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else throw("List size exceeds 8")
569569
570570 $f8_2($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($f8_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
571571 }) + "I"))) + getAmountOrClear((toString({
572572 let $l = genotype
573573 let $s = size($l)
574574 let $acc0 = 0
575575 func $f9_1 ($a,$i) = if (($i >= $s))
576576 then $a
577577 else isSymbolK($a, $l[$i])
578578
579579 func $f9_2 ($a,$i) = if (($i >= $s))
580580 then $a
581581 else throw("List size exceeds 8")
582582
583583 $f9_2($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($f9_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
584584 }) + "K"))) + getAmountOrClear((toString({
585585 let $l = genotype
586586 let $s = size($l)
587587 let $acc0 = 0
588588 func $f10_1 ($a,$i) = if (($i >= $s))
589589 then $a
590590 else isSymbolL($a, $l[$i])
591591
592592 func $f10_2 ($a,$i) = if (($i >= $s))
593593 then $a
594594 else throw("List size exceeds 8")
595595
596596 $f10_2($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($f10_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
597597 }) + "L"))) + getAmountOrClear((toString({
598598 let $l = genotype
599599 let $s = size($l)
600600 let $acc0 = 0
601601 func $f11_1 ($a,$i) = if (($i >= $s))
602602 then $a
603603 else isSymbolM($a, $l[$i])
604604
605605 func $f11_2 ($a,$i) = if (($i >= $s))
606606 then $a
607607 else throw("List size exceeds 8")
608608
609609 $f11_2($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($f11_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
610610 }) + "M"))) + getAmountOrClear((toString({
611611 let $l = genotype
612612 let $s = size($l)
613613 let $acc0 = 0
614614 func $f12_1 ($a,$i) = if (($i >= $s))
615615 then $a
616616 else isSymbolN($a, $l[$i])
617617
618618 func $f12_2 ($a,$i) = if (($i >= $s))
619619 then $a
620620 else throw("List size exceeds 8")
621621
622622 $f12_2($f12_1($f12_1($f12_1($f12_1($f12_1($f12_1($f12_1($f12_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
623623 }) + "N"))) + getAmountOrClear((toString({
624624 let $l = genotype
625625 let $s = size($l)
626626 let $acc0 = 0
627627 func $f13_1 ($a,$i) = if (($i >= $s))
628628 then $a
629629 else isSymbolO($a, $l[$i])
630630
631631 func $f13_2 ($a,$i) = if (($i >= $s))
632632 then $a
633633 else throw("List size exceeds 8")
634634
635635 $f13_2($f13_1($f13_1($f13_1($f13_1($f13_1($f13_1($f13_1($f13_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
636636 }) + "O"))) + getAmountOrClear((toString({
637637 let $l = genotype
638638 let $s = size($l)
639639 let $acc0 = 0
640640 func $f14_1 ($a,$i) = if (($i >= $s))
641641 then $a
642642 else isSymbolP($a, $l[$i])
643643
644644 func $f14_2 ($a,$i) = if (($i >= $s))
645645 then $a
646646 else throw("List size exceeds 8")
647647
648648 $f14_2($f14_1($f14_1($f14_1($f14_1($f14_1($f14_1($f14_1($f14_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
649649 }) + "P"))) + getAmountOrClear((toString({
650650 let $l = genotype
651651 let $s = size($l)
652652 let $acc0 = 0
653653 func $f15_1 ($a,$i) = if (($i >= $s))
654654 then $a
655655 else isSymbolS($a, $l[$i])
656656
657657 func $f15_2 ($a,$i) = if (($i >= $s))
658658 then $a
659659 else throw("List size exceeds 8")
660660
661661 $f15_2($f15_1($f15_1($f15_1($f15_1($f15_1($f15_1($f15_1($f15_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
662662 }) + "S"))) + getAmountOrClear((toString({
663663 let $l = genotype
664664 let $s = size($l)
665665 let $acc0 = 0
666666 func $f16_1 ($a,$i) = if (($i >= $s))
667667 then $a
668668 else isSymbolT($a, $l[$i])
669669
670670 func $f16_2 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else throw("List size exceeds 8")
673673
674674 $f16_2($f16_1($f16_1($f16_1($f16_1($f16_1($f16_1($f16_1($f16_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
675675 }) + "T"))) + getAmountOrClear((toString({
676676 let $l = genotype
677677 let $s = size($l)
678678 let $acc0 = 0
679679 func $f17_1 ($a,$i) = if (($i >= $s))
680680 then $a
681681 else isSymbolZ($a, $l[$i])
682682
683683 func $f17_2 ($a,$i) = if (($i >= $s))
684684 then $a
685685 else throw("List size exceeds 8")
686686
687687 $f17_2($f17_1($f17_1($f17_1($f17_1($f17_1($f17_1($f17_1($f17_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8)
688688 }) + "Z"))) + "-") + generation)
689689 $Tuple2(nil, gen)
690690 }
691691
692692
693693
694694 @Callable(i)
695695 func validateAndGetChildren (assetId) = if (!(checkAssetInIncubator(assetId)))
696696 then throw((("You need to attach a valid NFT-duck. " + assetId) + " is invalid!"))
697697 else {
698698 let children = tryGetInteger((("asset_" + assetId) + "_children"))
699699 $Tuple2(nil, children)
700700 }
701701
702702
703703
704704 @Callable(i)
705705 func createDuckSpecialGenes (address,duckGen,children) = if (if ((i.caller != getItemsAddress()))
706706 then (i.caller != this)
707707 else false)
708708 then throw("admin or items only")
709709 else {
710710 let txId = i.transactionId
711711 let description = (("{\"genotype\": \"" + duckGen) + "\", \"crossbreeding\": true}")
712712 let asset = Issue(duckGen, description, 1, 0, false)
713713 let assetId = calculateAssetId(asset)
714714 let duckIdKey = getDuckIdKey(toString(i.caller), txId)
715715 let farmGen = asString(invoke(this, "getGenFromName", [duckGen], nil))
716716 if ((farmGen == farmGen))
717717 then (composeGenericData(duckGen, duckIdKey, assetId, asset) ++ [IntegerEntry((("asset_" + toBase58String(assetId)) + "_children"), children), ScriptTransfer(Address(address), 1, assetId)])
718718 else throw("Strict value is not equal to itself.")
719719 }
720720
721721
722722
723723 @Callable(i)
724724 func startDuckBreeding (refererAddress) = {
725725 let firstPayment = value(i.payments[0])
726726 let secondPayment = value(i.payments[1])
727727 let validPayment = checkAdditionalPayment(i.payments[2])
728728 if ((validPayment == validPayment))
729729 then {
730730 let instantPaid = if (if ((size(i.payments) >= 4))
731731 then (i.payments[3].assetId == getSpiceAssetId())
732732 else false)
733733 then true
734734 else false
735735 if ((instantPaid == instantPaid))
736736 then {
737737 let firstAssetId = toBase58String(value(firstPayment.assetId))
738738 let secondAssetId = toBase58String(value(secondPayment.assetId))
739739 if (if ((firstPayment.amount != 1))
740740 then true
741741 else (secondPayment.amount != 1))
742742 then throw("NFT is not attached")
743743 else {
744744 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [getDucklingPrice()], nil))
745745 if ((amountPaidByCoupons == amountPaidByCoupons))
746746 then {
747747 let leftToPay = (getDucklingPrice() - amountPaidByCoupons)
748748 let payment = if ((leftToPay != 0))
749749 then {
750750 let thirdPayment = if (instantPaid)
751751 then value(i.payments[4])
752752 else value(i.payments[3])
753753 if ((thirdPayment.assetId != getEggAssetId()))
754754 then throw(("BSDB: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
755755 else if ((thirdPayment.amount != leftToPay))
756756 then throw(("BSDB: To breed you currently need the following amount of EGGlets: " + toString(leftToPay)))
757757 else {
758758 let refererRewardForPerch = fraction(leftToPay, 5, 100)
759759 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
760760 if ((refCall == refCall))
761761 then {
762762 let toBurn = if (refCall)
763763 then (leftToPay - refererRewardForPerch)
764764 else leftToPay
765765 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
766766 if ((burnCall == burnCall))
767767 then leftToPay
768768 else throw("Strict value is not equal to itself.")
769769 }
770770 else throw("Strict value is not equal to itself.")
771771 }
772772 }
773773 else 0
774774 if ((payment == payment))
775775 then {
776776 let children1 = asInt(invoke(this, "validateAndGetChildren", [firstAssetId], nil))
777777 if ((children1 == children1))
778778 then {
779779 let children2 = asInt(invoke(this, "validateAndGetChildren", [secondAssetId], nil))
780780 if ((children2 == children2))
781781 then if (if ((children1 > 0))
782782 then true
783783 else (children2 > 0))
784784 then throw("One duck can be used for breeding only once in its lifetime.")
785785 else {
786786 let breededStatus = canBeBreeded(fromBase58String(firstAssetId), fromBase58String(secondAssetId))
787787 if ((breededStatus != "true"))
788788 then throw(("These ducks cannot be breeded: " + breededStatus))
789789 else {
790790 let parent1Gen = split(value(assetInfo(value(firstPayment.assetId))).name, "")
791791 let parent2Gen = split(value(assetInfo(value(secondPayment.assetId))).name, "")
792792 let newG = determineGeneration(parent1Gen[14], parent2Gen[14])
793793 let spiceAmount = ((value(indexOf(Generations, newG)) + 1) * 1000000000)
794794 let result = if (instantPaid)
795795 then if (if ((i.payments[3].amount == spiceAmount))
796796 then (i.payments[3].assetId == getSpiceAssetId())
797797 else false)
798798 then {
799799 let topup = invoke(getTurtleStakingAddress(), "topUpReward", nil, [AttachedPayment(getSpiceAssetId(), (spiceAmount / 2))])
800800 if ((topup == topup))
801801 then [BooleanEntry(("instantPaid_" + toBase58String(i.transactionId)), true)]
802802 else throw("Strict value is not equal to itself.")
803803 }
804804 else throw("Please attach the correct amount of spice!")
805805 else {
806806 let res = asString(invoke(getBabyDuckBreedingAddress(), "issueDuckling", [toString(i.caller), toBase58String(i.transactionId), (spiceAmount / 100000000), newG], nil))
807807 if ((res == res))
808808 then [StringEntry(getDucklingKey(toString(i.caller), i.transactionId), res), BooleanEntry(("instantPaid_" + toBase58String(i.transactionId)), false)]
809809 else throw("Strict value is not equal to itself.")
810810 }
811811 if ((result == result))
812812 then ((result ++ [StringEntry(getDuckParentKey(i.transactionId, 1), firstAssetId), StringEntry(getDuckParentKey(i.transactionId, 2), secondAssetId), StringEntry(getProcessStatusKey(toString(i.caller), i.transactionId), HatchingStarted), IntegerEntry(getProcessFinishHeightKey(toString(i.caller), i.transactionId), (height + delayForHatching)), IntegerEntry((("asset_" + firstAssetId) + "_children"), 1), IntegerEntry((("asset_" + secondAssetId) + "_children"), 1), ScriptTransfer(i.caller, 1, value(firstPayment.assetId)), ScriptTransfer(i.caller, 1, value(secondPayment.assetId))]) ++ validPayment)
813813 else throw("Strict value is not equal to itself.")
814814 }
815815 }
816816 else throw("Strict value is not equal to itself.")
817817 }
818818 else throw("Strict value is not equal to itself.")
819819 }
820820 else throw("Strict value is not equal to itself.")
821821 }
822822 else throw("Strict value is not equal to itself.")
823823 }
824824 }
825825 else throw("Strict value is not equal to itself.")
826826 }
827827 else throw("Strict value is not equal to itself.")
828828 }
829829
830830
831831
832832 @Callable(i)
833833 func finishDuckHatching (txIdStr) = {
834834 let owner = toString(i.caller)
835835 let instantPaid = tryGetBoolean(("instantPaid_" + txIdStr))
836836 let ducklingLinked = tryGetString(getDucklingKey(owner, fromBase58String(txIdStr)))
837837 if (instantPaid)
838838 then finishDuckHatch(txIdStr, owner, "")
839839 else {
840840 let ducklingFinish = asString(invoke(getBabyDuckBreedingAddress(), "turnDucklingIntoDuck", nil, i.payments))
841841 if ((ducklingFinish == ducklingFinish))
842842 then if ((ducklingLinked != ducklingFinish))
843843 then throw("Please attach the correct duckling!")
844844 else finishDuckHatch(txIdStr, owner, "")
845845 else throw("Strict value is not equal to itself.")
846846 }
847847 }
848848
849849
850850
851851 @Callable(i)
852852 func finishDuckHatchingAdmin (txIdStr,owner) = if ((i.caller != this))
853853 then throw("BFDH: Only admins can run this!")
854854 else finishDuckHatch(txIdStr, owner, "")
855855
856856
857857
858858 @Callable(i)
859859 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = if (if ((parentFixedGene != 1))
860860 then (parentFixedGene != 2)
861861 else false)
862862 then throw("FG: Parent fixed gene can be only 1 or 2")
863863 else {
864864 let firstPayment = value(i.payments[0])
865865 let firstAssetId = toBase58String(value(firstPayment.assetId))
866866 if ((firstPayment.amount != 1))
867867 then throw("NFT is not attached")
868868 else {
869869 let artefact = asString(invoke(getItemsAddress(), "checkArtefactDetails", [firstAssetId], nil))
870870 if ((artefact == artefact))
871871 then if ((artefact != "ART-FIXGENE"))
872872 then throw("You need to attach a ART-FIXGENE artefact")
873873 else {
874874 let txId = fromBase58String(txIdStr)
875875 let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
876876 let processFinishHeight = getIntegerValue(this, finishHeightKey)
877877 let duckGenesString = asString(invoke(this, "generateDuck", [txId, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
878878 if ((duckGenesString == duckGenesString))
879879 then {
880880 let strictFinish = finishDuckHatchingItems(txIdStr, duckGenesString, i.payments[1], i.payments[2], toString(i.originCaller))
881881 ([Burn(value(firstPayment.assetId), 1)] ++ strictFinish)
882882 }
883883 else throw("Strict value is not equal to itself.")
884884 }
885885 else throw("Strict value is not equal to itself.")
886886 }
887887 }
888888
889889
890890
891891 @Callable(i)
892892 func freeGene (txIdStr) = {
893893 let firstPayment = value(i.payments[0])
894894 let firstAssetId = toBase58String(value(firstPayment.assetId))
895895 if ((firstPayment.amount != 1))
896896 then throw("NFT is not attached")
897897 else {
898898 let artefact = asString(invoke(getItemsAddress(), "checkArtefactDetails", [firstAssetId], nil))
899899 if ((artefact == artefact))
900900 then if ((artefact != "ART-FREEGENE"))
901901 then throw("You need to attach a ART-FREEGENE artefact")
902902 else {
903903 let txId = fromBase58String(txIdStr)
904904 let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
905905 let processFinishHeight = getIntegerValue(this, finishHeightKey)
906906 let selectedGene = getRandomGenes(txId, processFinishHeight)
907907 let randomPosition = getRandomNumber(8, txId, processFinishHeight, 3)
908908 let duckGenesString = asString(invoke(this, "generateDuck", [txId, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
909909 if ((duckGenesString == duckGenesString))
910910 then {
911911 let strictFinish = finishDuckHatchingItems(txIdStr, duckGenesString, i.payments[1], i.payments[2], toString(i.originCaller))
912912 ([Burn(value(firstPayment.assetId), 1)] ++ strictFinish)
913913 }
914914 else throw("Strict value is not equal to itself.")
915915 }
916916 else throw("Strict value is not equal to itself.")
917917 }
918918 }
919919
920920
921921
922922 @Callable(i)
923923 func reduceRarity (assetId,farmGen) = {
924924 let asset = fromBase58String(assetId)
925925 if (if (if ((i.caller != getItemsAddress()))
926926 then (i.caller != getRebirthAddress())
927927 else false)
928928 then (i.caller != this)
929929 else false)
930930 then throw("admin, items or rebirth only")
931931 else {
932932 let duckGen = value(assetInfo(asset)).name
933933 [IntegerEntry(getDuckStatsKey(duckGen), (tryGetInteger(getDuckStatsKey(duckGen)) - 1)), IntegerEntry((("stats_" + farmGen) + "_quantity"), (tryGetInteger((("stats_" + farmGen) + "_quantity")) - 1))]
934934 }
935935 }
936936
937937
938938 @Verifier(tx)
939939 func verify () = if (isTestEnv())
940940 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
941941 else {
942942 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
943943 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
944944 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
945945 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
946946 then 1
947947 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
948948 then 1
949949 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
950950 then 1
951951 else 0
952952 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
953953 then 1
954954 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
955955 then 1
956956 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
957957 then 1
958958 else 0
959959 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
960960 then 1
961961 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
962962 then 1
963963 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
964964 then 1
965965 else 0
966966 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
967967 match tx {
968968 case _ =>
969969 (signaturesCount >= 2)
970970 }
971971 }
972972

github/deemru/w8io/026f985 
81.90 ms