tx · F3Pv6w3sV2oqxwdFZbnCnwiZ1ohyQCErVYr6ArdGz6cU

3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi:  -0.02700000 Waves

2023.03.01 18:28 [2471180] smart account 3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi > SELF 0.00000000 Waves

{ "type": 13, "id": "F3Pv6w3sV2oqxwdFZbnCnwiZ1ohyQCErVYr6ArdGz6cU", "fee": 2700000, "feeAssetId": null, "timestamp": 1677684553638, "version": 2, "chainId": 84, "sender": "3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi", "senderPublicKey": "BwVRZtTzoCigEsffCvQ9uo7WvkoBNNGVjX4nat5X5zyQ", "proofs": [ "5RJ8m8AhgmMyjov5MRqeLoGc5n8NioZgjAmxu8ETx2e8RV1ZdKHXQBvb9nKrg4wmZHWak1puW4cCnJzW3PgqMfmy" ], "script": "base64:BgJICAISBQoDCAgIEgASAwoBCBIECgIIARIAEgMKAQESBQoDCAEIEgMKAQgSBgoEAQEBARIECgIBARIECgIBCBIDCgEBEgASABIAegALcmV2aXNpb25OdW0CAAAGRVVMRVI4ANaJz4EBAAVNVUxUNgDAhD0ABk1VTFRYNgkAtgIBAMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg4CQC2AgEAgMLXLwAGTVVMVDEyAICglKWNHQAGTVVMVDE4CQC2AgEAgICQu7rWrfANAANTRVACAl9fAAtCUlBST1RFQ1RFRACgjQYADkRFRkFVTFRQQVlNRU5UAICU69wDABRERUZBVUxUQ1JFQVRJT05HTlNCVACAlOvcAwAHV0FWRVNJRAkA2QQBAgVXQVZFUwAPbk1ldHJpY0lkeFByaWNlAAAAG25NZXRyaWNJZHhVc2RuTG9ja2VkQmFsYW5jZQABABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAIAEW5NZXRyaWNJZHhSZXNlcnZlAAMAF25NZXRyaWNJZHhSZXNlcnZlSW5Vc2RuAAQAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAUAEW5NZXRyaWNJZHhTdXJwbHVzAAYAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAAHAAxuTWV0cmljSWR4QlIACAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkACQAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkACgAUbk1ldHJpY0lkeFN1cmZTdXBwbHkACwASbk1ldHJpY1VzZG5Vc2R0UGVnAAwAFm5NZXRyaWNDdXJyZW50UHJpY2VBZGoADQAMYkZ1bmNJZHhTdXJmAAAADWJGdW5jSWR4V2F2ZXMAAQAMYkZ1bmNJZHhVc2RuAAIAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAMAE2JGdW5jSWR4U3VwcGx5U3RhcnQABAAPYkZ1bmNJZHhCUlN0YXJ0AAUAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAGABFiRnVuY0lkeFN1cHBseUVuZAAHAA1iRnVuY0lkeEJSRW5kAAgADGJGdW5jSWR4UmVzdAAJABJiRnVuY0lkeFdhdmVzUHJpY2UACgESa2V5TmV1dHJpbm9BZGRyZXNzAAIdJXMlc19fY29uZmlnX19uZXV0cmlub0FkZHJlc3MBEmtleU5ldXRyaW5vQXNzZXRJZAACEW5ldXRyaW5vX2Fzc2V0X2lkAQ5rZXlOc2J0QXNzZXRJZAACDWJvbmRfYXNzZXRfaWQBDmtleVN1cmZBc3NldElkAAINc3VyZl9hc3NldF9pZAEQa2V5QmFsYW5jZUxvY2tlZAACDWJhbGFuY2VfbG9ja18BFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAJAKwCAgkBEGtleUJhbGFuY2VMb2NrZWQAAgV3YXZlcwEYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAkArAICCQEQa2V5QmFsYW5jZUxvY2tlZAACCG5ldXRyaW5vARVrZXlNaW5XYXZlc1N3YXBBbW91bnQAAiFtaW5fb3V0TmV1dHJpbm9fc3dhcF9hbW91bnRfV0FWRVMBGGtleU1pbk5ldXRyaW5vU3dhcEFtb3VudAACGG1pbl9vdXRNdWx0aV9zd2FwX2Ftb3VudAESa2V5V2F2ZXNPdXRGZWVQYXJ0AAIVd2F2ZXNPdXRfc3dhcF9mZWVQYXJ0ARVrZXlOZXV0cmlub091dEZlZVBhcnQAAhhuZXV0cmlub091dF9zd2FwX2ZlZVBhcnQBE2tleVN3YXBBbW91bnRBUGFyYW0AAhglcyVzX19jb25maWdfX3N3YXBBUGFyYW0BE2tleVN3YXBBbW91bnRCUGFyYW0AAhglcyVzX19jb25maWdfX3N3YXBCUGFyYW0BF2tleVVzZG5Td2FwQW1vdW50QVBhcmFtAAIcJXMlc19fY29uZmlnX191c2RuU3dhcEFQYXJhbQEXa2V5VXNkblN3YXBBbW91bnRCUGFyYW0AAhwlcyVzX19jb25maWdfX3VzZG5Td2FwQlBhcmFtARNrZXlOc2J0TG9ja0NvbnRyYWN0AAIUJXNfX25zYnRMb2NrQ29udHJhY3QBD2tleU1hdGhDb250cmFjdAACECVzX19tYXRoQ29udHJhY3QBDmJyUHJvdGVjdGVkS0VZAAIXbWluX0JSX3Byb3RlY3Rpb25fbGV2ZWwBG2tleUJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAACG2JhbGFuY2Vfd2F2ZXNfbG9ja19pbnRlcnZhbAEea2V5QmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsAAIeYmFsYW5jZV9uZXV0cmlub19sb2NrX2ludGVydmFsARJrZXlQYXltZW50UmVxdWlyZWQAAhMlc19fcGF5bWVudFJlcXVpcmVkARBrZXlHbnNidFJlcXVpcmVkAAIRJXNfX2dOc2J0UmVxdWlyZWQBEXN3YXBzVGltZWZyYW1lS0VZAAIPc3dhcHNfdGltZWZyYW1lAQhrZXlQcmljZQACBXByaWNlARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCAgVzdGFydAUDbmlsBQNTRVABC2tleUhhbGZMaWZlAAIMJXNfX2hhbGZMaWZlARBrZXlNaW5Mb2NrQW1vdW50AAIRJXNfX21pbkxvY2tBbW91bnQBFWtleU1pbldhdmVzRm9yTnNidEJ1eQACEm1pbl93YXZlc19uc2J0X2J1eQEOa2V5TWluTnNidFNlbGwAAg1taW5fbnNidF9zZWxsARhrZXlScGRDb250cmFjdEJhbGFuY2VLZXkBB2Fzc2V0SWQJAKwCAgIMcnBkX2JhbGFuY2VfBQdhc3NldElkAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAEMZ2V0SW50T3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDWdldEJvb2xPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJsIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAEWY29udmVydE5ldXRyaW5vVG9XYXZlcwIGYW1vdW50BXByaWNlCQBrAwUGYW1vdW50BQVNVUxUOAUFcHJpY2UBFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8CBmFtb3VudAVwcmljZQkAawMFBmFtb3VudAUFcHJpY2UFBU1VTFQ4AQlhc0FueUxpc3QBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQKdmFsQW55TGlzdAUHJG1hdGNoMAUKdmFsQW55TGlzdAkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCGFzU3RyaW5nAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnZhbFN0cgUHJG1hdGNoMAUGdmFsU3RyCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQxhc1R1cGxlMkludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXYFByRtYXRjaDAFAXYJAAIBAh1mYWlsIHRvIGNhc3QgaW50byBUdXBsZTIgaW50cwESYXNTd2FwUGFyYW1zU1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAiJmYWlsIHRvIGNhc3QgaW50byBTd2FwUGFyYW1zU1RSVUNUAQt0b1RpbWVzdGFtcAEFc3RhcnQDCQBmAgAABQVzdGFydAD///////////8BBAckbWF0Y2gwCQDtBwEFBXN0YXJ0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAA////////////AQEFdG9YMTgCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFBk1VTFQxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQdmcm9tWDE4AgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUGTVVMVDE4ABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAEAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAACABRJZHhDb250cm9sQ2ZnUnBkRGFwcAADABVJZHhDb250cm9sQ2ZnTWF0aERhcHAABAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAFABVJZHhDb250cm9sQ2ZnUmVzdERhcHAABgAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAABwAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAIABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAkAHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAACgAgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAACwAXSWR4Q29udHJvbENmZ1Jlc3RWMkRhcHAADAAbSWR4Q29udHJvbENmZ0dvdmVybmFuY2VEYXBwAA0BEWtleUNvbnRyb2xBZGRyZXNzAAIcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwENa2V5Q29udHJvbENmZwACESVzX19jb250cm9sQ29uZmlnARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAALcnBkQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRRJZHhDb250cm9sQ2ZnUnBkRGFwcAATbnNidFN0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAAE3N1cmZTdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwABdnbnNidENvbnRyb2xsZXJDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAA5yZXN0VjJDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFF0lkeENvbnRyb2xDZmdSZXN0VjJEYXBwABJnb3Zlcm5hbmNlQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRtJZHhDb250cm9sQ2ZnR292ZXJuYW5jZURhcHAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBD2dldFN0cmluZ09yRmFpbAIFEG5ldXRyaW5vQ29udHJhY3QJARJrZXlOZXV0cmlub0Fzc2V0SWQAAA9uZXV0cmlub0Fzc2V0SWQJANkEAQUVbmV1dHJpbm9Bc3NldElkU3RyaW5nAA5uc2J0QXNzZXRJZFN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDmtleU5zYnRBc3NldElkAAALbnNidEFzc2V0SWQJANkEAQUObnNidEFzc2V0SWRTdHIADnN1cmZBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9hdWN0aW9uQ29udHJhY3QJAQ5rZXlTdXJmQXNzZXRJZAAAC3N1cmZBc3NldElkCQDZBAEFDnN1cmZBc3NldElkU3RyARJtaW5XYXZlc0Zvck5zYnRCdXkACQEFYXNJbnQBCQD8BwQFD2F1Y3Rpb25Db250cmFjdAIgbWluV2F2ZXNBbW91bnROc2J0QnV5U1lTUkVBRE9OTFkFA25pbAUDbmlsAQ5taW5Oc2J0Rm9yU2VsbAAJAQVhc0ludAEJAPwHBAUPYXVjdGlvbkNvbnRyYWN0Ah9taW5Oc2J0QW1vdW50Rm9yU2VsbFNZU1JFQURPTkxZBQNuaWwFA25pbAESbWluV2F2ZXNGb3JTdXJmQnV5AAkBBWFzSW50AQkA/AcEBQ9hdWN0aW9uQ29udHJhY3QCIG1pbldhdmVzQW1vdW50U3VyZkJ1eVNZU1JFQURPTkxZBQNuaWwFA25pbAERbWluVXNkbkZvclN1cmZCdXkACQEFYXNJbnQBCQD8BwQFD2F1Y3Rpb25Db250cmFjdAIfbWluVXNkbkFtb3VudFN1cmZCdXlTWVNSRUFET05MWQUDbmlsBQNuaWwBFHByaXZhdGVOc2J0UHJpY2VSRVNUAAQGcHJpY2VzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCIGNhbGNDb250cmFjdE5zYnRQcmljZVNZU1JFQURPTkxZCQDMCAIAAAUDbmlsBQNuaWwEDm5zYnQydXNkblByaWNlCQEFYXNJbnQBCQCRAwIFBnByaWNlcwAABA9uc2J0MndhdmVzUHJpY2UJAQVhc0ludAEJAJEDAgUGcHJpY2VzAAEJAJQKAgkBDEludGVnZXJFbnRyeQICDm5zYnQydXNkblByaWNlBQ5uc2J0MnVzZG5QcmljZQkBDEludGVnZXJFbnRyeQICD25zYnQyd2F2ZXNQcmljZQUPbnNidDJ3YXZlc1ByaWNlAQ5nZXRMb2NrZWRPblJwZAIHYWRkclN0cgphc3NldElkU3RyBANrZXkJALkJAgkAzAgCAgtycGRfYmFsYW5jZQkAzAgCBQphc3NldElkU3RyCQDMCAIFB2FkZHJTdHIFA25pbAIBXwkBC3ZhbHVlT3JFbHNlAgkAmggCBQtycGRDb250cmFjdAUDa2V5AAAPAWkBDWNvbnN0cnVjdG9yVjEDD25ldXRyaW5vQWRkcmVzcw9uc2J0TG9ja0FkZHJlc3MLbWF0aEFkZHJlc3MDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5ub3QgYXV0aG9yaXplZAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5TmV1dHJpbm9BZGRyZXNzAAUPbmV1dHJpbm9BZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlOc2J0TG9ja0NvbnRyYWN0AAUPbnNidExvY2tBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlNYXRoQ29udHJhY3QABQttYXRoQWRkcmVzcwUDbmlsAWkBFW5ldXRyaW5vU3RhdHNSRUFET05MWQAED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEBnByaWNlcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AiBjYWxjQ29udHJhY3ROc2J0UHJpY2VTWVNSRUFET05MWQkAzAgCAAAFA25pbAUDbmlsBAxjdXJyZW50UHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UEFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFG25NZXRyaWNJZHhVc2RuTG9ja2VkQmFsYW5jZQQSd2F2ZXNMb2NrZWRCYWxhbmNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUcbk1ldHJpY0lkeFdhdmVzTG9ja2VkQmFsYW5jZQQPcmVzZXJ2ZXNJbldhdmVzCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwURbk1ldHJpY0lkeFJlc2VydmUEDnJlc2VydmVzSW5Vc2RuCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4EDm5ldXRyaW5vU3VwcGx5CQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY0lkeFVzZG5TdXBwbHkEB3N1cnBsdXMJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRFuTWV0cmljSWR4U3VycGx1cwQOc3VycGx1c1BlcmNlbnQJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRhuTWV0cmljSWR4U3VycGx1c1BlcmNlbnQEAkJSCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUMbk1ldHJpY0lkeEJSBApuc2J0U3VwcGx5CQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY0lkeE5zYnRTdXBwbHkEDW1heE5zYnRTdXBwbHkJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRduTWV0cmljSWR4TWF4TnNidFN1cHBseQQLdXNkblVzZHRQZWcJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRJuTWV0cmljVXNkblVzZHRQZWcECWJ1cm5QcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFFm5NZXRyaWNDdXJyZW50UHJpY2VBZGoECmlzc3VlUHJpY2UFDGN1cnJlbnRQcmljZQQObnNidDJ1c2RuUHJpY2UJAQVhc0ludAEJAJEDAgUGcHJpY2VzAAAED25zYnQyd2F2ZXNQcmljZQkBBWFzSW50AQkAkQMCBQZwcmljZXMAAQQQbWF4V2F2ZXMyQnV5U3VyZgkAZQIJAGsDBQ5uZXV0cmlub1N1cHBseQUFTVVMVDgFDGN1cnJlbnRQcmljZQUPcmVzZXJ2ZXNJbldhdmVzBA9tYXhVc2RuMkJ1eVN1cmYJAGUCBQ5uZXV0cmlub1N1cHBseQUOcmVzZXJ2ZXNJblVzZG4ED3N1cmZQcmljZUluVXNkbgUCQlIEEHN1cmZQcmljZUluV2F2ZXMJAGsDBQJCUgUFTVVMVDYFDGN1cnJlbnRQcmljZQQPdG90YWxVc2RuU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFC3JwZENvbnRyYWN0CQEYa2V5UnBkQ29udHJhY3RCYWxhbmNlS2V5AQUVbmV1dHJpbm9Bc3NldElkU3RyaW5nAAAJAJQKAgUDbmlsCQC5CQIJAMwIAgIiJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDGN1cnJlbnRQcmljZQkAzAgCCQCkAwEFFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkAzAgCCQCkAwEFEndhdmVzTG9ja2VkQmFsYW5jZQkAzAgCCQCkAwEFD3Jlc2VydmVzSW5XYXZlcwkAzAgCCQCkAwEFDnJlc2VydmVzSW5Vc2RuCQDMCAIJAKQDAQUObmV1dHJpbm9TdXBwbHkJAMwIAgkApAMBBQdzdXJwbHVzCQDMCAIJAKQDAQUOc3VycGx1c1BlcmNlbnQJAMwIAgkApAMBBQJCUgkAzAgCCQCkAwEFCm5zYnRTdXBwbHkJAMwIAgkApAMBBQ1tYXhOc2J0U3VwcGx5CQDMCAIJAKQDAQUObnNidDJ1c2RuUHJpY2UJAMwIAgkApAMBBQ9uc2J0MndhdmVzUHJpY2UJAMwIAgkApAMBBQt1c2RuVXNkdFBlZwkAzAgCCQCkAwEFCmlzc3VlUHJpY2UJAMwIAgkApAMBBQlidXJuUHJpY2UJAMwIAgkApAMBBQ90b3RhbFVzZG5TdGFrZWQFA25pbAUDU0VQAWkBEHN3YXBJbmZvUkVBRE9OTFkBEXVzZXJBZGRyZXNzU3RyT3B0BAxjdXJyZW50UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD2NvbnRyb2xDb250cmFjdAkBCGtleVByaWNlAAQPbWluV2F2ZXNTd2FwQW10CQERQGV4dHJOYXRpdmUoMTA1MCkCBRBuZXV0cmlub0NvbnRyYWN0CQEVa2V5TWluV2F2ZXNTd2FwQW1vdW50AAQObWluVXNkblN3YXBBbXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEG5ldXRyaW5vQ29udHJhY3QJARhrZXlNaW5OZXV0cmlub1N3YXBBbW91bnQABA13YXZlczJVc2RuRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBRBuZXV0cmlub0NvbnRyYWN0CQESa2V5V2F2ZXNPdXRGZWVQYXJ0AAQNdXNkbjJXYXZlc0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUQbmV1dHJpbm9Db250cmFjdAkBFWtleU5ldXRyaW5vT3V0RmVlUGFydAAEFXVzZG5Td2FwRGVsYXlEdXJhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUQbmV1dHJpbm9Db250cmFjdAkBHmtleUJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAAEFndhdmVzU3dhcERlbGF5RHVyYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFEG5ldXRyaW5vQ29udHJhY3QJARtrZXlCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwABBBzd2FwUGFyYW1zU1RSVUNUCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgAABQNuaWwFA25pbAQUdG9rZW5Td2FwTGltaXRNYXhVc2QIBRBzd2FwUGFyYW1zU1RSVUNUAl8xBBJzd2FwTGltaXRTcGVudFVzZG4IBRBzd2FwUGFyYW1zU1RSVUNUAl8yBA5ibGNrczJMbXRSZXNldAgFEHN3YXBQYXJhbXNTVFJVQ1QCXzMEEHVzZG5Td2FwTGltaXRNYXgIBRBzd2FwUGFyYW1zU1RSVUNUAl83CQCUCgIFA25pbAkAuQkCCQDMCAICFiVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQxjdXJyZW50UHJpY2UJAMwIAgkApAMBBQ9taW5XYXZlc1N3YXBBbXQJAMwIAgkApAMBBQ5taW5Vc2RuU3dhcEFtdAkAzAgCCQCkAwEFDXdhdmVzMlVzZG5GZWUJAMwIAgkApAMBBQ11c2RuMldhdmVzRmVlCQDMCAIJAKQDAQUVdXNkblN3YXBEZWxheUR1cmF0aW9uCQDMCAIJAKQDAQUWd2F2ZXNTd2FwRGVsYXlEdXJhdGlvbgkAzAgCCQCkAwEFDmJsY2tzMkxtdFJlc2V0CQDMCAIJAKQDAQUUdG9rZW5Td2FwTGltaXRNYXhVc2QJAMwIAgkApAMBBRB1c2RuU3dhcExpbWl0TWF4CQDMCAIJAKQDAQUSc3dhcExpbWl0U3BlbnRVc2RuBQNuaWwFA1NFUAFpARFnbnNidEluZm9SRUFET05MWQIRdXNlckFkZHJlc3NTdHJPcHQLbnNidEFtdERpZmYEDGN1cnJlbnRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPY29udHJvbENvbnRyYWN0CQEIa2V5UHJpY2UABApzd2FwUGFyYW1zCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgAABQNuaWwFA25pbAQSbGltaXRNYXhUb2tlbkluVXNkCAUKc3dhcFBhcmFtcwJfMQQOYmxja3MyTG10UmVzZXQIBQpzd2FwUGFyYW1zAl8zBAhnbnNidEFtdAgFCnN3YXBQYXJhbXMCXzQEDWduc2J0QW10VG90YWwIBQpzd2FwUGFyYW1zAl81BAxsaW1pdE1heFVzZG4IBQpzd2FwUGFyYW1zAl83BA1zd2FwUGFyYW1zTkVXCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgULbnNidEFtdERpZmYFA25pbAUDbmlsBBVsaW1pdE1heFRva2VuSW5Vc2RORVcIBQ1zd2FwUGFyYW1zTkVXAl8xBBFibGNrczJMbXRSZXNldE5FVwgFDXN3YXBQYXJhbXNORVcCXzMEC2duc2J0QW10TkVXCAUNc3dhcFBhcmFtc05FVwJfNAQQZ25zYnRBbXRUb3RhbE5FVwgFDXN3YXBQYXJhbXNORVcCXzUED2xpbWl0TWF4VXNkbk5FVwgFDXN3YXBQYXJhbXNORVcCXzcECmduc2J0U2hhcmUDCQECIT0CBQ1nbnNidEFtdFRvdGFsAAAJAGsDCQBoAgUIZ25zYnRBbXQAZAUGTVVMVDEyBQ1nbnNidEFtdFRvdGFsAAAEDWduc2J0U2hhcmVORVcDCQECIT0CBRBnbnNidEFtdFRvdGFsTkVXAAAJAGsDCQBoAgULZ25zYnRBbXRORVcAZAUGTVVMVDEyBRBnbnNidEFtdFRvdGFsTkVXAAAECnJld2FyZEluZm8JAQhhc1N0cmluZwEJAPwHBAUTbnNidFN0YWtpbmdDb250cmFjdAIYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZCQDMCAIFEXVzZXJBZGRyZXNzU3RyT3B0BQNuaWwFA25pbAQHbnNidEFtdAUIZ25zYnRBbXQECm5zYnRBbXROZXcFC2duc2J0QW10TkVXBBJuc2J0QW10U3Rha2VkVG90YWwJAPAHAgUTbnNidFN0YWtpbmdDb250cmFjdAULbnNidEFzc2V0SWQEFW5zYnRBbXRTdGFrZWRUb3RhbE5ldwUSbnNidEFtdFN0YWtlZFRvdGFsBAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUTbnNidFN0YWtpbmdDb250cmFjdAIWbnNidFN0YWtpbmdTWVNSRUFET05MWQkAzAgCBRF1c2VyQWRkcmVzc1N0ck9wdAkAzAgCBQtuc2J0QW10RGlmZgUDbmlsBQNuaWwEEmlzRW1wdHlOc2J0QmFsYW5jZQMJAAACBQhnbnNidEFtdAAACQAAAgULZ25zYnRBbXRORVcAAAcEC3N0YXJ0SGVpZ2h0AwUSaXNFbXB0eU5zYnRCYWxhbmNlBQZoZWlnaHQJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQOc3RhcnRUaW1lc3RhbXAJAQt0b1RpbWVzdGFtcAEFC3N0YXJ0SGVpZ2h0BAhoYWxmTGlmZQkBDGdldEludE9yRmFpbAIFE25zYnRTdGFraW5nQ29udHJhY3QJAQtrZXlIYWxmTGlmZQAEDnN0YXJ0SGVpZ2h0TmV3AwUSaXNFbXB0eU5zYnRCYWxhbmNlBQZoZWlnaHQJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AhNtZXJnZVN0YWtlc1JFQURPTkxZCQDMCAIFCGduc2J0QW10CQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFC2duc2J0QW10TkVXCQDMCAIFBmhlaWdodAkAzAgCBQhoYWxmTGlmZQUDbmlsBQNuaWwEEXN0YXJ0VGltZXN0YW1wTmV3CQELdG9UaW1lc3RhbXABBQ5zdGFydEhlaWdodE5ldwkAlAoCBQNuaWwJALkJAgkAzAgCAiIlZCVkJWQlZCVkJWQlZCVkJXMlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUIZ25zYnRBbXQJAMwIAgkApAMBBQtnbnNidEFtdE5FVwkAzAgCCQCkAwEFCmduc2J0U2hhcmUJAMwIAgkApAMBBQ1nbnNidFNoYXJlTkVXCQDMCAIJAKQDAQUMbGltaXRNYXhVc2RuCQDMCAIJAKQDAQUSbGltaXRNYXhUb2tlbkluVXNkCQDMCAIJAKQDAQUPbGltaXRNYXhVc2RuTkVXCQDMCAIJAKQDAQUVbGltaXRNYXhUb2tlbkluVXNkTkVXCQDMCAIFCnJld2FyZEluZm8JAMwIAgkApAMBBQduc2J0QW10CQDMCAIJAKQDAQUKbnNidEFtdE5ldwkAzAgCCQCkAwEFEm5zYnRBbXRTdGFrZWRUb3RhbAkAzAgCCQCkAwEFFW5zYnRBbXRTdGFrZWRUb3RhbE5ldwkAzAgCCQCkAwEFC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUOc3RhcnRUaW1lc3RhbXAJAMwIAgkApAMBBQ5zdGFydEhlaWdodE5ldwkAzAgCCQCkAwEFEXN0YXJ0VGltZXN0YW1wTmV3BQNuaWwFA1NFUAFpARZuZXV0cmlub0NvbmZpZ1JFQURPTkxZAAQLbGltaXRQYXJhbUEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDG1hdGhDb250cmFjdAkBE2tleVN3YXBBbW91bnRBUGFyYW0ABAtsaW1pdFBhcmFtQgkBEUBleHRyTmF0aXZlKDEwNTApAgUMbWF0aENvbnRyYWN0CQETa2V5U3dhcEFtb3VudEJQYXJhbQAED3VzZG5MaW1pdFBhcmFtQQkBEUBleHRyTmF0aXZlKDEwNTApAgUMbWF0aENvbnRyYWN0CQEXa2V5VXNkblN3YXBBbW91bnRBUGFyYW0ABA91c2RuTGltaXRQYXJhbUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDG1hdGhDb250cmFjdAkBF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAQPbWluV2F2ZXNTd2FwQW10CQERQGV4dHJOYXRpdmUoMTA1MCkCBRBuZXV0cmlub0NvbnRyYWN0CQEVa2V5TWluV2F2ZXNTd2FwQW1vdW50AAQObWluVXNkblN3YXBBbXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEG5ldXRyaW5vQ29udHJhY3QJARhrZXlNaW5OZXV0cmlub1N3YXBBbW91bnQABA13YXZlczJVc2RuRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBRBuZXV0cmlub0NvbnRyYWN0CQESa2V5V2F2ZXNPdXRGZWVQYXJ0AAQNdXNkbjJXYXZlc0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUQbmV1dHJpbm9Db250cmFjdAkBFWtleU5ldXRyaW5vT3V0RmVlUGFydAAEC2JyUHJvdGVjdGVkCQELdmFsdWVPckVsc2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJAQ5iclByb3RlY3RlZEtFWQAFC0JSUFJPVEVDVEVEBA11c2RuU3dhcERlbGF5CQERQGV4dHJOYXRpdmUoMTA1MCkCBRBuZXV0cmlub0NvbnRyYWN0CQEea2V5QmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsAAQOd2F2ZXNTd2FwRGVsYXkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEG5ldXRyaW5vQ29udHJhY3QJARtrZXlCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwABA5zd2Fwc1RpbWVmcmFtZQkBC3ZhbHVlT3JFbHNlAgkAmggCBRBuZXV0cmlub0NvbnRyYWN0CQERc3dhcHNUaW1lZnJhbWVLRVkAAKALBBBtaW5XYXZlczROc2J0QnV5CQESbWluV2F2ZXNGb3JOc2J0QnV5AAQLbWluTnNidHNlbGwJAQ5taW5Oc2J0Rm9yU2VsbAAEDm1pbk5zYnRMb2NrQW10CQERQGV4dHJOYXRpdmUoMTA1MCkCBRNuc2J0U3Rha2luZ0NvbnRyYWN0CQEQa2V5TWluTG9ja0Ftb3VudAAECGhhbGZMaWZlCQERQGV4dHJOYXRpdmUoMTA1MCkCBRNuc2J0U3Rha2luZ0NvbnRyYWN0CQELa2V5SGFsZkxpZmUABBBtaW5XYXZlczRTdXJmQnV5CQESbWluV2F2ZXNGb3JTdXJmQnV5AAQPbWluVXNkbjRTdXJmQnV5CQERbWluVXNkbkZvclN1cmZCdXkABA5zdXJmU3Rha2luZ0NmZwkBCWFzQW55TGlzdAEJAPwHBAUTc3VyZlN0YWtpbmdDb250cmFjdAIRY29uZmlnU1lTUkVBRE9OTFkFA25pbAUDbmlsBA9taW5TdXJmU3Rha2VBbXQJAQVhc0ludAEJAJEDAgUOc3VyZlN0YWtpbmdDZmcAAAQSZ25zYnRGcm9tU3VyZkNvZWZmCQEFYXNJbnQBCQCRAwIFDnN1cmZTdGFraW5nQ2ZnAAEEIHN1cmZWb3RpbmdQb3dlclJlc3RyaWN0aXZlUGVyaW9kCQEFYXNJbnQBCQCRAwIFDnN1cmZTdGFraW5nQ2ZnAAIEG2JyVG9TdGFydFN1cmZUcmFuc2Zvcm1hdGlvbgkBBWFzSW50AQkAkQMCBQ5zdXJmU3Rha2luZ0NmZwADBAhzaHV0ZG93bgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9jb250cm9sQ29udHJhY3QCCmlzX2Jsb2NrZWQHBBJ2b3RpbmdDcmVhdGlvbkNvc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSZ292ZXJuYW5jZUNvbnRyYWN0CQESa2V5UGF5bWVudFJlcXVpcmVkAAUOREVGQVVMVFBBWU1FTlQEGXZvdGluZ0NyZWF0aW9uR25zYnROZWVkZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSZ292ZXJuYW5jZUNvbnRyYWN0CQEQa2V5R25zYnRSZXF1aXJlZAAFFERFRkFVTFRDUkVBVElPTkdOU0JUCQCUCgIFA25pbAkAuQkCCQDMCAICMiVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWIlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQULbGltaXRQYXJhbUEJAMwIAgkApAMBBQtsaW1pdFBhcmFtQgkAzAgCCQCkAwEFD21pbldhdmVzU3dhcEFtdAkAzAgCCQCkAwEFDm1pblVzZG5Td2FwQW10CQDMCAIJAKQDAQUNd2F2ZXMyVXNkbkZlZQkAzAgCCQCkAwEFDXVzZG4yV2F2ZXNGZWUJAMwIAgkApAMBBRBtaW5XYXZlczROc2J0QnV5CQDMCAIJAKQDAQULbWluTnNidHNlbGwJAMwIAgkApAMBBQ5taW5Oc2J0TG9ja0FtdAkAzAgCCQCkAwEFCGhhbGZMaWZlCQDMCAIJAKQDAQUQbWluV2F2ZXM0U3VyZkJ1eQkAzAgCCQCkAwEFD21pblVzZG40U3VyZkJ1eQkAzAgCCQCkAwEFD21pblN1cmZTdGFrZUFtdAkAzAgCCQCkAwEFEmduc2J0RnJvbVN1cmZDb2VmZgkAzAgCCQCkAwEFIHN1cmZWb3RpbmdQb3dlclJlc3RyaWN0aXZlUGVyaW9kCQDMCAIJAKQDAQUbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uCQDMCAIJAKUDAQUIc2h1dGRvd24JAMwIAgkApAMBBQ91c2RuTGltaXRQYXJhbUEJAMwIAgkApAMBBQ91c2RuTGltaXRQYXJhbUIJAMwIAgkApAMBBQticlByb3RlY3RlZAkAzAgCCQCkAwEFDndhdmVzU3dhcERlbGF5CQDMCAIJAKQDAQUNdXNkblN3YXBEZWxheQkAzAgCCQCkAwEFEnZvdGluZ0NyZWF0aW9uQ29zdAkAzAgCCQCkAwEFGXZvdGluZ0NyZWF0aW9uR25zYnROZWVkZWQJAMwIAgkApAMBBQ5zd2Fwc1RpbWVmcmFtZQUDbmlsBQNTRVABaQEPYnV5TnNidFJFQURPTkxZAQh3YXZlc1BheQQVbWluV2F2ZXNBbW91bnROc2J0QnV5CQESbWluV2F2ZXNGb3JOc2J0QnV5AAMJAGYCBRVtaW5XYXZlc0Ftb3VudE5zYnRCdXkFCHdhdmVzUGF5CQACAQkArAICCQCsAgICBG1pbiAJAKQDAQUVbWluV2F2ZXNBbW91bnROc2J0QnV5Ag8gd2F2ZXMgZXhwZWN0ZWQEC2N1cnZlUmVzdWx0CQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCFWN1cnZlRnVuY3Rpb25SRUFET05MWQkAzAgCBQh3YXZlc1BheQUDbmlsBQNuaWwDCQAAAgULY3VydmVSZXN1bHQFC2N1cnZlUmVzdWx0BApuc2J0QW1vdW50CQEFYXNJbnQBCQCRAwIFC2N1cnZlUmVzdWx0AAADCQBnAgAABQpuc2J0QW1vdW50CQACAQIPbnNidEFtb3VudCA8PSAwCQCUCgIFA25pbAkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUKbnNidEFtb3VudAUDbmlsBQNTRVAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPYnV5U3VyZlJFQURPTkxZAxF1c2VyQWRkcmVzc1N0ck9wdAZhbW91bnQKYXNzZXRJZFN0cgQHYXNzZXRJZAkA2QQBBQphc3NldElkU3RyBApzdXJmUmVzdWx0CQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCFHN1cmZGdW5jdGlvblJFQURPTkxZCQDMCAIFBmFtb3VudAkAzAgCBQdhc3NldElkBQNuaWwFA25pbAQKc3VyZkFtb3VudAkBBWFzSW50AQkAkQMCBQpzdXJmUmVzdWx0BQxiRnVuY0lkeFN1cmYEC2dOc2J0QW1vdW50CQEFYXNJbnQBCQD8BwQFE3N1cmZTdGFraW5nQ29udHJhY3QCGGduc2J0RnJvbVN1cmZTWVNSRUFET05MWQkAzAgCBQpzdXJmQW1vdW50BQNuaWwFA25pbAQKc3dhcFBhcmFtcwkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFEXVzZXJBZGRyZXNzU3RyT3B0CQDMCAIAAAUDbmlsBQNuaWwECndhdmVzTGltaXQIBQpzd2FwUGFyYW1zAl8xBAl1c2RuTGltaXQIBQpzd2FwUGFyYW1zAl83BA1zd2FwUGFyYW1zTmV3CQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgULZ05zYnRBbW91bnQFA25pbAUDbmlsBA13YXZlc0xpbWl0TmV3CAUNc3dhcFBhcmFtc05ldwJfMQQMdXNkbkxpbWl0TmV3CAUNc3dhcFBhcmFtc05ldwJfNwQFcHJpY2UJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUSYkZ1bmNJZHhXYXZlc1ByaWNlBBNhZGRpdGlvbmFsTGltaXRVc2RuCQBlAgUMdXNkbkxpbWl0TmV3BQl1c2RuTGltaXQEGWFkZGl0aW9uYWxMaW1pdFdhdmVzSW5Vc2QJAGUCBQ13YXZlc0xpbWl0TmV3BQp3YXZlc0xpbWl0BANicjAJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUPYkZ1bmNJZHhCUlN0YXJ0BANicjEJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUNYkZ1bmNJZHhCUkVuZAQQcHJpY2VTdXJmMldhdmVzMAkAawMFA2JyMAUFTVVMVDYFBXByaWNlBBBwcmljZVN1cmYyV2F2ZXMxCQBrAwUDYnIxBQVNVUxUNgUFcHJpY2UED2dzbmJ0UmVzdFYyREFUQQkBCWFzQW55TGlzdAEJAPwHBAUOcmVzdFYyQ29udHJhY3QCEWduc2J0SW5mb0lOVEVSTkFMCQDMCAIFEXVzZXJBZGRyZXNzU3RyT3B0CQDMCAIAAAkAzAgCBQpzdXJmQW1vdW50BQNuaWwFA25pbAQOdm90aW5nUG93ZXJNYXgJAQVhc0ludAEJAJEDAgUPZ3NuYnRSZXN0VjJEQVRBABUEEXZvdGluZ1Bvd2VyTWF4TkVXCQEFYXNJbnQBCQCRAwIFD2dzbmJ0UmVzdFYyREFUQQAWBBF2b3RpbmdQb3dlckV0YU5FVwkBBWFzSW50AQkAkQMCBQ9nc25idFJlc3RWMkRBVEEAFwQUbWVyZ2VkVm90aW5nUG93ZXJFdGEFEXZvdGluZ1Bvd2VyRXRhTkVXBBJtYXhWb3RpbmdQb3dlckRpZmYJAGUCBRF2b3RpbmdQb3dlck1heE5FVwUOdm90aW5nUG93ZXJNYXgEBHJlc3QJAQVhc0ludAEJAJEDAgUKc3VyZlJlc3VsdAUMYkZ1bmNJZHhSZXN0CQCUCgIFA25pbAkAuQkCCQDMCAICFiVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQpzdXJmQW1vdW50CQDMCAIJAKQDAQULZ05zYnRBbW91bnQJAMwIAgkApAMBBRNhZGRpdGlvbmFsTGltaXRVc2RuCQDMCAIJAKQDAQUZYWRkaXRpb25hbExpbWl0V2F2ZXNJblVzZAkAzAgCCQCkAwEFA2JyMAkAzAgCCQCkAwEFA2JyMQkAzAgCCQCkAwEFEHByaWNlU3VyZjJXYXZlczAJAMwIAgkApAMBBRBwcmljZVN1cmYyV2F2ZXMxCQDMCAIJAKQDAQUUbWVyZ2VkVm90aW5nUG93ZXJFdGEJAMwIAgkApAMBBRJtYXhWb3RpbmdQb3dlckRpZmYJAMwIAgkApAMBBQRyZXN0BQNuaWwFA1NFUAFpARJ3YWxsZXRJbmZvUkVBRE9OTFkBEXVzZXJBZGRyZXNzU3RyT3B0BARhZGRyCQCmCAEFEXVzZXJBZGRyZXNzU3RyT3B0BAdiYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAO8HAQkBBXZhbHVlAQUEYWRkcgkBDkJhbGFuY2VEZXRhaWxzBAAAAAAAAAAABAp1c2RuTG9ja2VkCQEOZ2V0TG9ja2VkT25ScGQCBRF1c2VyQWRkcmVzc1N0ck9wdAUVbmV1dHJpbm9Bc3NldElkU3RyaW5nBA1uc2J0TG9ja2VkT2xkCQEOZ2V0TG9ja2VkT25ScGQCBRF1c2VyQWRkcmVzc1N0ck9wdAUObnNidEFzc2V0SWRTdHIECWduc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCFGduc2J0SW5mb1NZU1JFQURPTkxZCQDMCAIFEXVzZXJBZGRyZXNzU3RyT3B0CQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsBAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAJEDAgUJZ25zYnREYXRhAAIECG5zYnRVc2VyCQEFYXNJbnQBCQCRAwIFCG5zYnREYXRhAAAECW5zYnRUb3RhbAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQABBBFnTnNidEZyb21Oc2J0VXNlcgkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQACBBJnTnNidEZyb21Oc2J0VG90YWwJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAwQIc3VyZkRhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQADBAhzdXJmVXNlcgkBBWFzSW50AQkAkQMCBQhzdXJmRGF0YQAABAlzdXJmVG90YWwJAQVhc0ludAEJAJEDAgUIc3VyZkRhdGEAAQQRZ05zYnRGcm9tU3VyZlVzZXIJAQVhc0ludAEJAJEDAgUIc3VyZkRhdGEAAgQSZ05zYnRGcm9tU3VyZlRvdGFsCQEFYXNJbnQBCQCRAwIFCHN1cmZEYXRhAAMEHGF2YWlsYWJsZVVzZG5Ub0NsYWltRnJvbVN1cmYAAAQaYWxyZWFkeUNsYWltZWRVc2RuRnJvbVN1cmYAAAQPZ3NuYnRSZXN0VjJEQVRBCQEJYXNBbnlMaXN0AQkA/AcEBQ5yZXN0VjJDb250cmFjdAIRZ25zYnRJbmZvSU5URVJOQUwJAMwIAgURdXNlckFkZHJlc3NTdHJPcHQJAMwIAgAACQDMCAIAAAUDbmlsBQNuaWwEC3ZvdGluZ1Bvd2VyCQEFYXNJbnQBCQCRAwIFD2dzbmJ0UmVzdFYyREFUQQATBA52b3RpbmdQb3dlck1heAkBBWFzSW50AQkAkQMCBQ9nc25idFJlc3RWMkRBVEEAFQQOdm90aW5nUG93ZXJFdGEJAQVhc0ludAEJAJEDAgUPZ3NuYnRSZXN0VjJEQVRBABcJAJQKAgUDbmlsCQC5CQIJAMwIAgIkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFB2JhbGFuY2UHcmVndWxhcgkAzAgCCQCkAwEIBQdiYWxhbmNlCWF2YWlsYWJsZQkAzAgCCQCkAwEIBQdiYWxhbmNlCmdlbmVyYXRpbmcJAMwIAgkApAMBCAUHYmFsYW5jZQllZmZlY3RpdmUJAMwIAgkApAMBBQZoZWlnaHQJAMwIAgkApAMBBQp1c2RuTG9ja2VkCQDMCAIJAKQDAQUNbnNidExvY2tlZE9sZAkAzAgCCQCkAwEFCG5zYnRVc2VyCQDMCAIJAKQDAQURZ05zYnRGcm9tTnNidFVzZXIJAMwIAgkApAMBBRFnTnNidEZyb21TdXJmVXNlcgkAzAgCCQCkAwEFCHN1cmZVc2VyCQDMCAIJAKQDAQULdm90aW5nUG93ZXIJAMwIAgkApAMBBQ52b3RpbmdQb3dlck1heAkAzAgCCQCkAwEFDnZvdGluZ1Bvd2VyRXRhCQDMCAIJAKQDAQUcYXZhaWxhYmxlVXNkblRvQ2xhaW1Gcm9tU3VyZgkAzAgCCQCkAwEFGmFscmVhZHlDbGFpbWVkVXNkbkZyb21TdXJmCQDMCAIJAKQDAQUSZ05zYnRGcm9tTnNidFRvdGFsCQDMCAIJAKQDAQUSZ05zYnRGcm9tU3VyZlRvdGFsBQNuaWwFA1NFUAFpARNtZXJnZWRTdGFrZVJFQURPTkxZBAdhbW91bnQxB2hlaWdodDEHYW1vdW50MgdoZWlnaHQyBAhoYWxmTGlmZQkBDGdldEludE9yRmFpbAIFE25zYnRTdGFraW5nQ29udHJhY3QJAQtrZXlIYWxmTGlmZQAEAWgJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AhNtZXJnZVN0YWtlc1JFQURPTkxZCQDMCAIFB2Ftb3VudDEJAMwIAgUHaGVpZ2h0MQkAzAgCBQdhbW91bnQyCQDMCAIFB2hlaWdodDIJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsCQCUCgIFA25pbAkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBCQBkAgUHYW1vdW50MQUHYW1vdW50MgkAzAgCCQCkAwEFAWgFA25pbAUDU0VQAWkBJnVuc3Rha2VDb21pc3Npb25BbW91bnRCeUhlaWdodFJFQURPTkxZAgZhbW91bnQLc3RhcnRIZWlnaHQECGhhbGZMaWZlCQEMZ2V0SW50T3JGYWlsAgUTbnNidFN0YWtpbmdDb250cmFjdAkBC2tleUhhbGZMaWZlAAQBYQkBBWFzSW50AQkA/AcEBQxtYXRoQ29udHJhY3QCIWdldFVuc3Rha2VDb21pc3Npb25BbW91bnRSRUFET05MWQkAzAgCBQZhbW91bnQJAMwIAgULc3RhcnRIZWlnaHQJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsAwkAAAIFAWEFAWEJAJQKAgUDbmlsCQC5CQIJAMwIAgICJWQJAMwIAgkApAMBBQFhBQNuaWwFA1NFUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpASR1bnN0YWtlQ29taXNzaW9uQW1vdW50QnlVc2VyUkVBRE9OTFkCBmFtb3VudAt1c2VyQWRkcmVzcwQIaGFsZkxpZmUJAQxnZXRJbnRPckZhaWwCBRNuc2J0U3Rha2luZ0NvbnRyYWN0CQELa2V5SGFsZkxpZmUABAtzdGFydEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBRNuc2J0U3Rha2luZ0NvbnRyYWN0CQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQZoZWlnaHQEAWEJAQVhc0ludAEJAPwHBAUMbWF0aENvbnRyYWN0AiFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAMwIAgUGYW1vdW50CQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFCGhhbGZMaWZlBQNuaWwFA25pbAMJAAACBQFhBQFhCQCUCgIFA25pbAkAuQkCCQDMCAICAiVkCQDMCAIJAKQDAQUBYQUDbmlsBQNTRVAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWdXNkblN0YWtpbmdBcHJSRUFET05MWQEEZGF5cwQLd2F2ZXNJbmNvbWUJAGgCAPAuBQVNVUxUOAQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQMY3VycmVudFByaWNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUPbk1ldHJpY0lkeFByaWNlBA90b3RhbFVzZG5TdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgULcnBkQ29udHJhY3QJARhrZXlScGRDb250cmFjdEJhbGFuY2VLZXkBBRVuZXV0cmlub0Fzc2V0SWRTdHJpbmcAAAQKdXNkbkluY29tZQkAawMFC3dhdmVzSW5jb21lBQxjdXJyZW50UHJpY2UFBU1VTFQ4BANhcHIJAGsDCQBoAgUKdXNkbkluY29tZQUFTVVMVDYA7QIFD3RvdGFsVXNkblN0YWtlZAkAlAoCBQNuaWwJAMwIAgUDYXByBQNuaWwBaQERbmV1dHJpbm9TdGF0ZVJFU1QABA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBAxjdXJyZW50UHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UEFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFG25NZXRyaWNJZHhVc2RuTG9ja2VkQmFsYW5jZQQSd2F2ZXNMb2NrZWRCYWxhbmNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUcbk1ldHJpY0lkeFdhdmVzTG9ja2VkQmFsYW5jZQQPcmVzZXJ2ZXNJbldhdmVzCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwURbk1ldHJpY0lkeFJlc2VydmUEDnJlc2VydmVzSW5Vc2RuCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4EDm5ldXRyaW5vU3VwcGx5CQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY0lkeFVzZG5TdXBwbHkEB3N1cnBsdXMJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRFuTWV0cmljSWR4U3VycGx1cwQOc3VycGx1c1BlcmNlbnQJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRhuTWV0cmljSWR4U3VycGx1c1BlcmNlbnQEAkJSCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUMbk1ldHJpY0lkeEJSBApuc2J0U3VwcGx5CQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY0lkeE5zYnRTdXBwbHkEDW5zYnRTdXBwbHlNYXgJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRduTWV0cmljSWR4TWF4TnNidFN1cHBseQQKc3VyZlN1cHBseQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFFG5NZXRyaWNJZHhTdXJmU3VwcGx5CQACAQkAuQkCCQDMCAICF3Jlc3VsdE5ldXRyaW5vU3RhdGVSRVNUCQDMCAIJAKQDAQUMY3VycmVudFByaWNlCQDMCAIJAKQDAQUVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQDMCAIJAKQDAQUSd2F2ZXNMb2NrZWRCYWxhbmNlCQDMCAIJAKQDAQUPcmVzZXJ2ZXNJbldhdmVzCQDMCAIJAKQDAQUOcmVzZXJ2ZXNJblVzZG4JAMwIAgkApAMBBQ5uZXV0cmlub1N1cHBseQkAzAgCCQCkAwEFB3N1cnBsdXMJAMwIAgkApAMBBQ5zdXJwbHVzUGVyY2VudAkAzAgCCQCkAwEFAkJSCQDMCAIJAKQDAQUKbnNidFN1cHBseQkAzAgCCQCkAwEFDW5zYnRTdXBwbHlNYXgJAMwIAgkApAMBBQpzdXJmU3VwcGx5BQNuaWwCAl9fAWkBDW5zYnRQcmljZVJFU1QABAZwcmljZXMJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIgY2FsY0NvbnRyYWN0TnNidFByaWNlU1lTUkVBRE9OTFkJAMwIAgAABQNuaWwFA25pbAQObnNidDJ1c2RuUHJpY2UJAQVhc0ludAEJAJEDAgUGcHJpY2VzAAAED25zYnQyd2F2ZXNQcmljZQkBBWFzSW50AQkAkQMCBQZwcmljZXMAAQQIcmVzdERhdGEJALkJAgkAzAgCAhJzdGFydE5zYnRQcmljZVJFU1QJAMwIAgkApAMBBQ5uc2J0MnVzZG5QcmljZQkAzAgCCQCkAwEFD25zYnQyd2F2ZXNQcmljZQkAzAgCAhBlbmROc2J0UHJpY2VSRVNUBQNuaWwCAl9fCQACAQUIcmVzdERhdGEBaQENc3VyZlByaWNlUkVTVAAED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEDGN1cnJlbnRQcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFD25NZXRyaWNJZHhQcmljZQQPcmVzZXJ2ZXNJbldhdmVzCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwURbk1ldHJpY0lkeFJlc2VydmUEDm5ldXRyaW5vU3VwcGx5CQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY0lkeFVzZG5TdXBwbHkED3N1cmZQcmljZUluVXNkbgkAawMFD3Jlc2VydmVzSW5XYXZlcwUMY3VycmVudFByaWNlBQ5uZXV0cmlub1N1cHBseQQQc3VyZlByaWNlSW5XYXZlcwkAawMFD3Jlc2VydmVzSW5XYXZlcwUFTVVMVDgFDm5ldXRyaW5vU3VwcGx5BAhyZXN0RGF0YQkAuQkCCQDMCAICEnN0YXJ0U3VyZlByaWNlUkVTVAkAzAgCCQCkAwEFD3N1cmZQcmljZUluVXNkbgkAzAgCCQCkAwEFEHN1cmZQcmljZUluV2F2ZXMJAMwIAgIQZW5kU3VyZlByaWNlUkVTVAUDbmlsAgJfXwkAAgEFCHJlc3REYXRhAMhcqrk=", "height": 2471180, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: PzXBPw4TYJnucHmS5eEn6pCJDw7oUvMFhp6HgVjn6dS Next: none Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let EULER8 = 271828182
77
88 let MULT6 = 1000000
99
1010 let MULTX6 = toBigInt(1000000)
1111
1212 let MULT8 = 100000000
1313
1414 let MULTX8 = toBigInt(100000000)
1515
1616 let MULT12 = 1000000000000
1717
1818 let MULT18 = toBigInt(1000000000000000000)
1919
2020 let SEP = "__"
2121
2222 let BRPROTECTED = 100000
2323
2424 let DEFAULTPAYMENT = 1000000000
2525
2626 let DEFAULTCREATIONGNSBT = 1000000000
2727
2828 let WAVESID = fromBase58String("WAVES")
2929
3030 let nMetricIdxPrice = 0
3131
3232 let nMetricIdxUsdnLockedBalance = 1
3333
3434 let nMetricIdxWavesLockedBalance = 2
3535
3636 let nMetricIdxReserve = 3
3737
3838 let nMetricIdxReserveInUsdn = 4
3939
4040 let nMetricIdxUsdnSupply = 5
4141
4242 let nMetricIdxSurplus = 6
4343
4444 let nMetricIdxSurplusPercent = 7
4545
4646 let nMetricIdxBR = 8
4747
4848 let nMetricIdxNsbtSupply = 9
4949
5050 let nMetricIdxMaxNsbtSupply = 10
5151
5252 let nMetricIdxSurfSupply = 11
5353
5454 let nMetricUsdnUsdtPeg = 12
5555
5656 let nMetricCurrentPriceAdj = 13
5757
5858 let bFuncIdxSurf = 0
5959
6060 let bFuncIdxWaves = 1
6161
6262 let bFuncIdxUsdn = 2
6363
6464 let bFuncIdxReserveStart = 3
6565
6666 let bFuncIdxSupplyStart = 4
6767
6868 let bFuncIdxBRStart = 5
6969
7070 let bFuncIdxReserveEnd = 6
7171
7272 let bFuncIdxSupplyEnd = 7
7373
7474 let bFuncIdxBREnd = 8
7575
7676 let bFuncIdxRest = 9
7777
7878 let bFuncIdxWavesPrice = 10
7979
8080 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
8181
8282
8383 func keyNeutrinoAssetId () = "neutrino_asset_id"
8484
8585
8686 func keyNsbtAssetId () = "bond_asset_id"
8787
8888
8989 func keySurfAssetId () = "surf_asset_id"
9090
9191
9292 func keyBalanceLocked () = "balance_lock_"
9393
9494
9595 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
9696
9797
9898 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
9999
100100
101101 func keyMinWavesSwapAmount () = "min_outNeutrino_swap_amount_WAVES"
102102
103103
104104 func keyMinNeutrinoSwapAmount () = "min_outMulti_swap_amount"
105105
106106
107107 func keyWavesOutFeePart () = "wavesOut_swap_feePart"
108108
109109
110110 func keyNeutrinoOutFeePart () = "neutrinoOut_swap_feePart"
111111
112112
113113 func keySwapAmountAParam () = "%s%s__config__swapAParam"
114114
115115
116116 func keySwapAmountBParam () = "%s%s__config__swapBParam"
117117
118118
119119 func keyUsdnSwapAmountAParam () = "%s%s__config__usdnSwapAParam"
120120
121121
122122 func keyUsdnSwapAmountBParam () = "%s%s__config__usdnSwapBParam"
123123
124124
125125 func keyNsbtLockContract () = "%s__nsbtLockContract"
126126
127127
128128 func keyMathContract () = "%s__mathContract"
129129
130130
131131 func brProtectedKEY () = "min_BR_protection_level"
132132
133133
134134 func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
135135
136136
137137 func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
138138
139139
140140 func keyPaymentRequired () = "%s__paymentRequired"
141141
142142
143143 func keyGnsbtRequired () = "%s__gNsbtRequired"
144144
145145
146146 func swapsTimeframeKEY () = "swaps_timeframe"
147147
148148
149149 func keyPrice () = "price"
150150
151151
152152 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
153153
154154
155155 func keyHalfLife () = "%s__halfLife"
156156
157157
158158 func keyMinLockAmount () = "%s__minLockAmount"
159159
160160
161161 func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
162162
163163
164164 func keyMinNsbtSell () = "min_nsbt_sell"
165165
166166
167167 func keyRpdContractBalanceKey (assetId) = ("rpd_balance_" + assetId)
168168
169169
170170 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
171171
172172
173173 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
174174
175175
176176 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
177177
178178
179179 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
180180
181181
182182 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
183183
184184
185185 func asAnyList (val) = match val {
186186 case valAnyList: List[Any] =>
187187 valAnyList
188188 case _ =>
189189 throw("fail to cast into List[Any]")
190190 }
191191
192192
193193 func asInt (val) = match val {
194194 case valInt: Int =>
195195 valInt
196196 case _ =>
197197 throw("fail to cast into Int")
198198 }
199199
200200
201201 func asString (val) = match val {
202202 case valStr: String =>
203203 valStr
204204 case _ =>
205205 throw("fail to cast into String")
206206 }
207207
208208
209209 func asTuple2Ints (val) = match val {
210210 case v: (Int, Int) =>
211211 v
212212 case _ =>
213213 throw("fail to cast into Tuple2 ints")
214214 }
215215
216216
217217 func asSwapParamsSTRUCT (val) = match val {
218218 case struct: (Int, Int, Int, Int, Int, Int, Int) =>
219219 struct
220220 case _ =>
221221 throw("fail to cast into SwapParamsSTRUCT")
222222 }
223223
224224
225225 func toTimestamp (start) = if ((0 > start))
226226 then -1
227227 else match blockInfoByHeight(start) {
228228 case block: BlockInfo =>
229229 block.timestamp
230230 case _ =>
231231 -1
232232 }
233233
234234
235235 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
236236
237237
238238 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
239239
240240
241241 let IdxControlCfgNeutrinoDapp = 1
242242
243243 let IdxControlCfgAuctionDapp = 2
244244
245245 let IdxControlCfgRpdDapp = 3
246246
247247 let IdxControlCfgMathDapp = 4
248248
249249 let IdxControlCfgLiquidationDapp = 5
250250
251251 let IdxControlCfgRestDapp = 6
252252
253253 let IdxControlCfgNodeRegistryDapp = 7
254254
255255 let IdxControlCfgNsbtStakingDapp = 8
256256
257257 let IdxControlCfgMediatorDapp = 9
258258
259259 let IdxControlCfgSurfStakingDapp = 10
260260
261261 let IdxControlCfgGnsbtControllerDapp = 11
262262
263263 let IdxControlCfgRestV2Dapp = 12
264264
265265 let IdxControlCfgGovernanceDapp = 13
266266
267267 func keyControlAddress () = "%s%s__config__controlAddress"
268268
269269
270270 func keyControlCfg () = "%s__controlConfig"
271271
272272
273273 func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
274274
275275
276276 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
277277
278278
279279 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
280280
281281 let controlCfg = readControlCfgOrFail(controlContract)
282282
283283 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
284284
285285 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
286286
287287 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
288288
289289 let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
290290
291291 let rpdContract = getContractAddressOrFail(controlCfg, IdxControlCfgRpdDapp)
292292
293293 let nsbtStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgNsbtStakingDapp)
294294
295295 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
296296
297297 let gnsbtControllerContract = getContractAddressOrFail(controlCfg, IdxControlCfgGnsbtControllerDapp)
298298
299299 let restV2Contract = getContractAddressOrFail(controlCfg, IdxControlCfgRestV2Dapp)
300300
301301 let governanceContract = getContractAddressOrFail(controlCfg, IdxControlCfgGovernanceDapp)
302302
303303 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
304304
305305 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
306306
307307 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyNsbtAssetId())
308308
309309 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
310310
311311 let surfAssetIdStr = getStringValue(auctionContract, keySurfAssetId())
312312
313313 let surfAssetId = fromBase58String(surfAssetIdStr)
314314
315315 func minWavesForNsbtBuy () = asInt(invoke(auctionContract, "minWavesAmountNsbtBuySYSREADONLY", nil, nil))
316316
317317
318318 func minNsbtForSell () = asInt(invoke(auctionContract, "minNsbtAmountForSellSYSREADONLY", nil, nil))
319319
320320
321321 func minWavesForSurfBuy () = asInt(invoke(auctionContract, "minWavesAmountSurfBuySYSREADONLY", nil, nil))
322322
323323
324324 func minUsdnForSurfBuy () = asInt(invoke(auctionContract, "minUsdnAmountSurfBuySYSREADONLY", nil, nil))
325325
326326
327327 func privateNsbtPriceREST () = {
328328 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
329329 let nsbt2usdnPrice = asInt(prices[0])
330330 let nsbt2wavesPrice = asInt(prices[1])
331331 $Tuple2(IntegerEntry("nsbt2usdnPrice", nsbt2usdnPrice), IntegerEntry("nsbt2wavesPrice", nsbt2wavesPrice))
332332 }
333333
334334
335335 func getLockedOnRpd (addrStr,assetIdStr) = {
336336 let key = makeString(["rpd_balance", assetIdStr, addrStr], "_")
337337 valueOrElse(getInteger(rpdContract, key), 0)
338338 }
339339
340340
341341 @Callable(i)
342342 func constructorV1 (neutrinoAddress,nsbtLockAddress,mathAddress) = if ((i.caller != this))
343343 then throw("not authorized")
344344 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), StringEntry(keyMathContract(), mathAddress)]
345345
346346
347347
348348 @Callable(i)
349349 func neutrinoStatsREADONLY () = {
350350 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
351351 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
352352 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
353353 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
354354 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
355355 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
356356 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
357357 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
358358 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
359359 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
360360 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
361361 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
362362 let maxNsbtSupply = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
363363 let usdnUsdtPeg = asInt(neutrinoMetrics[nMetricUsdnUsdtPeg])
364364 let burnPrice = asInt(neutrinoMetrics[nMetricCurrentPriceAdj])
365365 let issuePrice = currentPrice
366366 let nsbt2usdnPrice = asInt(prices[0])
367367 let nsbt2wavesPrice = asInt(prices[1])
368368 let maxWaves2BuySurf = (fraction(neutrinoSupply, MULT8, currentPrice) - reservesInWaves)
369369 let maxUsdn2BuySurf = (neutrinoSupply - reservesInUsdn)
370370 let surfPriceInUsdn = BR
371371 let surfPriceInWaves = fraction(BR, MULT6, currentPrice)
372372 let totalUsdnStaked = valueOrElse(getInteger(rpdContract, keyRpdContractBalanceKey(neutrinoAssetIdString)), 0)
373373 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(maxNsbtSupply), toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), toString(usdnUsdtPeg), toString(issuePrice), toString(burnPrice), toString(totalUsdnStaked)], SEP))
374374 }
375375
376376
377377
378378 @Callable(i)
379379 func swapInfoREADONLY (userAddressStrOpt) = {
380380 let currentPrice = getIntegerValue(controlContract, keyPrice())
381381 let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
382382 let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
383383 let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
384384 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
385385 let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
386386 let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
387387 let swapParamsSTRUCT = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
388388 let tokenSwapLimitMaxUsd = swapParamsSTRUCT._1
389389 let swapLimitSpentUsdn = swapParamsSTRUCT._2
390390 let blcks2LmtReset = swapParamsSTRUCT._3
391391 let usdnSwapLimitMax = swapParamsSTRUCT._7
392392 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(usdnSwapDelayDuration), toString(wavesSwapDelayDuration), toString(blcks2LmtReset), toString(tokenSwapLimitMaxUsd), toString(usdnSwapLimitMax), toString(swapLimitSpentUsdn)], SEP))
393393 }
394394
395395
396396
397397 @Callable(i)
398398 func gnsbtInfoREADONLY (userAddressStrOpt,nsbtAmtDiff) = {
399399 let currentPrice = getIntegerValue(controlContract, keyPrice())
400400 let swapParams = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
401401 let limitMaxTokenInUsd = swapParams._1
402402 let blcks2LmtReset = swapParams._3
403403 let gnsbtAmt = swapParams._4
404404 let gnsbtAmtTotal = swapParams._5
405405 let limitMaxUsdn = swapParams._7
406406 let swapParamsNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
407407 let limitMaxTokenInUsdNEW = swapParamsNEW._1
408408 let blcks2LmtResetNEW = swapParamsNEW._3
409409 let gnsbtAmtNEW = swapParamsNEW._4
410410 let gnsbtAmtTotalNEW = swapParamsNEW._5
411411 let limitMaxUsdnNEW = swapParamsNEW._7
412412 let gnsbtShare = if ((gnsbtAmtTotal != 0))
413413 then fraction((gnsbtAmt * 100), MULT12, gnsbtAmtTotal)
414414 else 0
415415 let gnsbtShareNEW = if ((gnsbtAmtTotalNEW != 0))
416416 then fraction((gnsbtAmtNEW * 100), MULT12, gnsbtAmtTotalNEW)
417417 else 0
418418 let rewardInfo = asString(invoke(nsbtStakingContract, "unclaimedRewardsREADONLY", [userAddressStrOpt], nil))
419419 let nsbtAmt = gnsbtAmt
420420 let nsbtAmtNew = gnsbtAmtNEW
421421 let nsbtAmtStakedTotal = assetBalance(nsbtStakingContract, nsbtAssetId)
422422 let nsbtAmtStakedTotalNew = nsbtAmtStakedTotal
423423 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
424424 let isEmptyNsbtBalance = if ((gnsbtAmt == 0))
425425 then (gnsbtAmtNEW == 0)
426426 else false
427427 let startHeight = if (isEmptyNsbtBalance)
428428 then height
429429 else asInt(nsbtData[2])
430430 let startTimestamp = toTimestamp(startHeight)
431431 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
432432 let startHeightNew = if (isEmptyNsbtBalance)
433433 then height
434434 else asInt(invoke(mathContract, "mergeStakesREADONLY", [gnsbtAmt, startHeight, gnsbtAmtNEW, height, halfLife], nil))
435435 let startTimestampNew = toTimestamp(startHeightNew)
436436 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%s%d%d%d%d%d%d%d%d", toString(gnsbtAmt), toString(gnsbtAmtNEW), toString(gnsbtShare), toString(gnsbtShareNEW), toString(limitMaxUsdn), toString(limitMaxTokenInUsd), toString(limitMaxUsdnNEW), toString(limitMaxTokenInUsdNEW), rewardInfo, toString(nsbtAmt), toString(nsbtAmtNew), toString(nsbtAmtStakedTotal), toString(nsbtAmtStakedTotalNew), toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
437437 }
438438
439439
440440
441441 @Callable(i)
442442 func neutrinoConfigREADONLY () = {
443443 let limitParamA = getIntegerValue(mathContract, keySwapAmountAParam())
444444 let limitParamB = getIntegerValue(mathContract, keySwapAmountBParam())
445445 let usdnLimitParamA = getIntegerValue(mathContract, keyUsdnSwapAmountAParam())
446446 let usdnLimitParamB = getIntegerValue(mathContract, keyUsdnSwapAmountBParam())
447447 let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
448448 let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
449449 let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
450450 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
451451 let brProtected = valueOrElse(getInteger(neutrinoContract, brProtectedKEY()), BRPROTECTED)
452452 let usdnSwapDelay = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
453453 let wavesSwapDelay = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
454454 let swapsTimeframe = valueOrElse(getInteger(neutrinoContract, swapsTimeframeKEY()), 1440)
455455 let minWaves4NsbtBuy = minWavesForNsbtBuy()
456456 let minNsbtsell = minNsbtForSell()
457457 let minNsbtLockAmt = getIntegerValue(nsbtStakingContract, keyMinLockAmount())
458458 let halfLife = getIntegerValue(nsbtStakingContract, keyHalfLife())
459459 let minWaves4SurfBuy = minWavesForSurfBuy()
460460 let minUsdn4SurfBuy = minUsdnForSurfBuy()
461461 let surfStakingCfg = asAnyList(invoke(surfStakingContract, "configSYSREADONLY", nil, nil))
462462 let minSurfStakeAmt = asInt(surfStakingCfg[0])
463463 let gnsbtFromSurfCoeff = asInt(surfStakingCfg[1])
464464 let surfVotingPowerRestrictivePeriod = asInt(surfStakingCfg[2])
465465 let brToStartSurfTransformation = asInt(surfStakingCfg[3])
466466 let shutdown = valueOrElse(getBoolean(controlContract, "is_blocked"), false)
467467 let votingCreationCost = valueOrElse(getInteger(governanceContract, keyPaymentRequired()), DEFAULTPAYMENT)
468468 let votingCreationGnsbtNeeded = valueOrElse(getInteger(governanceContract, keyGnsbtRequired()), DEFAULTCREATIONGNSBT)
469469 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%b%d%d%d%d%d%d%d%d", toString(limitParamA), toString(limitParamB), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(minWaves4NsbtBuy), toString(minNsbtsell), toString(minNsbtLockAmt), toString(halfLife), toString(minWaves4SurfBuy), toString(minUsdn4SurfBuy), toString(minSurfStakeAmt), toString(gnsbtFromSurfCoeff), toString(surfVotingPowerRestrictivePeriod), toString(brToStartSurfTransformation), toString(shutdown), toString(usdnLimitParamA), toString(usdnLimitParamB), toString(brProtected), toString(wavesSwapDelay), toString(usdnSwapDelay), toString(votingCreationCost), toString(votingCreationGnsbtNeeded), toString(swapsTimeframe)], SEP))
470470 }
471471
472472
473473
474474 @Callable(i)
475475 func buyNsbtREADONLY (wavesPay) = {
476476 let minWavesAmountNsbtBuy = minWavesForNsbtBuy()
477477 if ((minWavesAmountNsbtBuy > wavesPay))
478478 then throw((("min " + toString(minWavesAmountNsbtBuy)) + " waves expected"))
479479 else {
480480 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
481481 if ((curveResult == curveResult))
482482 then {
483483 let nsbtAmount = asInt(curveResult[0])
484484 if ((0 >= nsbtAmount))
485485 then throw("nsbtAmount <= 0")
486486 else $Tuple2(nil, makeString(["%d", toString(nsbtAmount)], SEP))
487487 }
488488 else throw("Strict value is not equal to itself.")
489489 }
490490 }
491491
492492
493493
494494 @Callable(i)
495495 func buySurfREADONLY (userAddressStrOpt,amount,assetIdStr) = {
496496 let assetId = fromBase58String(assetIdStr)
497497 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amount, assetId], nil))
498498 let surfAmount = asInt(surfResult[bFuncIdxSurf])
499499 let gNsbtAmount = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [surfAmount], nil))
500500 let swapParams = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
501501 let wavesLimit = swapParams._1
502502 let usdnLimit = swapParams._7
503503 let swapParamsNew = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, gNsbtAmount], nil))
504504 let wavesLimitNew = swapParamsNew._1
505505 let usdnLimitNew = swapParamsNew._7
506506 let price = asInt(surfResult[bFuncIdxWavesPrice])
507507 let additionalLimitUsdn = (usdnLimitNew - usdnLimit)
508508 let additionalLimitWavesInUsd = (wavesLimitNew - wavesLimit)
509509 let br0 = asInt(surfResult[bFuncIdxBRStart])
510510 let br1 = asInt(surfResult[bFuncIdxBREnd])
511511 let priceSurf2Waves0 = fraction(br0, MULT6, price)
512512 let priceSurf2Waves1 = fraction(br1, MULT6, price)
513513 let gsnbtRestV2DATA = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, surfAmount], nil))
514514 let votingPowerMax = asInt(gsnbtRestV2DATA[21])
515515 let votingPowerMaxNEW = asInt(gsnbtRestV2DATA[22])
516516 let votingPowerEtaNEW = asInt(gsnbtRestV2DATA[23])
517517 let mergedVotingPowerEta = votingPowerEtaNEW
518518 let maxVotingPowerDiff = (votingPowerMaxNEW - votingPowerMax)
519519 let rest = asInt(surfResult[bFuncIdxRest])
520520 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(surfAmount), toString(gNsbtAmount), toString(additionalLimitUsdn), toString(additionalLimitWavesInUsd), toString(br0), toString(br1), toString(priceSurf2Waves0), toString(priceSurf2Waves1), toString(mergedVotingPowerEta), toString(maxVotingPowerDiff), toString(rest)], SEP))
521521 }
522522
523523
524524
525525 @Callable(i)
526526 func walletInfoREADONLY (userAddressStrOpt) = {
527527 let addr = addressFromString(userAddressStrOpt)
528528 let balance = if (isDefined(addr))
529529 then wavesBalance(value(addr))
530530 else BalanceDetails(0, 0, 0, 0)
531531 let usdnLocked = getLockedOnRpd(userAddressStrOpt, neutrinoAssetIdString)
532532 let nsbtLockedOld = getLockedOnRpd(userAddressStrOpt, nsbtAssetIdStr)
533533 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOpt, 0, 0], nil))
534534 let nsbtData = asAnyList(gnsbtData[2])
535535 let nsbtUser = asInt(nsbtData[0])
536536 let nsbtTotal = asInt(nsbtData[1])
537537 let gNsbtFromNsbtUser = asInt(nsbtData[2])
538538 let gNsbtFromNsbtTotal = asInt(nsbtData[3])
539539 let surfData = asAnyList(gnsbtData[3])
540540 let surfUser = asInt(surfData[0])
541541 let surfTotal = asInt(surfData[1])
542542 let gNsbtFromSurfUser = asInt(surfData[2])
543543 let gNsbtFromSurfTotal = asInt(surfData[3])
544544 let availableUsdnToClaimFromSurf = 0
545545 let alreadyClaimedUsdnFromSurf = 0
546546 let gsnbtRestV2DATA = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, 0], nil))
547547 let votingPower = asInt(gsnbtRestV2DATA[19])
548548 let votingPowerMax = asInt(gsnbtRestV2DATA[21])
549549 let votingPowerEta = asInt(gsnbtRestV2DATA[23])
550550 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(balance.regular), toString(balance.available), toString(balance.generating), toString(balance.effective), toString(height), toString(usdnLocked), toString(nsbtLockedOld), toString(nsbtUser), toString(gNsbtFromNsbtUser), toString(gNsbtFromSurfUser), toString(surfUser), toString(votingPower), toString(votingPowerMax), toString(votingPowerEta), toString(availableUsdnToClaimFromSurf), toString(alreadyClaimedUsdnFromSurf), toString(gNsbtFromNsbtTotal), toString(gNsbtFromSurfTotal)], SEP))
551551 }
552552
553553
554554
555555 @Callable(i)
556556 func mergedStakeREADONLY (amount1,height1,amount2,height2) = {
557557 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
558558 let h = asInt(invoke(mathContract, "mergeStakesREADONLY", [amount1, height1, amount2, height2, halfLife], nil))
559559 $Tuple2(nil, makeString(["%d%d", toString((amount1 + amount2)), toString(h)], SEP))
560560 }
561561
562562
563563
564564 @Callable(i)
565565 func unstakeComissionAmountByHeightREADONLY (amount,startHeight) = {
566566 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
567567 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
568568 if ((a == a))
569569 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
570570 else throw("Strict value is not equal to itself.")
571571 }
572572
573573
574574
575575 @Callable(i)
576576 func unstakeComissionAmountByUserREADONLY (amount,userAddress) = {
577577 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
578578 let startHeight = valueOrElse(getInteger(nsbtStakingContract, keyLockParamStartBlock(userAddress)), height)
579579 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
580580 if ((a == a))
581581 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
582582 else throw("Strict value is not equal to itself.")
583583 }
584584
585585
586586
587587 @Callable(i)
588588 func usdnStakingAprREADONLY (days) = {
589589 let wavesIncome = (6000 * MULT8)
590590 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
591591 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
592592 let totalUsdnStaked = valueOrElse(getInteger(rpdContract, keyRpdContractBalanceKey(neutrinoAssetIdString)), 0)
593593 let usdnIncome = fraction(wavesIncome, currentPrice, MULT8)
594594 let apr = fraction((usdnIncome * MULT6), 365, totalUsdnStaked)
595595 $Tuple2(nil, [apr])
596596 }
597597
598598
599599
600600 @Callable(i)
601601 func neutrinoStateREST () = {
602602 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
603603 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
604604 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
605605 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
606606 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
607607 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
608608 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
609609 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
610610 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
611611 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
612612 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
613613 let nsbtSupplyMax = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
614614 let surfSupply = asInt(neutrinoMetrics[nMetricIdxSurfSupply])
615615 throw(makeString(["resultNeutrinoStateREST", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(nsbtSupplyMax), toString(surfSupply)], "__"))
616616 }
617617
618618
619619
620620 @Callable(i)
621621 func nsbtPriceREST () = {
622622 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
623623 let nsbt2usdnPrice = asInt(prices[0])
624624 let nsbt2wavesPrice = asInt(prices[1])
625625 let restData = makeString(["startNsbtPriceREST", toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), "endNsbtPriceREST"], "__")
626626 throw(restData)
627627 }
628628
629629
630630
631631 @Callable(i)
632632 func surfPriceREST () = {
633633 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
634634 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
635635 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
636636 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
637637 let surfPriceInUsdn = fraction(reservesInWaves, currentPrice, neutrinoSupply)
638638 let surfPriceInWaves = fraction(reservesInWaves, MULT8, neutrinoSupply)
639639 let restData = makeString(["startSurfPriceREST", toString(surfPriceInUsdn), toString(surfPriceInWaves), "endSurfPriceREST"], "__")
640640 throw(restData)
641641 }
642642
643643

github/deemru/w8io/3ef1775 
97.29 ms