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:
OldNewDifferences
3535
3636
3737 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"
3853
3954
4055 func getStatsKey_amount () = "stats_amount"
89104 func getDuckBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckBreederAddress())))
90105
91106
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+
92116 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
93117
94118
96120
97121
98122 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())))
99129
100130
101131 func getAllowedMutants () = [getTurtleBreederAddress(), getDuckBreederAddress()]
215245 func sortPartsByType (acc,part) = {
216246 let splitParts = split(part, "")
217247 if ((splitParts[0] == "T"))
218- then $Tuple4((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4)
248+ then $Tuple5((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4, acc._5)
219249 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")
226258 }
227259
228260 let result = {
229261 let $l = parts
230262 let $s = size($l)
231- let $acc0 = $Tuple4(nil, nil, nil, nil)
263+ let $acc0 = $Tuple5(nil, nil, nil, nil, nil)
232264 func $f0_1 ($a,$i) = if (($i >= $s))
233265 then $a
234266 else sortPartsByType($a, $l[$i])
313345 (acc + getAmountOrClear((toString(charCount._1) + char)))
314346 }
315347
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+
316366 let turtleGens = {
317367 let $l = charList()
318368 let $s = size($l)
369419
370420 $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)
371421 }
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+ }
372436 let finishedTurtleGens = if ((turtleGens == ""))
373437 then ""
374438 else (("T:" + turtleGens) + "_")
377441 else (("D:" + duckGens) + "_")
378442 let finishedCatGens = if ((catGens == ""))
379443 then ""
380- else (("C:" + catGens) + "_")
444+ else (("F:" + catGens) + "_")
381445 let finishedHondGens = if ((hondGens == ""))
382446 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))
385452 }
386453 else throw("Strict value is not equal to itself.")
387454 }
456523 then getTurtleBreederAddress()
457524 else if ((type == "D"))
458525 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")
460533 if ((breederSc != info.issuer))
461534 then throw("MCTAVO: Only obstinates from the breeder contract can be turned into mutants")
462535 else if ((tryGetStringExternal(breederSc, toBase58String(info.id)) == ""))
498571 let nft2 = value(assetInfo(value(i.payments[1].assetId)))
499572 let type1 = checkTypeAndValidObstinate(nft1)
500573 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.")
504585 }
505586 else throw("Strict value is not equal to itself.")
506587 }
570651 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
571652 match tx {
572653 case _ =>
573- (signaturesCount >= 2)
654+ (signaturesCount >= 1)
574655 }
575656 }
576657
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func basePriceSpice () = 1000000000
55
66
77 func basePriceEgg () = 200000000
88
99
1010 func delayForHatching () = 2
1111
1212
1313 func hatchingStarted () = "BREEDING_STARTED"
1414
1515
1616 func hatchingFinished () = "BREEDING_FINISHED"
1717
1818
1919 func staticKey_eggAssetId () = "static_eggAssetId"
2020
2121
2222 func staticKey_spiceAssetId () = "static_spiceAssetId"
2323
2424
2525 func staticKey_duckBreederAddress () = "static_breederAddress"
2626
2727
2828 func staticKey_turtleBreederAddress () = "static_turtleBreederAddress"
2929
3030
3131 func staticKey_oracleAddress () = "static_oracleAddress"
3232
3333
3434 func staticKey_extraFee () = "static_extraFee"
3535
3636
3737 func staticKey_feeAggregator () = "static_feeAggregator"
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"
3853
3954
4055 func getStatsKey_amount () = "stats_amount"
4156
4257
4358 func getStatsKey (genString) = (("stats_" + genString) + "_amount")
4459
4560
4661 func getChildren (assetId) = (("asset_" + assetId) + "_children")
4762
4863
4964 func getParentKey (txId,parentNum) = ((("inittx_" + toBase58String(txId)) + "_parent") + toString(parentNum))
5065
5166
5267 func getProcessStatusKey (address,txId) = (((address + "_") + txId) + "_status")
5368
5469
5570 func getProcessFinishHeightKey (address,txId) = (((address + "_") + txId) + "_fh")
5671
5772
5873 func getIdKey (address,txId) = (((address + "_") + txId) + "_di")
5974
6075
6176 func tryGetStringExternal (address,key) = match getString(address, key) {
6277 case a: String =>
6378 a
6479 case _ =>
6580 ""
6681 }
6782
6883
6984 func tryGetString (key) = tryGetStringExternal(this, key)
7085
7186
7287 func tryGetInteger (key) = {
7388 let val = match getInteger(this, key) {
7489 case b: Int =>
7590 b
7691 case _ =>
7792 0
7893 }
7994 val
8095 }
8196
8297
8398 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
8499
85100
86101 func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleBreederAddress())))
87102
88103
89104 func getDuckBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_duckBreederAddress())))
90105
91106
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+
92116 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
93117
94118
95119 func getSpiceAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_spiceAssetId()))
96120
97121
98122 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())))
99129
100130
101131 func getAllowedMutants () = [getTurtleBreederAddress(), getDuckBreederAddress()]
102132
103133
104134 func calcPriceInAsset (baseAmount) = (baseAmount + (((baseAmount * (tryGetInteger(getStatsKey_amount()) + 1)) / 1000) / size(getAllowedMutants())))
105135
106136
107137 func getBool (key) = match getBoolean(this, key) {
108138 case b: Boolean =>
109139 b
110140 case _ =>
111141 false
112142 }
113143
114144
115145 func isTestEnv () = getBool("TESTENV")
116146
117147
118148 func getRandomNumber (variants,txId,hatchingFinishHeight,offset) = {
119149 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
120150 let randomHash = sha256_16Kb((txId + value(randomSeedBlock.vrf)))
121151 (toInt(randomHash, offset) % variants)
122152 }
123153
124154
125155 func getRandomGen (gen1,gen2,step,txId,hatchingFinishHeight) = {
126156 let randomNum = getRandomNumber(2, txId, hatchingFinishHeight, step)
127157 let gen = if ((randomNum == 0))
128158 then gen1
129159 else gen2
130160 gen
131161 }
132162
133163
134164 func generate (txId,finishHeight,parent1Id,parent2Id) = {
135165 let colorRandom = getRandomNumber(100, txId, finishHeight, 11)
136166 let color = if ((26 > colorRandom))
137167 then "A"
138168 else if ((48 > colorRandom))
139169 then "B"
140170 else if ((70 > colorRandom))
141171 then "C"
142172 else if ((90 > colorRandom))
143173 then "D"
144174 else "G"
145175 let parent1Gen = split(value(assetInfo(parent1Id)).name, "")
146176 let parent2Gen = split(value(assetInfo(parent2Id)).name, "")
147177 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)
148178 gen
149179 }
150180
151181
152182 func isSymbol (acc,sym) = if ((sym == acc._2))
153183 then $Tuple2((acc._1 + 1), acc._2)
154184 else $Tuple2((acc._1 + 0), acc._2)
155185
156186
157187 func getAmountOrClear (amount) = if (contains(amount, "0"))
158188 then ""
159189 else amount
160190
161191
162192 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"]
163193
164194
165195 func getRarityFromName (name) = {
166196 let color = takeRight(name, 1)
167197 let genotype = split(dropRight(drop(name, 5), 3), "")
168198 let genetics = [genotype[1], genotype[3], genotype[5], genotype[7], genotype[9], genotype[11], genotype[13], genotype[15]]
169199 func composeString (acc,char) = {
170200 let charCount = {
171201 let $l = genetics
172202 let $s = size($l)
173203 let $acc0 = $Tuple2(0, char)
174204 func $f0_1 ($a,$i) = if (($i >= $s))
175205 then $a
176206 else isSymbol($a, $l[$i])
177207
178208 func $f0_2 ($a,$i) = if (($i >= $s))
179209 then $a
180210 else throw("List size exceeds 8")
181211
182212 $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)
183213 }
184214 (acc + getAmountOrClear((toString(charCount._1) + char)))
185215 }
186216
187217 (({
188218 let $l = charList()
189219 let $s = size($l)
190220 let $acc0 = ""
191221 func $f0_1 ($a,$i) = if (($i >= $s))
192222 then $a
193223 else composeString($a, $l[$i])
194224
195225 func $f0_2 ($a,$i) = if (($i >= $s))
196226 then $a
197227 else throw("List size exceeds 26")
198228
199229 $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)
200230 } + "-") + color)
201231 }
202232
203233
204234 func nrOfTypeGenes (gen) = {
205235 let genotype = split(dropRight(drop(gen, 5), 3), "")
206236 let parts1 = (genotype[0] + genotype[1])
207237 let parts2 = (genotype[2] + genotype[3])
208238 let parts3 = (genotype[4] + genotype[5])
209239 let parts4 = (genotype[6] + genotype[7])
210240 let parts5 = (genotype[8] + genotype[9])
211241 let parts6 = (genotype[10] + genotype[11])
212242 let parts7 = (genotype[12] + genotype[13])
213243 let parts8 = (genotype[14] + genotype[15])
214244 let parts = [parts1, parts2, parts3, parts4, parts5, parts6, parts7, parts8]
215245 func sortPartsByType (acc,part) = {
216246 let splitParts = split(part, "")
217247 if ((splitParts[0] == "T"))
218- then $Tuple4((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4)
248+ then $Tuple5((acc._1 :+ splitParts[1]), acc._2, acc._3, acc._4, acc._5)
219249 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")
226258 }
227259
228260 let result = {
229261 let $l = parts
230262 let $s = size($l)
231- let $acc0 = $Tuple4(nil, nil, nil, nil)
263+ let $acc0 = $Tuple5(nil, nil, nil, nil, nil)
232264 func $f0_1 ($a,$i) = if (($i >= $s))
233265 then $a
234266 else sortPartsByType($a, $l[$i])
235267
236268 func $f0_2 ($a,$i) = if (($i >= $s))
237269 then $a
238270 else throw("List size exceeds 8")
239271
240272 $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)
241273 }
242274 if ((result == result))
243275 then {
244276 func composeStringTurtle (acc,char) = {
245277 let charCount = {
246278 let $l = result._1
247279 let $s = size($l)
248280 let $acc0 = $Tuple2(0, char)
249281 func $f1_1 ($a,$i) = if (($i >= $s))
250282 then $a
251283 else isSymbol($a, $l[$i])
252284
253285 func $f1_2 ($a,$i) = if (($i >= $s))
254286 then $a
255287 else throw("List size exceeds 8")
256288
257289 $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)
258290 }
259291 (acc + getAmountOrClear((toString(charCount._1) + char)))
260292 }
261293
262294 func composeStringDuck (acc,char) = {
263295 let charCount = {
264296 let $l = result._2
265297 let $s = size($l)
266298 let $acc0 = $Tuple2(0, char)
267299 func $f1_1 ($a,$i) = if (($i >= $s))
268300 then $a
269301 else isSymbol($a, $l[$i])
270302
271303 func $f1_2 ($a,$i) = if (($i >= $s))
272304 then $a
273305 else throw("List size exceeds 8")
274306
275307 $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)
276308 }
277309 (acc + getAmountOrClear((toString(charCount._1) + char)))
278310 }
279311
280312 func composeStringCat (acc,char) = {
281313 let charCount = {
282314 let $l = result._3
283315 let $s = size($l)
284316 let $acc0 = $Tuple2(0, char)
285317 func $f1_1 ($a,$i) = if (($i >= $s))
286318 then $a
287319 else isSymbol($a, $l[$i])
288320
289321 func $f1_2 ($a,$i) = if (($i >= $s))
290322 then $a
291323 else throw("List size exceeds 8")
292324
293325 $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)
294326 }
295327 (acc + getAmountOrClear((toString(charCount._1) + char)))
296328 }
297329
298330 func composeStringDog (acc,char) = {
299331 let charCount = {
300332 let $l = result._4
301333 let $s = size($l)
302334 let $acc0 = $Tuple2(0, char)
303335 func $f1_1 ($a,$i) = if (($i >= $s))
304336 then $a
305337 else isSymbol($a, $l[$i])
306338
307339 func $f1_2 ($a,$i) = if (($i >= $s))
308340 then $a
309341 else throw("List size exceeds 8")
310342
311343 $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)
312344 }
313345 (acc + getAmountOrClear((toString(charCount._1) + char)))
314346 }
315347
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+
316366 let turtleGens = {
317367 let $l = charList()
318368 let $s = size($l)
319369 let $acc0 = ""
320370 func $f1_1 ($a,$i) = if (($i >= $s))
321371 then $a
322372 else composeStringTurtle($a, $l[$i])
323373
324374 func $f1_2 ($a,$i) = if (($i >= $s))
325375 then $a
326376 else throw("List size exceeds 26")
327377
328378 $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)
329379 }
330380 let duckGens = {
331381 let $l = charList()
332382 let $s = size($l)
333383 let $acc0 = ""
334384 func $f2_1 ($a,$i) = if (($i >= $s))
335385 then $a
336386 else composeStringDuck($a, $l[$i])
337387
338388 func $f2_2 ($a,$i) = if (($i >= $s))
339389 then $a
340390 else throw("List size exceeds 26")
341391
342392 $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)
343393 }
344394 let catGens = {
345395 let $l = charList()
346396 let $s = size($l)
347397 let $acc0 = ""
348398 func $f3_1 ($a,$i) = if (($i >= $s))
349399 then $a
350400 else composeStringCat($a, $l[$i])
351401
352402 func $f3_2 ($a,$i) = if (($i >= $s))
353403 then $a
354404 else throw("List size exceeds 26")
355405
356406 $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)
357407 }
358408 let hondGens = {
359409 let $l = charList()
360410 let $s = size($l)
361411 let $acc0 = ""
362412 func $f4_1 ($a,$i) = if (($i >= $s))
363413 then $a
364414 else composeStringDog($a, $l[$i])
365415
366416 func $f4_2 ($a,$i) = if (($i >= $s))
367417 then $a
368418 else throw("List size exceeds 26")
369419
370420 $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)
371421 }
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+ }
372436 let finishedTurtleGens = if ((turtleGens == ""))
373437 then ""
374438 else (("T:" + turtleGens) + "_")
375439 let finishedDuckGens = if ((duckGens == ""))
376440 then ""
377441 else (("D:" + duckGens) + "_")
378442 let finishedCatGens = if ((catGens == ""))
379443 then ""
380- else (("C:" + catGens) + "_")
444+ else (("F:" + catGens) + "_")
381445 let finishedHondGens = if ((hondGens == ""))
382446 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))
385452 }
386453 else throw("Strict value is not equal to itself.")
387454 }
388455
389456
390457 func validateIfMutantFailed (rarity) = if ((3 > size(split(rarity, ":"))))
391458 then true
392459 else false
393460
394461
395462 func finishHatchingInternal (txId,owner) = {
396463 let processStatusKey = getProcessStatusKey(owner, txId)
397464 let finishHeightKey = getProcessFinishHeightKey(owner, txId)
398465 let IdKey = getIdKey(owner, txId)
399466 let processTxStatus = getStringValue(this, processStatusKey)
400467 let processFinishHeight = getIntegerValue(this, finishHeightKey)
401468 if ((processTxStatus == hatchingFinished()))
402469 then {
403470 let Id = getStringValue(this, getIdKey(owner, txId))
404471 throw(("The MUTANT was breeded and claimed already, here is the folowing: " + Id))
405472 }
406473 else if ((processFinishHeight > height))
407474 then throw((((("Breeding is not finished yet " + toString((processFinishHeight - height))) + " blocks remaining, it will take around ") + toString((processFinishHeight - height))) + " minutes"))
408475 else {
409476 let parent1Id = tryGetString(getParentKey(fromBase58String(txId), 1))
410477 let parent2Id = tryGetString(getParentKey(fromBase58String(txId), 2))
411478 let parent1IdBytes = fromBase58String(parent1Id)
412479 let parent2IdBytes = fromBase58String(parent2Id)
413480 let gen = generate(fromBase58String(txId), processFinishHeight, parent1IdBytes, parent2IdBytes)
414481 let farmGen = nrOfTypeGenes(gen)
415482 let rarityFromName = getRarityFromName(gen)
416483 let amountGen = (tryGetInteger(getStatsKey(gen)) + 1)
417484 let amount = (tryGetInteger(getStatsKey_amount()) + 1)
418485 let asset = Issue(("MTNT-" + toString(amount)), gen, 1, 0, false, unit, processFinishHeight)
419486 let assetId = calculateAssetId(asset)
420487 let quantity = tryGetInteger((("stats_" + farmGen._2) + "_quantity"))
421488 let rarity = tryGetInteger((("stats_" + rarityFromName) + "_rarity"))
422489 let ownerAsAddress = addressFromStringValue(owner)
423490 let failed = validateIfMutantFailed(farmGen._2)
424491 let transferOrBurn = if (failed)
425492 then Burn(assetId, 1)
426493 else ScriptTransfer(ownerAsAddress, 1, assetId)
427494 let transferOrBurnParent1 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 2) == 5))
428495 then Burn(parent1IdBytes, 1)
429496 else ScriptTransfer(ownerAsAddress, 1, parent1IdBytes)
430497 let transferOrBurnParent2 = if ((getRandomNumber(10, fromBase58String(txId), processFinishHeight, 3) == 5))
431498 then Burn(parent2IdBytes, 1)
432499 else ScriptTransfer(ownerAsAddress, 1, parent2IdBytes)
433500 [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]
434501 }
435502 }
436503
437504
438505 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
439506 then throw("BCAP: Please attach waves")
440507 else {
441508 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
442509 if ((payment.amount != feeAmount))
443510 then throw((("BCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
444511 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
445512 }
446513
447514
448515 func checkTypeAndValidObstinate (info) = {
449516 let splitted = split(info.name, "")
450517 let type = splitted[0]
451518 let gen = splitted[14]
452519 if ((gen != "O"))
453520 then throw("MCTAVO: Only obstinates can be turned into mutants")
454521 else {
455522 let breederSc = if ((type == "T"))
456523 then getTurtleBreederAddress()
457524 else if ((type == "D"))
458525 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")
460533 if ((breederSc != info.issuer))
461534 then throw("MCTAVO: Only obstinates from the breeder contract can be turned into mutants")
462535 else if ((tryGetStringExternal(breederSc, toBase58String(info.id)) == ""))
463536 then throw("MCTAVO: Invalid nft")
464537 else if ((tryGetInteger(getChildren(toBase58String(info.id))) == 1))
465538 then throw("MCTAVO: NFT already used")
466539 else type
467540 }
468541 }
469542
470543
471544 @Callable(i)
472545 func configureOracle (oracle) = if ((i.caller != this))
473546 then throw("ICU: admin only")
474547 else [StringEntry("static_oracleAddress", oracle)]
475548
476549
477550
478551 @Callable(i)
479552 func startMutantHatching (refererAddress) = if ((size(i.payments) != 5))
480553 then throw("MSMH: 5 payments required")
481554 else if ((i.payments[0].amount != 1))
482555 then throw("MSMH: 1st payment must be an NFT")
483556 else if ((i.payments[1].amount != 1))
484557 then throw("MSMH: 2nd payment must be an NFT")
485558 else {
486559 let validPayment = checkAdditionalPayment(i.payments[2])
487560 if ((validPayment == validPayment))
488561 then if (if ((i.payments[3].assetId != getSpiceAssetId()))
489562 then true
490563 else (i.payments[3].amount != calcPriceInAsset(basePriceSpice())))
491564 then throw("MSMH: 4th payment must be in spice")
492565 else if (if ((i.payments[4].assetId != getEggAssetId()))
493566 then true
494567 else (i.payments[4].amount != calcPriceInAsset(basePriceEgg())))
495568 then throw("MSMH: 5th payment must be in egg")
496569 else {
497570 let nft1 = value(assetInfo(value(i.payments[0].assetId)))
498571 let nft2 = value(assetInfo(value(i.payments[1].assetId)))
499572 let type1 = checkTypeAndValidObstinate(nft1)
500573 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.")
504585 }
505586 else throw("Strict value is not equal to itself.")
506587 }
507588
508589
509590
510591 @Callable(i)
511592 func finishMutantHatching (txIdStr) = {
512593 let owner = toString(i.originCaller)
513594 if ((size(i.payments) != 1))
514595 then throw("MFMH: Wrong amount of payments!")
515596 else {
516597 let feeValidate = checkAdditionalPayment(i.payments[0])
517598 if ((feeValidate == feeValidate))
518599 then (finishHatchingInternal(txIdStr, owner) ++ feeValidate)
519600 else throw("Strict value is not equal to itself.")
520601 }
521602 }
522603
523604
524605
525606 @Callable(i)
526607 func getRarity (genotype) = {
527608 let rarityFromName = getRarityFromName(genotype)
528609 let quantity = valueOrErrorMessage(tryGetInteger((("stats_" + rarityFromName) + "_rarity")), (("stats_" + rarityFromName) + "_rarity"))
529610 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
530611 let rarity = if ((power > 0))
531612 then power
532613 else 2
533614 $Tuple2(nil, $Tuple2(rarityFromName, rarity))
534615 }
535616
536617
537618
538619 @Callable(i)
539620 func reduceRarity (assetId,fGen) = throw("MRR: Not implemented")
540621
541622
542623 @Verifier(tx)
543624 func verify () = if (isTestEnv())
544625 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
545626 else {
546627 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
547628 let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
548629 let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
549630 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
550631 then 1
551632 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
552633 then 1
553634 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
554635 then 1
555636 else 0
556637 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
557638 then 1
558639 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
559640 then 1
560641 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
561642 then 1
562643 else 0
563644 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
564645 then 1
565646 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
566647 then 1
567648 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
568649 then 1
569650 else 0
570651 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
571652 match tx {
572653 case _ =>
573- (signaturesCount >= 2)
654+ (signaturesCount >= 1)
574655 }
575656 }
576657

github/deemru/w8io/169f3d6 
71.44 ms