tx · 2XuHMj4Rnf9eG9nhXVGRUVNSD22Tggo57DpdJ9PQsMUd

3N1mAvAyeEwnFekyjaY4BXBKUcHqAUxwQxX:  -0.02100000 Waves

2024.10.07 20:29 [3316722] smart account 3N1mAvAyeEwnFekyjaY4BXBKUcHqAUxwQxX > SELF 0.00000000 Waves

{ "type": 13, "id": "2XuHMj4Rnf9eG9nhXVGRUVNSD22Tggo57DpdJ9PQsMUd", "fee": 2100000, "feeAssetId": null, "timestamp": 1728322194439, "version": 2, "chainId": 84, "sender": "3N1mAvAyeEwnFekyjaY4BXBKUcHqAUxwQxX", "senderPublicKey": "PwwJDKx8yjU8AygkZRDwcPJMvUHpwP62y3H2F3PoC5C", "proofs": [ "4ewmzohPA58TQENLvFnjimdomYXbL7P3t6Wade3wunKSovJW4yT5y31aXrzVfg3F9HrLGZM8JJ6FGHA56ZttitZY" ], "script": "base64:BgIcCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIECgIICCwBDmJhc2VQcmljZVNwaWNlAACAlOvcAwEMYmFzZVByaWNlRWdnAACAhK9fARBkZWxheUZvckhhdGNoaW5nAAACAQ9oYXRjaGluZ1N0YXJ0ZWQAAhBCUkVFRElOR19TVEFSVEVEARBoYXRjaGluZ0ZpbmlzaGVkAAIRQlJFRURJTkdfRklOSVNIRUQBFHN0YXRpY0tleV9lZ2dBc3NldElkAAIRc3RhdGljX2VnZ0Fzc2V0SWQBFnN0YXRpY0tleV9zcGljZUFzc2V0SWQAAhNzdGF0aWNfc3BpY2VBc3NldElkARxzdGF0aWNLZXlfZHVja0JyZWVkZXJBZGRyZXNzAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzAR5zdGF0aWNLZXlfdHVydGxlQnJlZWRlckFkZHJlc3MAAhtzdGF0aWNfdHVydGxlQnJlZWRlckFkZHJlc3MBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAIUc3RhdGljX29yYWNsZUFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgESZ2V0U3RhdHNLZXlfYW1vdW50AAIMc3RhdHNfYW1vdW50AQtnZXRTdGF0c0tleQEJZ2VuU3RyaW5nCQCsAgIJAKwCAgIGc3RhdHNfBQlnZW5TdHJpbmcCB19hbW91bnQBC2dldENoaWxkcmVuAQdhc3NldElkCQCsAgIJAKwCAgIGYXNzZXRfBQdhc3NldElkAglfY2hpbGRyZW4BDGdldFBhcmVudEtleQIEdHhJZAlwYXJlbnROdW0JAKwCAgkArAICCQCsAgICB2luaXR0eF8JANgEAQUEdHhJZAIHX3BhcmVudAkApAMBBQlwYXJlbnROdW0BE2dldFByb2Nlc3NTdGF0dXNLZXkCB2FkZHJlc3MEdHhJZAkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUEdHhJZAIHX3N0YXR1cwEZZ2V0UHJvY2Vzc0ZpbmlzaEhlaWdodEtleQIHYWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICBQdhZGRyZXNzAgFfBQR0eElkAgNfZmgBCGdldElkS2V5AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgIFB2FkZHJlc3MCAV8FBHR4SWQCA19kaQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQENdHJ5R2V0SW50ZWdlcgEDa2V5BAN2YWwEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAABQN2YWwBCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQkBF3N0YXRpY0tleV9vcmFjbGVBZGRyZXNzAAEXZ2V0VHVydGxlQnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJAR5zdGF0aWNLZXlfdHVydGxlQnJlZWRlckFkZHJlc3MAARVnZXREdWNrQnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARxzdGF0aWNLZXlfZHVja0JyZWVkZXJBZGRyZXNzAAENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARRzdGF0aWNLZXlfZWdnQXNzZXRJZAABD2dldFNwaWNlQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARZzdGF0aWNLZXlfc3BpY2VBc3NldElkAAEQZ2V0RmVlQWdncmVnYXRvcgAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAERZ2V0QWxsb3dlZE11dGFudHMACQDMCAIJARdnZXRUdXJ0bGVCcmVlZGVyQWRkcmVzcwAJAMwIAgkBFWdldER1Y2tCcmVlZGVyQWRkcmVzcwAFA25pbAEQY2FsY1ByaWNlSW5Bc3NldAEKYmFzZUFtb3VudAkAZAIFCmJhc2VBbW91bnQJAGkCCQBpAgkAaAIFCmJhc2VBbW91bnQJAGQCCQENdHJ5R2V0SW50ZWdlcgEJARJnZXRTdGF0c0tleV9hbW91bnQAAAEA6AcJAJADAQkBEWdldEFsbG93ZWRNdXRhbnRzAAEHZ2V0Qm9vbAEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEJaXNUZXN0RW52AAkBB2dldEJvb2wBAgdURVNURU5WAQ9nZXRSYW5kb21OdW1iZXIECHZhcmlhbnRzBHR4SWQUaGF0Y2hpbmdGaW5pc2hIZWlnaHQGb2Zmc2V0BA9yYW5kb21TZWVkQmxvY2sJAQV2YWx1ZQEJAO0HAQkAZQIFFGhhdGNoaW5nRmluaXNoSGVpZ2h0AAEECnJhbmRvbUhhc2gJANQWAQkAywECBQR0eElkCQEFdmFsdWUBCAUPcmFuZG9tU2VlZEJsb2NrA3ZyZgkAagIJALIJAgUKcmFuZG9tSGFzaAUGb2Zmc2V0BQh2YXJpYW50cwEMZ2V0UmFuZG9tR2VuBQRnZW4xBGdlbjIEc3RlcAR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0BAlyYW5kb21OdW0JAQ9nZXRSYW5kb21OdW1iZXIEAAIFBHR4SWQFFGhhdGNoaW5nRmluaXNoSGVpZ2h0BQRzdGVwBANnZW4DCQAAAgUJcmFuZG9tTnVtAAAFBGdlbjEFBGdlbjIFA2dlbgEIZ2VuZXJhdGUEBHR4SWQMZmluaXNoSGVpZ2h0CXBhcmVudDFJZAlwYXJlbnQySWQEC2NvbG9yUmFuZG9tCQEPZ2V0UmFuZG9tTnVtYmVyBABkBQR0eElkBQxmaW5pc2hIZWlnaHQACwQFY29sb3IDCQBmAgAaBQtjb2xvclJhbmRvbQIBQQMJAGYCADAFC2NvbG9yUmFuZG9tAgFCAwkAZgIARgULY29sb3JSYW5kb20CAUMDCQBmAgBaBQtjb2xvclJhbmRvbQIBRAIBRwQKcGFyZW50MUdlbgkAtQkCCAkBBXZhbHVlAQkA7AcBBQlwYXJlbnQxSWQEbmFtZQIABApwYXJlbnQyR2VuCQC1CQIICQEFdmFsdWUBCQDsBwEFCXBhcmVudDJJZARuYW1lAgAEA2dlbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgVNVE5ULQkBDGdldFJhbmRvbUdlbgUJAKwCAgkAkQMCBQpwYXJlbnQxR2VuAAAJAJEDAgUKcGFyZW50MUdlbgAFCQCsAgIJAJEDAgUKcGFyZW50MkdlbgAACQCRAwIFCnBhcmVudDJHZW4ABQAABQR0eElkBQxmaW5pc2hIZWlnaHQJAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ABgkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAYAAQUEdHhJZAUMZmluaXNoSGVpZ2h0CQEMZ2V0UmFuZG9tR2VuBQkArAICCQCRAwIFCnBhcmVudDFHZW4AAAkAkQMCBQpwYXJlbnQxR2VuAAcJAKwCAgkAkQMCBQpwYXJlbnQyR2VuAAAJAJEDAgUKcGFyZW50MkdlbgAHAAIFBHR4SWQFDGZpbmlzaEhlaWdodAkBDGdldFJhbmRvbUdlbgUJAKwCAgkAkQMCBQpwYXJlbnQxR2VuAAAJAJEDAgUKcGFyZW50MUdlbgAICQCsAgIJAJEDAgUKcGFyZW50MkdlbgAACQCRAwIFCnBhcmVudDJHZW4ACAADBQR0eElkBQxmaW5pc2hIZWlnaHQJAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ACQkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAkABAUEdHhJZAUMZmluaXNoSGVpZ2h0CQEMZ2V0UmFuZG9tR2VuBQkArAICCQCRAwIFCnBhcmVudDFHZW4AAAkAkQMCBQpwYXJlbnQxR2VuAAoJAKwCAgkAkQMCBQpwYXJlbnQyR2VuAAAJAJEDAgUKcGFyZW50MkdlbgAKAAUFBHR4SWQFDGZpbmlzaEhlaWdodAkBDGdldFJhbmRvbUdlbgUJAKwCAgkAkQMCBQpwYXJlbnQxR2VuAAAJAJEDAgUKcGFyZW50MUdlbgALCQCsAgIJAJEDAgUKcGFyZW50MkdlbgAACQCRAwIFCnBhcmVudDJHZW4ACwAGBQR0eElkBQxmaW5pc2hIZWlnaHQJAQxnZXRSYW5kb21HZW4FCQCsAgIJAJEDAgUKcGFyZW50MUdlbgAACQCRAwIFCnBhcmVudDFHZW4ADAkArAICCQCRAwIFCnBhcmVudDJHZW4AAAkAkQMCBQpwYXJlbnQyR2VuAAwABwUEdHhJZAUMZmluaXNoSGVpZ2h0AgItRwUFY29sb3IFA2dlbgEIaXNTeW1ib2wCA2FjYwNzeW0DCQAAAgUDc3ltCAUDYWNjAl8yCQCUCgIJAGQCCAUDYWNjAl8xAAEIBQNhY2MCXzIJAJQKAgkAZAIIBQNhY2MCXzEAAAgFA2FjYwJfMgEQZ2V0QW1vdW50T3JDbGVhcgEGYW1vdW50AwkBCGNvbnRhaW5zAgUGYW1vdW50AgEwAgAFBmFtb3VudAEIY2hhckxpc3QACQDMCAICAUEJAMwIAgIBQgkAzAgCAgFDCQDMCAICAUQJAMwIAgIBRQkAzAgCAgFGCQDMCAICAUcJAMwIAgIBSAkAzAgCAgFJCQDMCAICAUoJAMwIAgIBSwkAzAgCAgFMCQDMCAICAU0JAMwIAgIBTgkAzAgCAgFPCQDMCAICAVAJAMwIAgIBUQkAzAgCAgFSCQDMCAICAVMJAMwIAgIBVAkAzAgCAgFVCQDMCAICAVYJAMwIAgIBVwkAzAgCAgFYCQDMCAICAVkJAMwIAgIBWgUDbmlsARFnZXRSYXJpdHlGcm9tTmFtZQEEbmFtZQQFY29sb3IJALICAgUEbmFtZQABBAhnZW5vdHlwZQkAtQkCCQCzAgIJALACAgUEbmFtZQAFAAMCAAQIZ2VuZXRpY3MJAMwIAgkAkQMCBQhnZW5vdHlwZQABCQDMCAIJAJEDAgUIZ2Vub3R5cGUAAwkAzAgCCQCRAwIFCGdlbm90eXBlAAUJAMwIAgkAkQMCBQhnZW5vdHlwZQAHCQDMCAIJAJEDAgUIZ2Vub3R5cGUACQkAzAgCCQCRAwIFCGdlbm90eXBlAAsJAMwIAgkAkQMCBQhnZW5vdHlwZQANCQDMCAIJAJEDAgUIZ2Vub3R5cGUADwUDbmlsCgENY29tcG9zZVN0cmluZwIDYWNjBGNoYXIECWNoYXJDb3VudAoAAiRsBQhnZW5ldGljcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQRjaGFyCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhpc1N5bWJvbAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgJAKwCAgUDYWNjCQEQZ2V0QW1vdW50T3JDbGVhcgEJAKwCAgkApAMBCAUJY2hhckNvdW50Al8xBQRjaGFyCQCsAgIJAKwCAgoAAiRsCQEIY2hhckxpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1jb21wb3NlU3RyaW5nAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoCAS0FBWNvbG9yAQ1uck9mVHlwZUdlbmVzAQNnZW4ECGdlbm90eXBlCQC1CQIJALMCAgkAsAICBQNnZW4ABQADAgAEBnBhcnRzMQkArAICCQCRAwIFCGdlbm90eXBlAAAJAJEDAgUIZ2Vub3R5cGUAAQQGcGFydHMyCQCsAgIJAJEDAgUIZ2Vub3R5cGUAAgkAkQMCBQhnZW5vdHlwZQADBAZwYXJ0czMJAKwCAgkAkQMCBQhnZW5vdHlwZQAECQCRAwIFCGdlbm90eXBlAAUEBnBhcnRzNAkArAICCQCRAwIFCGdlbm90eXBlAAYJAJEDAgUIZ2Vub3R5cGUABwQGcGFydHM1CQCsAgIJAJEDAgUIZ2Vub3R5cGUACAkAkQMCBQhnZW5vdHlwZQAJBAZwYXJ0czYJAKwCAgkAkQMCBQhnZW5vdHlwZQAKCQCRAwIFCGdlbm90eXBlAAsEBnBhcnRzNwkArAICCQCRAwIFCGdlbm90eXBlAAwJAJEDAgUIZ2Vub3R5cGUADQQGcGFydHM4CQCsAgIJAJEDAgUIZ2Vub3R5cGUADgkAkQMCBQhnZW5vdHlwZQAPBAVwYXJ0cwkAzAgCBQZwYXJ0czEJAMwIAgUGcGFydHMyCQDMCAIFBnBhcnRzMwkAzAgCBQZwYXJ0czQJAMwIAgUGcGFydHM1CQDMCAIFBnBhcnRzNgkAzAgCBQZwYXJ0czcJAMwIAgUGcGFydHM4BQNuaWwKAQ9zb3J0UGFydHNCeVR5cGUCA2FjYwRwYXJ0BApzcGxpdFBhcnRzCQC1CQIFBHBhcnQCAAMJAAACCQCRAwIFCnNwbGl0UGFydHMAAAIBVAkAlgoECQDNCAIIBQNhY2MCXzEJAJEDAgUKc3BsaXRQYXJ0cwABCAUDYWNjAl8yCAUDYWNjAl8zCAUDYWNjAl80AwkAAAIJAJEDAgUKc3BsaXRQYXJ0cwAAAgFECQCWCgQIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQpzcGxpdFBhcnRzAAEIBQNhY2MCXzMIBQNhY2MCXzQDCQAAAgkAkQMCBQpzcGxpdFBhcnRzAAACAUMJAJYKBAgFA2FjYwJfMQgFA2FjYwJfMgkAzQgCCAUDYWNjAl8zCQCRAwIFCnNwbGl0UGFydHMAAQgFA2FjYwJfNAMJAAACCQCRAwIFCnNwbGl0UGFydHMAAAIBSAkAlgoE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AgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoEEmZpbmlzaGVkVHVydGxlR2VucwMJAAACBQp0dXJ0bGVHZW5zAgACAAkArAICCQCsAgICAlQ6BQp0dXJ0bGVHZW5zAgFfBBBmaW5pc2hlZER1Y2tHZW5zAwkAAAIFCGR1Y2tHZW5zAgACAAkArAICCQCsAgICAkQ6BQhkdWNrR2VucwIBXwQPZmluaXNoZWRDYXRHZW5zAwkAAAIFB2NhdEdlbnMCAAIACQCsAgIJAKwCAgICQzoFB2NhdEdlbnMCAV8EEGZpbmlzaGVkSG9uZEdlbnMDCQAAAgUIaG9uZEdlbnMCAAIACQCsAgIJAKwCAgICSDoFCGhvbmRHZW5zAgFfCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgIMREVCVUdfVFVSVExFBQp0dXJ0bGVHZW5zCQDMCAIJAQtTdHJpbmdFbnRyeQICCkRFQlVHX0RVQ0sFCGR1Y2tHZW5zCQDMCAIJAQtTdHJpbmdFbnRyeQICCURFQlVHX0NBVAUHY2F0R2VucwkAzAgCCQELU3RyaW5nRW50cnkCAgpERUJVR19IT05EBQhob25kR2VucwUDbmlsCQCsAgIJAKwCAgkArAICBRJmaW5pc2hlZFR1cnRsZUdlbnMFEGZpbmlzaGVkRHVja0dlbnMFD2ZpbmlzaGVkQ2F0R2VucwUIaG9uZEdlbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BFnZhbGlkYXRlSWZNdXRhbnRGYWlsZWQBBnJhcml0eQMJAGYCAAMJAJADAQkAtQkCBQZyYXJpdHkCAToGBwEWZmluaXNoSGF0Y2hpbmdJbnRlcm5hbAIEdHhJZAVvd25lcgQQcHJvY2Vzc1N0YXR1c0tleQkBE2dldFByb2Nlc3NTdGF0dXNLZXkCBQVvd25lcgUEdHhJZAQPZmluaXNoSGVpZ2h0S2V5CQEZZ2V0UHJvY2Vzc0ZpbmlzaEhlaWdodEtleQIFBW93bmVyBQR0eElkBAVJZEtleQkBCGdldElkS2V5AgUFb3duZXIFBHR4SWQED3Byb2Nlc3NUeFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUQcHJvY2Vzc1N0YXR1c0tleQQTcHJvY2Vzc0ZpbmlzaEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUPZmluaXNoSGVpZ2h0S2V5AwkAAAIFD3Byb2Nlc3NUeFN0YXR1cwkBEGhhdGNoaW5nRmluaXNoZWQABAJJZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkBCGdldElkS2V5AgUFb3duZXIFBHR4SWQJAAIBCQCsAgICQlRoZSBNVVRBTlQgd2FzIGJyZWVkZWQgYW5kIGNsYWltZWQgYWxyZWFkeSwgaGVyZSBpcyB0aGUgZm9sb3dpbmc6IAUCSWQDCQBmAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAUGaGVpZ2h0CQACAQkArAICCQCsAgIJAKwCAgkArAICAh1CcmVlZGluZyBpcyBub3QgZmluaXNoZWQgeWV0IAkApAMBCQBlAgUTcHJvY2Vzc0ZpbmlzaEhlaWdodAUGaGVpZ2h0AicgYmxvY2tzIHJlbWFpbmluZywgaXQgd2lsbCB0YWtlIGFyb3VuZCAJAKQDAQkAZQIFE3Byb2Nlc3NGaW5pc2hIZWlnaHQFBmhlaWdodAIIIG1pbnV0ZXMECXBhcmVudDFJZAkBDHRyeUdldFN0cmluZwEJAQxnZXRQYXJlbnRLZXkCCQDZBAEFBHR4SWQAAQQJcGFyZW50MklkCQEMdHJ5R2V0U3RyaW5nAQkBDGdldFBhcmVudEtleQIJANkEAQUEdHhJZAACBA5wYXJlbnQxSWRCeXRlcwkA2QQBBQlwYXJlbnQxSWQEDnBhcmVudDJJZEJ5dGVzCQDZBAEFCXBhcmVudDJJZAQDZ2VuCQEIZ2VuZXJhdGUECQDZBAEFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQFDnBhcmVudDFJZEJ5dGVzBQ5wYXJlbnQySWRCeXRlcwQHZmFybUdlbgkBDW5yT2ZUeXBlR2VuZXMBBQNnZW4EDnJhcml0eUZyb21OYW1lCQERZ2V0UmFyaXR5RnJvbU5hbWUBBQNnZW4ECWFtb3VudEdlbgkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkBC2dldFN0YXRzS2V5AQUDZ2VuAAEEBmFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkBEmdldFN0YXRzS2V5X2Ftb3VudAAAAQQFYXNzZXQJAMMIBwkArAICAgVNVE5ULQkApAMBBQZhbW91bnQFA2dlbgABAAAHBQR1bml0BRNwcm9jZXNzRmluaXNoSGVpZ2h0BAdhc3NldElkCQC4CAEFBWFzc2V0BAhxdWFudGl0eQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIGc3RhdHNfCAUHZmFybUdlbgJfMgIJX3F1YW50aXR5BAZyYXJpdHkJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBnN0YXRzXwUOcmFyaXR5RnJvbU5hbWUCB19yYXJpdHkEDm93bmVyQXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQVvd25lcgQGZmFpbGVkCQEWdmFsaWRhdGVJZk11dGFudEZhaWxlZAEIBQdmYXJtR2VuAl8yBA50cmFuc2Zlck9yQnVybgMFBmZhaWxlZAkBBEJ1cm4CBQdhc3NldElkAAEJAQ5TY3JpcHRUcmFuc2ZlcgMFDm93bmVyQXNBZGRyZXNzAAEFB2Fzc2V0SWQEFXRyYW5zZmVyT3JCdXJuUGFyZW50MQMJAAACCQEPZ2V0UmFuZG9tTnVtYmVyBAAKCQDZBAEFBHR4SWQFE3Byb2Nlc3NGaW5pc2hIZWlnaHQAAgAFCQEEQnVybgIFDnBhcmVudDFJZEJ5dGVzAAEJAQ5TY3JpcHRUcmFuc2ZlcgMFDm93bmVyQXNBZGRyZXNzAAEFDnBhcmVudDFJZEJ5dGVzBBV0cmFuc2Zlck9yQnVyblBhcmVudDIDCQAAAgkBD2dldFJhbmRvbU51bWJlcgQACgkA2QQBBQR0eElkBRNwcm9jZXNzRmluaXNoSGVpZ2h0AAMABQkBBEJ1cm4CBQ5wYXJlbnQySWRCeXRlcwABCQEOU2NyaXB0VHJhbnNmZXIDBQ5vd25lckFzQWRkcmVzcwABBQ5wYXJlbnQySWRCeXRlcwkAzAgCCQELU3RyaW5nRW50cnkCBRBwcm9jZXNzU3RhdHVzS2V5CQEQaGF0Y2hpbmdGaW5pc2hlZAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUFSWRLZXkJANgEAQUHYXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQDYBAEFB2Fzc2V0SWQFBUlkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQELZ2V0U3RhdHNLZXkBBQNnZW4FCWFtb3VudEdlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmdldFN0YXRzS2V5X2Ftb3VudAAFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBnN0YXRzXwgFB2Zhcm1HZW4CXzICCV9xdWFudGl0eQkAZAIFCHF1YW50aXR5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZzdGF0c18FDnJhcml0eUZyb21OYW1lAgdfcmFyaXR5CQBkAgUGcmFyaXR5AAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FCXBhcmVudDFJZAIJX2NoaWxkcmVuAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZhc3NldF8FCXBhcmVudDJJZAIJX2NoaWxkcmVuAAEJAMwIAgUFYXNzZXQJAMwIAgUOdHJhbnNmZXJPckJ1cm4JAMwIAgUVdHJhbnNmZXJPckJ1cm5QYXJlbnQxCQDMCAIFFXRyYW5zZmVyT3JCdXJuUGFyZW50MgUDbmlsARZjaGVja0FkZGl0aW9uYWxQYXltZW50AQdwYXltZW50AwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhlCQ0FQOiBQbGVhc2UgYXR0YWNoIHdhdmVzBAlmZWVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQlnZXRPcmFjbGUACQESc3RhdGljS2V5X2V4dHJhRmVlAAMJAQIhPQIIBQdwYXltZW50BmFtb3VudAUJZmVlQW1vdW50CQACAQkArAICCQCsAgICHEJDQVA6IFBsZWFzZSBhdHRhY2ggZXhhY3RseSAJAKQDAQUJZmVlQW1vdW50AhMgYW1vdW50IG9mIHdhdmVsZXRzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARBnZXRGZWVBZ2dyZWdhdG9yAAUJZmVlQW1vdW50BQR1bml0BQNuaWwBGmNoZWNrVHlwZUFuZFZhbGlkT2JzdGluYXRlAQRpbmZvBAhzcGxpdHRlZAkAtQkCCAUEaW5mbwRuYW1lAgAEBHR5cGUJAJEDAgUIc3BsaXR0ZWQAAAQDZ2VuCQCRAwIFCHNwbGl0dGVkAA4DCQECIT0CBQNnZW4CAU8JAAIBAjJNQ1RBVk86IE9ubHkgb2JzdGluYXRlcyBjYW4gYmUgdHVybmVkIGludG8gbXV0YW50cwQJYnJlZWRlclNjAwkAAAIFBHR5cGUCAVQJARdnZXRUdXJ0bGVCcmVlZGVyQWRkcmVzcwADCQAAAgUEdHlwZQIBRAkBFWdldER1Y2tCcmVlZGVyQWRkcmVzcwAJAAIBAhRNQ1RBVk86IEludmFsaWQgdHlwZQMJAQIhPQIFCWJyZWVkZXJTYwgFBGluZm8GaXNzdWVyCQACAQJMTUNUQVZPOiBPbmx5IG9ic3RpbmF0ZXMgZnJvbSB0aGUgYnJlZWRlciBjb250cmFjdCBjYW4gYmUgdHVybmVkIGludG8gbXV0YW50cwMJAAACCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQlicmVlZGVyU2MJANgEAQgFBGluZm8CaWQCAAkAAgECE01DVEFWTzogSW52YWxpZCBuZnQDCQAAAgkBDXRyeUdldEludGVnZXIBCQELZ2V0Q2hpbGRyZW4BCQDYBAEIBQRpbmZvAmlkAAEJAAIBAhhNQ1RBVk86IE5GVCBhbHJlYWR5IHVzZWQFBHR5cGUFAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPSUNVOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpARNzdGFydE11dGFudEhhdGNoaW5nAQ5yZWZlcmVyQWRkcmVzcwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMABQkAAgECGU1TTUg6IDUgcGF5bWVudHMgcmVxdWlyZWQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABCQACAQIgTVNNSDogMXN0IHBheW1lbnQgbXVzdCBiZSBhbiBORlQDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAABCQACAQIgTVNNSDogMm5kIHBheW1lbnQgbXVzdCBiZSBhbiBORlQEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAIDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQDAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAwdhc3NldElkCQEPZ2V0U3BpY2VBc3NldElkAAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAMGYW1vdW50CQEQY2FsY1ByaWNlSW5Bc3NldAEJAQ5iYXNlUHJpY2VTcGljZQAJAAIBAiJNU01IOiA0dGggcGF5bWVudCBtdXN0IGJlIGluIHNwaWNlAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAQHYXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQABgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMABAZhbW91bnQJARBjYWxjUHJpY2VJbkFzc2V0AQkBDGJhc2VQcmljZUVnZwAJAAIBAiBNU01IOiA1dGggcGF5bWVudCBtdXN0IGJlIGluIGVnZwQEbmZ0MQkBBXZhbHVlAQkA7AcBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEBG5mdDIJAQV2YWx1ZQEJAOwHAQkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBAV0eXBlMQkBGmNoZWNrVHlwZUFuZFZhbGlkT2JzdGluYXRlAQUEbmZ0MQQFdHlwZTIJARpjaGVja1R5cGVBbmRWYWxpZE9ic3RpbmF0ZQEFBG5mdDIDCQAAAgUFdHlwZTEFBXR5cGUyCQACAQImTVNNSDogTkZUcyBjYW4gbm90IGJlIG9mIHRoZSBzYW1lIHR5cGUJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEMZ2V0UGFyZW50S2V5AggFAWkNdHJhbnNhY3Rpb25JZAABCQDYBAEIBQRuZnQxAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxnZXRQYXJlbnRLZXkCCAUBaQ10cmFuc2FjdGlvbklkAAIJANgEAQgFBG5mdDICaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2dldFByb2Nlc3NTdGF0dXNLZXkCCQClCAEIBQFpBmNhbGxlcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQEPaGF0Y2hpbmdTdGFydGVkAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkCCQClCAEIBQFpBmNhbGxlcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQBkAgUGaGVpZ2h0CQEQZGVsYXlGb3JIYXRjaGluZwAFA25pbAUMdmFsaWRQYXltZW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFGZpbmlzaE11dGFudEhhdGNoaW5nAQd0eElkU3RyBAVvd25lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAh9NRk1IOiBXcm9uZyBhbW91bnQgb2YgcGF5bWVudHMhBAtmZWVWYWxpZGF0ZQkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAgULZmVlVmFsaWRhdGUFC2ZlZVZhbGlkYXRlCQDOCAIJARZmaW5pc2hIYXRjaGluZ0ludGVybmFsAgUHdHhJZFN0cgUFb3duZXIFC2ZlZVZhbGlkYXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWdldFJhcml0eQEIZ2Vub3R5cGUEDnJhcml0eUZyb21OYW1lCQERZ2V0UmFyaXR5RnJvbU5hbWUBBQhnZW5vdHlwZQQIcXVhbnRpdHkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIGc3RhdHNfBQ5yYXJpdHlGcm9tTmFtZQIHX3Jhcml0eQkArAICCQCsAgICBnN0YXRzXwUOcmFyaXR5RnJvbU5hbWUCB19yYXJpdHkEBXBvd2VyCQBsBgkAaQIAkE4FCHF1YW50aXR5AAQABQABAAIFBUZMT09SBAZyYXJpdHkDCQBmAgUFcG93ZXIAAAUFcG93ZXIAAgkAlAoCBQNuaWwJAJQKAgUOcmFyaXR5RnJvbU5hbWUFBnJhcml0eQFpAQxyZWR1Y2VSYXJpdHkCB2Fzc2V0SWQEZkdlbgkAAgECFE1SUjogTm90IGltcGxlbWVudGVkAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASBccg5LrvEhT2bmGUX6aqKx7bE2KVlfGczMsOFNQYhqfQQJdGhpcmRVc2VyASCgr5HlLXlDYWEyEq2OufoYWVGdLVNJNsPQo/eoYBk7TgQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAjp40As=", "height": 3316722, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func basePriceSpice () = 1000000000
5+
6+
7+func basePriceEgg () = 200000000
8+
9+
10+func delayForHatching () = 2
11+
12+
13+func hatchingStarted () = "BREEDING_STARTED"
14+
15+
16+func hatchingFinished () = "BREEDING_FINISHED"
17+
18+
19+func staticKey_eggAssetId () = "static_eggAssetId"
20+
21+
22+func staticKey_spiceAssetId () = "static_spiceAssetId"
23+
24+
25+func staticKey_duckBreederAddress () = "static_breederAddress"
26+
27+
28+func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
29+
30+
31+func staticKey_oracleAddress () = "static_oracleAddress"
32+
33+
34+func staticKey_extraFee () = "static_extraFee"
35+
36+
37+func staticKey_feeAggregator () = "static_feeAggregator"
38+
39+
40+func getStatsKey_amount () = "stats_amount"
41+
42+
43+func getStatsKey (genString) = (("stats_" + genString) + "_amount")
44+
45+
46+func getChildren (assetId) = (("asset_" + assetId) + "_children")
47+
48+
49+func getParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
50+
51+
52+func getProcessStatusKey (address,txId) = (((address + "_") + txId) + "_status")
53+
54+
55+func getProcessFinishHeightKey (address,txId) = (((address + "_") + txId) + "_fh")
56+
57+
58+func getIdKey (address,txId) = (((address + "_") + txId) + "_di")
59+
60+
61+func tryGetStringExternal (address,key) = match getString(address, key) {
62+ case a: String =>
63+ a
64+ case _ =>
65+ ""
66+}
67+
68+
69+func tryGetString (key) = tryGetStringExternal(this, key)
70+
71+
72+func tryGetInteger (key) = {
73+ let val = match getInteger(this, key) {
74+ case b: Int =>
75+ b
76+ case _ =>
77+ 0
78+ }
79+ val
80+ }
81+
82+
83+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
84+
85+
86+func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
87+
88+
89+func getDuckBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckBreederAddress())))
90+
91+
92+func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
93+
94+
95+func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
96+
97+
98+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
99+
100+
101+func getAllowedMutants () = [getTurtleBreederAddress(), getDuckBreederAddress()]
102+
103+
104+func calcPriceInAsset (baseAmount) = (baseAmount + (((baseAmount * (tryGetInteger(getStatsKey_amount()) + 1)) / 1000) / size(getAllowedMutants())))
105+
106+
107+func getBool (key) = match getBoolean(this, key) {
108+ case b: Boolean =>
109+ b
110+ case _ =>
111+ false
112+}
113+
114+
115+func isTestEnv () = getBool("TESTENV")
116+
117+
118+func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
119+ let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
120+ let randomHash = sha256_16Kb((txId + value(randomSeedBlock.vrf)))
121+ (toInt(randomHash, offset) % variants)
122+ }
123+
124+
125+func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
126+ let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
127+ let gen = if ((randomNum == 0))
128+ then gen1
129+ else gen2
130+ gen
131+ }
132+
133+
134+func generate (txId,finishHeight,parent1Id,parent2Id) = {
135+ let colorRandom = getRandomNumber(100, txId, finishHeight, 11)
136+ let color = if ((26 > colorRandom))
137+ then "A"
138+ else if ((48 > colorRandom))
139+ then "B"
140+ else if ((70 > colorRandom))
141+ then "C"
142+ else if ((90 > colorRandom))
143+ then "D"
144+ else "G"
145+ let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
146+ let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
147+ 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)
148+ gen
149+ }
150+
151+
152+func isSymbol (acc,sym) = if ((sym == acc._2))
153+ then $Tuple2((acc._1 + 1), acc._2)
154+ else $Tuple2((acc._1 + 0), acc._2)
155+
156+
157+func getAmountOrClear (amount) = if (contains(amount, "0"))
158+ then ""
159+ else amount
160+
161+
162+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"]
163+
164+
165+func getRarityFromName (name) = {
166+ let color = takeRight(name, 1)
167+ let genotype = split(dropRight(drop(name, 5), 3), "")
168+ let genetics = [genotype[1], genotype[3], genotype[5], genotype[7], genotype[9], genotype[11], genotype[13], genotype[15]]
169+ func composeString (acc,char) = {
170+ let charCount = {
171+ let $l = genetics
172+ let $s = size($l)
173+ let $acc0 = $Tuple2(0, char)
174+ func $f0_1 ($a,$i) = if (($i >= $s))
175+ then $a
176+ else isSymbol($a, $l[$i])
177+
178+ func $f0_2 ($a,$i) = if (($i >= $s))
179+ then $a
180+ else throw("List size exceeds 8")
181+
182+ $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)
183+ }
184+ (acc + getAmountOrClear((toString(charCount._1) + char)))
185+ }
186+
187+ (({
188+ let $l = charList()
189+ let $s = size($l)
190+ let $acc0 = ""
191+ func $f0_1 ($a,$i) = if (($i >= $s))
192+ then $a
193+ else composeString($a, $l[$i])
194+
195+ func $f0_2 ($a,$i) = if (($i >= $s))
196+ then $a
197+ else throw("List size exceeds 26")
198+
199+ $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)
200+ } + "-") + color)
201+ }
202+
203+
204+func nrOfTypeGenes (gen) = {
205+ let genotype = split(dropRight(drop(gen, 5), 3), "")
206+ let parts1 = (genotype[0] + genotype[1])
207+ let parts2 = (genotype[2] + genotype[3])
208+ let parts3 = (genotype[4] + genotype[5])
209+ let parts4 = (genotype[6] + genotype[7])
210+ let parts5 = (genotype[8] + genotype[9])
211+ let parts6 = (genotype[10] + genotype[11])
212+ let parts7 = (genotype[12] + genotype[13])
213+ let parts8 = (genotype[14] + genotype[15])
214+ let parts = [parts1, parts2, parts3, parts4, parts5, parts6, parts7, parts8]
215+ func sortPartsByType (acc,part) = {
216+ let splitParts = split(part, "")
217+ if ((splitParts[0] == "T"))
218+ then $Tuple4((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4)
219+ else if ((splitParts[0] == "D"))
220+ then $Tuple4(acc._1, (acc._2 :+ splitParts[1]), acc._3, acc._4)
221+ else if ((splitParts[0] == "C"))
222+ then $Tuple4(acc._1, acc._2, (acc._3 :+ splitParts[1]), acc._4)
223+ else if ((splitParts[0] == "H"))
224+ then $Tuple4(acc._1, acc._2, acc._3, (acc._4 :+ splitParts[1]))
225+ else throw("UNKNOWN TYPE")
226+ }
227+
228+ let result = {
229+ let $l = parts
230+ let $s = size($l)
231+ let $acc0 = $Tuple4(nil, nil, nil, nil)
232+ func $f0_1 ($a,$i) = if (($i >= $s))
233+ then $a
234+ else sortPartsByType($a, $l[$i])
235+
236+ func $f0_2 ($a,$i) = if (($i >= $s))
237+ then $a
238+ else throw("List size exceeds 8")
239+
240+ $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)
241+ }
242+ if ((result == result))
243+ then {
244+ func composeStringTurtle (acc,char) = {
245+ let charCount = {
246+ let $l = result._1
247+ let $s = size($l)
248+ let $acc0 = $Tuple2(0, char)
249+ func $f1_1 ($a,$i) = if (($i >= $s))
250+ then $a
251+ else isSymbol($a, $l[$i])
252+
253+ func $f1_2 ($a,$i) = if (($i >= $s))
254+ then $a
255+ else throw("List size exceeds 8")
256+
257+ $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)
258+ }
259+ (acc + getAmountOrClear((toString(charCount._1) + char)))
260+ }
261+
262+ func composeStringDuck (acc,char) = {
263+ let charCount = {
264+ let $l = result._2
265+ let $s = size($l)
266+ let $acc0 = $Tuple2(0, char)
267+ func $f1_1 ($a,$i) = if (($i >= $s))
268+ then $a
269+ else isSymbol($a, $l[$i])
270+
271+ func $f1_2 ($a,$i) = if (($i >= $s))
272+ then $a
273+ else throw("List size exceeds 8")
274+
275+ $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)
276+ }
277+ (acc + getAmountOrClear((toString(charCount._1) + char)))
278+ }
279+
280+ func composeStringCat (acc,char) = {
281+ let charCount = {
282+ let $l = result._3
283+ let $s = size($l)
284+ let $acc0 = $Tuple2(0, char)
285+ func $f1_1 ($a,$i) = if (($i >= $s))
286+ then $a
287+ else isSymbol($a, $l[$i])
288+
289+ func $f1_2 ($a,$i) = if (($i >= $s))
290+ then $a
291+ else throw("List size exceeds 8")
292+
293+ $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)
294+ }
295+ (acc + getAmountOrClear((toString(charCount._1) + char)))
296+ }
297+
298+ func composeStringDog (acc,char) = {
299+ let charCount = {
300+ let $l = result._4
301+ let $s = size($l)
302+ let $acc0 = $Tuple2(0, char)
303+ func $f1_1 ($a,$i) = if (($i >= $s))
304+ then $a
305+ else isSymbol($a, $l[$i])
306+
307+ func $f1_2 ($a,$i) = if (($i >= $s))
308+ then $a
309+ else throw("List size exceeds 8")
310+
311+ $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)
312+ }
313+ (acc + getAmountOrClear((toString(charCount._1) + char)))
314+ }
315+
316+ let turtleGens = {
317+ let $l = charList()
318+ let $s = size($l)
319+ let $acc0 = ""
320+ func $f1_1 ($a,$i) = if (($i >= $s))
321+ then $a
322+ else composeStringTurtle($a, $l[$i])
323+
324+ func $f1_2 ($a,$i) = if (($i >= $s))
325+ then $a
326+ else throw("List size exceeds 26")
327+
328+ $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)
329+ }
330+ let duckGens = {
331+ let $l = charList()
332+ let $s = size($l)
333+ let $acc0 = ""
334+ func $f2_1 ($a,$i) = if (($i >= $s))
335+ then $a
336+ else composeStringDuck($a, $l[$i])
337+
338+ func $f2_2 ($a,$i) = if (($i >= $s))
339+ then $a
340+ else throw("List size exceeds 26")
341+
342+ $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)
343+ }
344+ let catGens = {
345+ let $l = charList()
346+ let $s = size($l)
347+ let $acc0 = ""
348+ func $f3_1 ($a,$i) = if (($i >= $s))
349+ then $a
350+ else composeStringCat($a, $l[$i])
351+
352+ func $f3_2 ($a,$i) = if (($i >= $s))
353+ then $a
354+ else throw("List size exceeds 26")
355+
356+ $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)
357+ }
358+ let hondGens = {
359+ let $l = charList()
360+ let $s = size($l)
361+ let $acc0 = ""
362+ func $f4_1 ($a,$i) = if (($i >= $s))
363+ then $a
364+ else composeStringDog($a, $l[$i])
365+
366+ func $f4_2 ($a,$i) = if (($i >= $s))
367+ then $a
368+ else throw("List size exceeds 26")
369+
370+ $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)
371+ }
372+ let finishedTurtleGens = if ((turtleGens == ""))
373+ then ""
374+ else (("T:" + turtleGens) + "_")
375+ let finishedDuckGens = if ((duckGens == ""))
376+ then ""
377+ else (("D:" + duckGens) + "_")
378+ let finishedCatGens = if ((catGens == ""))
379+ then ""
380+ else (("C:" + catGens) + "_")
381+ let finishedHondGens = if ((hondGens == ""))
382+ then ""
383+ else (("H:" + hondGens) + "_")
384+ $Tuple2([StringEntry("DEBUG_TURTLE", turtleGens), StringEntry("DEBUG_DUCK", duckGens), StringEntry("DEBUG_CAT", catGens), StringEntry("DEBUG_HOND", hondGens)], (((finishedTurtleGens + finishedDuckGens) + finishedCatGens) + hondGens))
385+ }
386+ else throw("Strict value is not equal to itself.")
387+ }
388+
389+
390+func validateIfMutantFailed (rarity) = if ((3 > size(split(rarity, ":"))))
391+ then true
392+ else false
393+
394+
395+func finishHatchingInternal (txId,owner) = {
396+ let processStatusKey = getProcessStatusKey(owner, txId)
397+ let finishHeightKey = getProcessFinishHeightKey(owner, txId)
398+ let IdKey = getIdKey(owner, txId)
399+ let processTxStatus = getStringValue(this, processStatusKey)
400+ let processFinishHeight = getIntegerValue(this, finishHeightKey)
401+ if ((processTxStatus == hatchingFinished()))
402+ then {
403+ let Id = getStringValue(this, getIdKey(owner, txId))
404+ throw(("The MUTANT was breeded and claimed already, here is the folowing: " + Id))
405+ }
406+ else if ((processFinishHeight > height))
407+ then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
408+ else {
409+ let parent1Id = tryGetString(getParentKey(fromBase58String(txId), 1))
410+ let parent2Id = tryGetString(getParentKey(fromBase58String(txId), 2))
411+ let parent1IdBytes = fromBase58String(parent1Id)
412+ let parent2IdBytes = fromBase58String(parent2Id)
413+ let gen = generate(fromBase58String(txId), processFinishHeight, parent1IdBytes, parent2IdBytes)
414+ let farmGen = nrOfTypeGenes(gen)
415+ let rarityFromName = getRarityFromName(gen)
416+ let amountGen = (tryGetInteger(getStatsKey(gen)) + 1)
417+ let amount = (tryGetInteger(getStatsKey_amount()) + 1)
418+ let asset = Issue(("MTNT-" + toString(amount)), gen, 1, 0, false, unit, processFinishHeight)
419+ let assetId = calculateAssetId(asset)
420+ let quantity = tryGetInteger((("stats_" + farmGen._2) + "_quantity"))
421+ let rarity = tryGetInteger((("stats_" + rarityFromName) + "_rarity"))
422+ let ownerAsAddress = addressFromStringValue(owner)
423+ let failed = validateIfMutantFailed(farmGen._2)
424+ let transferOrBurn = if (failed)
425+ then Burn(assetId, 1)
426+ else ScriptTransfer(ownerAsAddress, 1, assetId)
427+ let transferOrBurnParent1 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 2) == 5))
428+ then Burn(parent1IdBytes, 1)
429+ else ScriptTransfer(ownerAsAddress, 1, parent1IdBytes)
430+ let transferOrBurnParent2 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 3) == 5))
431+ then Burn(parent2IdBytes, 1)
432+ else ScriptTransfer(ownerAsAddress, 1, parent2IdBytes)
433+[StringEntry(processStatusKey, hatchingFinished()), StringEntry(IdKey, toBase58String(assetId)), StringEntry(toBase58String(assetId), IdKey), IntegerEntry(getStatsKey(gen), amountGen), IntegerEntry(getStatsKey_amount(), 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]
434+ }
435+ }
436+
437+
438+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
439+ then throw("BCAP: Please attach waves")
440+ else {
441+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
442+ if ((payment.amount != feeAmount))
443+ then throw((("BCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
444+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
445+ }
446+
447+
448+func checkTypeAndValidObstinate (info) = {
449+ let splitted = split(info.name, "")
450+ let type = splitted[0]
451+ let gen = splitted[14]
452+ if ((gen != "O"))
453+ then throw("MCTAVO: Only obstinates can be turned into mutants")
454+ else {
455+ let breederSc = if ((type == "T"))
456+ then getTurtleBreederAddress()
457+ else if ((type == "D"))
458+ then getDuckBreederAddress()
459+ else throw("MCTAVO: Invalid type")
460+ if ((breederSc != info.issuer))
461+ then throw("MCTAVO: Only obstinates from the breeder contract can be turned into mutants")
462+ else if ((tryGetStringExternal(breederSc, toBase58String(info.id)) == ""))
463+ then throw("MCTAVO: Invalid nft")
464+ else if ((tryGetInteger(getChildren(toBase58String(info.id))) == 1))
465+ then throw("MCTAVO: NFT already used")
466+ else type
467+ }
468+ }
469+
470+
471+@Callable(i)
472+func configureOracle (oracle) = if ((i.caller != this))
473+ then throw("ICU: admin only")
474+ else [StringEntry("static_oracleAddress", oracle)]
475+
476+
477+
478+@Callable(i)
479+func startMutantHatching (refererAddress) = if ((size(i.payments) != 5))
480+ then throw("MSMH: 5 payments required")
481+ else if ((i.payments[0].amount != 1))
482+ then throw("MSMH: 1st payment must be an NFT")
483+ else if ((i.payments[1].amount != 1))
484+ then throw("MSMH: 2nd payment must be an NFT")
485+ else {
486+ let validPayment = checkAdditionalPayment(i.payments[2])
487+ if ((validPayment == validPayment))
488+ then if (if ((i.payments[3].assetId != getSpiceAssetId()))
489+ then true
490+ else (i.payments[3].amount != calcPriceInAsset(basePriceSpice())))
491+ then throw("MSMH: 4th payment must be in spice")
492+ else if (if ((i.payments[4].assetId != getEggAssetId()))
493+ then true
494+ else (i.payments[4].amount != calcPriceInAsset(basePriceEgg())))
495+ then throw("MSMH: 5th payment must be in egg")
496+ else {
497+ let nft1 = value(assetInfo(value(i.payments[0].assetId)))
498+ let nft2 = value(assetInfo(value(i.payments[1].assetId)))
499+ let type1 = checkTypeAndValidObstinate(nft1)
500+ let type2 = checkTypeAndValidObstinate(nft2)
501+ if ((type1 == type2))
502+ then throw("MSMH: NFTs can not be of the same type")
503+ 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)
504+ }
505+ else throw("Strict value is not equal to itself.")
506+ }
507+
508+
509+
510+@Callable(i)
511+func finishMutantHatching (txIdStr) = {
512+ let owner = toString(i.originCaller)
513+ if ((size(i.payments) != 1))
514+ then throw("MFMH: Wrong amount of payments!")
515+ else {
516+ let feeValidate = checkAdditionalPayment(i.payments[0])
517+ if ((feeValidate == feeValidate))
518+ then (finishHatchingInternal(txIdStr, owner) ++ feeValidate)
519+ else throw("Strict value is not equal to itself.")
520+ }
521+ }
522+
523+
524+
525+@Callable(i)
526+func getRarity (genotype) = {
527+ let rarityFromName = getRarityFromName(genotype)
528+ let quantity = valueOrErrorMessage(tryGetInteger((("stats_" + rarityFromName) + "_rarity")), (("stats_" + rarityFromName) + "_rarity"))
529+ let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
530+ let rarity = if ((power > 0))
531+ then power
532+ else 2
533+ $Tuple2(nil, $Tuple2(rarityFromName, rarity))
534+ }
535+
536+
537+
538+@Callable(i)
539+func reduceRarity (assetId,fGen) = throw("MRR: Not implemented")
540+
541+
542+@Verifier(tx)
543+func verify () = if (isTestEnv())
544+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
545+ else {
546+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
547+ let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
548+ let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
549+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
550+ then 1
551+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
552+ then 1
553+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
554+ then 1
555+ else 0
556+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
557+ then 1
558+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
559+ then 1
560+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
561+ then 1
562+ else 0
563+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
564+ then 1
565+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
566+ then 1
567+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
568+ then 1
569+ else 0
570+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
571+ match tx {
572+ case _ =>
573+ (signaturesCount >= 2)
574+ }
575+ }
576+

github/deemru/w8io/169f3d6 
49.55 ms