tx · 68FRaBw93dsNeQFx1DF1fnvGxQsbzg7bCF7w4xdb38EE

3N33m3JMhEN5QxhDKujcsbpFHo3UcHE4Jwt:  -0.03300000 Waves

2024.12.29 21:14 [3436153] smart account 3N33m3JMhEN5QxhDKujcsbpFHo3UcHE4Jwt > SELF 0.00000000 Waves

{ "type": 13, "id": "68FRaBw93dsNeQFx1DF1fnvGxQsbzg7bCF7w4xdb38EE", "fee": 3300000, "feeAssetId": null, "timestamp": 1735496044836, "version": 2, "chainId": 84, "sender": "3N33m3JMhEN5QxhDKujcsbpFHo3UcHE4Jwt", "senderPublicKey": "9Rp4v3BUwexbq4Ta6b1K2wTRxefC3irpr2tHC51mSAjz", "proofs": [ "4UnybD9Zea9UbLWfhjkcUpVpTE1dN13pvBQtwSKcSaetXXB1zQwbTVWKyhm9ACyhymxH13T2sVHzYGTnEw7adzRk" ], "script": "base64:AAIFAAAAAAAAADgIAhIECgIICBIDCgEIEgQKAggIEgUKAwgIARIDCgEIEgUKAwgEBBIDCgEIEgASAwoBCBIECgIICAAAAEEAAAAABVNjYWxlAAAAAAAF9eEAAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAMdHJ5R2V0U3RyaW5nAAAAAQAAAANrZXkJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAHZ2V0Qm9vbAAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgcBAAAACWlzVGVzdEVudgAAAAAJAQAAAAdnZXRCb29sAAAAAQIAAAAHVEVTVEVOVgEAAAAcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwAAAAACAAAAGXN0YXRpY19yZWZDb250cmFjdEFkZHJlc3MAAAAAFWtleUdsb2JhbExhc3RJbnRlcmVzdAIAAAAZZ2xvYmFsX2xhc3RDaGVja19pbnRlcmVzdAEAAAAXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAAAAAgAAABRzdGF0aWNfb3JhY2xlQWRkcmVzcwEAAAAUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAAAAAgAAABFzdGF0aWNfZWdnQXNzZXRJZAEAAAAac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAAAAAAgAAABdzdGF0aWNfaW5jdWJhdG9yQWRkcmVzcwEAAAAYc3RhdGljS2V5X2JyZWVkZXJBZGRyZXNzAAAAAAIAAAAVc3RhdGljX2JyZWVkZXJBZGRyZXNzAQAAABtzdGF0aWNLZXlfYWNjQm9vc3RlckFkZHJlc3MAAAAAAgAAABhzdGF0aWNfYWNjQm9vc3RlckFkZHJlc3MBAAAAGHN0YXRpY0tleV9jb3Vwb25zQWRkcmVzcwAAAAACAAAAFXN0YXRpY19jb3Vwb25zQWRkcmVzcwEAAAAVc3RhdGljS2V5X2J1cm5BZGRyZXNzAAAAAAIAAAASc3RhdGljX2J1cm5BZGRyZXNzAQAAABJzdGF0aWNLZXlfZXh0cmFGZWUAAAAAAgAAAA9zdGF0aWNfZXh0cmFGZWUBAAAAF3N0YXRpY0tleV9mZWVBZ2dyZWdhdG9yAAAAAAIAAAAUc3RhdGljX2ZlZUFnZ3JlZ2F0b3IAAAAAD2tleUdsb2JhbEVhcm5lZAIAAAAPZ2xvYmFsX2Vhcm5pbmdzAQAAABJzdGF0aWNLZXlfcGVyY2hGZWUAAAAAAgAAAA9zdGF0aWNfcGVyY2hGZWUBAAAAGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwAAAAACAAAAFXN0YXRpY19yZWJpcnRoQWRkcmVzcwEAAAAec3RhdGljS2V5X3R1cnRsZVJlYmlydGhBZGRyZXNzAAAAAAIAAAAbc3RhdGljX3R1cnRsZVJlYmlydGhBZGRyZXNzAQAAABZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAAAAAIAAAATc3RhdGljX2l0ZW1zQWRkcmVzcwEAAAAOdG90YWxTdGFrZWRLZXkAAAAAAgAAAAx0b3RhbF9zdGFrZWQBAAAAH3N0YXRpY0tleV9wcm94eVN0YWtpbmdDb250cmFjdHMAAAAAAgAAABxzdGF0aWNfcHJveHlTdGFraW5nQ29udHJhY3RzAQAAABlzdGF0aWNLZXlfY2ZNYXN0ZXJBZGRyZXNzAAAAAAIAAAAWc3RhdGljX2NmTWFzdGVyQWRkcmVzcwEAAAATc3RhdGljS2V5X3BvdGlvbkZlZQAAAAACAAAAEHN0YXRpY19wb3Rpb25GZWUBAAAAHnN0YXRpY0tleV9jYW5pbmVTdGFraW5nQWRkcmVzcwAAAAACAAAAG3N0YXRpY19jYW5pbmVTdGFraW5nQWRkcmVzcwEAAAAac3RhdGljS2V5X3dlYXJhYmxlc0FkZHJlc3MAAAAAAgAAABdzdGF0aWNfd2VhcmFibGVzQWRkcmVzcwEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAAAAAQAAABFnZXRSZWJpcnRoQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGHN0YXRpY0tleV9yZWJpcnRoQWRkcmVzcwAAAAABAAAADWdldEVnZ0Fzc2V0SWQAAAAACQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAUc3RhdGljS2V5X2VnZ0Fzc2V0SWQAAAAAAQAAABNnZXRJbmN1YmF0b3JBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAac3RhdGljS2V5X2luY3ViYXRvckFkZHJlc3MAAAAAAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAGHN0YXRpY0tleV9icmVlZGVyQWRkcmVzcwAAAAABAAAAFGdldEFjY0Jvb3N0ZXJBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAbc3RhdGljS2V5X2FjY0Jvb3N0ZXJBZGRyZXNzAAAAAAEAAAARZ2V0Q291cG9uc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABhzdGF0aWNLZXlfY291cG9uc0FkZHJlc3MAAAAAAQAAAA5nZXRCdXJuQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFXN0YXRpY0tleV9idXJuQWRkcmVzcwAAAAABAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABdzdGF0aWNLZXlfZmVlQWdncmVnYXRvcgAAAAABAAAAFWdldFJlZkNvbnRyYWN0QWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAAAAAAQAAABdnZXRUdXJ0bGVSZWJpcnRoQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAHnN0YXRpY0tleV90dXJ0bGVSZWJpcnRoQWRkcmVzcwAAAAABAAAAD2dldEl0ZW1zQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAFnN0YXRpY0tleV9pdGVtc0FkZHJlc3MAAAAAAQAAAA9nZXRQcm94eVN0YWtpbmcAAAAACQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAH3N0YXRpY0tleV9wcm94eVN0YWtpbmdDb250cmFjdHMAAAAAAQAAABJnZXRDZk1hc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABlzdGF0aWNLZXlfY2ZNYXN0ZXJBZGRyZXNzAAAAAAEAAAAMZ2V0UG90aW9uRmVlAAAAAAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAABNzdGF0aWNLZXlfcG90aW9uRmVlAAAAAAEAAAAXZ2V0Q2FuaW5lU3Rha2luZ0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAAJAQAAAB5zdGF0aWNLZXlfY2FuaW5lU3Rha2luZ0FkZHJlc3MAAAAAAQAAABNnZXRXZWFyYWJsZXNBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAAac3RhdGljS2V5X3dlYXJhYmxlc0FkZHJlc3MAAAAAAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIAAAAHYWRkcmVzcwAAAAVhc3NldAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEl9sYXN0Q2hlY2tJbnRlcmVzdAEAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAACAAAAB2FkZHJlc3MAAAAFYXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAA1fZmFybWluZ1Bvd2VyAQAAABByZXdhcmRDbGFpbWVkS2V5AAAAAgAAAAdhZGRyZXNzAAAABWFzc2V0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAIX2NsYWltZWQBAAAAEnRvdGFsU3Rha2VkVXNlcktleQAAAAEAAAAHYWRkcmVzcwkAASwAAAACAgAAAA10b3RhbF9zdGFrZWRfBQAAAAdhZGRyZXNzAAAAAA1SZWZlcmVyUmV3YXJkAAAAAAAAAAAFAQAAABZjaGVja0FkZGl0aW9uYWxQYXltZW50AAAAAQAAAAdwYXltZW50AwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZRkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQAAAAJZmVlQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAADCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAACWZlZUFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAcRkNBUDogUGxlYXNlIGF0dGFjaCBleGFjdGx5IAkAAaQAAAABBQAAAAlmZWVBbW91bnQCAAAAEyBhbW91bnQgb2Ygd2F2ZWxldHMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAABQAAAAlmZWVBbW91bnQFAAAABHVuaXQFAAAAA25pbAEAAAANdHJ5R2V0SW50ZWdlcgAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiAAAAAAAAAAAAAQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAHkZBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEAAAAKYXNJbnRUdXBsZQAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAooSW50LCBJbnQpBAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAkAAAIAAAABAgAAACRGQUk6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiAoSW50LEludCkBAAAAEmhhbmRsZVN0YWtpbmdUb3BVcAAAAAEAAAAGYW1vdW50BAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAVa2V5R2xvYmFsTGFzdEludGVyZXN0BAAAABF0b3RhbFN0YWtlZEFtb3VudAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAOdG90YWxTdGFrZWRLZXkAAAAABAAAAA1pbnRlcmVzdERlbHRhAwkAAGYAAAACBQAAABF0b3RhbFN0YWtlZEFtb3VudAAAAAAAAAAAAAkAAGsAAAADBQAAAAZhbW91bnQFAAAABVNjYWxlBQAAABF0b3RhbFN0YWtlZEFtb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa2V5R2xvYmFsRWFybmVkCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAPa2V5R2xvYmFsRWFybmVkBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFWtleUdsb2JhbExhc3RJbnRlcmVzdAkAAGQAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAADWludGVyZXN0RGVsdGEFAAAAA25pbAEAAAAIYXNTdHJpbmcAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAFAAAABnN0cmluZwkAAAIAAAABAgAAACFGQVM6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBAAAADXRyeUdldEJvb2xlYW4AAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIHAQAAABV0cnlHZXRCb29sZWFuRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgcBAAAADmdldEFzc2V0T3JpZ2luAAAAAQAAAApnZW5lcmF0aW9uAwkAAAAAAAACBQAAAApnZW5lcmF0aW9uAgAAAAFHCQEAAAATZ2V0SW5jdWJhdG9yQWRkcmVzcwAAAAAJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAABAAAADmdldEFzc2V0UmFyaXR5AAAAAgAAAAhnZW5vdHlwZQAAAApnZW5lcmF0aW9uBAAAAAhxdWFudGl0eQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIJAQAAAA5nZXRBc3NldE9yaWdpbgAAAAEFAAAACmdlbmVyYXRpb24JAAEsAAAAAgkAASwAAAACAgAAAAZzdGF0c18FAAAACGdlbm90eXBlAgAAAAlfcXVhbnRpdHkJAAEsAAAAAgkAASwAAAACAgAAAAZzdGF0c18FAAAACGdlbm90eXBlAgAAABNfcXVhbnRpdHkgbm90IGZvdW5kBAAAAAVwb3dlcgkAAGwAAAAGCQAAaQAAAAIAAAAAAAAAJxAFAAAACHF1YW50aXR5AAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAABAAAAAAAAAAACBQAAAAVGTE9PUgMJAABmAAAAAgUAAAAFcG93ZXIAAAAAAAAAAAAFAAAABXBvd2VyAAAAAAAAAAACAQAAABZnZXRBc3NldFJhcml0eUNvbXBsZXRlAAAAAgAAAAlpc0phY2twb3QAAAAJYXNzZXROYW1lBAAAAAZyYXJpdHkDBQAAAAlpc0phY2twb3QAAAAAAAAAAGQEAAAACmdlbmVyYXRpb24JAAEvAAAAAgkBAAAACXRha2VSaWdodAAAAAIFAAAACWFzc2V0TmFtZQAAAAAAAAAAAgAAAAAAAAAAAQQAAAAHZmFybUdlbgkBAAAACGFzU3RyaW5nAAAAAQkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAAA5nZXRHZW5Gcm9tTmFtZQkABEwAAAACBQAAAAlhc3NldE5hbWUFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAdmYXJtR2VuBQAAAAdmYXJtR2VuCQEAAAAOZ2V0QXNzZXRSYXJpdHkAAAACBQAAAAdmYXJtR2VuBQAAAApnZW5lcmF0aW9uCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUAAAAGcmFyaXR5AQAAABJ1cGRhdGVGYXJtaW5nUG93ZXIAAAADAAAAB2FkZHJlc3MAAAAFYXNzZXQAAAAMb3JpZ2luQ2FsbGVyBAAAAAt0b3RhbFN0YWtlZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAOdG90YWxTdGFrZWRLZXkAAAAABAAAAA90b3RhbFN0YWtlZFVzZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEnRvdGFsU3Rha2VkVXNlcktleQAAAAEFAAAAB2FkZHJlc3MEAAAACWN1cnJlbnRGUAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAQAAAAFbmV3RlAJAQAAAAphc0ludFR1cGxlAAAAAQkAA/wAAAAEBQAAAAR0aGlzAgAAABJjYWxjdWxhdGVGYXJtUG93ZXIJAARMAAAAAgUAAAAFYXNzZXQJAARMAAAAAgUAAAAMb3JpZ2luQ2FsbGVyBQAAAANuaWwFAAAAA25pbAMJAQAAAAIhPQAAAAIFAAAACWN1cnJlbnRGUAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADnRvdGFsU3Rha2VkS2V5AAAAAAkAAGQAAAACCQAAZQAAAAIFAAAAC3RvdGFsU3Rha2VkBQAAAAljdXJyZW50RlAIBQAAAAVuZXdGUAAAAAJfMQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEnRvdGFsU3Rha2VkVXNlcktleQAAAAEFAAAAB2FkZHJlc3MJAABkAAAAAgkAAGUAAAACBQAAAA90b3RhbFN0YWtlZFVzZXIFAAAACWN1cnJlbnRGUAgFAAAABW5ld0ZQAAAAAl8xCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAgFAAAABW5ld0ZQAAAAAl8xBQAAAANuaWwFAAAAA25pbAEAAAASY2xhaW1TdGFraW5nUmVzdWx0AAAABQAAAAdhZGRyZXNzAAAABWFzc2V0AAAABnJlY2FsYwAAAA93YWxsZXRUb1JlY2VpdmUAAAALYm9udXNDYWxsZXIEAAAAD2N1cnJlbnRJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAABVrZXlHbG9iYWxMYXN0SW50ZXJlc3QEAAAAEWxhc3RDaGVja0ludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BAAAAAxzdGFrZWRBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEWFzc2V0RmFybWluZ1Bvd2VyAAAAAgUAAAAHYWRkcmVzcwUAAAAFYXNzZXQEAAAACGZwVXBkYXRlAwUAAAAGcmVjYWxjCQEAAAASdXBkYXRlRmFybWluZ1Bvd2VyAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAC2JvbnVzQ2FsbGVyBQAAAANuaWwDCQAAAAAAAAIFAAAACGZwVXBkYXRlBQAAAAhmcFVwZGF0ZQQAAAAGcmV3YXJkAwkAAGYAAAACBQAAABFsYXN0Q2hlY2tJbnRlcmVzdAAAAAAAAAAAAAkAAGsAAAADCQAAZQAAAAIFAAAAD2N1cnJlbnRJbnRlcmVzdAUAAAARbGFzdENoZWNrSW50ZXJlc3QFAAAADHN0YWtlZEFtb3VudAUAAAAFU2NhbGUAAAAAAAAAAAAJAAUUAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAD3dhbGxldFRvUmVjZWl2ZQUAAAAGcmV3YXJkCQEAAAANZ2V0RWdnQXNzZXRJZAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRrZXlMYXN0Q2hlY2tJbnRlcmVzdAAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BQAAAA9jdXJyZW50SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABByZXdhcmRDbGFpbWVkS2V5AAAAAgUAAAAPd2FsbGV0VG9SZWNlaXZlBQAAAAVhc3NldAkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABByZXdhcmRDbGFpbWVkS2V5AAAAAgUAAAAPd2FsbGV0VG9SZWNlaXZlBQAAAAVhc3NldAUAAAAGcmV3YXJkBQAAAANuaWwFAAAACGZwVXBkYXRlBQAAAAZyZXdhcmQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQAAAAlhc0Jvb2xlYW4AAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAAHYm9vbGVhbgUAAAAHJG1hdGNoMAUAAAAHYm9vbGVhbgkAAAIAAAABAgAAACJGQUI6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBCb29sZWFuAQAAABNjYWxjdWxhdGVQZXJjaFByaWNlAAAAAQAAAAdhZGRyZXNzBAAAABFoYXNBcnRlZmFjdFN0YWtlZAkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAAFGdldEFjY0Jvb3N0ZXJBZGRyZXNzAAAAAAkAASwAAAACCQABLAAAAAICAAAAC0FSVC1YTUlTVExfBQAAAAdhZGRyZXNzAgAAAAZfb3duZXIEAAAACnBlcmNoUHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAAAlnZXRPcmFjbGUAAAAACQEAAAASc3RhdGljS2V5X3BlcmNoRmVlAAAAAAMJAAAAAAAAAgUAAAARaGFzQXJ0ZWZhY3RTdGFrZWQCAAAAAAUAAAAKcGVyY2hQcmljZQkAAGgAAAACCQAAaQAAAAIFAAAACnBlcmNoUHJpY2UAAAAAAAAAAAoAAAAAAAAAAAkBAAAAEGlzUHJveHlTdGFraW5nU2MAAAABAAAAB2FkZHJlc3MEAAAAEGFsbG93ZWRDb250cmFjdHMJAQAAAA9nZXRQcm94eVN0YWtpbmcAAAAABAAAABRhbGxvd2VkQ29udHJhY3RzTGlzdAkABLUAAAACBQAAABBhbGxvd2VkQ29udHJhY3RzAgAAAAE7CQEAAAACIT0AAAACCQAETwAAAAIFAAAAFGFsbG93ZWRDb250cmFjdHNMaXN0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AAAGYW1vdW50BQAAAANuaWwCAAAAAAAAAAFpAQAAAA5taWdyYXRlUGVyY2hlcwAAAAEAAAAHYWRkcmVzcwQAAAAKb2xkRmFybWluZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19mYXJtaW5nQWRkcmVzcwoBAAAAF3RyeUdldEludGVnZXJPbGRGYXJtaW5nAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAKb2xkRmFybWluZwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIAAAAAAAAAAAAEAAAADHBlcmNoQW1vdW50QgkBAAAAF3RyeUdldEludGVnZXJPbGRGYXJtaW5nAAAAAQkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABNfcGVyY2hlc0F2YWlsYWJsZV9CAwkAAAAAAAACBQAAAAxwZXJjaEFtb3VudEIFAAAADHBlcmNoQW1vdW50QgQAAAAMcGVyY2hBbW91bnRSCQEAAAAXdHJ5R2V0SW50ZWdlck9sZEZhcm1pbmcAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAE19wZXJjaGVzQXZhaWxhYmxlX1IDCQAAAAAAAAIFAAAADHBlcmNoQW1vdW50UgUAAAAMcGVyY2hBbW91bnRSBAAAAAxwZXJjaEFtb3VudEcJAQAAABd0cnlHZXRJbnRlZ2VyT2xkRmFybWluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAATX3BlcmNoZXNBdmFpbGFibGVfRwMJAAAAAAAAAgUAAAAMcGVyY2hBbW91bnRHBQAAAAxwZXJjaEFtb3VudEcEAAAADHBlcmNoQW1vdW50WQkBAAAAF3RyeUdldEludGVnZXJPbGRGYXJtaW5nAAAAAQkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAABNfcGVyY2hl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", "height": 3436153, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F4j42U56yjKoGDm4MKitVGQvkTtLwogvjh2tGAaRDKBM Next: hJBrS7xNYDxv92ejZFGaRW7KoEizuynVrSScY2sYobt Diff:
OldNewDifferences
8686 func staticKey_canineStakingAddress () = "static_canineStakingAddress"
8787
8888
89+func staticKey_wearablesAddress () = "static_wearablesAddress"
90+
91+
8992 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
9093
9194
132135
133136
134137 func getCanineStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineStakingAddress())))
138+
139+
140+func getWearablesAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_wearablesAddress())))
135141
136142
137143 func keyLastCheckInterest (address,asset) = (((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest")
302308 then true
303309 else (value(assetInfo(fromBase58String(assetId))).issuer == getIncubatorAddress())))
304310 then throw("This does not seem like a valid Duck!")
305- else {
306- let assetName = value(assetInfo(fromBase58String(assetId))).name
307- let gen = takeRight(assetName, 1)
308- let isJackpot = (takeRight(assetName, 1) == "U")
309- let rarity = getAssetRarityComplete(isJackpot, assetName)
310- let genotype = split(dropRight(drop(assetName, 5), 3), "")
311- func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
312- then (accum :+ nextGen)
313- else accum
311+ else if (if (tryGetBooleanExternal(getBreederAddress(), (assetId + "_blacklisted")))
312+ then true
313+ else tryGetBooleanExternal(getIncubatorAddress(), (assetId + "_blacklisted")))
314+ then throw("Screw urself")
315+ else {
316+ let assetName = value(assetInfo(fromBase58String(assetId))).name
317+ let gen = takeRight(assetName, 1)
318+ let isJackpot = (takeRight(assetName, 1) == "U")
319+ let rarity = getAssetRarityComplete(isJackpot, assetName)
320+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
321+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
322+ then (accum :+ nextGen)
323+ else accum
314324
315- let uniqueList = {
316- let $l = genotype
317- let $s = size($l)
318- let $acc0 = nil
319- func $f0_1 ($a,$i) = if (($i >= $s))
320- then $a
321- else uniqueArrayFilter($a, $l[$i])
325+ let uniqueList = {
326+ let $l = genotype
327+ let $s = size($l)
328+ let $acc0 = nil
329+ func $f0_1 ($a,$i) = if (($i >= $s))
330+ then $a
331+ else uniqueArrayFilter($a, $l[$i])
322332
323- func $f0_2 ($a,$i) = if (($i >= $s))
324- then $a
325- else throw("List size exceeds 8")
333+ func $f0_2 ($a,$i) = if (($i >= $s))
334+ then $a
335+ else throw("List size exceeds 8")
326336
327- $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)
337+ $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)
338+ }
339+ let totalGenes = if ((gen == "U"))
340+ then 8
341+ else size(uniqueList)
342+ let power = pow(15, 1, totalGenes, 0, 2, DOWN)
343+ let baseBlock = if (isTestEnv())
344+ then 2500000
345+ else 3750000
346+ let multiplier = (((height - baseBlock) * 100) / (((60 * 24) * 30) * 3))
347+ let basePower = tryGetInteger((assetId + "_basePower"))
348+ let finalPower = if ((basePower > 0))
349+ then basePower
350+ else ((power * multiplier) / 100)
351+ let finalPowerRarity = ((finalPower * rarity) / 100)
352+ let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [assetId, bonusAddress], nil))
353+ if ((farmBoost == farmBoost))
354+ then {
355+ let wearabledBoost = asInt(invoke(getWearablesAddress(), "calculateWearblesBoost", [assetId], nil))
356+ if ((wearabledBoost == wearabledBoost))
357+ then {
358+ let finalPowerRarityBoost = ((finalPowerRarity + ((finalPowerRarity * farmBoost) / 100)) + ((finalPowerRarity * wearabledBoost) / 1000))
359+ $Tuple2(nil, $Tuple2(finalPowerRarityBoost, finalPower))
360+ }
361+ else throw("Strict value is not equal to itself.")
362+ }
363+ else throw("Strict value is not equal to itself.")
328364 }
329- let totalGenes = if ((gen == "U"))
330- then 8
331- else size(uniqueList)
332- let power = pow(15, 1, totalGenes, 0, 2, DOWN)
333- let baseBlock = if (isTestEnv())
334- then 2500000
335- else 3750000
336- let multiplier = (((height - baseBlock) * 100) / (((60 * 24) * 30) * 3))
337- let basePower = tryGetInteger((assetId + "_basePower"))
338- let finalPower = if ((basePower > 0))
339- then basePower
340- else ((power * multiplier) / 100)
341- let finalPowerRarity = ((finalPower * rarity) / 100)
342- let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [assetId, bonusAddress], nil))
343- if ((farmBoost == farmBoost))
344- then {
345- let finalPowerRarityBoost = (finalPowerRarity + ((finalPowerRarity * farmBoost) / 100))
346- $Tuple2(nil, $Tuple2(finalPowerRarityBoost, finalPower))
347- }
348- else throw("Strict value is not equal to itself.")
349- }
350365
351366
352367
420435 @Callable(i)
421436 func addFreePerch (address,color,amount) = if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
422437 then throw("you need to set color properly")
423- else if (if (if ((i.caller != getRebirthAddress()))
438+ else if (if (if (if ((i.caller != getRebirthAddress()))
424439 then (i.caller != getTurtleRebirthAddress())
425440 else false)
426441 then (i.caller != this)
442+ else false)
443+ then (i.caller != getCouponsAddress())
427444 else false)
428445 then throw("rebirth and admin only")
429446 else {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale = 100000000
55
66 func tryGetStringExternal (address,key) = match getString(address, key) {
77 case a: String =>
88 a
99 case _ =>
1010 ""
1111 }
1212
1313
1414 func tryGetString (key) = tryGetStringExternal(this, key)
1515
1616
1717 func getBool (key) = match getBoolean(this, key) {
1818 case b: Boolean =>
1919 b
2020 case _ =>
2121 false
2222 }
2323
2424
2525 func isTestEnv () = getBool("TESTENV")
2626
2727
2828 func staticKey_refContractAddress () = "static_refContractAddress"
2929
3030
3131 let keyGlobalLastInterest = "global_lastCheck_interest"
3232
3333 func staticKey_oracleAddress () = "static_oracleAddress"
3434
3535
3636 func staticKey_eggAssetId () = "static_eggAssetId"
3737
3838
3939 func staticKey_incubatorAddress () = "static_incubatorAddress"
4040
4141
4242 func staticKey_breederAddress () = "static_breederAddress"
4343
4444
4545 func staticKey_accBoosterAddress () = "static_accBoosterAddress"
4646
4747
4848 func staticKey_couponsAddress () = "static_couponsAddress"
4949
5050
5151 func staticKey_burnAddress () = "static_burnAddress"
5252
5353
5454 func staticKey_extraFee () = "static_extraFee"
5555
5656
5757 func staticKey_feeAggregator () = "static_feeAggregator"
5858
5959
6060 let keyGlobalEarned = "global_earnings"
6161
6262 func staticKey_perchFee () = "static_perchFee"
6363
6464
6565 func staticKey_rebirthAddress () = "static_rebirthAddress"
6666
6767
6868 func staticKey_turtleRebirthAddress () = "static_turtleRebirthAddress"
6969
7070
7171 func staticKey_itemsAddress () = "static_itemsAddress"
7272
7373
7474 func totalStakedKey () = "total_staked"
7575
7676
7777 func staticKey_proxyStakingContracts () = "static_proxyStakingContracts"
7878
7979
8080 func staticKey_cfMasterAddress () = "static_cfMasterAddress"
8181
8282
8383 func staticKey_potionFee () = "static_potionFee"
8484
8585
8686 func staticKey_canineStakingAddress () = "static_canineStakingAddress"
8787
8888
89+func staticKey_wearablesAddress () = "static_wearablesAddress"
90+
91+
8992 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
9093
9194
9295 func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_rebirthAddress())))
9396
9497
9598 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
9699
97100
98101 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
99102
100103
101104 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
102105
103106
104107 func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_accBoosterAddress())))
105108
106109
107110 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
108111
109112
110113 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
111114
112115
113116 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
114117
115118
116119 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
117120
118121
119122 func getTurtleRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_turtleRebirthAddress())))
120123
121124
122125 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
123126
124127
125128 func getProxyStaking () = tryGetStringExternal(getOracle(), staticKey_proxyStakingContracts())
126129
127130
128131 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_cfMasterAddress())))
129132
130133
131134 func getPotionFee () = getIntegerValue(getOracle(), staticKey_potionFee())
132135
133136
134137 func getCanineStakingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_canineStakingAddress())))
138+
139+
140+func getWearablesAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_wearablesAddress())))
135141
136142
137143 func keyLastCheckInterest (address,asset) = (((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest")
138144
139145
140146 func assetFarmingPower (address,asset) = (((("address_" + address) + "_asset_") + asset) + "_farmingPower")
141147
142148
143149 func rewardClaimedKey (address,asset) = (((address + "_asset_") + asset) + "_claimed")
144150
145151
146152 func totalStakedUserKey (address) = ("total_staked_" + address)
147153
148154
149155 let RefererReward = 5
150156
151157 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
152158 then throw("FCAP: Please attach waves")
153159 else {
154160 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
155161 if ((payment.amount != feeAmount))
156162 then throw((("FCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
157163 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
158164 }
159165
160166
161167 func tryGetInteger (key) = match getInteger(this, key) {
162168 case b: Int =>
163169 b
164170 case _ =>
165171 0
166172 }
167173
168174
169175 func asInt (value) = match value {
170176 case int: Int =>
171177 int
172178 case _ =>
173179 throw("FAI: wrong type, expected: Int")
174180 }
175181
176182
177183 func asIntTuple (value) = match value {
178184 case int: (Int, Int) =>
179185 int
180186 case _ =>
181187 throw("FAI: wrong type, expected: (Int,Int)")
182188 }
183189
184190
185191 func handleStakingTopUp (amount) = {
186192 let currentInterest = tryGetInteger(keyGlobalLastInterest)
187193 let totalStakedAmount = tryGetInteger(totalStakedKey())
188194 let interestDelta = if ((totalStakedAmount > 0))
189195 then fraction(amount, Scale, totalStakedAmount)
190196 else 0
191197 [IntegerEntry(keyGlobalEarned, (tryGetInteger(keyGlobalEarned) + amount)), IntegerEntry(keyGlobalLastInterest, (currentInterest + interestDelta))]
192198 }
193199
194200
195201 func asString (value) = match value {
196202 case string: String =>
197203 string
198204 case _ =>
199205 throw("FAS: wrong type, expected: String")
200206 }
201207
202208
203209 func tryGetBoolean (key) = match getBoolean(this, key) {
204210 case b: Boolean =>
205211 b
206212 case _ =>
207213 false
208214 }
209215
210216
211217 func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
212218 case b: Boolean =>
213219 b
214220 case _ =>
215221 false
216222 }
217223
218224
219225 func getAssetOrigin (generation) = if ((generation == "G"))
220226 then getIncubatorAddress()
221227 else getBreederAddress()
222228
223229
224230 func getAssetRarity (genotype,generation) = {
225231 let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found"))
226232 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
227233 if ((power > 0))
228234 then power
229235 else 2
230236 }
231237
232238
233239 func getAssetRarityComplete (isJackpot,assetName) = {
234240 let rarity = if (isJackpot)
235241 then 100
236242 else {
237243 let generation = take(takeRight(assetName, 2), 1)
238244 let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
239245 if ((farmGen == farmGen))
240246 then getAssetRarity(farmGen, generation)
241247 else throw("Strict value is not equal to itself.")
242248 }
243249 rarity
244250 }
245251
246252
247253 func updateFarmingPower (address,asset,originCaller) = {
248254 let totalStaked = tryGetInteger(totalStakedKey())
249255 let totalStakedUser = tryGetInteger(totalStakedUserKey(address))
250256 let currentFP = tryGetInteger(assetFarmingPower(address, asset))
251257 let newFP = asIntTuple(invoke(this, "calculateFarmPower", [asset, originCaller], nil))
252258 if ((currentFP != 0))
253259 then [IntegerEntry(totalStakedKey(), ((totalStaked - currentFP) + newFP._1)), IntegerEntry(totalStakedUserKey(address), ((totalStakedUser - currentFP) + newFP._1)), IntegerEntry(assetFarmingPower(address, asset), newFP._1)]
254260 else nil
255261 }
256262
257263
258264 func claimStakingResult (address,asset,recalc,walletToReceive,bonusCaller) = {
259265 let currentInterest = tryGetInteger(keyGlobalLastInterest)
260266 let lastCheckInterest = tryGetInteger(keyLastCheckInterest(address, asset))
261267 let stakedAmount = tryGetInteger(assetFarmingPower(address, asset))
262268 let fpUpdate = if (recalc)
263269 then updateFarmingPower(address, asset, bonusCaller)
264270 else nil
265271 if ((fpUpdate == fpUpdate))
266272 then {
267273 let reward = if ((lastCheckInterest > 0))
268274 then fraction((currentInterest - lastCheckInterest), stakedAmount, Scale)
269275 else 0
270276 $Tuple2(([ScriptTransfer(addressFromStringValue(walletToReceive), reward, getEggAssetId()), IntegerEntry(keyLastCheckInterest(address, asset), currentInterest), IntegerEntry(rewardClaimedKey(walletToReceive, asset), (tryGetInteger(rewardClaimedKey(walletToReceive, asset)) + reward))] ++ fpUpdate), reward)
271277 }
272278 else throw("Strict value is not equal to itself.")
273279 }
274280
275281
276282 func asBoolean (value) = match value {
277283 case boolean: Boolean =>
278284 boolean
279285 case _ =>
280286 throw("FAB: wrong type, expected: Boolean")
281287 }
282288
283289
284290 func calculatePerchPrice (address) = {
285291 let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner"))
286292 let perchPrice = getIntegerValue(getOracle(), staticKey_perchFee())
287293 if ((hasArtefactStaked == ""))
288294 then perchPrice
289295 else ((perchPrice / 10) * 9)
290296 }
291297
292298
293299 func isProxyStakingSc (address) = {
294300 let allowedContracts = getProxyStaking()
295301 let allowedContractsList = split(allowedContracts, ";")
296302 (indexOf(allowedContractsList, address) != unit)
297303 }
298304
299305
300306 @Callable(i)
301307 func calculateFarmPower (assetId,bonusAddress) = if (!(if ((value(assetInfo(fromBase58String(assetId))).issuer == getBreederAddress()))
302308 then true
303309 else (value(assetInfo(fromBase58String(assetId))).issuer == getIncubatorAddress())))
304310 then throw("This does not seem like a valid Duck!")
305- else {
306- let assetName = value(assetInfo(fromBase58String(assetId))).name
307- let gen = takeRight(assetName, 1)
308- let isJackpot = (takeRight(assetName, 1) == "U")
309- let rarity = getAssetRarityComplete(isJackpot, assetName)
310- let genotype = split(dropRight(drop(assetName, 5), 3), "")
311- func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
312- then (accum :+ nextGen)
313- else accum
311+ else if (if (tryGetBooleanExternal(getBreederAddress(), (assetId + "_blacklisted")))
312+ then true
313+ else tryGetBooleanExternal(getIncubatorAddress(), (assetId + "_blacklisted")))
314+ then throw("Screw urself")
315+ else {
316+ let assetName = value(assetInfo(fromBase58String(assetId))).name
317+ let gen = takeRight(assetName, 1)
318+ let isJackpot = (takeRight(assetName, 1) == "U")
319+ let rarity = getAssetRarityComplete(isJackpot, assetName)
320+ let genotype = split(dropRight(drop(assetName, 5), 3), "")
321+ func uniqueArrayFilter (accum,nextGen) = if (!(containsElement(accum, nextGen)))
322+ then (accum :+ nextGen)
323+ else accum
314324
315- let uniqueList = {
316- let $l = genotype
317- let $s = size($l)
318- let $acc0 = nil
319- func $f0_1 ($a,$i) = if (($i >= $s))
320- then $a
321- else uniqueArrayFilter($a, $l[$i])
325+ let uniqueList = {
326+ let $l = genotype
327+ let $s = size($l)
328+ let $acc0 = nil
329+ func $f0_1 ($a,$i) = if (($i >= $s))
330+ then $a
331+ else uniqueArrayFilter($a, $l[$i])
322332
323- func $f0_2 ($a,$i) = if (($i >= $s))
324- then $a
325- else throw("List size exceeds 8")
333+ func $f0_2 ($a,$i) = if (($i >= $s))
334+ then $a
335+ else throw("List size exceeds 8")
326336
327- $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)
337+ $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)
338+ }
339+ let totalGenes = if ((gen == "U"))
340+ then 8
341+ else size(uniqueList)
342+ let power = pow(15, 1, totalGenes, 0, 2, DOWN)
343+ let baseBlock = if (isTestEnv())
344+ then 2500000
345+ else 3750000
346+ let multiplier = (((height - baseBlock) * 100) / (((60 * 24) * 30) * 3))
347+ let basePower = tryGetInteger((assetId + "_basePower"))
348+ let finalPower = if ((basePower > 0))
349+ then basePower
350+ else ((power * multiplier) / 100)
351+ let finalPowerRarity = ((finalPower * rarity) / 100)
352+ let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [assetId, bonusAddress], nil))
353+ if ((farmBoost == farmBoost))
354+ then {
355+ let wearabledBoost = asInt(invoke(getWearablesAddress(), "calculateWearblesBoost", [assetId], nil))
356+ if ((wearabledBoost == wearabledBoost))
357+ then {
358+ let finalPowerRarityBoost = ((finalPowerRarity + ((finalPowerRarity * farmBoost) / 100)) + ((finalPowerRarity * wearabledBoost) / 1000))
359+ $Tuple2(nil, $Tuple2(finalPowerRarityBoost, finalPower))
360+ }
361+ else throw("Strict value is not equal to itself.")
362+ }
363+ else throw("Strict value is not equal to itself.")
328364 }
329- let totalGenes = if ((gen == "U"))
330- then 8
331- else size(uniqueList)
332- let power = pow(15, 1, totalGenes, 0, 2, DOWN)
333- let baseBlock = if (isTestEnv())
334- then 2500000
335- else 3750000
336- let multiplier = (((height - baseBlock) * 100) / (((60 * 24) * 30) * 3))
337- let basePower = tryGetInteger((assetId + "_basePower"))
338- let finalPower = if ((basePower > 0))
339- then basePower
340- else ((power * multiplier) / 100)
341- let finalPowerRarity = ((finalPower * rarity) / 100)
342- let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [assetId, bonusAddress], nil))
343- if ((farmBoost == farmBoost))
344- then {
345- let finalPowerRarityBoost = (finalPowerRarity + ((finalPowerRarity * farmBoost) / 100))
346- $Tuple2(nil, $Tuple2(finalPowerRarityBoost, finalPower))
347- }
348- else throw("Strict value is not equal to itself.")
349- }
350365
351366
352367
353368 @Callable(i)
354369 func configureOracle (oracle) = if ((i.caller != this))
355370 then throw("FCO: admin only")
356371 else [StringEntry(staticKey_oracleAddress(), oracle)]
357372
358373
359374
360375 @Callable(i)
361376 func buyPerch (colorI,refererAddress) = {
362377 let validPayment = checkAdditionalPayment(i.payments[0])
363378 if ((validPayment == validPayment))
364379 then {
365380 let color = if ((colorI == "U"))
366381 then "B"
367382 else colorI
368383 if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
369384 then throw("you need to set color properly")
370385 else {
371386 let exactPrice = calculatePerchPrice(toString(i.caller))
372387 let leftToPay = if ((i.originCaller == i.caller))
373388 then {
374389 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [exactPrice], nil))
375390 if ((amountPaidByCoupons == amountPaidByCoupons))
376391 then (exactPrice - amountPaidByCoupons)
377392 else throw("Strict value is not equal to itself.")
378393 }
379394 else exactPrice
380395 let payment = if ((leftToPay != 0))
381396 then {
382397 let firstPayment = if ((size(i.payments) == 2))
383398 then value(i.payments[1])
384399 else value(i.payments[0])
385400 if ((firstPayment.assetId != getEggAssetId()))
386401 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
387402 else if ((firstPayment.amount != leftToPay))
388403 then throw(((("FBP: To buy a perch you currently need the following amount of EGGlets: " + toString(leftToPay)) + " ") + toString(i.caller)))
389404 else {
390405 let refererRewardForPerch = fraction(leftToPay, 5, 100)
391406 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
392407 if ((refCall == refCall))
393408 then {
394409 let toBurn = if (refCall)
395410 then (leftToPay - refererRewardForPerch)
396411 else leftToPay
397412 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
398413 if ((burnCall == burnCall))
399414 then leftToPay
400415 else throw("Strict value is not equal to itself.")
401416 }
402417 else throw("Strict value is not equal to itself.")
403418 }
404419 }
405420 else 0
406421 if ((payment == payment))
407422 then {
408423 let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color)
409424 let perchAmount = tryGetInteger(perchAmountKey)
410425 ([IntegerEntry(perchAmountKey, (perchAmount + 1))] ++ validPayment)
411426 }
412427 else throw("Strict value is not equal to itself.")
413428 }
414429 }
415430 else throw("Strict value is not equal to itself.")
416431 }
417432
418433
419434
420435 @Callable(i)
421436 func addFreePerch (address,color,amount) = if ((0 > value(indexOf(["B", "R", "G", "Y"], color))))
422437 then throw("you need to set color properly")
423- else if (if (if ((i.caller != getRebirthAddress()))
438+ else if (if (if (if ((i.caller != getRebirthAddress()))
424439 then (i.caller != getTurtleRebirthAddress())
425440 else false)
426441 then (i.caller != this)
442+ else false)
443+ then (i.caller != getCouponsAddress())
427444 else false)
428445 then throw("rebirth and admin only")
429446 else {
430447 let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color)
431448 let perchAmount = tryGetInteger(perchAmountKey)
432449 $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + amount))], "")
433450 }
434451
435452
436453
437454 @Callable(i)
438455 func migratePerches (address) = {
439456 let oldFarming = addressFromStringValue(tryGetStringExternal(getOracle(), "static_farmingAddress"))
440457 func tryGetIntegerOldFarming (key) = match getInteger(oldFarming, key) {
441458 case b: Int =>
442459 b
443460 case _ =>
444461 0
445462 }
446463
447464 let perchAmountB = tryGetIntegerOldFarming((("address_" + address) + "_perchesAvailable_B"))
448465 if ((perchAmountB == perchAmountB))
449466 then {
450467 let perchAmountR = tryGetIntegerOldFarming((("address_" + address) + "_perchesAvailable_R"))
451468 if ((perchAmountR == perchAmountR))
452469 then {
453470 let perchAmountG = tryGetIntegerOldFarming((("address_" + address) + "_perchesAvailable_G"))
454471 if ((perchAmountG == perchAmountG))
455472 then {
456473 let perchAmountY = tryGetIntegerOldFarming((("address_" + address) + "_perchesAvailable_Y"))
457474 if ((perchAmountY == perchAmountY))
458475 then {
459476 let perchAmountBInvoke = invoke(this, "addFreePerch", [address, "B", perchAmountB], nil)
460477 if ((perchAmountBInvoke == perchAmountBInvoke))
461478 then {
462479 let perchAmountRInvoke = invoke(this, "addFreePerch", [address, "R", perchAmountR], nil)
463480 if ((perchAmountRInvoke == perchAmountRInvoke))
464481 then {
465482 let perchAmountGInvoke = invoke(this, "addFreePerch", [address, "G", perchAmountG], nil)
466483 if ((perchAmountGInvoke == perchAmountGInvoke))
467484 then {
468485 let perchAmountYInvoke = invoke(this, "addFreePerch", [address, "Y", perchAmountY], nil)
469486 if ((perchAmountYInvoke == perchAmountYInvoke))
470487 then if (if (if (if ((perchAmountB == 0))
471488 then (perchAmountR == 0)
472489 else false)
473490 then (perchAmountG == 0)
474491 else false)
475492 then (perchAmountY == 0)
476493 else false)
477494 then throw("Nothing to migrate")
478495 else {
479496 let invokePerchesDelete = invoke(oldFarming, "removePerches", [address], nil)
480497 if ((invokePerchesDelete == invokePerchesDelete))
481498 then nil
482499 else throw("Strict value is not equal to itself.")
483500 }
484501 else throw("Strict value is not equal to itself.")
485502 }
486503 else throw("Strict value is not equal to itself.")
487504 }
488505 else throw("Strict value is not equal to itself.")
489506 }
490507 else throw("Strict value is not equal to itself.")
491508 }
492509 else throw("Strict value is not equal to itself.")
493510 }
494511 else throw("Strict value is not equal to itself.")
495512 }
496513 else throw("Strict value is not equal to itself.")
497514 }
498515 else throw("Strict value is not equal to itself.")
499516 }
500517
501518
502519
503520 @Callable(i)
504521 func stakeNFT (jColor,usePerchOrigin,stakeWithoutPerch) = if (if (stakeWithoutPerch)
505522 then !(isProxyStakingSc(toString(i.caller)))
506523 else false)
507524 then throw("You can't stake without a perch")
508525 else {
509526 let validPayment = checkAdditionalPayment(i.payments[0])
510527 if ((validPayment == validPayment))
511528 then {
512529 let pmt = value(i.payments[1])
513530 let assetId = value(pmt.assetId)
514531 let assetName = value(value(assetInfo(assetId)).name)
515532 let isJackpot = (takeRight(assetName, 1) == "U")
516533 let address = toString(i.caller)
517534 let perchAddress = if (usePerchOrigin)
518535 then toString(i.originCaller)
519536 else address
520537 let perches = if (stakeWithoutPerch)
521538 then nil
522539 else {
523540 let color = if (isJackpot)
524541 then jColor
525542 else takeRight(assetName, 1)
526543 let availablePerches = tryGetInteger(((("address_" + perchAddress) + "_perchesAvailable_") + color))
527544 if ((0 >= availablePerches))
528545 then throw(("no perches available for the color " + color))
529546 else [IntegerEntry(((("address_" + perchAddress) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]
530547 }
531548 if ((perches == perches))
532549 then if ((pmt.amount != 1))
533550 then throw("NFT is not attached")
534551 else {
535552 let farmingPower = asIntTuple(invoke(this, "calculateFarmPower", [toBase58String(assetId), toString(i.originCaller)], nil))
536553 if ((farmingPower == farmingPower))
537554 then {
538555 let result = claimStakingResult(address, toBase58String(assetId), false, address, toString(i.originCaller))
539556 if ((result == result))
540557 then ((([IntegerEntry(totalStakedKey(), (tryGetInteger(totalStakedKey()) + farmingPower._1)), IntegerEntry(totalStakedUserKey(address), (tryGetInteger(totalStakedUserKey(address)) + farmingPower._1)), StringEntry((toBase58String(assetId) + "_owner"), address), BooleanEntry((toBase58String(assetId) + "_use_origin"), usePerchOrigin), StringEntry((toBase58String(assetId) + "_original_caller"), toString(i.originCaller)), IntegerEntry(assetFarmingPower(address, toBase58String(assetId)), farmingPower._1), IntegerEntry((toBase58String(assetId) + "_basePower"), farmingPower._2), BooleanEntry((toBase58String(assetId) + "_without_perch"), stakeWithoutPerch)] ++ validPayment) ++ perches) ++ result._1)
541558 else throw("Strict value is not equal to itself.")
542559 }
543560 else throw("Strict value is not equal to itself.")
544561 }
545562 else throw("Strict value is not equal to itself.")
546563 }
547564 else throw("Strict value is not equal to itself.")
548565 }
549566
550567
551568
552569 @Callable(i)
553570 func unstakeNFT (asset) = {
554571 let address = toString(i.caller)
555572 if ((tryGetString((asset + "_owner")) != toString(i.caller)))
556573 then throw("You don't own this duck!!")
557574 else {
558575 let result = claimStakingResult(address, asset, false, address, toString(i.originCaller))
559576 if ((result == result))
560577 then {
561578 let validPayment = checkAdditionalPayment(i.payments[0])
562579 if ((validPayment == validPayment))
563580 then {
564581 let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor"))
565582 let withoutPerch = tryGetBoolean((asset + "_without_perch"))
566583 let perches = if (withoutPerch)
567584 then nil
568585 else {
569586 let usePerchOrigin = tryGetBoolean((asset + "_use_origin"))
570587 let perchOwner = if (usePerchOrigin)
571588 then toString(i.originCaller)
572589 else address
573590 [IntegerEntry(((("address_" + perchOwner) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + perchOwner) + "_perchesAvailable_") + color)) + 1))]
574591 }
575592 if ((perches == perches))
576593 then {
577594 let assetFP = tryGetInteger(assetFarmingPower(address, asset))
578595 if ((assetFP == assetFP))
579596 then $Tuple2(((([IntegerEntry(totalStakedKey(), (tryGetInteger(totalStakedKey()) - assetFP)), IntegerEntry(totalStakedUserKey(address), (tryGetInteger(totalStakedUserKey(address)) - assetFP)), DeleteEntry((asset + "_owner")), DeleteEntry(assetFarmingPower(address, asset)), DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_perchColor")), DeleteEntry((asset + "_original_caller")), DeleteEntry((asset + "_use_origin")), DeleteEntry((asset + "_without_perch")), ScriptTransfer(Address(fromBase58String(address)), 1, fromBase58String(asset))] ++ validPayment) ++ perches) ++ result._1), result._2)
580597 else throw("Strict value is not equal to itself.")
581598 }
582599 else throw("Strict value is not equal to itself.")
583600 }
584601 else throw("Strict value is not equal to itself.")
585602 }
586603 else throw("Strict value is not equal to itself.")
587604 }
588605 }
589606
590607
591608
592609 @Callable(i)
593610 func topUpReward () = {
594611 let firstPayment = value(i.payments[0])
595612 if ((firstPayment.assetId != getEggAssetId()))
596613 then throw(("FBP: You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
597614 else {
598615 let resHandleStaking = handleStakingTopUp(firstPayment.amount)
599616 $Tuple2(resHandleStaking, true)
600617 }
601618 }
602619
603620
604621
605622 @Callable(i)
606623 func claimReward (assetId) = {
607624 let validPayment = if ((i.originCaller == getCfMasterAddress()))
608625 then nil
609626 else checkAdditionalPayment(i.payments[0])
610627 if ((validPayment == validPayment))
611628 then if (if ((tryGetString((assetId + "_owner")) != toString(i.caller)))
612629 then (tryGetString((assetId + "_original_caller")) != toString(i.caller))
613630 else false)
614631 then throw((("You don't own this duck (" + assetId) + ")!! "))
615632 else if ((size(i.payments) > 1))
616633 then throw("Please don't add extra payments")
617634 else {
618635 let toReceive = if ((i.originCaller != getCfMasterAddress()))
619636 then toString(i.caller)
620637 else tryGetString((assetId + "_original_caller"))
621638 let owner = if ((i.originCaller != getCfMasterAddress()))
622639 then toString(i.caller)
623640 else tryGetString((assetId + "_owner"))
624641 let origin = if ((i.originCaller != getCfMasterAddress()))
625642 then toString(i.originCaller)
626643 else tryGetString((assetId + "_original_caller"))
627644 let result = claimStakingResult(owner, assetId, true, toReceive, origin)
628645 $Tuple2((validPayment ++ result._1), result._2)
629646 }
630647 else throw("Strict value is not equal to itself.")
631648 }
632649
633650
634651
635652 @Callable(i)
636653 func redeemItem (type,nftAssetId) = {
637654 let wavesPayment = i.payments[0]
638655 if ((wavesPayment == wavesPayment))
639656 then {
640657 let potionPayment = value(i.payments[1])
641658 if ((potionPayment == potionPayment))
642659 then if ((potionPayment.amount != 1))
643660 then throw("You need to attach exactly 1 potion")
644661 else {
645662 let artefact = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(value(value(potionPayment).assetId))], nil))
646663 if ((artefact == artefact))
647664 then if ((artefact != "ART-POTION"))
648665 then throw("You need to attach a ART-POTION artefact")
649666 else if ((wavesPayment.assetId != unit))
650667 then throw("You need to attach waves")
651668 else if ((wavesPayment.amount != getPotionFee()))
652669 then throw((("You need to attach exactly " + toString(getPotionFee())) + " waves"))
653670 else {
654671 let sendToAggreGator = (wavesPayment.amount / 2)
655672 let topup = (wavesPayment.amount - sendToAggreGator)
656673 let basePower = tryGetInteger((nftAssetId + "_basePower"))
657674 if ((basePower == 0))
658675 then throw("This is not a valid duck or the duck waves never staked!")
659676 else if ((tryGetString((nftAssetId + "_owner")) != ""))
660677 then throw("Please usntake your duck first!!")
661678 else {
662679 let addMore = invoke(getCanineStakingAddress(), "addWavesAndStakeMore", nil, [AttachedPayment(unit, topup)])
663680 if ((addMore == addMore))
664681 then [ScriptTransfer(getFeeAggregator(), sendToAggreGator, unit), DeleteEntry((nftAssetId + "_basePower"))]
665682 else throw("Strict value is not equal to itself.")
666683 }
667684 }
668685 else throw("Strict value is not equal to itself.")
669686 }
670687 else throw("Strict value is not equal to itself.")
671688 }
672689 else throw("Strict value is not equal to itself.")
673690 }
674691
675692
676693 @Verifier(tx)
677694 func verify () = if (isTestEnv())
678695 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
679696 else {
680697 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
681698 let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
682699 let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
683700 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
684701 then 1
685702 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
686703 then 1
687704 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
688705 then 1
689706 else 0
690707 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
691708 then 1
692709 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
693710 then 1
694711 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
695712 then 1
696713 else 0
697714 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
698715 then 1
699716 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
700717 then 1
701718 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
702719 then 1
703720 else 0
704721 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
705722 match tx {
706723 case _ =>
707724 (signaturesCount >= 2)
708725 }
709726 }
710727

github/deemru/w8io/169f3d6 
69.34 ms