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