tx · CS9qcqGSxg3aH1JorLGCvb2FwKUGGZopvLskNnsuu2hR

3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi:  -0.04000000 Waves

2022.08.05 06:28 [2170645] smart account 3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi > SELF 0.00000000 Waves

{ "type": 13, "id": "CS9qcqGSxg3aH1JorLGCvb2FwKUGGZopvLskNnsuu2hR", "fee": 4000000, "feeAssetId": null, "timestamp": 1659670023023, "version": 1, "sender": "3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi", "senderPublicKey": "BwVRZtTzoCigEsffCvQ9uo7WvkoBNNGVjX4nat5X5zyQ", "proofs": [ "cJC2UeU26ojUtGDLkaDx6zHqgCJHfgmg6tMbNX13qWqhP8ktSE9XeSn9yRPTkGUUozkxgNWmL8BiwWbapobtMGu" ], "script": "base64:AAIFAAAAAAAAAEMIAhIFCgMICAgSABIDCgEIEgQKAggBEgASAwoBARIFCgMIAQgSAwoBCBIGCgQBAQEBEgQKAgEBEgQKAgEIEgASABIAAAAAbAAAAAALcmV2aXNpb25OdW0CAAAAAAAAAAAGRVVMRVI4AAAAAAAQM8TWAAAAAAVNVUxUNgAAAAAAAA9CQAAAAAAGTVVMVFg2CQABNgAAAAEAAAAAAAAPQkAAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAAZNVUxUWDgJAAE2AAAAAQAAAAAABfXhAAAAAAAGTVVMVDEyAAAAAOjUpRAAAAAAAAZNVUxUMTgJAAE2AAAAAQAN4Lazp2QAAAAAAAADU0VQAgAAAAJfXwAAAAAHV0FWRVNJRAkAAlkAAAABAgAAAAVXQVZFUwAAAAAPbk1ldHJpY0lkeFByaWNlAAAAAAAAAAAAAAAAABtuTWV0cmljSWR4VXNkbkxvY2tlZEJhbGFuY2UAAAAAAAAAAAEAAAAAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UAAAAAAAAAAAIAAAAAEW5NZXRyaWNJZHhSZXNlcnZlAAAAAAAAAAADAAAAABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgAAAAAAAAAABAAAAAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkAAAAAAAAAAAUAAAAAEW5NZXRyaWNJZHhTdXJwbHVzAAAAAAAAAAAGAAAAABhuTWV0cmljSWR4U3VycGx1c1BlcmNlbnQAAAAAAAAAAAcAAAAADG5NZXRyaWNJZHhCUgAAAAAAAAAACAAAAAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkAAAAAAAAAAAkAAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5AAAAAAAAAAAKAAAAABRuTWV0cmljSWR4U3VyZlN1cHBseQAAAAAAAAAACwAAAAAMYkZ1bmNJZHhTdXJmAAAAAAAAAAAAAAAAAA1iRnVuY0lkeFdhdmVzAAAAAAAAAAABAAAAAAxiRnVuY0lkeFVzZG4AAAAAAAAAAAIAAAAAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAAAAAAAAAADAAAAABNiRnVuY0lkeFN1cHBseVN0YXJ0AAAAAAAAAAAEAAAAAA9iRnVuY0lkeEJSU3RhcnQAAAAAAAAAAAUAAAAAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAAAAAAAAAABgAAAAARYkZ1bmNJZHhTdXBwbHlFbmQAAAAAAAAAAAcAAAAADWJGdW5jSWR4QlJFbmQAAAAAAAAAAAgAAAAADGJGdW5jSWR4UmVzdAAAAAAAAAAACQAAAAASYkZ1bmNJZHhXYXZlc1ByaWNlAAAAAAAAAAAKAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAAAgAAAB0lcyVzX19jb25maWdfX25ldXRyaW5vQWRkcmVzcwEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAIAAAARbmV1dHJpbm9fYXNzZXRfaWQBAAAADmtleU5zYnRBc3NldElkAAAAAAIAAAANYm9uZF9hc3NldF9pZAEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAgAAAA1zdXJmX2Fzc2V0X2lkAQAAABBrZXlCYWxhbmNlTG9ja2VkAAAAAAIAAAANYmFsYW5jZV9sb2NrXwEAAAAVa2V5V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAABXdhdmVzAQAAABhrZXlOZXV0cmlub0xvY2tlZEJhbGFuY2UAAAAACQABLAAAAAIJAQAAABBrZXlCYWxhbmNlTG9ja2VkAAAAAAIAAAAIbmV1dHJpbm8BAAAAFWtleU1pbldhdmVzU3dhcEFtb3VudAAAAAACAAAAFW1pbl93YXZlc19zd2FwX2Ftb3VudAEAAAAYa2V5TWluTmV1dHJpbm9Td2FwQW1vdW50AAAAAAIAAAAYbWluX25ldXRyaW5vX3N3YXBfYW1vdW50AQAAABJrZXlXYXZlc091dEZlZVBhcnQAAAAAAgAAABV3YXZlc091dF9zd2FwX2ZlZVBhcnQBAAAAFWtleU5ldXRyaW5vT3V0RmVlUGFydAAAAAACAAAAGG5ldXRyaW5vT3V0X3N3YXBfZmVlUGFydAEAAAATa2V5U3dhcEFtb3VudEFQYXJhbQAAAAACAAAAGCVzJXNfX2NvbmZpZ19fc3dhcEFQYXJhbQEAAAATa2V5U3dhcEFtb3VudEJQYXJhbQAAAAACAAAAGCVzJXNfX2NvbmZpZ19fc3dhcEJQYXJhbQEAAAATa2V5TnNidExvY2tDb250cmFjdAAAAAACAAAAFCVzX19uc2J0TG9ja0NvbnRyYWN0AQAAAA9rZXlNYXRoQ29udHJhY3QAAAAAAgAAABAlc19fbWF0aENvbnRyYWN0AQAAABtrZXlCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwAAAAAAgAAABtiYWxhbmNlX3dhdmVzX2xvY2tfaW50ZXJ2YWwBAAAAHmtleUJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAAAAAACAAAAHmJhbGFuY2VfbmV1dHJpbm9fbG9ja19pbnRlcnZhbAEAAAAIa2V5UHJpY2UAAAAAAgAAAAVwcmljZQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEAAAALdXNlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAYlcyVzJXMJAARMAAAAAgIAAAALcGFyYW1CeVVzZXIJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgIAAAAFc3RhcnQFAAAAA25pbAUAAAADU0VQAQAAAAtrZXlIYWxmTGlmZQAAAAACAAAADCVzX19oYWxmTGlmZQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAACAAAAESVzX19taW5Mb2NrQW1vdW50AQAAABVrZXlNaW5XYXZlc0Zvck5zYnRCdXkAAAAAAgAAABJtaW5fd2F2ZXNfbnNidF9idXkBAAAADmtleU1pbk5zYnRTZWxsAAAAAAIAAAANbWluX25zYnRfc2VsbAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkABLkAAAACCQAETAAAAAICAAAACm1hbmRhdG9yeSAJAARMAAAAAgkABCUAAAABBQAAAAdhZGRyZXNzCQAETAAAAAICAAAAAS4JAARMAAAAAgUAAAADa2V5CQAETAAAAAICAAAADyBpcyBub3QgZGVmaW5lZAUAAAADbmlsAgAAAAABAAAADGdldEludE9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAA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Q2ZnUnBkRGFwcAAAAAAAAAAAAwAAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAAAAAAAAEAAAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAAAAAAAAFAAAAABVJZHhDb250cm9sQ2ZnUmVzdERhcHAAAAAAAAAAAAYAAAAAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAAAAAAAAAAHAAAAABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAAAAAAAAAAIAAAAABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAAAAAAAAAAJAAAAABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAAAAAAAAAAKAAAAACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAAAAAAAAAAACwAAAAAXSWR4Q29udHJvbENmZ1Jlc3RWMkRhcHAAAAAAAAAAAAwBAAAAEWtleUNvbnRyb2xBZGRyZXNzAAAAAAIAAAAcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwEAAAANa2V5Q29udHJvbENmZwAAAAACAAAAESVzX19jb250cm9sQ29uZmlnAQAAABRyZWFkQ29udHJvbENmZ09yRmFpbAAAAAEAAAAHY29udHJvbAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAHY29udHJvbAkBAAAADWtleUNvbnRyb2xDZmcAAAAABQAAAANTRVABAAAAGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAAAAAIAAAAKY29udHJvbENmZwAAAANpZHgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmNvbnRyb2xDZmcFAAAAA2lkeAkAASwAAAACAgAAAC1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAAGkAAAAAQUAAAADaWR4AAAAAA9jb250cm9sQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAEWtleUNvbnRyb2xBZGRyZXNzAAAAAAIAAAAjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngAAAAACmNvbnRyb2xDZmcJAQAAABRyZWFkQ29udHJvbENmZ09yRmFpbAAAAAEFAAAAD2NvbnRyb2xDb250cmFjdAAAAAAMbWF0aENvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAAAAALcnBkQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABRJZHhDb250cm9sQ2ZnUnBkRGFwcAAAAAATbnNidFN0YWtpbmdDb250cmFjdAkBAAAAGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAAAAAIFAAAACmNvbnRyb2xDZmcFAAAAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAAAAAAE3N1cmZTdGFraW5nQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAAAABdnbnNidENvbnRyb2xsZXJDb250cmFjdAkBAAAAGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAAAAAIFAAAACmNvbnRyb2xDZmcFAAAAIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAAAAAA5yZXN0VjJDb250cmFjdAkBAAAAGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAAAAAIFAAAACmNvbnRyb2xDZmcFAAAAF0lkeENvbnRyb2xDZmdSZXN0VjJEYXBwAAAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwAAAAAObnNidEFzc2V0SWRTdHIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAA5rZXlOc2J0QXNzZXRJZAAAAAAAAAAAC25zYnRBc3NldElkCQACWQAAAAEFAAAADm5zYnRBc3NldElkU3RyAAAAAA5zdXJmQXNzZXRJZFN0cgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAAAAAAtzdXJmQXNzZXRJZAkAAlkAAAABBQAAAA5zdXJmQXNzZXRJZFN0cgEAAAASbWluV2F2ZXNGb3JOc2J0QnV5AAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAIG1pbldhdmVzQW1vdW50TnNidEJ1eVNZU1JFQURPTkxZBQAAAANuaWwFAAAAA25pbAEAAAAObWluTnNidEZvclNlbGwAAAAACQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAD2F1Y3Rpb25Db250cmFjdAIAAAAfbWluTnNidEFtb3VudEZvclNlbGxTWVNSRUFET05MWQUAAAADbmlsBQAAAANuaWwBAAAAEm1pbldhdmVzRm9yU3VyZkJ1eQAAAAAJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAPYXVjdGlvbkNvbnRyYWN0AgAAACBtaW5XYXZlc0Ftb3VudFN1cmZCdXlTWVNSRUFET05MWQUAAAADbmlsBQAAAANuaWwBAAAAEW1pblVzZG5Gb3JTdXJmQnV5AAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAH21pblVzZG5BbW91bnRTdXJmQnV5U1lTUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsAQAAABRwcml2YXRlTnNidFByaWNlUkVTVAAAAAAEAAAABnByaWNlcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACBjYWxjQ29udHJhY3ROc2J0UHJpY2VTWVNSRUFET05MWQkABEwAAAACAAAAAAAAAAAABQAAAANuaWwFAAAAA25pbAQAAAAObnNidDJ1c2RuUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAAABAAAAA9uc2J0MndhdmVzUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAABCQAFFAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA5uc2J0MnVzZG5QcmljZQUAAAAObnNidDJ1c2RuUHJpY2UJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA9uc2J0MndhdmVzUHJpY2UFAAAAD25zYnQyd2F2ZXNQcmljZQEAAAAOZ2V0TG9ja2VkT25ScGQAAAACAAAAB2FkZHJTdHIAAAAKYXNzZXRJZFN0cgQAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAALcnBkX2JhbGFuY2UJAARMAAAAAgUAAAAKYXNzZXRJZFN0cgkABEwAAAACBQAAAAdhZGRyU3RyBQAAAANuaWwCAAAAAV8JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAALcnBkQ29udHJhY3QFAAAAA2tleQAAAAAAAAAAAAAAAA4AAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAD25ldXRyaW5vQWRkcmVzcwAAAA9uc2J0TG9ja0FkZHJlc3MAAAALbWF0aEFkZHJlc3MDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAFAAAAD25ldXRyaW5vQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5TnNidExvY2tDb250cmFjdAAAAAAFAAAAD25zYnRMb2NrQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAUAAAALbWF0aEFkZHJlc3MFAAAAA25pbAAAAAFpAQAAABVuZXV0cmlub1N0YXRzUkVBRE9OTFkAAAAABAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAZwcmljZXMJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAgY2FsY0NvbnRyYWN0TnNidFByaWNlU1lTUkVBRE9OTFkJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAADGN1cnJlbnRQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlBAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlBAAAAA9yZXNlcnZlc0luV2F2ZXMJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABFuTWV0cmljSWR4UmVzZXJ2ZQQAAAAOcmVzZXJ2ZXNJblVzZG4JAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgQAAAAObmV1dHJpbm9TdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQQAAAAHc3VycGx1cwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhTdXJwbHVzBAAAAA5zdXJwbHVzUGVyY2VudAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAQAAAACQlIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAAxuTWV0cmljSWR4QlIEAAAACm5zYnRTdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQQAAAANbWF4TnNidFN1cHBseQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5BAAAAA5uc2J0MnVzZG5QcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAAEAAAAD25zYnQyd2F2ZXNQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAEEAAAAEG1pbldhdmVzNE5zYnRCdXkJAQAAABJtaW5XYXZlc0Zvck5zYnRCdXkAAAAABAAAAAttaW5Oc2J0c2VsbAkBAAAADm1pbk5zYnRGb3JTZWxsAAAAAAQAAAAObWluTnNidExvY2tBbXQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAEAAAAEG1heFdhdmVzMkJ1eVN1cmYJAABlAAAAAgkAAGsAAAADBQAAAA5uZXV0cmlub1N1cHBseQUAAAAFTVVMVDgFAAAADGN1cnJlbnRQcmljZQUAAAAPcmVzZXJ2ZXNJbldhdmVzBAAAAA9tYXhVc2RuMkJ1eVN1cmYJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkFAAAADnJlc2VydmVzSW5Vc2RuBAAAAA9zdXJmUHJpY2VJblVzZG4FAAAAAkJSBAAAABBzdXJmUHJpY2VJbldhdmVzCQAAawAAAAMFAAAAAkJSBQAAAAVNVUxUNgUAAAAMY3VycmVudFByaWNlCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAAKCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA9yZXNlcnZlc0luV2F2ZXMJAARMAAAAAgkAAaQAAAABBQAAAA5yZXNlcnZlc0luVXNkbgkABEwAAAACCQABpAAAAAEFAAAADm5ldXRyaW5vU3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAAHc3VycGx1cwkABEwAAAACCQABpAAAAAEFAAAADnN1cnBsdXNQZXJjZW50CQAETAAAAAIJAAGkAAAAAQUAAAACQlIJAARMAAAAAgkAAaQAAAABBQAAAApuc2J0U3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAANbWF4TnNidFN1cHBseQkABEwAAAACCQABpAAAAAEFAAAADm5zYnQydXNkblByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAPbnNidDJ3YXZlc1ByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAQbWluV2F2ZXM0TnNidEJ1eQkABEwAAAACCQABpAAAAAEFAAAAC21pbk5zYnRzZWxsCQAETAAAAAIJAAGkAAAAAQUAAAAObWluTnNidExvY2tBbXQJAARMAAAAAgkAAaQAAAABBQAAABBtYXhXYXZlczJCdXlTdXJmCQAETAAAAAIJAAGkAAAAAQUAAAAPbWF4VXNkbjJCdXlTdXJmCQAETAAAAAIJAAGkAAAAAQUAAAAPc3VyZlByaWNlSW5Vc2RuCQAETAAAAAIJAAGkAAAAAQUAAAAQc3VyZlByaWNlSW5XYXZlcwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAQc3dhcEluZm9SRUFET05MWQAAAAEAAAARdXNlckFkZHJlc3NTdHJPcHQEAAAADGN1cnJlbnRQcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAAIa2V5UHJpY2UAAAAABAAAAA9taW5XYXZlc1N3YXBBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABVrZXlNaW5XYXZlc1N3YXBBbW91bnQAAAAABAAAAA5taW5Vc2RuU3dhcEFtdAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAGGtleU1pbk5ldXRyaW5vU3dhcEFtb3VudAAAAAAEAAAADXdhdmVzMlVzZG5GZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlXYXZlc091dEZlZVBhcnQAAAAABAAAAA11c2RuMldhdmVzRmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAVa2V5TmV1dHJpbm9PdXRGZWVQYXJ0AAAAAAQAAAAVdXNkblN3YXBEZWxheUR1cmF0aW9uCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAea2V5QmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsAAAAAAQAAAAWd2F2ZXNTd2FwRGVsYXlEdXJhdGlvbgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAG2tleUJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAAAAAAEAAAADSR0MDExNDYxMTE2MjUJAQAAABJhc1N3YXBQYXJhbXNTVFJVQ1QAAAABCQAD/AAAAAQFAAAAEG5ldXRyaW5vQ29udHJhY3QCAAAAG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkABEwAAAACBQAAABF1c2VyQWRkcmVzc1N0ck9wdAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwFAAAAA25pbAQAAAAQc3dhcExpbWl0TWF4VXNkbggFAAAADSR0MDExNDYxMTE2MjUAAAACXzEEAAAAEnN3YXBMaW1pdFNwZW50VXNkbggFAAAADSR0MDExNDYxMTE2MjUAAAACXzIEAAAADmJsY2tzMkxtdFJlc2V0CAUAAAANJHQwMTE0NjExMTYyNQAAAAJfMwQAAAARc3dhcExpbWl0TWF4V2F2ZXMJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAQc3dhcExpbWl0TWF4VXNkbgUAAAAMY3VycmVudFByaWNlCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAAFiVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAA9taW5XYXZlc1N3YXBBbXQJAARMAAAAAgkAAaQAAAABBQAAAA5taW5Vc2RuU3dhcEFtdAkABEwAAAACCQABpAAAAAEFAAAADXdhdmVzMlVzZG5GZWUJAARMAAAAAgkAAaQAAAABBQAAAA11c2RuMldhdmVzRmVlCQAETAAAAAIJAAGkAAAAAQUAAAAVdXNkblN3YXBEZWxheUR1cmF0aW9uCQAETAAAAAIJAAGkAAAAAQUAAAAWd2F2ZXNTd2FwRGVsYXlEdXJhdGlvbgkABEwAAAACCQABpAAAAAEFAAAADmJsY2tzMkxtdFJlc2V0CQAETAAAAAIJAAGkAAAAAQUAAAARc3dhcExpbWl0TWF4V2F2ZXMJAARMAAAAAgkAAaQAAAABBQAAABBzd2FwTGltaXRNYXhVc2RuCQAETAAAAAIJAAGkAAAAAQUAAAASc3dhcExpbWl0U3BlbnRVc2RuBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAABFnbnNidEluZm9SRUFET05MWQAAAAIAAAARdXNlckFkZHJlc3NTdHJPcHQAAAALbnNidEFtdERpZmYEAAAADGN1cnJlbnRQcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAAIa2V5UHJpY2UAAAAABAAAAA0kdDAxMjYzMTEyODE0CQEAAAASYXNTd2FwUGFyYW1zU1RSVUNUAAAAAQkAA/wAAAAEBQAAABBuZXV0cmlub0NvbnRyYWN0AgAAABtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAARMAAAAAgUAAAARdXNlckFkZHJlc3NTdHJPcHQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAADGxpbWl0TWF4VXNkbggFAAAADSR0MDEyNjMxMTI4MTQAAAACXzEEAAAACmxpbWl0U3BlbnQIBQAAAA0kdDAxMjYzMTEyODE0AAAAAl8yBAAAAA5ibGNrczJMbXRSZXNldAgFAAAADSR0MDEyNjMxMTI4MTQAAAACXzMEAAAACGduc2J0QW10CAUAAAANJHQwMTI2MzExMjgxNAAAAAJfNAQAAAANZ25zYnRBbXRUb3RhbAgFAAAADSR0MDEyNjMxMTI4MTQAAAACXzUEAAAADSR0MDEyODE4MTMwMjYJAQAAABJhc1N3YXBQYXJhbXNTVFJVQ1QAAAABCQAD/AAAAAQFAAAAEG5ldXRyaW5vQ29udHJhY3QCAAAAG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkABEwAAAACBQAAABF1c2VyQWRkcmVzc1N0ck9wdAkABEwAAAACBQAAAAtuc2J0QW10RGlmZgUAAAADbmlsBQAAAANuaWwEAAAAD2xpbWl0TWF4VXNkbk5FVwgFAAAADSR0MDEyODE4MTMwMjYAAAACXzEEAAAADWxpbWl0U3BlbnRORVcIBQAAAA0kdDAxMjgxODEzMDI2AAAAAl8yBAAAABFibGNrczJMbXRSZXNldE5FVwgFAAAADSR0MDEyODE4MTMwMjYAAAACXzMEAAAAC2duc2J0QW10TkVXCAUAAAANJHQwMTI4MTgxMzAyNgAAAAJfNAQAAAAQZ25zYnRBbXRUb3RhbE5FVwgFAAAADSR0MDEyODE4MTMwMjYAAAACXzUEAAAADWxpbWl0TWF4V2F2ZXMJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAMbGltaXRNYXhVc2RuBQAAAAxjdXJyZW50UHJpY2UEAAAAEGxpbWl0TWF4V2F2ZXNORVcJAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgUAAAAPbGltaXRNYXhVc2RuTkVXBQAAAAxjdXJyZW50UHJpY2UEAAAACmduc2J0U2hhcmUDCQEAAAACIT0AAAACBQAAAA1nbnNidEFtdFRvdGFsAAAAAAAAAAAACQAAawAAAAMJAABoAAAAAgUAAAAIZ25zYnRBbXQAAAAAAAAAAGQFAAAABk1VTFQxMgUAAAANZ25zYnRBbXRUb3RhbAAAAAAAAAAAAAQAAAANZ25zYnRTaGFyZU5FVwMJAQAAAAIhPQAAAAIFAAAAEGduc2J0QW10VG90YWxORVcAAAAAAAAAAAAJAABrAAAAAwkAAGgAAAACBQAAAAtnbnNidEFtdE5FVwAAAAAAAAAAZAUAAAAGTVVMVDEyBQAAABBnbnNidEFtdFRvdGFsTkVXAAAAAAAAAAAABAAAAApyZXdhcmRJbmZvCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQFAAAAE25zYnRTdGFraW5nQ29udHJhY3QCAAAAGHVuY2xhaW1lZFJld2FyZHNSRUFET05MWQkABEwAAAACBQAAABF1c2VyQWRkcmVzc1N0ck9wdAUAAAADbmlsBQAAAANuaWwEAAAAB25zYnRBbXQFAAAACGduc2J0QW10BAAAAApuc2J0QW10TmV3BQAAAAtnbnNidEFtdE5FVwQAAAASbnNidEFtdFN0YWtlZFRvdGFsBQAAAA1nbnNidEFtdFRvdGFsBAAAABVuc2J0QW10U3Rha2VkVG90YWxOZXcFAAAAEGduc2J0QW10VG90YWxORVcEAAAACG5zYnREYXRhCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0AgAAABZuc2J0U3Rha2luZ1NZU1JFQURPTkxZCQAETAAAAAIFAAAAEXVzZXJBZGRyZXNzU3RyT3B0CQAETAAAAAIFAAAAC25zYnRBbXREaWZmBQAAAANuaWwFAAAAA25pbAQAAAASaXNFbXB0eU5zYnRCYWxhbmNlAwkAAAAAAAACBQAAAAhnbnNidEFtdAAAAAAAAAAAAAkAAAAAAAACBQAAAAtnbnNidEFtdE5FVwAAAAAAAAAAAAcEAAAAC3N0YXJ0SGVpZ2h0AwUAAAASaXNFbXB0eU5zYnRCYWxhbmNlAP//////////CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAACG5zYnREYXRhAAAAAAAAAAACBAAAAA5zdGFydFRpbWVzdGFtcAkBAAAAC3RvVGltZXN0YW1wAAAAAQUAAAALc3RhcnRIZWlnaHQEAAAACGhhbGZMaWZlCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAATbnNidFN0YWtpbmdDb250cmFjdAkBAAAAC2tleUhhbGZMaWZlAAAAAAQAAAAOc3RhcnRIZWlnaHROZXcDBQAAABJpc0VtcHR5TnNidEJhbGFuY2UA//////////8JAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABNtZXJnZVN0YWtlc1JFQURPTkxZCQAETAAAAAIFAAAACGduc2J0QW10CQAETAAAAAIFAAAAC3N0YXJ0SGVpZ2h0CQAETAAAAAIFAAAAC2duc2J0QW10TkVXCQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwEAAAAEXN0YXJ0VGltZXN0YW1wTmV3CQEAAAALdG9UaW1lc3RhbXAAAAABBQAAAA5zdGFydEhlaWdodE5ldwkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAACIlZCVkJWQlZCVkJWQlZCVkJXMlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAIZ25zYnRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAtnbnNidEFtdE5FVwkABEwAAAACCQABpAAAAAEFAAAACmduc2J0U2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAA1nbnNidFNoYXJlTkVXCQAETAAAAAIJAAGkAAAAAQUAAAAMbGltaXRNYXhVc2RuCQAETAAAAAIJAAGkAAAAAQUAAAANbGltaXRNYXhXYXZlcwkABEwAAAACCQABpAAAAAEFAAAAD2xpbWl0TWF4VXNkbk5FVwkABEwAAAACCQABpAAAAAEFAAAAEGxpbWl0TWF4V2F2ZXNORVcJAARMAAAAAgUAAAAKcmV3YXJkSW5mbwkABEwAAAACCQABpAAAAAEFAAAAB25zYnRBbXQJAARMAAAAAgkAAaQAAAABBQAAAApuc2J0QW10TmV3CQAETAAAAAIJAAGkAAAAAQUAAAASbnNidEFtdFN0YWtlZFRvdGFsCQAETAAAAAIJAAGkAAAAAQUAAAAVbnNidEFtdFN0YWtlZFRvdGFsTmV3CQAETAAAAAIJAAGkAAAAAQUAAAALc3RhcnRIZWlnaHQJAARMAAAAAgkAAaQAAAABBQAAAA5zdGFydFRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAADnN0YXJ0SGVpZ2h0TmV3CQAETAAAAAIJAAGkAAAAAQUAAAARc3RhcnRUaW1lc3RhbXBOZXcFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAFm5ldXRyaW5vQ29uZmlnUkVBRE9OTFkAAAAABAAAAAtsaW1pdFBhcmFtQQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAMbWF0aENvbnRyYWN0CQEAAAATa2V5U3dhcEFtb3VudEFQYXJhbQAAAAAEAAAAC2xpbWl0UGFyYW1CCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAxtYXRoQ29udHJhY3QJAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAQAAAAPbWluV2F2ZXNTd2FwQW10CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAVa2V5TWluV2F2ZXNTd2FwQW1vdW50AAAAAAQAAAAObWluVXNkblN3YXBBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhrZXlNaW5OZXV0cmlub1N3YXBBbW91bnQAAAAABAAAAA13YXZlczJVc2RuRmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5V2F2ZXNPdXRGZWVQYXJ0AAAAAAQAAAANdXNkbjJXYXZlc0ZlZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAFWtleU5ldXRyaW5vT3V0RmVlUGFydAAAAAAEAAAAEG1pbldhdmVzNE5zYnRCdXkJAQAAABJtaW5XYXZlc0Zvck5zYnRCdXkAAAAABAAAAAttaW5Oc2J0c2VsbAkBAAAADm1pbk5zYnRGb3JTZWxsAAAAAAQAAAAObWluTnNidExvY2tBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAE25zYnRTdGFraW5nQ29udHJhY3QJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAQAAAAIaGFsZkxpZmUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAE25zYnRTdGFraW5nQ29udHJhY3QJAQAAAAtrZXlIYWxmTGlmZQAAAAAEAAAAEG1pbldhdmVzNFN1cmZCdXkJAQAAABJtaW5XYXZlc0ZvclN1cmZCdXkAAAAABAAAAA9taW5Vc2RuNFN1cmZCdXkJAQAAABFtaW5Vc2RuRm9yU3VyZkJ1eQAAAAAEAAAADnN1cmZTdGFraW5nQ2ZnCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABNzdXJmU3Rha2luZ0NvbnRyYWN0AgAAABFjb25maWdTWVNSRUFET05MWQUAAAADbmlsBQAAAANuaWwEAAAAD21pblN1cmZTdGFrZUFtdAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA5zdXJmU3Rha2luZ0NmZwAAAAAAAAAAAAQAAAASZ25zYnRGcm9tU3VyZkNvZWZmCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAADnN1cmZTdGFraW5nQ2ZnAAAAAAAAAAABBAAAACBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA5zdXJmU3Rha2luZ0NmZwAAAAAAAAAAAgQAAAAbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAADnN1cmZTdGFraW5nQ2ZnAAAAAAAAAAADCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAAICVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUA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WQAAAAIAAAAGYW1vdW50AAAAC3VzZXJBZGRyZXNzBAAAAAhoYWxmTGlmZQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAE25zYnRTdGFraW5nQ29udHJhY3QJAQAAAAtrZXlIYWxmTGlmZQAAAAAEAAAAC3N0YXJ0SGVpZ2h0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAE25zYnRTdGFraW5nQ29udHJhY3QJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAALdXNlckFkZHJlc3MFAAAABmhlaWdodAQAAAABYQkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAIWdldFVuc3Rha2VDb21pc3Npb25BbW91bnRSRUFET05MWQkABEwAAAACBQAAAAZhbW91bnQJAARMAAAAAgUAAAALc3RhcnRIZWlnaHQJAARMAAAAAgUAAAAIaGFsZkxpZmUFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAFhBQAAAAFhCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAAAiVkCQAETAAAAAIJAAGkAAAAAQUAAAABYQUAAAADbmlsBQAAAANTRVAJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAEW5ldXRyaW5vU3RhdGVSRVNUAAAAAAQAAAAPbmV1dHJpbm9NZXRyaWNzCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQAAAANuaWwFAAAAA25pbAQAAAAMY3VycmVudFByaWNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAPbk1ldHJpY0lkeFByaWNlBAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABtuTWV0cmljSWR4VXNkbkxvY2tlZEJhbGFuY2UEAAAAEndhdmVzTG9ja2VkQmFsYW5jZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UEAAAAD3Jlc2VydmVzSW5XYXZlcwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhSZXNlcnZlBAAAAA5yZXNlcnZlc0luVXNkbgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAF25NZXRyaWNJZHhSZXNlcnZlSW5Vc2RuBAAAAA5uZXV0cmlub1N1cHBseQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5BAAAAAdzdXJwbHVzCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAARbk1ldHJpY0lkeFN1cnBsdXMEAAAADnN1cnBsdXNQZXJjZW50CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50BAAAAAJCUgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAADG5NZXRyaWNJZHhCUgQAAAAKbnNidFN1cHBseQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5BAAAAA1uc2J0U3VwcGx5TWF4CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkEAAAACnN1cmZTdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4U3VyZlN1cHBseQkAAAIAAAABCQAEuQAAAAIJAARMAAAAAgIAAAAXcmVzdWx0TmV1dHJpbm9TdGF0ZVJFU1QJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA9yZXNlcnZlc0luV2F2ZXMJAARMAAAAAgkAAaQAAAABBQAAAA5yZXNlcnZlc0luVXNkbgkABEwAAAACCQABpAAAAAEFAAAADm5ldXRyaW5vU3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAAHc3VycGx1cwkABEwAAAACCQABpAAAAAEFAAAADnN1cnBsdXNQZXJjZW50CQAETAAAAAIJAAGkAAAAAQUAAAACQlIJAARMAAAAAgkAAaQAAAABBQAAAApuc2J0U3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAANbnNidFN1cHBseU1heAkABEwAAAACCQABpAAAAAEFAAAACnN1cmZTdXBwbHkFAAAAA25pbAIAAAACX18AAAABaQEAAAANbnNidFByaWNlUkVTVAAAAAAEAAAABnByaWNlcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACBjYWxjQ29udHJhY3ROc2J0UHJpY2VTWVNSRUFET05MWQkABEwAAAACAAAAAAAAAAAABQAAAANuaWwFAAAAA25pbAQAAAAObnNidDJ1c2RuUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAAABAAAAA9uc2J0MndhdmVzUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAABBAAAAAhyZXN0RGF0YQkABLkAAAACCQAETAAAAAICAAAAEnN0YXJ0TnNidFByaWNlUkVTVAkABEwAAAACCQABpAAAAAEFAAAADm5zYnQydXNkblByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAPbnNidDJ3YXZlc1ByaWNlCQAETAAAAAICAAAAEGVuZE5zYnRQcmljZVJFU1QFAAAAA25pbAIAAAACX18JAAACAAAAAQUAAAAIcmVzdERhdGEAAAABaQEAAAANc3VyZlByaWNlUkVTVAAAAAAEAAAAD25ldXRyaW5vTWV0cmljcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUAAAADbmlsBQAAAANuaWwEAAAADGN1cnJlbnRQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAPcmVzZXJ2ZXNJbldhdmVzCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAARbk1ldHJpY0lkeFJlc2VydmUEAAAADm5ldXRyaW5vU3VwcGx5CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkEAAAAD3N1cmZQcmljZUluVXNkbgkAAGsAAAADBQAAAA9yZXNlcnZlc0luV2F2ZXMFAAAADGN1cnJlbnRQcmljZQUAAAAObmV1dHJpbm9TdXBwbHkEAAAAEHN1cmZQcmljZUluV2F2ZXMJAABrAAAAAwUAAAAPcmVzZXJ2ZXNJbldhdmVzBQAAAAVNVUxUOAUAAAAObmV1dHJpbm9TdXBwbHkEAAAACHJlc3REYXRhCQAEuQAAAAIJAARMAAAAAgIAAAASc3RhcnRTdXJmUHJpY2VSRVNUCQAETAAAAAIJAAGkAAAAAQUAAAAPc3VyZlByaWNlSW5Vc2RuCQAETAAAAAIJAAGkAAAAAQUAAAAQc3VyZlByaWNlSW5XYXZlcwkABEwAAAACAgAAABBlbmRTdXJmUHJpY2VSRVNUBQAAAANuaWwCAAAAAl9fCQAAAgAAAAEFAAAACHJlc3REYXRhAAAAAMcGxeU=", "chainId": 84, "height": 2170645, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: agSb9GXxpH4pVSQQ1XGCJF8XUNyMsiumnXC2pwRhJQm Next: GxrsQLWw4f86vBvLCwJ78nSqkwSRUjgmVToU1mDieNR4 Diff:
OldNewDifferences
229229
230230 let IdxControlCfgGnsbtControllerDapp = 11
231231
232+let IdxControlCfgRestV2Dapp = 12
233+
232234 func keyControlAddress () = "%s%s__config__controlAddress"
233235
234236
260262 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
261263
262264 let gnsbtControllerContract = getContractAddressOrFail(controlCfg, IdxControlCfgGnsbtControllerDapp)
265+
266+let restV2Contract = getContractAddressOrFail(controlCfg, IdxControlCfgRestV2Dapp)
263267
264268 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
265269
344348 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
345349 let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
346350 let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
347- let $t01134011504 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
348- let swapLimitMaxUsdn = $t01134011504._1
349- let swapLimitSpentUsdn = $t01134011504._2
350- let blcks2LmtReset = $t01134011504._3
351+ let $t01146111625 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
352+ let swapLimitMaxUsdn = $t01146111625._1
353+ let swapLimitSpentUsdn = $t01146111625._2
354+ let blcks2LmtReset = $t01146111625._3
351355 let swapLimitMaxWaves = convertNeutrinoToWaves(swapLimitMaxUsdn, currentPrice)
352356 $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(swapLimitMaxWaves), toString(swapLimitMaxUsdn), toString(swapLimitSpentUsdn)], SEP))
353357 }
357361 @Callable(i)
358362 func gnsbtInfoREADONLY (userAddressStrOpt,nsbtAmtDiff) = {
359363 let currentPrice = getIntegerValue(controlContract, keyPrice())
360- let $t01251012693 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
361- let limitMaxUsdn = $t01251012693._1
362- let limitSpent = $t01251012693._2
363- let blcks2LmtReset = $t01251012693._3
364- let gnsbtAmt = $t01251012693._4
365- let gnsbtAmtTotal = $t01251012693._5
366- let $t01269712905 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
367- let limitMaxUsdnNEW = $t01269712905._1
368- let limitSpentNEW = $t01269712905._2
369- let blcks2LmtResetNEW = $t01269712905._3
370- let gnsbtAmtNEW = $t01269712905._4
371- let gnsbtAmtTotalNEW = $t01269712905._5
364+ let $t01263112814 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
365+ let limitMaxUsdn = $t01263112814._1
366+ let limitSpent = $t01263112814._2
367+ let blcks2LmtReset = $t01263112814._3
368+ let gnsbtAmt = $t01263112814._4
369+ let gnsbtAmtTotal = $t01263112814._5
370+ let $t01281813026 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
371+ let limitMaxUsdnNEW = $t01281813026._1
372+ let limitSpentNEW = $t01281813026._2
373+ let blcks2LmtResetNEW = $t01281813026._3
374+ let gnsbtAmtNEW = $t01281813026._4
375+ let gnsbtAmtTotalNEW = $t01281813026._5
372376 let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
373377 let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
374378 let gnsbtShare = if ((gnsbtAmtTotal != 0))
382386 let nsbtAmtNew = gnsbtAmtNEW
383387 let nsbtAmtStakedTotal = gnsbtAmtTotal
384388 let nsbtAmtStakedTotalNew = gnsbtAmtTotalNEW
385- let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt], nil))
389+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
386390 let isEmptyNsbtBalance = if ((gnsbtAmt == 0))
387391 then (gnsbtAmtNEW == 0)
388392 else false
459463 let br1 = asInt(surfResult[bFuncIdxBREnd])
460464 let priceSurf2Waves0 = fraction(br0, MULT6, price)
461465 let priceSurf2Waves1 = fraction(br1, MULT6, price)
462- let votingPowerEta = 1000
463- let newVotingPower = 4242
466+ let gsnbtRestV2Data = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, 0], nil))
467+ let votingPower = asInt(gsnbtRestV2Data[19])
468+ let votingPowerMax = asInt(gsnbtRestV2Data[21])
469+ let votingPowerEta = asInt(gsnbtRestV2Data[23])
470+ let gsnbtRestV2DataNEW = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, surfAmount], nil))
471+ let votingPowerNEW = asInt(gsnbtRestV2DataNEW[19])
472+ let votingPowerMaxNEW = asInt(gsnbtRestV2DataNEW[21])
473+ let votingPowerEtaNEW = asInt(gsnbtRestV2DataNEW[23])
474+ let mergedVotingPowerEta = votingPowerEtaNEW
475+ let maxVotingPowerDiff = (votingPowerMaxNEW - votingPowerMax)
464476 let rest = asInt(surfResult[bFuncIdxRest])
465- $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(surfAmount), toString(gNsbtAmount), toString(additionalLimitUsdn), toString(additionalLimitWaves), toString(br0), toString(br1), toString(priceSurf2Waves0), toString(priceSurf2Waves1), toString(votingPowerEta), toString(newVotingPower), toString(rest)], SEP))
477+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(surfAmount), toString(gNsbtAmount), toString(additionalLimitUsdn), toString(additionalLimitWaves), toString(br0), toString(br1), toString(priceSurf2Waves0), toString(priceSurf2Waves1), toString(mergedVotingPowerEta), toString(maxVotingPowerDiff), toString(rest)], SEP))
466478 }
467479
468480
473485 let balance = wavesBalance(addr)
474486 let usdnLocked = getLockedOnRpd(userAddressStr, neutrinoAssetIdString)
475487 let nsbtLockedOld = getLockedOnRpd(userAddressStr, nsbtAssetIdStr)
476- let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStr], nil))
488+ let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStr, 0, 0], nil))
477489 let nsbtData = asAnyList(gnsbtData[2])
478490 let nsbtUser = asInt(nsbtData[0])
479491 let nsbtTotal = asInt(nsbtData[1])
486498 let gNsbtFromSurfTotal = asInt(surfData[3])
487499 let availableUsdnToClaimFromSurf = 0
488500 let alreadyClaimedUsdnFromSurf = 0
489- let votingPower = 4242
490- let votingPowerMax = 424242
491- let heightVotingPowerMax = 42424242
492- $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(heightVotingPowerMax), toString(availableUsdnToClaimFromSurf), toString(alreadyClaimedUsdnFromSurf), toString(gNsbtFromNsbtTotal), toString(gNsbtFromSurfTotal)], SEP))
501+ let gsnbtRestV2DATA = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStr, 0, 0], nil))
502+ let votingPower = asInt(gsnbtRestV2DATA[19])
503+ let votingPowerMax = asInt(gsnbtRestV2DATA[21])
504+ let votingPowerEta = asInt(gsnbtRestV2DATA[23])
505+ $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))
493506 }
494507
495508
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
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 WAVESID = fromBase58String("WAVES")
2323
2424 let nMetricIdxPrice = 0
2525
2626 let nMetricIdxUsdnLockedBalance = 1
2727
2828 let nMetricIdxWavesLockedBalance = 2
2929
3030 let nMetricIdxReserve = 3
3131
3232 let nMetricIdxReserveInUsdn = 4
3333
3434 let nMetricIdxUsdnSupply = 5
3535
3636 let nMetricIdxSurplus = 6
3737
3838 let nMetricIdxSurplusPercent = 7
3939
4040 let nMetricIdxBR = 8
4141
4242 let nMetricIdxNsbtSupply = 9
4343
4444 let nMetricIdxMaxNsbtSupply = 10
4545
4646 let nMetricIdxSurfSupply = 11
4747
4848 let bFuncIdxSurf = 0
4949
5050 let bFuncIdxWaves = 1
5151
5252 let bFuncIdxUsdn = 2
5353
5454 let bFuncIdxReserveStart = 3
5555
5656 let bFuncIdxSupplyStart = 4
5757
5858 let bFuncIdxBRStart = 5
5959
6060 let bFuncIdxReserveEnd = 6
6161
6262 let bFuncIdxSupplyEnd = 7
6363
6464 let bFuncIdxBREnd = 8
6565
6666 let bFuncIdxRest = 9
6767
6868 let bFuncIdxWavesPrice = 10
6969
7070 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
7171
7272
7373 func keyNeutrinoAssetId () = "neutrino_asset_id"
7474
7575
7676 func keyNsbtAssetId () = "bond_asset_id"
7777
7878
7979 func keySurfAssetId () = "surf_asset_id"
8080
8181
8282 func keyBalanceLocked () = "balance_lock_"
8383
8484
8585 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
8686
8787
8888 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
8989
9090
9191 func keyMinWavesSwapAmount () = "min_waves_swap_amount"
9292
9393
9494 func keyMinNeutrinoSwapAmount () = "min_neutrino_swap_amount"
9595
9696
9797 func keyWavesOutFeePart () = "wavesOut_swap_feePart"
9898
9999
100100 func keyNeutrinoOutFeePart () = "neutrinoOut_swap_feePart"
101101
102102
103103 func keySwapAmountAParam () = "%s%s__config__swapAParam"
104104
105105
106106 func keySwapAmountBParam () = "%s%s__config__swapBParam"
107107
108108
109109 func keyNsbtLockContract () = "%s__nsbtLockContract"
110110
111111
112112 func keyMathContract () = "%s__mathContract"
113113
114114
115115 func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
116116
117117
118118 func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
119119
120120
121121 func keyPrice () = "price"
122122
123123
124124 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
125125
126126
127127 func keyHalfLife () = "%s__halfLife"
128128
129129
130130 func keyMinLockAmount () = "%s__minLockAmount"
131131
132132
133133 func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
134134
135135
136136 func keyMinNsbtSell () = "min_nsbt_sell"
137137
138138
139139 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
140140
141141
142142 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
143143
144144
145145 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
146146
147147
148148 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
149149
150150
151151 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
152152
153153
154154 func asAnyList (val) = match val {
155155 case valAnyList: List[Any] =>
156156 valAnyList
157157 case _ =>
158158 throw("fail to cast into List[Any]")
159159 }
160160
161161
162162 func asInt (val) = match val {
163163 case valInt: Int =>
164164 valInt
165165 case _ =>
166166 throw("fail to cast into Int")
167167 }
168168
169169
170170 func asString (val) = match val {
171171 case valStr: String =>
172172 valStr
173173 case _ =>
174174 throw("fail to cast into String")
175175 }
176176
177177
178178 func asTuple2Ints (val) = match val {
179179 case v: (Int, Int) =>
180180 v
181181 case _ =>
182182 throw("fail to cast into Tuple2 ints")
183183 }
184184
185185
186186 func asSwapParamsSTRUCT (val) = match val {
187187 case struct: (Int, Int, Int, Int, Int) =>
188188 struct
189189 case _ =>
190190 throw("fail to cast into Int")
191191 }
192192
193193
194194 func toTimestamp (start) = if ((0 > start))
195195 then -1
196196 else match blockInfoByHeight(start) {
197197 case block: BlockInfo =>
198198 block.timestamp
199199 case _ =>
200200 -1
201201 }
202202
203203
204204 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
205205
206206
207207 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
208208
209209
210210 let IdxControlCfgNeutrinoDapp = 1
211211
212212 let IdxControlCfgAuctionDapp = 2
213213
214214 let IdxControlCfgRpdDapp = 3
215215
216216 let IdxControlCfgMathDapp = 4
217217
218218 let IdxControlCfgLiquidationDapp = 5
219219
220220 let IdxControlCfgRestDapp = 6
221221
222222 let IdxControlCfgNodeRegistryDapp = 7
223223
224224 let IdxControlCfgNsbtStakingDapp = 8
225225
226226 let IdxControlCfgMediatorDapp = 9
227227
228228 let IdxControlCfgSurfStakingDapp = 10
229229
230230 let IdxControlCfgGnsbtControllerDapp = 11
231231
232+let IdxControlCfgRestV2Dapp = 12
233+
232234 func keyControlAddress () = "%s%s__config__controlAddress"
233235
234236
235237 func keyControlCfg () = "%s__controlConfig"
236238
237239
238240 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
239241
240242
241243 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
242244
243245
244246 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
245247
246248 let controlCfg = readControlCfgOrFail(controlContract)
247249
248250 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
249251
250252 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
251253
252254 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
253255
254256 let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
255257
256258 let rpdContract = getContractAddressOrFail(controlCfg, IdxControlCfgRpdDapp)
257259
258260 let nsbtStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgNsbtStakingDapp)
259261
260262 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
261263
262264 let gnsbtControllerContract = getContractAddressOrFail(controlCfg, IdxControlCfgGnsbtControllerDapp)
265+
266+let restV2Contract = getContractAddressOrFail(controlCfg, IdxControlCfgRestV2Dapp)
263267
264268 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
265269
266270 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
267271
268272 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyNsbtAssetId())
269273
270274 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
271275
272276 let surfAssetIdStr = getStringValue(auctionContract, keySurfAssetId())
273277
274278 let surfAssetId = fromBase58String(surfAssetIdStr)
275279
276280 func minWavesForNsbtBuy () = asInt(invoke(auctionContract, "minWavesAmountNsbtBuySYSREADONLY", nil, nil))
277281
278282
279283 func minNsbtForSell () = asInt(invoke(auctionContract, "minNsbtAmountForSellSYSREADONLY", nil, nil))
280284
281285
282286 func minWavesForSurfBuy () = asInt(invoke(auctionContract, "minWavesAmountSurfBuySYSREADONLY", nil, nil))
283287
284288
285289 func minUsdnForSurfBuy () = asInt(invoke(auctionContract, "minUsdnAmountSurfBuySYSREADONLY", nil, nil))
286290
287291
288292 func privateNsbtPriceREST () = {
289293 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
290294 let nsbt2usdnPrice = asInt(prices[0])
291295 let nsbt2wavesPrice = asInt(prices[1])
292296 $Tuple2(IntegerEntry("nsbt2usdnPrice", nsbt2usdnPrice), IntegerEntry("nsbt2wavesPrice", nsbt2wavesPrice))
293297 }
294298
295299
296300 func getLockedOnRpd (addrStr,assetIdStr) = {
297301 let key = makeString(["rpd_balance", assetIdStr, addrStr], "_")
298302 valueOrElse(getInteger(rpdContract, key), 0)
299303 }
300304
301305
302306 @Callable(i)
303307 func constructor (neutrinoAddress,nsbtLockAddress,mathAddress) = if ((i.caller != this))
304308 then throw("not authorized")
305309 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), StringEntry(keyMathContract(), mathAddress)]
306310
307311
308312
309313 @Callable(i)
310314 func neutrinoStatsREADONLY () = {
311315 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
312316 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
313317 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
314318 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
315319 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
316320 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
317321 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
318322 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
319323 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
320324 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
321325 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
322326 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
323327 let maxNsbtSupply = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
324328 let nsbt2usdnPrice = asInt(prices[0])
325329 let nsbt2wavesPrice = asInt(prices[1])
326330 let minWaves4NsbtBuy = minWavesForNsbtBuy()
327331 let minNsbtsell = minNsbtForSell()
328332 let minNsbtLockAmt = getIntOrFail(nsbtStakingContract, keyMinLockAmount())
329333 let maxWaves2BuySurf = (fraction(neutrinoSupply, MULT8, currentPrice) - reservesInWaves)
330334 let maxUsdn2BuySurf = (neutrinoSupply - reservesInUsdn)
331335 let surfPriceInUsdn = BR
332336 let surfPriceInWaves = fraction(BR, MULT6, currentPrice)
333337 $Tuple2(nil, makeString(["%d%d%d%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(minWaves4NsbtBuy), toString(minNsbtsell), toString(minNsbtLockAmt), toString(maxWaves2BuySurf), toString(maxUsdn2BuySurf), toString(surfPriceInUsdn), toString(surfPriceInWaves)], SEP))
334338 }
335339
336340
337341
338342 @Callable(i)
339343 func swapInfoREADONLY (userAddressStrOpt) = {
340344 let currentPrice = getIntegerValue(controlContract, keyPrice())
341345 let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
342346 let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
343347 let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
344348 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
345349 let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
346350 let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
347- let $t01134011504 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
348- let swapLimitMaxUsdn = $t01134011504._1
349- let swapLimitSpentUsdn = $t01134011504._2
350- let blcks2LmtReset = $t01134011504._3
351+ let $t01146111625 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
352+ let swapLimitMaxUsdn = $t01146111625._1
353+ let swapLimitSpentUsdn = $t01146111625._2
354+ let blcks2LmtReset = $t01146111625._3
351355 let swapLimitMaxWaves = convertNeutrinoToWaves(swapLimitMaxUsdn, currentPrice)
352356 $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(swapLimitMaxWaves), toString(swapLimitMaxUsdn), toString(swapLimitSpentUsdn)], SEP))
353357 }
354358
355359
356360
357361 @Callable(i)
358362 func gnsbtInfoREADONLY (userAddressStrOpt,nsbtAmtDiff) = {
359363 let currentPrice = getIntegerValue(controlContract, keyPrice())
360- let $t01251012693 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
361- let limitMaxUsdn = $t01251012693._1
362- let limitSpent = $t01251012693._2
363- let blcks2LmtReset = $t01251012693._3
364- let gnsbtAmt = $t01251012693._4
365- let gnsbtAmtTotal = $t01251012693._5
366- let $t01269712905 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
367- let limitMaxUsdnNEW = $t01269712905._1
368- let limitSpentNEW = $t01269712905._2
369- let blcks2LmtResetNEW = $t01269712905._3
370- let gnsbtAmtNEW = $t01269712905._4
371- let gnsbtAmtTotalNEW = $t01269712905._5
364+ let $t01263112814 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
365+ let limitMaxUsdn = $t01263112814._1
366+ let limitSpent = $t01263112814._2
367+ let blcks2LmtReset = $t01263112814._3
368+ let gnsbtAmt = $t01263112814._4
369+ let gnsbtAmtTotal = $t01263112814._5
370+ let $t01281813026 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
371+ let limitMaxUsdnNEW = $t01281813026._1
372+ let limitSpentNEW = $t01281813026._2
373+ let blcks2LmtResetNEW = $t01281813026._3
374+ let gnsbtAmtNEW = $t01281813026._4
375+ let gnsbtAmtTotalNEW = $t01281813026._5
372376 let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
373377 let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
374378 let gnsbtShare = if ((gnsbtAmtTotal != 0))
375379 then fraction((gnsbtAmt * 100), MULT12, gnsbtAmtTotal)
376380 else 0
377381 let gnsbtShareNEW = if ((gnsbtAmtTotalNEW != 0))
378382 then fraction((gnsbtAmtNEW * 100), MULT12, gnsbtAmtTotalNEW)
379383 else 0
380384 let rewardInfo = asString(invoke(nsbtStakingContract, "unclaimedRewardsREADONLY", [userAddressStrOpt], nil))
381385 let nsbtAmt = gnsbtAmt
382386 let nsbtAmtNew = gnsbtAmtNEW
383387 let nsbtAmtStakedTotal = gnsbtAmtTotal
384388 let nsbtAmtStakedTotalNew = gnsbtAmtTotalNEW
385- let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt], nil))
389+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
386390 let isEmptyNsbtBalance = if ((gnsbtAmt == 0))
387391 then (gnsbtAmtNEW == 0)
388392 else false
389393 let startHeight = if (isEmptyNsbtBalance)
390394 then -1
391395 else asInt(nsbtData[2])
392396 let startTimestamp = toTimestamp(startHeight)
393397 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
394398 let startHeightNew = if (isEmptyNsbtBalance)
395399 then -1
396400 else asInt(invoke(mathContract, "mergeStakesREADONLY", [gnsbtAmt, startHeight, gnsbtAmtNEW, height, halfLife], nil))
397401 let startTimestampNew = toTimestamp(startHeightNew)
398402 $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(limitMaxWaves), toString(limitMaxUsdnNEW), toString(limitMaxWavesNEW), rewardInfo, toString(nsbtAmt), toString(nsbtAmtNew), toString(nsbtAmtStakedTotal), toString(nsbtAmtStakedTotalNew), toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
399403 }
400404
401405
402406
403407 @Callable(i)
404408 func neutrinoConfigREADONLY () = {
405409 let limitParamA = getIntegerValue(mathContract, keySwapAmountAParam())
406410 let limitParamB = getIntegerValue(mathContract, keySwapAmountBParam())
407411 let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
408412 let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
409413 let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
410414 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
411415 let minWaves4NsbtBuy = minWavesForNsbtBuy()
412416 let minNsbtsell = minNsbtForSell()
413417 let minNsbtLockAmt = getIntegerValue(nsbtStakingContract, keyMinLockAmount())
414418 let halfLife = getIntegerValue(nsbtStakingContract, keyHalfLife())
415419 let minWaves4SurfBuy = minWavesForSurfBuy()
416420 let minUsdn4SurfBuy = minUsdnForSurfBuy()
417421 let surfStakingCfg = asAnyList(invoke(surfStakingContract, "configSYSREADONLY", nil, nil))
418422 let minSurfStakeAmt = asInt(surfStakingCfg[0])
419423 let gnsbtFromSurfCoeff = asInt(surfStakingCfg[1])
420424 let surfVotingPowerRestrictivePeriod = asInt(surfStakingCfg[2])
421425 let brToStartSurfTransformation = asInt(surfStakingCfg[3])
422426 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%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)], SEP))
423427 }
424428
425429
426430
427431 @Callable(i)
428432 func buyNsbtREADONLY (wavesPay) = {
429433 let minWavesAmountNsbtBuy = minWavesForNsbtBuy()
430434 if ((minWavesAmountNsbtBuy > wavesPay))
431435 then throw((("min " + toString(minWavesAmountNsbtBuy)) + " waves expected"))
432436 else {
433437 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
434438 if ((curveResult == curveResult))
435439 then {
436440 let nsbtAmount = asInt(curveResult[0])
437441 if ((0 >= nsbtAmount))
438442 then throw("nsbtAmount <= 0")
439443 else $Tuple2(nil, makeString(["%d", toString(nsbtAmount)], SEP))
440444 }
441445 else throw("Strict value is not equal to itself.")
442446 }
443447 }
444448
445449
446450
447451 @Callable(i)
448452 func buySurfREADONLY (userAddressStrOpt,amount,assetIdStr) = {
449453 let assetId = fromBase58String(assetIdStr)
450454 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amount, assetId], nil))
451455 let surfAmount = asInt(surfResult[bFuncIdxSurf])
452456 let gNsbtAmount = asInt(invoke(gnsbtControllerContract, "gnsbtFromSurfSYSREADONLY", [surfAmount], nil))
453457 let limitOld = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))._1
454458 let limitNew = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, gNsbtAmount], nil))._1
455459 let price = asInt(surfResult[bFuncIdxWavesPrice])
456460 let additionalLimitUsdn = (limitNew - limitOld)
457461 let additionalLimitWaves = fraction(additionalLimitUsdn, MULT8, price)
458462 let br0 = asInt(surfResult[bFuncIdxBRStart])
459463 let br1 = asInt(surfResult[bFuncIdxBREnd])
460464 let priceSurf2Waves0 = fraction(br0, MULT6, price)
461465 let priceSurf2Waves1 = fraction(br1, MULT6, price)
462- let votingPowerEta = 1000
463- let newVotingPower = 4242
466+ let gsnbtRestV2Data = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, 0], nil))
467+ let votingPower = asInt(gsnbtRestV2Data[19])
468+ let votingPowerMax = asInt(gsnbtRestV2Data[21])
469+ let votingPowerEta = asInt(gsnbtRestV2Data[23])
470+ let gsnbtRestV2DataNEW = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStrOpt, 0, surfAmount], nil))
471+ let votingPowerNEW = asInt(gsnbtRestV2DataNEW[19])
472+ let votingPowerMaxNEW = asInt(gsnbtRestV2DataNEW[21])
473+ let votingPowerEtaNEW = asInt(gsnbtRestV2DataNEW[23])
474+ let mergedVotingPowerEta = votingPowerEtaNEW
475+ let maxVotingPowerDiff = (votingPowerMaxNEW - votingPowerMax)
464476 let rest = asInt(surfResult[bFuncIdxRest])
465- $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(surfAmount), toString(gNsbtAmount), toString(additionalLimitUsdn), toString(additionalLimitWaves), toString(br0), toString(br1), toString(priceSurf2Waves0), toString(priceSurf2Waves1), toString(votingPowerEta), toString(newVotingPower), toString(rest)], SEP))
477+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(surfAmount), toString(gNsbtAmount), toString(additionalLimitUsdn), toString(additionalLimitWaves), toString(br0), toString(br1), toString(priceSurf2Waves0), toString(priceSurf2Waves1), toString(mergedVotingPowerEta), toString(maxVotingPowerDiff), toString(rest)], SEP))
466478 }
467479
468480
469481
470482 @Callable(i)
471483 func walletInfoREADONLY (userAddressStr) = {
472484 let addr = addressFromStringValue(userAddressStr)
473485 let balance = wavesBalance(addr)
474486 let usdnLocked = getLockedOnRpd(userAddressStr, neutrinoAssetIdString)
475487 let nsbtLockedOld = getLockedOnRpd(userAddressStr, nsbtAssetIdStr)
476- let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStr], nil))
488+ let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStr, 0, 0], nil))
477489 let nsbtData = asAnyList(gnsbtData[2])
478490 let nsbtUser = asInt(nsbtData[0])
479491 let nsbtTotal = asInt(nsbtData[1])
480492 let gNsbtFromNsbtUser = asInt(nsbtData[2])
481493 let gNsbtFromNsbtTotal = asInt(nsbtData[3])
482494 let surfData = asAnyList(gnsbtData[3])
483495 let surfUser = asInt(surfData[0])
484496 let surfTotal = asInt(surfData[1])
485497 let gNsbtFromSurfUser = asInt(surfData[2])
486498 let gNsbtFromSurfTotal = asInt(surfData[3])
487499 let availableUsdnToClaimFromSurf = 0
488500 let alreadyClaimedUsdnFromSurf = 0
489- let votingPower = 4242
490- let votingPowerMax = 424242
491- let heightVotingPowerMax = 42424242
492- $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(heightVotingPowerMax), toString(availableUsdnToClaimFromSurf), toString(alreadyClaimedUsdnFromSurf), toString(gNsbtFromNsbtTotal), toString(gNsbtFromSurfTotal)], SEP))
501+ let gsnbtRestV2DATA = asAnyList(invoke(restV2Contract, "gnsbtInfoINTERNAL", [userAddressStr, 0, 0], nil))
502+ let votingPower = asInt(gsnbtRestV2DATA[19])
503+ let votingPowerMax = asInt(gsnbtRestV2DATA[21])
504+ let votingPowerEta = asInt(gsnbtRestV2DATA[23])
505+ $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))
493506 }
494507
495508
496509
497510 @Callable(i)
498511 func mergedStakeREADONLY (amount1,height1,amount2,height2) = {
499512 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
500513 let h = asInt(invoke(mathContract, "mergeStakesREADONLY", [amount1, height1, amount2, height2, halfLife], nil))
501514 $Tuple2(nil, makeString(["%d%d", toString((amount1 + amount2)), toString(h)], SEP))
502515 }
503516
504517
505518
506519 @Callable(i)
507520 func unstakeComissionAmountByHeightREADONLY (amount,startHeight) = {
508521 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
509522 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
510523 if ((a == a))
511524 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
512525 else throw("Strict value is not equal to itself.")
513526 }
514527
515528
516529
517530 @Callable(i)
518531 func unstakeComissionAmountByUserREADONLY (amount,userAddress) = {
519532 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
520533 let startHeight = valueOrElse(getInteger(nsbtStakingContract, keyLockParamStartBlock(userAddress)), height)
521534 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
522535 if ((a == a))
523536 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
524537 else throw("Strict value is not equal to itself.")
525538 }
526539
527540
528541
529542 @Callable(i)
530543 func neutrinoStateREST () = {
531544 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
532545 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
533546 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
534547 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
535548 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
536549 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
537550 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
538551 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
539552 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
540553 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
541554 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
542555 let nsbtSupplyMax = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
543556 let surfSupply = asInt(neutrinoMetrics[nMetricIdxSurfSupply])
544557 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)], "__"))
545558 }
546559
547560
548561
549562 @Callable(i)
550563 func nsbtPriceREST () = {
551564 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
552565 let nsbt2usdnPrice = asInt(prices[0])
553566 let nsbt2wavesPrice = asInt(prices[1])
554567 let restData = makeString(["startNsbtPriceREST", toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), "endNsbtPriceREST"], "__")
555568 throw(restData)
556569 }
557570
558571
559572
560573 @Callable(i)
561574 func surfPriceREST () = {
562575 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
563576 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
564577 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
565578 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
566579 let surfPriceInUsdn = fraction(reservesInWaves, currentPrice, neutrinoSupply)
567580 let surfPriceInWaves = fraction(reservesInWaves, MULT8, neutrinoSupply)
568581 let restData = makeString(["startSurfPriceREST", toString(surfPriceInUsdn), toString(surfPriceInWaves), "endSurfPriceREST"], "__")
569582 throw(restData)
570583 }
571584
572585

github/deemru/w8io/169f3d6 
108.07 ms