tx · 4DbUEDaNgvxtkNfXZqBFVeNJLcqd4yxVRtDXZ3MdvPmW

3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi:  -0.04000000 Waves

2022.09.26 14:49 [2246059] smart account 3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi > SELF 0.00000000 Waves

{ "type": 13, "id": "4DbUEDaNgvxtkNfXZqBFVeNJLcqd4yxVRtDXZ3MdvPmW", "fee": 4000000, "feeAssetId": null, "timestamp": 1664192969463, "version": 1, "sender": "3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi", "senderPublicKey": "4qGVXRFATZNzo2RZZ5UYHXojGyJgSRBwtgJcCU8rJe5A", "proofs": [ "3PDUPfvFfPLmV9axS52e7eMQrLByMayvvrm5MrNSJT3dnnckeMAxAeLxSTvSByYn5NpBn3WSe3ojxVYJSzDbDETQ", "uryA6o3D3ZS6P82jbAbU6xgGNDv2Am3fsT4WGZCBDLut1LN5CCiFUjb6ptppyxzbfEpHcwgpebc4jpzESwgXb8H", "1Wbgww7boMT6jwUVWis5792qCPE9VRgiiCFLrw7AKiLtXhj6tizLGfjunFaZXW1BR9beHhvRQ3VXv4pXtKb2FB1" ], "script": "base64:AAIFAAAAAAAAADkIAhIFCgMICAESAwoBARIHCgUBAQEBARIDCgEBEgQKAgECEgMKAQESABIFCgMBAQESBwoFAQEBAQEAAABeAAAAAAtyZXZpc2lvbk51bQIAAAAoZGRjNmU1MWVhNjMxNDJmMjY3OGNjMTQ1YWUyODUxZGE3NmVhMjQ1OQAAAAAJTVVMVFNDQUxFAAAAAAAAAAAIAAAAAAdTQ0FMRTE2AAAAAAAAAAAQAAAAAANTRVACAAAAAl9fAAAAAAVIQUxGOAAAAAAAAvrwgAAAAAAIRVVMRVJYMTYJAAE2AAAAAQAAYJKhE9jVdAAAAAAEVFdPWAkAATYAAAABAAAAAAAAAAACAAAAAAVNVUxUNgAAAAAAAA9CQAAAAAAGTVVMVFg2CQABNgAAAAEAAAAAAAAPQkAAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAAZNVUxUWDgJAAE2AAAAAQAAAAAABfXhAAAAAAAHTVVMVFgxMAkAATYAAAABAAAAAAJUC+QAAAAAAAdNVUxUWDE2CQABNgAAAAEAACOG8m/BAAAAAAAAB1dBVkVTSUQJAAJZAAAAAQIAAAAFV0FWRVMAAAAAC2tSZXN1bHRJZHhBAAAAAAAAAAAAAAAAAA9rUmVzdWx0SWR4UGF1bEIAAAAAAAAAAAEAAAAAGWtSZXN1bHRJZHhXUmVzZXJ2ZXNJblVzZG4AAAAAAAAAAAIAAAAAEGtSZXN1bHRJZHhNdWx0QlIAAAAAAAAAAAMAAAAAE2tSZXN1bHRJZHhNdWx0UG93ZXIAAAAAAAAAAAQAAAAAG2tSZXN1bHRJZHhNdWx0RXhwSW5Qb3dlclN0cgAAAAAAAAAABQAAAAASa1Jlc3VsdElkeE11bHRLU3RyAAAAAAAAAAAGAAAAAA9uTWV0cmljSWR4UHJpY2UAAAAAAAAAAAAAAAAAG25NZXRyaWNJZHhVc2RuTG9ja2VkQmFsYW5jZQAAAAAAAAAAAQAAAAAcbk1ldHJpY0lkeFdhdmVzTG9ja2VkQmFsYW5jZQAAAAAAAAAAAgAAAAARbk1ldHJpY0lkeFJlc2VydmUAAAAAAAAAAAMAAAAAF25NZXRyaWNJZHhSZXNlcnZlSW5Vc2RuAAAAAAAAAAAEAAAAABRuTWV0cmljSWR4VXNkblN1cHBseQAAAAAAAAAABQAAAAARbk1ldHJpY0lkeFN1cnBsdXMAAAAAAAAAAAYAAAAAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAAAAAAAAAAABwAAAAAMbk1ldHJpY0lkeEJSAAAAAAAAAAAIAAAAABRuTWV0cmljSWR4TnNidFN1cHBseQAAAAAAAAAACQAAAAAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkAAAAAAAAAAAoAAAAAFG5NZXRyaWNJZHhTdXJmU3VwcGx5AAAAAAAAAAALAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAAAgAAAB0lcyVzX19jb25maWdfX25ldXRyaW5vQWRkcmVzcwEAAAATa2V5U3dhcEFtb3VudEFQYXJhbQAAAAACAAAAGCVzJXNfX2NvbmZpZ19fc3dhcEFQYXJhbQEAAAATa2V5U3dhcEFtb3VudEJQYXJhbQAAAAACAAAAGCVzJXNfX2NvbmZpZ19fc3dhcEJQYXJhbQEAAAAXa2V5VXNkblN3YXBBbW91bnRBUGFyYW0AAAAAAgAAABwlcyVzX19jb25maWdfX3VzZG5Td2FwQVBhcmFtAQAAABdrZXlVc2RuU3dhcEFtb3VudEJQYXJhbQAAAAACAAAAHCVzJXNfX2NvbmZpZ19fdXNkblN3YXBCUGFyYW0BAAAAEmtleU5ldXRyaW5vQXNzZXRJZAAAAAACAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAQAAAA5rZXlOc2J0QXNzZXRJZAAAAAACAAAADWJvbmRfYXNzZXRfaWQBAAAADmtleVN1cmZBc3NldElkAAAAAAIAAAANc3VyZl9hc3NldF9pZAEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAADWJhbGFuY2VfbG9ja18BAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAJAAEsAAAAAgkBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAAV3YXZlcwEAAAAYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAACG5ldXRyaW5vAQAAABFzd2Fwc1RpbWVmcmFtZUtFWQAAAAACAAAAD3N3YXBzX3RpbWVmcmFtZQEAAAAaa2V5VXNlckxhc3RRdWlja1N3YXBIZWln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c3RbQW55XQEAAAAFYXNJbnQAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABnZhbEludAUAAAAHJG1hdGNoMAUAAAAGdmFsSW50CQAAAgAAAAECAAAAFWZhaWwgdG8gY2FzdCBpbnRvIEludAEAAAAIYXNTdHJpbmcAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnZhbFN0cgUAAAAHJG1hdGNoMAUAAAAGdmFsU3RyCQAAAgAAAAECAAAAGGZhaWwgdG8gY2FzdCBpbnRvIFN0cmluZwAAAAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAAAAAAAAAAAQAAAAAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAAAAAAAAAACAAAAABRJZHhDb250cm9sQ2ZnUnBkRGFwcAAAAAAAAAAAAwAAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAAAAAAAAEAAAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAAAAAAAAFAAAAABVJZHhDb250cm9sQ2ZnUmVzdERhcHAAAAAAAAAAAAYAAAAAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAAAAAAAAAAHAAAAABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAAAAAAAAAAIAAAAABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAAAAAAAAAAJAQAAABFrZXlDb250cm9sQWRkcmVzcwAAAAACAAAAHCVzJXNfX2NvbmZpZ19fY29udHJvbEFkZHJlc3MBAAAADWtleUNvbnRyb2xDZmcAAAAAAgAAABElc19fY29udHJvbENvbmZpZwEAAAAUcmVhZENvbnRyb2xDZmdPckZhaWwAAAABAAAAB2NvbnRyb2wJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAB2NvbnRyb2wJAQAAAA1rZXlDb250cm9sQ2ZnAAAAAAUAAAADU0VQAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACAAAACmNvbnRyb2xDZmcAAAADaWR4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApjb250cm9sQ2ZnBQAAAANpZHgJAAEsAAAAAgIAAAAtQ29udHJvbCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQABpAAAAAEFAAAAA2lkeAAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABFrZXlDb250cm9sQWRkcmVzcwAAAAACAAAAIzNONE5TN2Q0Sm85YTZGMTRMaUZVS0tZVmRVa2tmMmVQNFp4AAAAAApjb250cm9sQ2ZnCQEAAAAUcmVhZENvbnRyb2xDZmdPckZhaWwAAAABBQAAAA9jb250cm9sQ29udHJhY3QAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAABN1c2RuU3Rha2luZ0NvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAUSWR4Q29udHJvbENmZ1JwZERhcHAAAAAAEm5ldXRyaW5vQXNzZXRJZFN0cgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlOZXV0cmlub0Fzc2V0SWQAAAAAAAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQUAAAASbmV1dHJpbm9Bc3NldElkU3RyAAAAAAtuc2J0QXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAOa2V5TnNidEFzc2V0SWQAAAAAAAAAAAtzdXJmQXNzZXRJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5rZXlTdXJmQXNzZXRJZAAAAAABAAAAGWNhbGNVc2RuT3V0T2ZNYXJrZXRTdXBwbHkAAAAABAAAABZvdXRPZk1hcmtldEFkZHJlc3NMaXN0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAIAAAAlJXMlc19fY29udHJvbF9fb3V0T2ZNYXJrZXRBZGRyZXNzTGlzdAIAAAAAAwkAAAAAAAACBQAAABZvdXRPZk1hcmtldEFkZHJlc3NMaXN0AgAAAAAAAAAAAAAAAAAKAQAAAAtiYWxhbmNlc1NVTQAAAAIAAAARb3V0T2ZNYXJrZXRTdXBwbHkAAAALbmV4dEFkZHJlc3MJAABkAAAAAgkAAGQAAAACBQAAABFvdXRPZk1hcmtldFN1cHBseQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABN1c2RuU3Rha2luZ0NvbnRyYWN0CQEAAAARcnBkVXNlckJhbGFuY2VLZXkAAAACBQAAAAtuZXh0QWRkcmVzcwUAAAASbmV1dHJpbm9Bc3NldElkU3RyAAAAAAAAAAAACQAD8AAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC25leHRBZGRyZXNzBQAAAA9uZXV0cmlub0Fzc2V0SWQKAAAAAAIkbAkABLUAAAACBQAAABZvdXRPZk1hcmtldEFkZHJlc3NMaXN0BQAAAANTRVAKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwAAAAAAAAAAAACgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAALYmFsYW5jZXNTVU0AAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgNAkBAAAABSRmMF8yAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAADGN1cnJlbnRQcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAAIa2V5UHJpY2UAAAAAAAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAGGtleU5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAEndhdmVzTG9ja2VkQmFsYW5jZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAVa2V5V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAHcmVzZXJ2ZQkAAGUAAAACCAkAA+8AAAABBQAAABBuZXV0cmlub0NvbnRyYWN0AAAAB3JlZ3VsYXIFAAAAEndhdmVzTG9ja2VkQmFsYW5jZQAAAAAOcmVzZXJ2ZXNJblVzZG4JAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlAAAAABluZXV0cmlub091dE9mTWFya2V0U3VwcGx5CQEAAAAZY2FsY1VzZG5PdXRPZk1hcmtldFN1cHBseQAAAAAAAAAAE25ldXRyaW5vVG90YWxTdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD8AAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA/AAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIFAAAAE25ldXRyaW5vVG90YWxTdXBwbHkFAAAAGW5ldXRyaW5vT3V0T2ZNYXJrZXRTdXBwbHkAAAAAAkJSAwkAAAAAAAACBQAAAA5uZXV0cmlub1N1cHBseQAAAAAAAAAAAAAAAAAAAAAAAAkAAGsAAAADBQAAAA5yZXNlcnZlc0luVXNkbgUAAAAFTVVMVDYFAAAADm5ldXRyaW5vU3VwcGx5AAAACQAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAMAAAAPbmV1dHJpbm9BZGRyZXNzAAAAD25zYnRMb2NrQWRkcmVzcwAAABBzd2FwQW1vdW50QVBhcmFtAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAABQAAAA9uZXV0cmlub0FkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAUAAAAQc3dhcEFtb3VudEFQYXJhbQUAAAADbmlsAAAAAWkBAAAAFWNhbGNTd2FwTGltaXRSRUFET05MWQAAAAEAAAALZ05zYnRBbW91bnQEAAAAEGxpbWl0V2F2ZXNJblVzZG4DCQAAZwAAAAIAAAAAAAAAAAAFAAAAC2dOc2J0QW1vdW50AAAAAAAAAAAABAAAAAhhUGFyYW1YOAkAATYAAAABCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAE2tleVN3YXBBbW91bnRBUGFyYW0AAAAABAAAAAliUGFyYW1YMTYJAAE2AAAAAQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMJAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAQAAAAJcG93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dmVzUGF5UmF3BAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQAAAANuaWwFAAAAA25pbAQAAAAFcHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAA9uTWV0cmljSWR4UHJpY2UEAAAABHdSYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABFuTWV0cmljSWR4UmVzZXJ2ZQQAAAAEdVJhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5BAAAAARzUmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkEAAAABG1SYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQQAAAAKa0NhbGNBcnJheQkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAASY2FsY3VsYXRlS1JFQURPTkxZCQAETAAAAAIFAAAABHdSYXcJAARMAAAAAgUAAAAEdVJhdwkABEwAAAACBQAAAAVwcmljZQkABEwAAAACBQAAAARtUmF3CQAETAAAAAIFAAAABHNSYXcFAAAAA25pbAUAAAADbmlsBAAAAAVtdWx0SwkAAacAAAABCQEAAAAIYXNTdHJpbmcAAAABCQABkQAAAAIFAAAACmtDYWxjQXJyYXkFAAAAEmtSZXN1bHRJZHhNdWx0S1N0cgQAAAAHdXNkblBheQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAt3YXZlc1BheVJhdwUAAAAFcHJpY2UEAAAAEGJpZ01heE5zYnRTdXBwbHkJAAE2AAAAAQUAAAAEbVJhdwQAAAANYmlnTnNidFN1cHBseQkAATYAAAABCQAAZQAAAAIFAAAABG1S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AAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACCQAAZAAAAAIFAAAAB3Jlc2VydmUFAAAACXVzZUFtb3VudAUAAAAFcHJpY2UFAAAABU1VTFQ2BQAAAAZzdXBwbHkJAARMAAAAAgkAAGUAAAACBQAAAAZhbW91bnQFAAAACXVzZUFtb3VudAkABEwAAAACBQAAAAVwcmljZQUAAAADbmlsCQAAAgAAAAECAAAAEVVuc3VwcG9ydGVkIGFzc2V0AAAAAWkBAAAAIGNhbGNDb250cmFjdE5zYnRQcmljZVNZU1JFQURPTkxZAAAAAQAAAA9uc2J0U3VwcGx5REVMVEEEAAAAD25ldXRyaW5vTWV0cmljcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAVwcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAEd1JhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhSZXNlcnZlBAAAAAR1UmF3CQAAZQAAAAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARzUmF3CQAAZAAAAAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARtUmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkEAAAACmtDYWxjQXJyYXkJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAEmNhbGN1bGF0ZUtSRUFET05MWQkABEwAAAACBQAAAAR3UmF3CQAETAAAAAIFAAAA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", "chainId": 84, "height": 2246059, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8gRBLgNTYE7YYmhCTWUzA5L7vwsuhy7kyusVgM8Ndtep Next: GLFdBgEuuobAc1SFq2fmyito8FHnjXzrufEvqcmM77tQ Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = "ddc6e51ea63142f2678cc145ae2851da76ea2459"
55
66 let MULTSCALE = 8
77
88 let SCALE16 = 16
99
1010 let SEP = "__"
1111
1212 let HALF8 = 50000000
1313
1414 let EULERX16 = toBigInt(27182818284590452)
1515
1616 let TWOX = toBigInt(2)
1717
1818 let MULT6 = 1000000
1919
2020 let MULTX6 = toBigInt(1000000)
2121
2222 let MULT8 = 100000000
2323
2424 let MULTX8 = toBigInt(100000000)
2525
2626 let MULTX10 = toBigInt(10000000000)
2727
2828 let MULTX16 = toBigInt(10000000000000000)
2929
3030 let WAVESID = fromBase58String("WAVES")
3131
3232 let kResultIdxA = 0
3333
3434 let kResultIdxPaulB = 1
3535
3636 let kResultIdxWReservesInUsdn = 2
3737
3838 let kResultIdxMultBR = 3
3939
4040 let kResultIdxMultPower = 4
4141
4242 let kResultIdxMultExpInPowerStr = 5
4343
4444 let kResultIdxMultKStr = 6
4545
4646 let nMetricIdxPrice = 0
4747
4848 let nMetricIdxUsdnLockedBalance = 1
4949
5050 let nMetricIdxWavesLockedBalance = 2
5151
5252 let nMetricIdxReserve = 3
5353
5454 let nMetricIdxReserveInUsdn = 4
5555
5656 let nMetricIdxUsdnSupply = 5
5757
5858 let nMetricIdxSurplus = 6
5959
6060 let nMetricIdxSurplusPercent = 7
6161
6262 let nMetricIdxBR = 8
6363
6464 let nMetricIdxNsbtSupply = 9
6565
6666 let nMetricIdxMaxNsbtSupply = 10
6767
6868 let nMetricIdxSurfSupply = 11
6969
7070 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
7171
7272
7373 func keySwapAmountAParam () = "%s%s__config__swapAParam"
7474
7575
7676 func keySwapAmountBParam () = "%s%s__config__swapBParam"
7777
7878
7979 func keyUsdnSwapAmountAParam () = "%s%s__config__usdnSwapAParam"
8080
8181
8282 func keyUsdnSwapAmountBParam () = "%s%s__config__usdnSwapBParam"
8383
8484
8585 func keyNeutrinoAssetId () = "neutrino_asset_id"
8686
8787
8888 func keyNsbtAssetId () = "bond_asset_id"
8989
9090
9191 func keySurfAssetId () = "surf_asset_id"
9292
9393
9494 func keyBalanceLocked () = "balance_lock_"
9595
9696
9797 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
9898
9999
100100 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
101101
102102
103103 func swapsTimeframeKEY () = "swaps_timeframe"
104104
105105
106106 func keyUserLastQuickSwapHeight (userAddress) = makeString(["%s%s", "userLastQuickSwapHeight", userAddress], SEP)
107107
108108
109109 func keyQuickSwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "quickSwapUserSpentInPeriod", userAddress], SEP)
110110
111111
112112 func keyPrice () = "price"
113113
114114
115115 let RpdBalanceKey = "rpd_balance"
116116
117117 func rpdUserBalanceKey (owner,assetId) = makeString([RpdBalanceKey, assetId, owner], "_")
118118
119119
120120 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
121121
122122
123123 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
124124
125125
126126 func getNumberByKey (address,key) = valueOrElse(getInteger(address, key), 0)
127127
128128
129129 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
130130
131131
132132 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
133133
134134
135135 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
136136
137137
138138 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
139139
140140
141141 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
142142
143143
144144 func asAnyList (val) = match val {
145145 case valAnyLyst: List[Any] =>
146146 valAnyLyst
147147 case _ =>
148148 throw("fail to cast into List[Any]")
149149 }
150150
151151
152152 func asInt (val) = match val {
153153 case valInt: Int =>
154154 valInt
155155 case _ =>
156156 throw("fail to cast into Int")
157157 }
158158
159159
160160 func asString (val) = match val {
161161 case valStr: String =>
162162 valStr
163163 case _ =>
164164 throw("fail to cast into String")
165165 }
166166
167167
168168 let IdxControlCfgNeutrinoDapp = 1
169169
170170 let IdxControlCfgAuctionDapp = 2
171171
172172 let IdxControlCfgRpdDapp = 3
173173
174174 let IdxControlCfgMathDapp = 4
175175
176176 let IdxControlCfgLiquidationDapp = 5
177177
178178 let IdxControlCfgRestDapp = 6
179179
180180 let IdxControlCfgNodeRegistryDapp = 7
181181
182182 let IdxControlCfgNsbtStakingDapp = 8
183183
184184 let IdxControlCfgMediatorDapp = 9
185185
186186 func keyControlAddress () = "%s%s__config__controlAddress"
187187
188188
189189 func keyControlCfg () = "%s__controlConfig"
190190
191191
192192 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
193193
194194
195195 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
196196
197197
198198 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
199199
200200 let controlCfg = readControlCfgOrFail(controlContract)
201201
202202 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
203203
204204 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
205205
206206 let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
207207
208208 let usdnStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgRpdDapp)
209209
210210 let neutrinoAssetIdStr = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
211211
212212 let neutrinoAssetId = fromBase58String(neutrinoAssetIdStr)
213213
214214 let nsbtAssetId = fromBase58String(getStringValue(neutrinoContract, keyNsbtAssetId()))
215215
216216 let surfAssetId = fromBase58String(getStringValue(auctionContract, keySurfAssetId()))
217217
218218 func calcUsdnOutOfMarketSupply () = {
219219 let outOfMarketAddressList = valueOrElse(getString(controlContract, "%s%s__control__outOfMarketAddressList"), "")
220220 if ((outOfMarketAddressList == ""))
221221 then 0
222222 else {
223223 func balancesSUM (outOfMarketSupply,nextAddress) = ((outOfMarketSupply + valueOrElse(getInteger(usdnStakingContract, rpdUserBalanceKey(nextAddress, neutrinoAssetIdStr)), 0)) + assetBalance(addressFromStringValue(nextAddress), neutrinoAssetId))
224224
225225 let $l = split(outOfMarketAddressList, SEP)
226226 let $s = size($l)
227227 let $acc0 = 0
228228 func $f0_1 ($a,$i) = if (($i >= $s))
229229 then $a
230230 else balancesSUM($a, $l[$i])
231231
232232 func $f0_2 ($a,$i) = if (($i >= $s))
233233 then $a
234234 else throw("List size exceeds 4")
235235
236236 $f0_2($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4)
237237 }
238238 }
239239
240240
241241 let currentPrice = getIntegerValue(controlContract, keyPrice())
242242
243243 let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoContract, keyNeutrinoLockedBalance()), 0)
244244
245245 let wavesLockedBalance = valueOrElse(getInteger(neutrinoContract, keyWavesLockedBalance()), 0)
246246
247247 let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
248248
249249 let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
250250
251251 let neutrinoOutOfMarketSupply = calcUsdnOutOfMarketSupply()
252252
253253 let neutrinoTotalSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
254254
255255 let neutrinoSupply = (neutrinoTotalSupply - neutrinoOutOfMarketSupply)
256256
257257 let BR = if ((neutrinoSupply == 0))
258258 then 0
259259 else fraction(reservesInUsdn, MULT6, neutrinoSupply)
260260
261261 @Callable(i)
262262 func constructor (neutrinoAddress,nsbtLockAddress,swapAmountAParam) = if ((i.caller != this))
263263 then throw("not authorized")
264264 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), IntegerEntry(keySwapAmountAParam(), swapAmountAParam)]
265265
266266
267267
268268 @Callable(i)
269269 func calcSwapLimitREADONLY (gNsbtAmount) = {
270270 let limitWavesInUsdn = if ((0 >= gNsbtAmount))
271271 then 0
272272 else {
273273 let aParamX8 = toBigInt(getIntOrFail(this, keySwapAmountAParam()))
274274 let bParamX16 = toBigInt(getIntOrFail(this, keySwapAmountBParam()))
275275 let powPartX8 = pow(toBigInt(gNsbtAmount), 6, bParamX16, 16, 8, CEILING)
276276 toInt(fraction(aParamX8, powPartX8, MULTX10))
277277 }
278278 let limitWaves = convertNeutrinoToWaves(limitWavesInUsdn, currentPrice)
279279 let limitUsdn = if ((0 >= gNsbtAmount))
280280 then 0
281281 else {
282282 let aParamX8 = toBigInt(getIntOrFail(this, keyUsdnSwapAmountAParam()))
283283 let bParamX16 = toBigInt(getIntOrFail(this, keyUsdnSwapAmountBParam()))
284284 let brX6 = toBigInt(BR)
285285 let powPartX8 = pow(toBigInt(gNsbtAmount), 6, bParamX16, 16, 8, CEILING)
286286 toInt(fraction(fraction(aParamX8, powPartX8, MULTX10), brX6, MULTX6))
287287 }
288288 $Tuple2(nil, [limitWavesInUsdn, limitWaves, limitUsdn])
289289 }
290290
291291
292292
293293 @Callable(i)
294294 func calculateKREADONLY (wRaw,uRaw,price,mRaw,sRaw) = {
295295 let EXP = toBigInt(2718281)
296296 let EXPSCALE = 6
297297 let a = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_a"), 3)
298298 let paulB = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_b"), ((3 * MULT6) / 10))
299299 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
300300 let multBR = fraction(wReservesInUsdn, MULT8, uRaw)
301301 if ((multBR > 10678564816))
302302 then throw((("BR=" + toString(multBR)) + " > 10678.564816% will overflow exponent"))
303303 else {
304304 let multPower = (a * (multBR - MULT8))
305305 let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
306306 let multK = fraction(toBigInt(paulB), multExpInPower, MULTX6)
307307 $Tuple2(nil, [a, paulB, wReservesInUsdn, multBR, multPower, toString(multExpInPower), toString(multK)])
308308 }
309309 }
310310
311311
312312
313313 @Callable(i)
314314 func curveFunctionREADONLY (wavesPayRaw) = {
315315 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
316316 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
317317 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
318318 let uRaw = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
319319 let sRaw = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
320320 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
321321 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
322322 let multK = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
323323 let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
324324 let bigMaxNsbtSupply = toBigInt(mRaw)
325325 let bigNsbtSupply = toBigInt((mRaw - sRaw))
326326 let step1 = fraction(toBigInt(usdnPay), MULTX16, multK)
327327 let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
328328 let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
329329 let nsbtAmountRaw = ((mRaw - sRaw) - step3)
330330 $Tuple2(nil, [nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, asInt(kCalcArray[kResultIdxA]), asInt(kCalcArray[kResultIdxPaulB]), asInt(kCalcArray[kResultIdxWReservesInUsdn]), price, asInt(kCalcArray[kResultIdxMultBR]), asInt(kCalcArray[kResultIdxMultPower]), kCalcArray[kResultIdxMultExpInPowerStr], kCalcArray[kResultIdxMultKStr], toString(step1), toString(step2), step3])
331331 }
332332
333333
334334
335335 @Callable(i)
336336 func surfFunctionREADONLY (amount,assetId) = if ((0 > amount))
337337 then throw("amount should be positive")
338338 else {
339339 let price = currentPrice
340340 let priceBig = toBigInt(price)
341341 let reserveBig = toBigInt(reserve)
342342 let supply = neutrinoSupply
343343 let supplyBig = toBigInt(supply)
344344 if ((BR >= MULT6))
345345 then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
346346 else {
347347 let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
348348 let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
349349 let useAmount = if ((assetId == neutrinoAssetId))
350350 then if ((amount > maxUsdnPay))
351351 then maxUsdnPay
352352 else amount
353353 else if ((assetId == WAVESID))
354354 then if ((amount > maxWavesPay))
355355 then maxWavesPay
356356 else amount
357357 else 0
358358 let amountBig = toBigInt(useAmount)
359359 if ((assetId == neutrinoAssetId))
360360 then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
361361 else if ((assetId == WAVESID))
362362 then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
363363 else throw("Unsupported asset")
364364 }
365365 }
366366
367367
368368
369369 @Callable(i)
370370 func calcContractNsbtPriceSYSREADONLY (nsbtSupplyDELTA) = {
371371 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
372372 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
373373 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
374374 let uRaw = (asInt(neutrinoMetrics[nMetricIdxUsdnSupply]) - nsbtSupplyDELTA)
375375 let sRaw = (asInt(neutrinoMetrics[nMetricIdxNsbtSupply]) + nsbtSupplyDELTA)
376376 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
377377 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
378378 let multKX16 = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
379379 let multStep1X16 = fraction(toBigInt(mRaw), MULTX16, toBigInt((mRaw - sRaw)))
380380 let multStep2X16 = fraction(multStep1X16, multStep1X16, MULTX16)
381381 let multNsbt2usdnPriceX16 = fraction(multKX16, multStep2X16, MULTX16)
382382 let nsbt2usdnPrice = toInt(fraction(multNsbt2usdnPriceX16, toBigInt(MULT6), MULTX16))
383383 let nsbt2wavesPrice = fraction(nsbt2usdnPrice, MULT6, price)
384384 $Tuple2(nil, [nsbt2usdnPrice, nsbt2wavesPrice])
385385 }
386386
387387
388388
389389 @Callable(i)
390390 func calcNeutinoMetricsREADONLY () = {
391391 let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
392392 let nsbtSupply = (nsbtSupplyMAX - assetBalance(auctionContract, nsbtAssetId))
393393 let surfSupply = value(assetInfo(surfAssetId)).quantity
394394 $Tuple2(nil, [currentPrice, neutrinoLockedBalance, wavesLockedBalance, reserve, reservesInUsdn, neutrinoSupply, neutrinoOutOfMarketSupply, neutrinoTotalSupply, BR, nsbtSupply, nsbtSupplyMAX, surfSupply])
395395 }
396396
397397
398398
399399 @Callable(i)
400400 func getUnstakeComissionAmountREADONLY (amount,startHeight,halfLife) = $Tuple2(nil, fraction(amount, pow(2, 0, fraction(-((height - startHeight)), MULT8, halfLife), 8, 8, HALFUP), MULT8))
401401
402402
403403
404404 @Callable(i)
405405 func mergeStakesREADONLY (amount1,height1,amount2,height2,halfLife) = {
406406 let w = fraction(amount2, pow(2, 0, fraction((height2 - height1), MULT8, halfLife), 8, 8, HALFUP), MULT8)
407407 let v = fraction((amount1 + amount2), MULT8, (amount1 + w))
408408 $Tuple2(nil, (height1 + ((HALF8 - (halfLife * log(v, 8, 2, 0, 8, HALFUP))) / MULT8)))
409409 }
410410
411411
412412 @Verifier(tx)
413413 func verify () = {
414414 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
415415 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
416416 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
417417 then 1
418418 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
419419 then 1
420420 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
421421 then 1
422422 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
423423 then 2
424424 else 0))
425425 (count >= 3)
426426 }
427427

github/deemru/w8io/3ef1775 
91.35 ms