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:
Old | New | Differences | |
---|---|---|---|
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 ◑