tx · HDvR9Y3uodWvyQrbSG2fnDY5Y7nVHJp12TVE5Epusoo9

3PKygHiLgLC16j5bNP1T3UUudmH98Pp2v8o:  -0.02100000 Waves

2024.05.09 21:44 [4164893] smart account 3PKygHiLgLC16j5bNP1T3UUudmH98Pp2v8o > SELF 0.00000000 Waves

{ "type": 13, "id": "HDvR9Y3uodWvyQrbSG2fnDY5Y7nVHJp12TVE5Epusoo9", "fee": 2100000, "feeAssetId": null, "timestamp": 1715280295408, "version": 2, "chainId": 87, "sender": "3PKygHiLgLC16j5bNP1T3UUudmH98Pp2v8o", "senderPublicKey": "EKWFwVJMAk6xj9i7a2PGBZx557V7M57jEhyaZHH3mAc1", "proofs": [ "TiViPR6LdqoN4b3poWmJGsrNyWsmo8H8hx6ABH3zyrDipQWuwWZUnGzC4TLZ3Mze8Q9d5K5HKMhjSXypyN8yvKo" ], "script": "base64:BgIXCAISAwoBCBIDCgEIEgMKAQgSBAoCCAgsAQ5iYXNlUHJpY2VTcGljZQAAgJTr3AMBDGJhc2VQcmljZUVnZwAAgISvXwEQZGVsYXlGb3JIYXRjaGluZwAAAgEPaGF0Y2hpbmdTdGFydGVkAAIQQlJFRURJTkdfU1RBUlRFRAEQaGF0Y2hpbmdGaW5pc2hlZAACEUJSRUVESU5HX0ZJTklTSEVEARRzdGF0aWNLZXlfZWdnQXNzZXRJZAACEXN0YXRpY19lZ2dBc3NldElkARZzdGF0aWNLZXlfc3BpY2VBc3NldElkAAITc3RhdGljX3NwaWNlQXNzZXRJZAEcc3RhdGljS2V5X2R1Y2tCcmVlZGVyQWRkcmVzcwACFXN0YXRpY19icmVlZGVyQWRkcmVzcwEec3RhdGljS2V5X3R1cnRsZUJyZWVkZXJBZGRyZXNzAAIbc3RhdGljX3R1cnRsZUJyZWVkZXJBZGRyZXNzARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARJzdGF0aWNLZXlfZXh0cmFGZWUAAg9zdGF0aWNfZXh0cmFGZWUBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAIUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IBEmdldFN0YXRzS2V5X2Ftb3VudAACDHN0YXRzX2Ftb3VudAELZ2V0U3RhdHNLZXkBCWdlblN0cmluZwkArAICCQCsAgICBnN0YXRzXwUJZ2VuU3RyaW5nAgdfYW1vdW50AQtnZXRDaGlsZHJlbgEHYXNzZXRJZAkArAICCQCsAgICBmFzc2V0XwUHYXNzZXRJZAIJX2NoaWxkcmVuAQxnZXRQYXJlbnRLZXkCBHR4SWQJcGFyZW50TnVtCQCsAgIJAKwCAgkArAICAgdpbml0dHhfCQDYBAEFBHR4SWQCB19wYXJlbnQJAKQDAQUJcGFyZW50TnVtARNnZXRQcm9jZXNzU3RhdHVzS2V5AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FBHR4SWQCB19zdGF0dXMBGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkCB2FkZHJlc3MEdHhJZAkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUEdHhJZAIDX2ZoAQhnZXRJZEtleQIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfBQR0eElkAgNfZGkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBDXRyeUdldEludGVnZXIBA2tleQQDdmFsBAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAUDdmFsAQlnZXRPcmFjbGUACQEHQWRkcmVzcwEJANkEAQkBDHRyeUdldFN0cmluZwEJARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwABF2dldFR1cnRsZUJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEec3RhdGljS2V5X3R1cnRsZUJyZWVkZXJBZGRyZXNzAAEVZ2V0RHVja0JyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEcc3RhdGljS2V5X2R1Y2tCcmVlZGVyQWRkcmVzcwABDWdldEVnZ0Fzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAQ9nZXRTcGljZUFzc2V0SWQACQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X3NwaWNlQXNzZXRJZAABEGdldEZlZUFnZ3JlZ2F0b3IACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgABEWdldEFsbG93ZWRNdXRhbnRzAAkAzAgCCQEXZ2V0VHVydGxlQnJlZWRlckFkZHJlc3MACQDMCAIJARVnZXREdWNrQnJlZWRlckFkZHJlc3MABQNuaWwBEGNhbGNQcmljZUluQXNzZXQBCmJhc2VBbW91bnQJAGQCBQpiYXNlQW1vdW50CQBpAgkAaQIJAGgCBQpiYXNlQW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQESZ2V0U3RhdHNLZXlfYW1vdW50AAABAOgHCQCQAwEJARFnZXRBbGxvd2VkTXV0YW50cwABB2dldEJvb2wBA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBCWlzVGVzdEVudgAJAQdnZXRCb29sAQIHVEVTVEVOVgEPZ2V0UmFuZG9tTnVtYmVyBAh2YXJpYW50cwR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAABBApyYW5kb21IYXNoCQDUFgEJAMsBAgUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gFBm9mZnNldAUIdmFyaWFudHMBDGdldFJhbmRvbUdlbgUEZ2VuMQRnZW4yBHN0ZXAEdHhJZBRoYXRjaGluZ0ZpbmlzaEhlaWdodAQJcmFuZG9tTnVtCQEPZ2V0UmFuZG9tTnVtYmVyBAACBQR0eElkBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAUEc3RlcAQDZ2VuAwkAAAIFCXJhbmRvbU51bQAABQRnZW4xBQRnZW4yBQNnZW4BCGdlbmVyYXRlBAR0eElkDGZpbmlzaEhlaWdodAlwYXJlbnQxSWQJcGFyZW50MklkBAtjb2xvclJhbmRvbQkBD2dldFJhbmRvbU51bWJlcgQAZAUEdHhJZAUMZmluaXNoSGVpZ2h0AAsEBWNvbG9yAwkAZgIAGgULY29sb3JSYW5kb20CAUEDCQBmAgAwBQtjb2xvclJhbmRvbQIBQgMJAGYCAEYFC2NvbG9yUmFuZG9tAgFDAwkAZgIAWgULY29sb3JSYW5kb20CAUQCAUcECnBhcmVudDFHZW4JALUJAggJAQV2YWx1ZQEJAOwHAQUJcGFyZW50MUlkBG5hbWUCAAQKcGFyZW50MkdlbgkAtQkCCAkBBXZhbHVlAQkA7AcBBQlwYXJlbnQySWQEbmFtZQIABANnZW4JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIFTVROVC0JAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ABQkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAUAAAUEdHhJZAUMZmluaXNoSGVpZ2h0CQEMZ2V0UmFuZG9tR2VuBQkArAICCQCRAwIFCnBhcmVudDFHZW4AAAkAkQMCBQpwYXJlbnQxR2VuAAYJAKwCAgkAkQMCBQpwYXJlbnQyR2VuAAAJAJEDAgUKcGFyZW50MkdlbgAGAAEFBHR4SWQFDGZpbmlzaEhlaWdodAkBDGdldFJhbmRvbUdlbgUJAKwCAgkAkQMCBQpwYXJlbnQxR2VuAAAJAJEDAgUKcGFyZW50MUdlbgAHCQCsAgIJAJEDAgUKcGFyZW50MkdlbgAACQCRAwIFCnBhcmVudDJHZW4ABwACBQR0eElkBQxmaW5pc2hIZWlnaHQJAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ACAkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAgAAwUEdHhJZAUMZmluaXNoSGVpZ2h0CQEMZ2V0UmFuZG9tR2VuBQkArAICCQCRAwIFCnBhcmVudDFHZW4AAAkAkQMCBQpwYXJlbnQxR2VuAAkJAKwCAgkAkQMCBQpwYXJlbnQyR2VuAAAJAJEDAgUKcGFyZW50MkdlbgAJAAQFBHR4SWQFDGZpbmlzaEhlaWdodAkBDGdldFJhbmRvbUdlbgUJAKwCAgkAkQMCBQpwYXJlbnQxR2VuAAAJAJEDAgUKcGFyZW50MUdlbgAKCQCsAgIJAJEDAgUKcGFyZW50MkdlbgAACQCRAwIFCnBhcmVudDJHZW4ACgAFBQR0eElkBQxmaW5pc2hIZWlnaHQJAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ACwkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAsABgUEdHhJZAUMZmluaXNoSGVpZ2h0CQEMZ2V0UmFuZG9tR2VuBQkArAICCQCRAwIFCnBhcmVudDFHZW4AAAkAkQMCBQpwYXJlbnQxR2VuAAwJAKwCAgkAkQMCBQpwYXJlbnQyR2VuAAAJAJEDAgUKcGFyZW50MkdlbgAMAAcFBHR4SWQFDGZpbmlzaEhlaWdodAICLUcFBWNvbG9yBQNnZW4BCGlzU3ltYm9sAgNhY2MDc3ltAwkAAAIFA3N5bQgFA2FjYwJfMgkAlAoCCQBkAggFA2FjYwJfMQABCAUDYWNjAl8yCQCUCgIJAGQCCAUDYWNjAl8xAAAIBQNhY2MCXzIBEGdldEFtb3VudE9yQ2xlYXIBBmFtb3VudAMJAQhjb250YWlucwIFBmFtb3VudAIBMAIABQZhbW91bnQBCGNoYXJMaXN0AAkAzAgCAgFBCQDMCAICAUIJAMwIAgIBQwkAzAgCAgFECQDMCAICAUUJAMwIAgIBRgkAzAgCAgFHCQDMCAICAUgJAMwIAgIBSQkAzAgCAgFKCQDMCAICAUsJAMwIAgIBTAkAzAgCAgFNCQDMCAICAU4JAMwIAgIBTwkAzAgCAgFQCQDMCAICAVEJAMwIAgIBUgkAzAgCAgFTCQDMCAICAVQJAMwIAgIBVQkAzAgCAgFWCQDMCAICAVcJAMwIAgIBWAkAzAgCAgFZCQDMCAICAVoFA25pbAERZ2V0UmFyaXR5RnJvbU5hbWUBBG5hbWUEBWNvbG9yCQCRAwIJALUJAgUEbmFtZQIAABYECGdlbm90eXBlCQC1CQIJALMCAgkAsAICBQRuYW1lAAUAAwIABAhnZW5ldGljcwkAzAgCCQCRAwIFCGdlbm90eXBlAAEJAMwIAgkAkQMCBQhnZW5vdHlwZQADCQDMCAIJAJEDAgUIZ2Vub3R5cGUABQkAzAgCCQCRAwIFCGdlbm90eXBlAAcJAMwIAgkAkQMCBQhnZW5vdHlwZQAJCQDMCAIJAJEDAgUIZ2Vub3R5cGUACwkAzAgCCQCRAwIFCGdlbm90eXBlAA0JAMwIAgkAkQMCBQhnZW5vdHlwZQAPBQNuaWwKAQ1jb21wb3NlU3RyaW5nAgNhY2MEY2hhcgQJY2hhckNvdW50CgACJGwFCGdlbmV0aWNzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFBGNoYXIKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGlzU3ltYm9sAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA4CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAkArAICBQNhY2MJARBnZXRBbW91bnRPckNsZWFyAQkArAICCQCkAwEIBQljaGFyQ291bnQCXzEFBGNoYXIJAKwCAgkArAICCgACJGwJAQhjaGFyTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWNvbXBvc2VTdHJpbmcCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDI2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgIBLQUFY29sb3IBDW5yT2ZUeXBlR2VuZXMBA2dlbgQIZ2Vub3R5cGUJALUJAgkAswICCQCwAgIFA2dlbgAFAAMCAAQGcGFydHMxCQCsAgIJAJEDAgUIZ2Vub3R5cGUAAAkAkQMCBQhnZW5vdHlwZQABBAZwYXJ0czIJAKwCAgkAkQMCBQhnZW5vdHlwZQACCQCRAwIFCGdlbm90eXBlAAMEBnBhcnRzMwkArAICCQCRAwIFCGdlbm90eXBlAAQJAJEDAgUIZ2Vub3R5cGUABQQGcGFydHM0CQCsAgIJAJEDAgUIZ2Vub3R5cGUABgkAkQMCBQhnZW5vdHlwZQAHBAZwYXJ0czUJAKwCAgkAkQMCBQhnZW5vdHlwZQAICQCRAwIFCGdlbm90eXBlAAkEBnBhcnRzNgkArAICCQCRAwIFCGdlbm90eXBlAAoJAJEDAgUIZ2Vub3R5cGUACwQGcGFydHM3CQCsAgIJAJEDAgUIZ2Vub3R5cGUADAkAkQMCBQhnZW5vdHlwZQANBAZwYXJ0czgJAKwCAgkAkQMCBQhnZW5vdHlwZQAOCQCRAwIFCGdlbm90eXBlAA8EBXBhcnRzCQDMCAIFBnBhcnRzMQkAzAgCBQZwYXJ0czIJAMwIAgUGcGFydHMzCQDMCAIFBnBhcnRzNAkAzAgCBQZwYXJ0czUJAMwIAgUGcGFydHM2CQDMCAIFBnBhcnRzNwkAzAgCBQZwYXJ0czgFA25pbAoBD3NvcnRQYXJ0c0J5VHlwZQIDYWNjBHBhcnQECnNwbGl0UGFydHMJALUJAgUEcGFydAIAAwkAAAIJAJEDAgUKc3BsaXRQYXJ0cwAAAgFUCQCWCgQJAM0IAggFA2FjYwJfMQkAkQMCBQpzcGxpdFBhcnRzAAEIBQNhY2MCXzIIBQNhY2MCXzMIBQNhY2MCXzQDCQAAAgkAkQMCBQpzcGxpdFBhcnRzAAACAUQJAJYKBAgFA2FjYwJfMQkAzQgCCAUDYWNjAl8yCQCRAwIFCnNwbGl0UGFydHMAAQgFA2FjYwJfMwgFA2FjYwJfNAMJAAACCQCRAwIFCnNwbGl0UGFydHMAAAIBQwkAlgoECAUDYWNjAl8xCAUDYWNjAl8yCQDNCAIIBQNhY2MCXzMJAJEDAgUKc3BsaXRQYXJ0cwABCAUDYWNjAl80AwkAAAIJAJEDAgUKc3BsaXRQYXJ0cwAAAgFICQCW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XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgQSZmluaXNoZWRUdXJ0bGVHZW5zAwkAAAIFCnR1cnRsZUdlbnMCAAIACQCsAgIJAKwCAgICVDoFCnR1cnRsZUdlbnMCAV8EEGZpbmlzaGVkRHVja0dlbnMDCQAAAgUIZHVja0dlbnMCAAIACQCsAgIJAKwCAgICRDoFCGR1Y2tHZW5zAgFfBA9maW5pc2hlZENhdEdlbnMDCQAAAgUHY2F0R2VucwIAAgAJAKwCAgkArAICAgJDOgUHY2F0R2VucwIBXwQQZmluaXNoZWRIb25kR2VucwMJAAACBQhob25kR2VucwIAAgAJAKwCAgkArAICAgJIOgUIaG9uZEdlbnMCAV8JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCAgxERUJVR19UVVJUTEUFCnR1cnRsZUdlbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIKREVCVUdfRFVDSwUIZHVja0dlbnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIJREVCVUdfQ0FUBQdjYXRHZW5zCQDMCAIJAQtTdHJpbmdFbnRyeQICCkRFQlVHX0hPTkQFCGhvbmRHZW5zBQNuaWwJAKwCAgkArAICCQCsAgIFEmZpbmlzaGVkVHVydGxlR2VucwUQZmluaXNoZWREdWNrR2VucwUPZmluaXNoZWRDYXRHZW5zBQhob25kR2VucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEWdmFsaWRhdGVJZk11dGFudEZhaWxlZAEGcmFyaXR5AwkAZgIAAwkAkAMBCQC1CQIFBnJhcml0eQIBOgYHARZmaW5pc2hIYXRjaGluZ0ludGVybmFsAgR0eElkBW93bmVyBBBwcm9jZXNzU3RhdHVzS2V5CQETZ2V0UHJvY2Vzc1N0YXR1c0tleQIFBW93bmVyBQR0eElkBA9maW5pc2hIZWlnaHRLZXkJARlnZXRQcm9jZXNzRmluaXNoSGVpZ2h0S2V5AgUFb3duZXIFBHR4SWQEBUlkS2V5CQEIZ2V0SWRLZXkCBQVvd25lcgUEdHhJZAQPcHJvY2Vzc1R4U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRBwcm9jZXNzU3RhdHVzS2V5BBNwcm9jZXNzRmluaXNoSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ9maW5pc2hIZWlnaHRLZXkDCQAAAgUPcHJvY2Vzc1R4U3RhdHVzCQEQaGF0Y2hpbmdGaW5pc2hlZAAEAklkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEIZ2V0SWRLZXkCBQVvd25lcgUEdHhJZAkAAgEJAKwCAgJCVGhlIE1VVEFOVCB3YXMgYnJlZWRlZCBhbmQgY2xhaW1lZCBhbHJlYWR5LCBoZXJlIGlzIHRoZSBmb2xvd2luZzogBQJJZAMJAGYCBRNwcm9jZXNzRmluaXNoSGVpZ2h0BQZoZWlnaHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICHUJyZWVkaW5nIGlzIG5vdCBmaW5pc2hlZCB5ZXQgCQCkAwEJAGUCBRNwcm9jZXNzRmluaXNoSGVpZ2h0BQZoZWlnaHQCJyBibG9ja3MgcmVtYWluaW5nLCBpdCB3aWxsIHRha2UgYXJvdW5kIAkApAMBCQBlAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAUGaGVpZ2h0AgggbWludXRlcwQJcGFyZW50MUlkCQEMdHJ5R2V0U3RyaW5nAQkBDGdldFBhcmVudEtleQIJANkEAQUEdHhJZAABBAlwYXJlbnQySWQJAQx0cnlHZXRTdHJpbmcBCQEMZ2V0UGFyZW50S2V5AgkA2QQBBQR0eElkAAIEDnBhcmVudDFJZEJ5dGVzCQDZBAEFCXBhcmVudDFJZAQOcGFyZW50MklkQnl0ZXMJANkEAQUJcGFyZW50MklkBANnZW4JAQhnZW5lcmF0ZQQJANkEAQUEdHhJZAUTcHJvY2Vzc0ZpbmlzaEhlaWdodAUOcGFyZW50MUlkQnl0ZXMFDnBhcmVudDJJZEJ5dGVzBAdmYXJtR2VuCQENbnJPZlR5cGVHZW5lcwEFA2dlbgQOcmFyaXR5RnJvbU5hbWUJARFnZXRSYXJpdHlGcm9tTmFtZQEFA2dlbgQGYW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBCQELZ2V0U3RhdHNLZXkBBQNnZW4AAQQFYXNzZXQJAMMIBwkArAICAgVNVE5ULQkApAMBBQZhbW91bnQFA2dlbgABAAAHBQR1bml0BRNwcm9jZXNzRmluaXNoSGVpZ2h0BAdhc3NldElkCQC4CAEFBWFzc2V0BAhxdWFudGl0eQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIGc3RhdHNfCAUHZmFybUdlbgJfMgIJX3F1YW50aXR5BAZyYXJpdHkJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBnN0YXRzXwUOcmFyaXR5RnJvbU5hbWUCB19yYXJpdHkEDm93bmVyQXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgQGZmFpbGVkCQEWdmFsaWRhdGVJZk11dGFudEZhaWxlZAEIBQdmYXJtR2VuAl8yBA50cmFuc2Zlck9yQnVybgMFBmZhaWxlZAkBBEJ1cm4CBQdhc3NldElkAAEJAQ5TY3JpcHRUcmFuc2ZlcgMFDm93bmVyQXNBZGRyZXNzAAEFB2Fzc2V0SWQEFXRyYW5zZmVyT3JCdXJuUGFyZW50MQMJAAACCQEPZ2V0UmFuZG9tTnVtYmVyBAAKCQDZBAEFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQAAgAFCQEEQnVybgIFDnBhcmVudDFJZEJ5dGVzAAEJAQ5TY3JpcHRUcmFuc2ZlcgMFDm93bmVyQXNBZGRyZXNzAAEFDnBhcmVudDFJZEJ5dGVzBBV0cmFuc2Zlck9yQnVyblBhcmVudDIDCQAAAgkBD2dldFJhbmRvbU51bWJlcgQACgkA2QQBBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0AAMABQkBBEJ1cm4CBQ5wYXJlbnQySWRCeXRlcwABCQEOU2NyaXB0VHJhbnNmZXIDBQ5vd25lckFzQWRkcmVzcwABBQ5wYXJlbnQySWRCeXRlcwkAzAgCCQELU3RyaW5nRW50cnkCBRBwcm9jZXNzU3RhdHVzS2V5CQEQaGF0Y2hpbmdGaW5pc2hlZAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUFSWRLZXkJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQDYBAEFB2Fzc2V0SWQFBUlkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELZ2V0U3RhdHNLZXkBBQNnZW4FBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBnN0YXRzXwgFB2Zhcm1HZW4CXzICCV9xdWFudGl0eQkAZAIFCHF1YW50aXR5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZzdGF0c18FDnJhcml0eUZyb21OYW1lAgdfcmFyaXR5CQBkAgUGcmFyaXR5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FCXBhcmVudDFJZAIJX2NoaWxkcmVuAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FCXBhcmVudDJJZAIJX2NoaWxkcmVuAAEJAMwIAgkBDEludGVnZXJFbnRyeQICDHN0YXRzX2Ftb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQIMc3RhdHNfYW1vdW50AAEJAMwIAgUFYXNzZXQJAMwIAgUOdHJhbnNmZXJPckJ1cm4JAMwIAgUVdHJhbnNmZXJPckJ1cm5QYXJlbnQxCQDMCAIFFXRyYW5zZmVyT3JCdXJuUGFyZW50MgUDbmlsARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQdwYXltZW50AwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhlCQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAlmZWVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X2V4dHJhRmVlAAMJAQIhPQIIBQdwYXltZW50BmFtb3VudAUJZmVlQW1vdW50CQACAQkArAICCQCsAgICHEJDQVA6IFBsZWFzZSBhdHRhY2ggZXhhY3RseSAJAKQDAQUJZmVlQW1vdW50AhMgYW1vdW50IG9mIHdhdmVsZXRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50BQR1bml0BQNuaWwBGmNoZWNrVHlwZUFuZFZhbGlkT2JzdGluYXRlAQRpbmZvBAhzcGxpdHRlZAkAtQkCCAUEaW5mbwRuYW1lAgAEBHR5cGUJAJEDAgUIc3BsaXR0ZWQAAAQDZ2VuCQCRAwIFCHNwbGl0dGVkAA4DCQECIT0CBQNnZW4CAU8JAAIBAjJNQ1RBVk86IE9ubHkgb2JzdGluYXRlcyBjYW4gYmUgdHVybmVkIGludG8gbXV0YW50cwQJYnJlZWRlclNjAwkAAAIFBHR5cGUCAVQJARdnZXRUdXJ0bGVCcmVlZGVyQWRkcmVzcwADCQAAAgUEdHlwZQIBRAkBFWdldER1Y2tCcmVlZGVyQWRkcmVzcwAJAAIBAhRNQ1RBVk86IEludmFsaWQgdHlwZQMJAQIhPQIFCWJyZWVkZXJTYwgFBGluZm8GaXNzdWVyCQACAQJMTUNUQVZPOiBPbmx5IG9ic3RpbmF0ZXMgZnJvbSB0aGUgYnJlZWRlciBjb250cmFjdCBjYW4gYmUgdHVybmVkIGludG8gbXV0YW50cwMJAAACCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQlicmVlZGVyU2MJANgEAQgFBGluZm8CaWQCAAkAAgECE01DVEFWTzogSW52YWxpZCBuZnQDCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQkBC2dldENoaWxkcmVuAQkA2AQBCAUEaW5mbwJpZAIACQACAQIYTUNUQVZPOiBORlQgYWxyZWFkeSB1c2VkBQR0eXBlBAFpAQ9jb25maWd1cmVPcmFjbGUBBm9yYWNsZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECD0lDVTogYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwBaQETc3RhcnRNdXRhbnRIYXRjaGluZwEOcmVmZXJlckFkZHJlc3MDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAUJAAIBAhlNU01IOiA1IHBheW1lbnRzIHJlcXVpcmVkAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQkAAgECIE1TTUg6IDFzdCBwYXltZW50IG11c3QgYmUgYW4gTkZUAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQAAQkAAgECIE1TTUg6IDJuZCBwYXltZW50IG11c3QgYmUgYW4gTkZUBAx2YWxpZFBheW1lbnQJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwACAwkAAAIFDHZhbGlkUGF5bWVudAUMdmFsaWRQYXltZW50AwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAMHYXNzZXRJZAkBD2dldFNwaWNlQXNzZXRJZAAGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwADBmFtb3VudAkBEGNhbGNQcmljZUluQXNzZXQBCQEOYmFzZVByaWNlU3BpY2UACQACAQIiTVNNSDogNHRoIHBheW1lbnQgbXVzdCBiZSBpbiBzcGljZQMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAEB2Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAQGYW1vdW50CQEQY2FsY1ByaWNlSW5Bc3NldAEJAQxiYXNlUHJpY2VFZ2cACQACAQIgTVNNSDogNXRoIHBheW1lbnQgbXVzdCBiZSBpbiBlZ2cEBG5mdDEJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBARuZnQyCQEFdmFsdWUBCQDsBwEJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAQFdHlwZTEJARpjaGVja1R5cGVBbmRWYWxpZE9ic3RpbmF0ZQEFBG5mdDEEBXR5cGUyCQEaY2hlY2tUeXBlQW5kVmFsaWRPYnN0aW5hdGUBBQRuZnQyAwkAAAIFBXR5cGUxBQV0eXBlMgkAAgECJk1TTUg6IE5GVHMgY2FuIG5vdCBiZSBvZiB0aGUgc2FtZSB0eXBlCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFBhcmVudEtleQIIBQFpDXRyYW5zYWN0aW9uSWQAAQkA2AQBCAUEbmZ0MQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQEMZ2V0UGFyZW50S2V5AggFAWkNdHJhbnNhY3Rpb25JZAACCQDYBAEIBQRuZnQyAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNnZXRQcm9jZXNzU3RhdHVzS2V5AgkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD2hhdGNoaW5nU3RhcnRlZAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARlnZXRQcm9jZXNzRmluaXNoSGVpZ2h0S2V5AgkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAZAIFBmhlaWdodAkBEGRlbGF5Rm9ySGF0Y2hpbmcABQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARRmaW5pc2hNdXRhbnRIYXRjaGluZwEHdHhJZFN0cgQFb3duZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIfTUZNSDogV3JvbmcgYW1vdW50IG9mIHBheW1lbnRzIQQLZmVlVmFsaWRhdGUJARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQkAkQMCCAUBaQhwYXltZW50cwAAAwkAAAIFC2ZlZVZhbGlkYXRlBQtmZWVWYWxpZGF0ZQkAzggCCQEWZmluaXNoSGF0Y2hpbmdJbnRlcm5hbAIFB3R4SWRTdHIFBW93bmVyBQtmZWVWYWxpZGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxyZWR1Y2VSYXJpdHkCB2Fzc2V0SWQEZkdlbgkAAgECFE1SUjogTm90IGltcGxlbWVudGVkAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASDBbN+O7dONc4+Lovn6iQ/0dc1EG1RyUqO0nNJWpC3gdQQJdGhpcmRVc2VyASDnW/SOqtL5SZ5uhCa4+X4f3GeofdwruNTqe83yaArBJQQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAloyHAU=", "height": 4164893, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7LgXeXU2Z5VtihTDWEFzpqUxtJAR4XRFHys2pyD3pFcv Next: HQ6tRE54U83HKv7UN7cjHW2kSwFT6aEYeycoPt1BD7Ai Diff:
OldNewDifferences
429429 let transferOrBurnParent2 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 3) == 5))
430430 then Burn(parent2IdBytes, 1)
431431 else ScriptTransfer(ownerAsAddress, 1, parent2IdBytes)
432-[StringEntry(processStatusKey, hatchingFinished()), StringEntry(IdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), IdKey), IntegerEntry(getStatsKey(gen), amount), IntegerEntry((("stats_" + farmGen._2) + "_quantity"), (quantity + 1)), IntegerEntry((("stats_" + rarityFromName) + "_rarity"), (rarity + 1)), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), asset, transferOrBurn, transferOrBurnParent1, transferOrBurnParent2]
432+[StringEntry(processStatusKey, hatchingFinished()), StringEntry(IdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), IdKey), IntegerEntry(getStatsKey(gen), amount), IntegerEntry((("stats_" + farmGen._2) + "_quantity"), (quantity + 1)), IntegerEntry((("stats_" + rarityFromName) + "_rarity"), (rarity + 1)), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), asset, transferOrBurn, transferOrBurnParent1, transferOrBurnParent2]
433433 }
434434 }
435435
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func basePriceSpice () = 1000000000
55
66
77 func basePriceEgg () = 200000000
88
99
1010 func delayForHatching () = 2
1111
1212
1313 func hatchingStarted () = "BREEDING_STARTED"
1414
1515
1616 func hatchingFinished () = "BREEDING_FINISHED"
1717
1818
1919 func staticKey_eggAssetId () = "static_eggAssetId"
2020
2121
2222 func staticKey_spiceAssetId () = "static_spiceAssetId"
2323
2424
2525 func staticKey_duckBreederAddress () = "static_breederAddress"
2626
2727
2828 func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
2929
3030
3131 func staticKey_oracleAddress () = "static_oracleAddress"
3232
3333
3434 func staticKey_extraFee () = "static_extraFee"
3535
3636
3737 func staticKey_feeAggregator () = "static_feeAggregator"
3838
3939
4040 func getStatsKey_amount () = "stats_amount"
4141
4242
4343 func getStatsKey (genString) = (("stats_" + genString) + "_amount")
4444
4545
4646 func getChildren (assetId) = (("asset_" + assetId) + "_children")
4747
4848
4949 func getParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
5050
5151
5252 func getProcessStatusKey (address,txId) = (((address + "_") + txId) + "_status")
5353
5454
5555 func getProcessFinishHeightKey (address,txId) = (((address + "_") + txId) + "_fh")
5656
5757
5858 func getIdKey (address,txId) = (((address + "_") + txId) + "_di")
5959
6060
6161 func tryGetStringExternal (address,key) = match getString(address, key) {
6262 case a: String =>
6363 a
6464 case _ =>
6565 ""
6666 }
6767
6868
6969 func tryGetString (key) = tryGetStringExternal(this, key)
7070
7171
7272 func tryGetInteger (key) = {
7373 let val = match getInteger(this, key) {
7474 case b: Int =>
7575 b
7676 case _ =>
7777 0
7878 }
7979 val
8080 }
8181
8282
8383 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8484
8585
8686 func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
8787
8888
8989 func getDuckBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckBreederAddress())))
9090
9191
9292 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
9393
9494
9595 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
9696
9797
9898 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
9999
100100
101101 func getAllowedMutants () = [getTurtleBreederAddress(), getDuckBreederAddress()]
102102
103103
104104 func calcPriceInAsset (baseAmount) = (baseAmount + (((baseAmount * (tryGetInteger(getStatsKey_amount()) + 1)) / 1000) / size(getAllowedMutants())))
105105
106106
107107 func getBool (key) = match getBoolean(this, key) {
108108 case b: Boolean =>
109109 b
110110 case _ =>
111111 false
112112 }
113113
114114
115115 func isTestEnv () = getBool("TESTENV")
116116
117117
118118 func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
119119 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
120120 let randomHash = sha256_16Kb((txId + value(randomSeedBlock.vrf)))
121121 (toInt(randomHash, offset) % variants)
122122 }
123123
124124
125125 func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
126126 let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
127127 let gen = if ((randomNum == 0))
128128 then gen1
129129 else gen2
130130 gen
131131 }
132132
133133
134134 func generate (txId,finishHeight,parent1Id,parent2Id) = {
135135 let colorRandom = getRandomNumber(100, txId, finishHeight, 11)
136136 let color = if ((26 > colorRandom))
137137 then "A"
138138 else if ((48 > colorRandom))
139139 then "B"
140140 else if ((70 > colorRandom))
141141 then "C"
142142 else if ((90 > colorRandom))
143143 then "D"
144144 else "G"
145145 let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
146146 let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
147147 let gen = (((((((((("MTNT-" + getRandomGen((parent1Gen[0] + parent1Gen[5]), (parent2Gen[0] + parent2Gen[5]), 0, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[6]), (parent2Gen[0] + parent2Gen[6]), 1, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[7]), (parent2Gen[0] + parent2Gen[7]), 2, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[8]), (parent2Gen[0] + parent2Gen[8]), 3, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[9]), (parent2Gen[0] + parent2Gen[9]), 4, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[10]), (parent2Gen[0] + parent2Gen[10]), 5, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[11]), (parent2Gen[0] + parent2Gen[11]), 6, txId, finishHeight)) + getRandomGen((parent1Gen[0] + parent1Gen[12]), (parent2Gen[0] + parent2Gen[12]), 7, txId, finishHeight)) + "-G") + color)
148148 gen
149149 }
150150
151151
152152 func isSymbol (acc,sym) = if ((sym == acc._2))
153153 then $Tuple2((acc._1 + 1), acc._2)
154154 else $Tuple2((acc._1 + 0), acc._2)
155155
156156
157157 func getAmountOrClear (amount) = if (contains(amount, "0"))
158158 then ""
159159 else amount
160160
161161
162162 func charList () = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
163163
164164
165165 func getRarityFromName (name) = {
166166 let color = split(name, "")[22]
167167 let genotype = split(dropRight(drop(name, 5), 3), "")
168168 let genetics = [genotype[1], genotype[3], genotype[5], genotype[7], genotype[9], genotype[11], genotype[13], genotype[15]]
169169 func composeString (acc,char) = {
170170 let charCount = {
171171 let $l = genetics
172172 let $s = size($l)
173173 let $acc0 = $Tuple2(0, char)
174174 func $f0_1 ($a,$i) = if (($i >= $s))
175175 then $a
176176 else isSymbol($a, $l[$i])
177177
178178 func $f0_2 ($a,$i) = if (($i >= $s))
179179 then $a
180180 else throw("List size exceeds 8")
181181
182182 $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)
183183 }
184184 (acc + getAmountOrClear((toString(charCount._1) + char)))
185185 }
186186
187187 (({
188188 let $l = charList()
189189 let $s = size($l)
190190 let $acc0 = ""
191191 func $f0_1 ($a,$i) = if (($i >= $s))
192192 then $a
193193 else composeString($a, $l[$i])
194194
195195 func $f0_2 ($a,$i) = if (($i >= $s))
196196 then $a
197197 else throw("List size exceeds 26")
198198
199199 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26)
200200 } + "-") + color)
201201 }
202202
203203
204204 func nrOfTypeGenes (gen) = {
205205 let genotype = split(dropRight(drop(gen, 5), 3), "")
206206 let parts1 = (genotype[0] + genotype[1])
207207 let parts2 = (genotype[2] + genotype[3])
208208 let parts3 = (genotype[4] + genotype[5])
209209 let parts4 = (genotype[6] + genotype[7])
210210 let parts5 = (genotype[8] + genotype[9])
211211 let parts6 = (genotype[10] + genotype[11])
212212 let parts7 = (genotype[12] + genotype[13])
213213 let parts8 = (genotype[14] + genotype[15])
214214 let parts = [parts1, parts2, parts3, parts4, parts5, parts6, parts7, parts8]
215215 func sortPartsByType (acc,part) = {
216216 let splitParts = split(part, "")
217217 if ((splitParts[0] == "T"))
218218 then $Tuple4((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4)
219219 else if ((splitParts[0] == "D"))
220220 then $Tuple4(acc._1, (acc._2 :+ splitParts[1]), acc._3, acc._4)
221221 else if ((splitParts[0] == "C"))
222222 then $Tuple4(acc._1, acc._2, (acc._3 :+ splitParts[1]), acc._4)
223223 else if ((splitParts[0] == "H"))
224224 then $Tuple4(acc._1, acc._2, acc._3, (acc._4 :+ splitParts[1]))
225225 else throw("UNKNOWN TYPE")
226226 }
227227
228228 let result = {
229229 let $l = parts
230230 let $s = size($l)
231231 let $acc0 = $Tuple4(nil, nil, nil, nil)
232232 func $f0_1 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else sortPartsByType($a, $l[$i])
235235
236236 func $f0_2 ($a,$i) = if (($i >= $s))
237237 then $a
238238 else throw("List size exceeds 8")
239239
240240 $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)
241241 }
242242 if ((result == result))
243243 then {
244244 func composeStringTurtle (acc,char) = {
245245 let charCount = {
246246 let $l = result._1
247247 let $s = size($l)
248248 let $acc0 = $Tuple2(0, char)
249249 func $f1_1 ($a,$i) = if (($i >= $s))
250250 then $a
251251 else isSymbol($a, $l[$i])
252252
253253 func $f1_2 ($a,$i) = if (($i >= $s))
254254 then $a
255255 else throw("List size exceeds 8")
256256
257257 $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)
258258 }
259259 (acc + getAmountOrClear((toString(charCount._1) + char)))
260260 }
261261
262262 func composeStringDuck (acc,char) = {
263263 let charCount = {
264264 let $l = result._2
265265 let $s = size($l)
266266 let $acc0 = $Tuple2(0, char)
267267 func $f1_1 ($a,$i) = if (($i >= $s))
268268 then $a
269269 else isSymbol($a, $l[$i])
270270
271271 func $f1_2 ($a,$i) = if (($i >= $s))
272272 then $a
273273 else throw("List size exceeds 8")
274274
275275 $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)
276276 }
277277 (acc + getAmountOrClear((toString(charCount._1) + char)))
278278 }
279279
280280 func composeStringCat (acc,char) = {
281281 let charCount = {
282282 let $l = result._3
283283 let $s = size($l)
284284 let $acc0 = $Tuple2(0, char)
285285 func $f1_1 ($a,$i) = if (($i >= $s))
286286 then $a
287287 else isSymbol($a, $l[$i])
288288
289289 func $f1_2 ($a,$i) = if (($i >= $s))
290290 then $a
291291 else throw("List size exceeds 8")
292292
293293 $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)
294294 }
295295 (acc + getAmountOrClear((toString(charCount._1) + char)))
296296 }
297297
298298 func composeStringDog (acc,char) = {
299299 let charCount = {
300300 let $l = result._4
301301 let $s = size($l)
302302 let $acc0 = $Tuple2(0, char)
303303 func $f1_1 ($a,$i) = if (($i >= $s))
304304 then $a
305305 else isSymbol($a, $l[$i])
306306
307307 func $f1_2 ($a,$i) = if (($i >= $s))
308308 then $a
309309 else throw("List size exceeds 8")
310310
311311 $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)
312312 }
313313 (acc + getAmountOrClear((toString(charCount._1) + char)))
314314 }
315315
316316 let turtleGens = {
317317 let $l = charList()
318318 let $s = size($l)
319319 let $acc0 = ""
320320 func $f1_1 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else composeStringTurtle($a, $l[$i])
323323
324324 func $f1_2 ($a,$i) = if (($i >= $s))
325325 then $a
326326 else throw("List size exceeds 26")
327327
328328 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($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), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26)
329329 }
330330 let duckGens = {
331331 let $l = charList()
332332 let $s = size($l)
333333 let $acc0 = ""
334334 func $f2_1 ($a,$i) = if (($i >= $s))
335335 then $a
336336 else composeStringDuck($a, $l[$i])
337337
338338 func $f2_2 ($a,$i) = if (($i >= $s))
339339 then $a
340340 else throw("List size exceeds 26")
341341
342342 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($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), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26)
343343 }
344344 let catGens = {
345345 let $l = charList()
346346 let $s = size($l)
347347 let $acc0 = ""
348348 func $f3_1 ($a,$i) = if (($i >= $s))
349349 then $a
350350 else composeStringCat($a, $l[$i])
351351
352352 func $f3_2 ($a,$i) = if (($i >= $s))
353353 then $a
354354 else throw("List size exceeds 26")
355355
356356 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($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), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26)
357357 }
358358 let hondGens = {
359359 let $l = charList()
360360 let $s = size($l)
361361 let $acc0 = ""
362362 func $f4_1 ($a,$i) = if (($i >= $s))
363363 then $a
364364 else composeStringDog($a, $l[$i])
365365
366366 func $f4_2 ($a,$i) = if (($i >= $s))
367367 then $a
368368 else throw("List size exceeds 26")
369369
370370 $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($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), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26)
371371 }
372372 let finishedTurtleGens = if ((turtleGens == ""))
373373 then ""
374374 else (("T:" + turtleGens) + "_")
375375 let finishedDuckGens = if ((duckGens == ""))
376376 then ""
377377 else (("D:" + duckGens) + "_")
378378 let finishedCatGens = if ((catGens == ""))
379379 then ""
380380 else (("C:" + catGens) + "_")
381381 let finishedHondGens = if ((hondGens == ""))
382382 then ""
383383 else (("H:" + hondGens) + "_")
384384 $Tuple2([StringEntry("DEBUG_TURTLE", turtleGens), StringEntry("DEBUG_DUCK", duckGens), StringEntry("DEBUG_CAT", catGens), StringEntry("DEBUG_HOND", hondGens)], (((finishedTurtleGens + finishedDuckGens) + finishedCatGens) + hondGens))
385385 }
386386 else throw("Strict value is not equal to itself.")
387387 }
388388
389389
390390 func validateIfMutantFailed (rarity) = if ((3 > size(split(rarity, ":"))))
391391 then true
392392 else false
393393
394394
395395 func finishHatchingInternal (txId,owner) = {
396396 let processStatusKey = getProcessStatusKey(owner, txId)
397397 let finishHeightKey = getProcessFinishHeightKey(owner, txId)
398398 let IdKey = getIdKey(owner, txId)
399399 let processTxStatus = getStringValue(this, processStatusKey)
400400 let processFinishHeight = getIntegerValue(this, finishHeightKey)
401401 if ((processTxStatus == hatchingFinished()))
402402 then {
403403 let Id = getStringValue(this, getIdKey(owner, txId))
404404 throw(("The MUTANT was breeded and claimed already, here is the folowing: " + Id))
405405 }
406406 else if ((processFinishHeight > height))
407407 then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
408408 else {
409409 let parent1Id = tryGetString(getParentKey(fromBase58String(txId), 1))
410410 let parent2Id = tryGetString(getParentKey(fromBase58String(txId), 2))
411411 let parent1IdBytes = fromBase58String(parent1Id)
412412 let parent2IdBytes = fromBase58String(parent2Id)
413413 let gen = generate(fromBase58String(txId), processFinishHeight, parent1IdBytes, parent2IdBytes)
414414 let farmGen = nrOfTypeGenes(gen)
415415 let rarityFromName = getRarityFromName(gen)
416416 let amount = (tryGetInteger(getStatsKey(gen)) + 1)
417417 let asset = Issue(("MTNT-" + toString(amount)), gen, 1, 0, false, unit, processFinishHeight)
418418 let assetId = calculateAssetId(asset)
419419 let quantity = tryGetInteger((("stats_" + farmGen._2) + "_quantity"))
420420 let rarity = tryGetInteger((("stats_" + rarityFromName) + "_rarity"))
421421 let ownerAsAddress = addressFromStringValue(owner)
422422 let failed = validateIfMutantFailed(farmGen._2)
423423 let transferOrBurn = if (failed)
424424 then Burn(assetId, 1)
425425 else ScriptTransfer(ownerAsAddress, 1, assetId)
426426 let transferOrBurnParent1 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 2) == 5))
427427 then Burn(parent1IdBytes, 1)
428428 else ScriptTransfer(ownerAsAddress, 1, parent1IdBytes)
429429 let transferOrBurnParent2 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 3) == 5))
430430 then Burn(parent2IdBytes, 1)
431431 else ScriptTransfer(ownerAsAddress, 1, parent2IdBytes)
432-[StringEntry(processStatusKey, hatchingFinished()), StringEntry(IdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), IdKey), IntegerEntry(getStatsKey(gen), amount), IntegerEntry((("stats_" + farmGen._2) + "_quantity"), (quantity + 1)), IntegerEntry((("stats_" + rarityFromName) + "_rarity"), (rarity + 1)), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), asset, transferOrBurn, transferOrBurnParent1, transferOrBurnParent2]
432+[StringEntry(processStatusKey, hatchingFinished()), StringEntry(IdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), IdKey), IntegerEntry(getStatsKey(gen), amount), IntegerEntry((("stats_" + farmGen._2) + "_quantity"), (quantity + 1)), IntegerEntry((("stats_" + rarityFromName) + "_rarity"), (rarity + 1)), IntegerEntry((("asset_" + parent1Id) + "_children"), 1), IntegerEntry((("asset_" + parent2Id) + "_children"), 1), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), asset, transferOrBurn, transferOrBurnParent1, transferOrBurnParent2]
433433 }
434434 }
435435
436436
437437 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
438438 then throw("BCAP: Please attach waves")
439439 else {
440440 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
441441 if ((payment.amount != feeAmount))
442442 then throw((("BCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
443443 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
444444 }
445445
446446
447447 func checkTypeAndValidObstinate (info) = {
448448 let splitted = split(info.name, "")
449449 let type = splitted[0]
450450 let gen = splitted[14]
451451 if ((gen != "O"))
452452 then throw("MCTAVO: Only obstinates can be turned into mutants")
453453 else {
454454 let breederSc = if ((type == "T"))
455455 then getTurtleBreederAddress()
456456 else if ((type == "D"))
457457 then getDuckBreederAddress()
458458 else throw("MCTAVO: Invalid type")
459459 if ((breederSc != info.issuer))
460460 then throw("MCTAVO: Only obstinates from the breeder contract can be turned into mutants")
461461 else if ((tryGetStringExternal(breederSc, toBase58String(info.id)) == ""))
462462 then throw("MCTAVO: Invalid nft")
463463 else if ((tryGetString(getChildren(toBase58String(info.id))) != ""))
464464 then throw("MCTAVO: NFT already used")
465465 else type
466466 }
467467 }
468468
469469
470470 @Callable(i)
471471 func configureOracle (oracle) = if ((i.caller != this))
472472 then throw("ICU: admin only")
473473 else [StringEntry("static_oracleAddress", oracle)]
474474
475475
476476
477477 @Callable(i)
478478 func startMutantHatching (refererAddress) = if ((size(i.payments) != 5))
479479 then throw("MSMH: 5 payments required")
480480 else if ((i.payments[0].amount != 1))
481481 then throw("MSMH: 1st payment must be an NFT")
482482 else if ((i.payments[1].amount != 1))
483483 then throw("MSMH: 2nd payment must be an NFT")
484484 else {
485485 let validPayment = checkAdditionalPayment(i.payments[2])
486486 if ((validPayment == validPayment))
487487 then if (if ((i.payments[3].assetId != getSpiceAssetId()))
488488 then true
489489 else (i.payments[3].amount != calcPriceInAsset(basePriceSpice())))
490490 then throw("MSMH: 4th payment must be in spice")
491491 else if (if ((i.payments[4].assetId != getEggAssetId()))
492492 then true
493493 else (i.payments[4].amount != calcPriceInAsset(basePriceEgg())))
494494 then throw("MSMH: 5th payment must be in egg")
495495 else {
496496 let nft1 = value(assetInfo(value(i.payments[0].assetId)))
497497 let nft2 = value(assetInfo(value(i.payments[1].assetId)))
498498 let type1 = checkTypeAndValidObstinate(nft1)
499499 let type2 = checkTypeAndValidObstinate(nft2)
500500 if ((type1 == type2))
501501 then throw("MSMH: NFTs can not be of the same type")
502502 else ([StringEntry(getParentKey(i.transactionId, 1), toBase58String(nft1.id)), StringEntry(getParentKey(i.transactionId, 2), toBase58String(nft2.id)), StringEntry(getProcessStatusKey(toString(i.caller), toBase58String(i.transactionId)), hatchingStarted()), IntegerEntry(getProcessFinishHeightKey(toString(i.caller), toBase58String(i.transactionId)), (height + delayForHatching()))] ++ validPayment)
503503 }
504504 else throw("Strict value is not equal to itself.")
505505 }
506506
507507
508508
509509 @Callable(i)
510510 func finishMutantHatching (txIdStr) = {
511511 let owner = toString(i.originCaller)
512512 if ((size(i.payments) != 1))
513513 then throw("MFMH: Wrong amount of payments!")
514514 else {
515515 let feeValidate = checkAdditionalPayment(i.payments[0])
516516 if ((feeValidate == feeValidate))
517517 then (finishHatchingInternal(txIdStr, owner) ++ feeValidate)
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 }
521521
522522
523523
524524 @Callable(i)
525525 func reduceRarity (assetId,fGen) = throw("MRR: Not implemented")
526526
527527
528528 @Verifier(tx)
529529 func verify () = if (isTestEnv())
530530 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
531531 else {
532532 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
533533 let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
534534 let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
535535 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
536536 then 1
537537 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
538538 then 1
539539 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
540540 then 1
541541 else 0
542542 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
543543 then 1
544544 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
545545 then 1
546546 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
547547 then 1
548548 else 0
549549 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
550550 then 1
551551 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
552552 then 1
553553 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
554554 then 1
555555 else 0
556556 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
557557 match tx {
558558 case _ =>
559559 (signaturesCount >= 2)
560560 }
561561 }
562562

github/deemru/w8io/873ac7e 
61.68 ms