tx · GrqRiidEKsesx7Awz59GX61TbACe9KkkQEmWewFFhjxc

3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo:  -0.14000000 Waves

2020.11.25 15:17 [2344641] smart account 3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo > SELF 0.00000000 Waves

{ "type": 13, "id": "GrqRiidEKsesx7Awz59GX61TbACe9KkkQEmWewFFhjxc", "fee": 14000000, "feeAssetId": null, "timestamp": 1606308464616, "version": 1, "sender": "3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo", "senderPublicKey": "BRnVwSVctnV8pge5vRpsJdWnkjWEJspFb6QvrmZvu3Ht", "proofs": [ "", "M4BxEJzTWjUjuA35EvpqH2e3Ewt15VLKTMffYUkFdVbaJDspWUdawpQnS9KQAR8krGnALdG4dZh8jpbNYdUymf7", "", "2q2qWHXp3LpmhNanPaUTajsnNy4fyp6xiCu6ubK9GVAizVjwc97kHmaCvxAjaSbXjm3wukLJGZABUaNQDThC1uTj" ], "script": "base64:AAIEAAAAAAAAAA4IAhIAEgASBAoCCAESAAAAAFMBAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQIAAAAAAQAAAAxnZXRCb29sQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkHAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQAAAAAAAAAAAAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5BwAAAAAQcHViS2V5QWRtaW5zTGlzdAkABEwAAAACAgAAACxCTEVvZ3V6UFZLVlRmWHh4VDNXN1JxZjhhVW0yZ2dDOVZlbWQyTVFhd00yRwkABEwAAAACAgAAACxGV1ZmZllyMkFMbUhNZWpabTNXcWVMejZTZHltM2dMRkd0Sm40S1R3eVU1eAkABEwAAAACAgAAACwzV2gyTGFXY2I1Z2c3SzJwUGNXM0VwNkVBdVJCellrQWdyZHB0NDNqVERGYQkABEwAAAACAgAAACw1V1JYRlNqd2NUYk5mS2NKczhacVhtU1NXWXNTVkpVdE12TXFaajVoSDROYwUAAAADbmlsAAAAAAxTRU5EVFhFWFBJUkUAAAAAAAAAAB4AAAAAD0xJU1RTUExJVFNZTUJPTAIAAAABXwAAAAAOTElTVERBVEFTWU1CT0wCAAAAASsAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAABVBBVUxJAAAAAAAAD0JAAAAAAAhQUklDRUxFVAAAAAAAAA9CQAAAAAAOREVGQVVMVFNXQVBGRUUAAAAAAAAATiAAAAAADElkeE5ldEFtb3VudAAAAAAAAAAAAAAAAAAMSWR4RmVlQW1vdW50AAAAAAAAAAABAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAAA5Cb25kQXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAASQXVjdGlvbkNvbnRyYWN0S2V5AgAAABBhdWN0aW9uX2NvbnRyYWN0AAAAABZMaXF1aWRhdGlvbkNvbnRyYWN0S2V5AgAAABRsaXF1aWRhdGlvbl9jb250cmFjdAAAAAAOUlBEQ29udHJhY3RLZXkCAAAADHJwZF9jb250cmFjdAAAAAARQ29udG9sQ29udHJhY3RLZXkCAAAAEGNvbnRyb2xfY29udHJhY3QAAAAAG0JhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbEtleQIAAAAbYmFsYW5jZV93YXZlc19sb2NrX2ludGVydmFsAAAAAB5CYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWxLZXkCAAAAHmJhbGFuY2VfbmV1dHJpbm9fbG9ja19pbnRlcnZhbAAAAAAVTWluV2F2ZXNTd2FwQW1vdW50S2V5AgAAABVtaW5fd2F2ZXNfc3dhcF9hbW91bnQAAAAAGE1pbk5ldXRyaW5vU3dhcEFtb3VudEtleQIAAAAYbWluX25ldXRyaW5vX3N3YXBfYW1vdW50AAAAABtOb2RlT3JhY2xlUHJvdmlkZXJQdWJLZXlLZXkCAAAAFG5vZGVfb3JhY2xlX3Byb3ZpZGVyAAAAABVOZXV0cmlub091dEZlZVBhcnRLZXkCAAAAGG5ldXRyaW5vT3V0X3N3YXBfZmVlUGFydAAAAAASV2F2ZXNPdXRGZWVQYXJ0S2V5AgAAABV3YXZlc091dF9zd2FwX2ZlZVBhcnQAAAAAFUZlZXNNYW5hZ2VyQWRkcmVzc0tleQIAAAAUZmVlc19tYW5hZ2VyX2FkZHJlc3MAAAAADVJQREJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAQAAABhnZXRSUERDb250cmFjdEJhbGFuY2VLZXkAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAA1SUERCYWxhbmNlS2V5AgAAAAFfCQACWAAAAAEFAAAAB2Fzc2V0SWQAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAANUHJpY2VJbmRleEtleQIAAAALcHJpY2VfaW5kZXgAAAAADElzQmxvY2tlZEtleQIAAAAKaXNfYmxvY2tlZAEAAAASZ2V0UHJpY2VIaXN0b3J5S2V5AAAAAQAAAAVibG9jawkAASwAAAACCQABLAAAAAIFAAAACFByaWNlS2V5AgAAAAFfCQABpAAAAAEFAAAABWJsb2NrAQAAABhnZXRIZWlnaHRQcmljZUJ5SW5kZXhLZXkAAAABAAAABWluZGV4CQABLAAAAAIJAAEsAAAAAgUAAAANUHJpY2VJbmRleEtleQIAAAABXwkAAaQAAAABBQAAAAVpbmRleAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8BAAAAIGdldFJQRFNuYXBzaG90Q29udHJhY3RCYWxhbmNlS2V5AAAAAgAAAAVjb3VudAAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADVJQREJhbGFuY2VLZXkCAAAAAV8JAAJYAAAAAQUAAAAHYXNzZXRJZAIAAAABXwkAAaQAAAABBQAAAAVjb3VudAEAAAAdZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWVLZXkAAAABAAAABGhhc2gJAAEsAAAAAgkAASwAAAACAgAAABtjYW5jZWxfbGVhc2VfdHhfcmVzZXJ2ZV9mZWUCAAAAAV8FAAAABGhhc2gBAAAAGGdldFdhdmVzTG9ja2VkQmFsYW5jZUtleQAAAAEAAAAFb3duZXIJAAEsAAAAAgkAASwAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkCAAAAAV8FAAAABW93bmVyAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABAAAABW93bmVyCQABLAAAAAIJAAEsAAAAAgUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AgAAAAFfBQAAAAVvd25lcgEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQAAAAVvd25lcgkAASwAAAACAgAAABViYWxhbmNlX3VubG9ja19ibG9ja18FAAAABW93bmVyAQAAAA9nZXRSUERQcm9maXRLZXkAAAABAAAABWNvdW50CQABLAAAAAIJAAEsAAAAAgIAAAAKcnBkX3Byb2ZpdAIAAAABXwkAAaQAAAABBQAAAAVjb3VudAEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAhQUklDRUxFVAUAAAAFcHJpY2UFAAAAB1dBVkVMRVQFAAAABVBBVUxJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQFAAAABXByaWNlBQAAAAhQUklDRUxFVAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAABmFtb3VudAUAAAAFcHJpY2UBAAAAFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QAAAABAAAACWpzb25BcnJheQkABLUAAAACBQAAAAlqc29uQXJyYXkCAAAAASwAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkAAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQUAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEkF1Y3Rpb25Db250cmFjdEtleQAAAAALcnBkQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADlJQRENvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEUNvbnRvbENvbnRyYWN0S2V5AAAAAApwcmljZUluZGV4CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAA1QcmljZUluZGV4S2V5AAAAAAlpc0Jsb2NrZWQJAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAxJc0Jsb2NrZWRLZXkAAAAAGG5vZGVPcmFjbGVQcm92aWRlclB1YktleQkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABtOb2RlT3JhY2xlUHJvdmlkZXJQdWJLZXlLZXkAAAAAGGJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAbQmFsYW5jZVdhdmVzTG9ja0ludGVydmFsS2V5AAAAABtiYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWwJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAHkJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbEtleQAAAAASbWluV2F2ZXNTd2FwQW1vdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVNaW5XYXZlc1N3YXBBbW91bnRLZXkAAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQUAAAAYTWluTmV1dHJpbm9Td2FwQW1vdW50S2V5AAAAAAtib25kQXNzZXRJZAkAAlkAAAABAgAAACw2blNwVnlOSDd5TTY5ZWc0NDZ3clFSOTRpcGJiY21aTVUxRU5Qd2FuQzk3ZwAAAAAVZGVwcmVjYXRlZEJvbmRBc3NldElkCQACWQAAAAECAAAALDk3NWFrWkJmbk1qNTEzVTdNWmFIS3pRcm1zRXg1YUUzd2RXS1RySEJoYmpGAAAAABBuZXV0cmlub0NvbnRyYWN0BQAAAAR0aGlzAAAAAAxjdXJyZW50UHJpY2UJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QFAAAACFByaWNlS2V5AAAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAAAB3Jlc2VydmUJAABlAAAAAggJAAPvAAAAAQUAAAAQbmV1dHJpbm9Db250cmFjdAAAAAdyZWd1bGFyBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UAAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIJAABlAAAAAgkAAGQAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA/AAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQJAAPwAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAAAAAAdzdXJwbHVzCQAAZQAAAAIJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAHcmVzZXJ2ZQUAAAAMY3VycmVudFByaWNlBQAAAA5uZXV0cmlub1N1cHBseQAAAAAHZGVmaWNpdAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAdyZXNlcnZlBQAAAAxjdXJyZW50UHJpY2UBAAAAG2NoZWNrSXNWYWxpZE1pblNwb25zb3JlZEZlZQAAAAEAAAACdHgEAAAADk1JTlRSQU5TRkVSRkVFAAAAAAAAAYagBAAAABZTcG9uc29yZWRGZWVVcHBlckJvdW5kAAAAAAAAAAPoBAAAAA9yZWFsTmV1dHJpbm9GZWUJAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgUAAAAOTUlOVFJBTlNGRVJGRUUFAAAADGN1cnJlbnRQcmljZQQAAAAObWluTmV1dHJpbm9GZWUJAABoAAAAAgUAAAAPcmVhbE5ldXRyaW5vRmVlAAAAAAAAAAACBAAAAA5tYXhOZXV0cmlub0ZlZQkAAGsAAAADBQAAAA9yZWFsTmV1dHJpbm9GZWUFAAAAFlNwb25zb3JlZEZlZVVwcGVyQm91bmQAAAAAAAAAAGQEAAAACGlucHV0RmVlCQEAAAAFdmFsdWUAAAABCAUAAAACdHgAAAAUbWluU3BvbnNvcmVkQXNzZXRGZWUDAwkAAGcAAAACBQAAAAhpbnB1dEZlZQUAAAAObWluTmV1dHJpbm9GZWUJAABnAAAAAgUAAAAObWF4TmV1dHJpbm9GZWUFAAAACGlucHV0RmVlBwkAAAAAAAACCAUAAAACdHgAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkBwEAAAAVZ2V0UlBEQ29udHJhY3RCYWxhbmNlAAAAAQAAAAdhc3NldElkCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAALcnBkQ29udHJhY3QJAQAAABhnZXRSUERDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAAdhc3NldElkAQAAAA9nZXRQcmljZUhpc3RvcnkAAAABAAAABWJsb2NrCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0CQEAAAASZ2V0UHJpY2VIaXN0b3J5S2V5AAAAAQUAAAAFYmxvY2sBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEAAAAFaW5kZXgJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QJAQAAABhnZXRIZWlnaHRQcmljZUJ5SW5kZXhLZXkAAAABBQAAAAVpbmRleAEAAAAaZ2V0Q2FuY2VsTGVhc2VUeFJlc2VydmVGZWUAAAABAAAABGhhc2gJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAB1nZXRDYW5jZWxMZWFzZVR4UmVzZXJ2ZUZlZUtleQAAAAEFAAAABGhhc2gBAAAAFWdldFdhdmVzTG9ja2VkQmFsYW5jZQAAAAEAAAAFb3duZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABhnZXRXYXZlc0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAVvd25lcgEAAAAYZ2V0TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAQAAAAVvd25lcgkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAABW93bmVyAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABAAAABW93bmVyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAYZ2V0QmFsYW5jZVVubG9ja0Jsb2NrS2V5AAAAAQUAAAAFb3duZXIBAAAADGdldFJQRFByb2ZpdAAAAAEAAAAFY291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA9nZXRSUERQcm9maXRLZXkAAAABBQAAAAVjb3VudAEAAAAJYXBwbHlGZWVzAAAAAgAAAAthbW91bnRHcm9zcwAAAAdmZWVQYXJ0BAAAAAlmZWVBbW91bnQJAABrAAAAAwUAAAALYW1vdW50R3Jvc3MFAAAAB2ZlZVBhcnQFAAAABVBBVUxJCQAETAAAAAIJAABlAAAAAgUAAAALYW1vdW50R3Jvc3MFAAAACWZlZUFtb3VudAkABEwAAAACBQAAAAlmZWVBbW91bnQFAAAAA25pbAAAAAQAAAABaQEAAAATc3dhcFdhdmVzVG9OZXV0cmlubwAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAZgAAAAIFAAAAEm1pbldhdmVzU3dhcEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAQFRoZSBzcGVjaWZpZWQgV2F2ZXMgYW1vdW50IGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgbWluaW11bSBvZiAJAAGkAAAAAQUAAAASbWluV2F2ZXNTd2FwQW1vdW50AgAAAAogd2F2ZWxldHMuAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABAgAAAClPbmx5IFdhdmVzIHRva2VuIGlzIGFsbG93ZWQgZm9yIHN3YXBwaW5nLgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFpjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQAAZgAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAABmF3YWl0IAkAAaQAAAABCQAAZQAAAAIJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BQAAAAZoZWlnaHQCAAAAByBibG9ja3MDAwkBAAAAAiE9AAAAAgkBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAGCQEAAAACIT0AAAACCQEAAAAVZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAACJwbGVhc2Ugd2l0aGRyYXcgbG9ja2VkIGZ1bmRzIGZpcnN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRCYWxhbmNlVW5sb2NrQmxvY2tLZXkAAAABBQAAAAdhY2NvdW50CQAAZAAAAAIFAAAABmhlaWdodAUAAAAYYmFsYW5jZVdhdmVzTG9ja0ludGVydmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABVXYXZlc0xvY2tlZEJhbGFuY2VLZXkJAABkAAAAAgUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCAUAAAADcG10AAAABmFtb3VudAUAAAADbmlsAAAAAWkBAAAAE3N3YXBOZXV0cmlub1RvV2F2ZXMAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAGYAAAACBQAAABVtaW5OZXV0cmlub1N3YXBBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAENUaGUgc3BlY2lmaWVkIE5ldXRyaW5vIGFtb3VudCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIG1pbmltdW0gb2YgCQABpAAAAAEFAAAAFW1pbk5ldXRyaW5vU3dhcEFtb3VudAIAAAAQIE5ldXRyaW5vIGNlbnRzLgMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAGFUaGUgY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04uIFBsZWFzZSB3YWl0IGZvciByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMuAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAA9uZXV0cmlub0Fzc2V0SWQJAAACAAAAAQIAAAA6T25seSBhcHByb3ByaWF0ZSBOZXV0cmlubyB0b2tlbnMgYXJlIGFsbG93ZWQgZm9yIHN3YXBwaW5nLgMJAABmAAAAAgkBAAAAFWdldFVubG9ja0JhbGFuY2VCbG9jawAAAAEFAAAAB2FjY291bnQFAAAABmhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAGYXdhaXQgCQABpAAAAAEJAABlAAAAAgkBAAAAFWdldFVubG9ja0JhbGFuY2VCbG9jawAAAAEFAAAAB2FjY291bnQFAAAABmhlaWdodAIAAAAHIGJsb2NrcwMDCQEAAAACIT0AAAACCQEAAAAYZ2V0TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAYJAQAAAAIhPQAAAAIJAQAAABVnZXRXYXZlc0xvY2tlZEJhbGFuY2UAAAABBQAAAAdhY2NvdW50AAAAAAAAAAAACQAAAgAAAAECAAAAInBsZWFzZSB3aXRoZHJhdyBsb2NrZWQgZnVuZHMgZmlyc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXROZXV0cmlub0xvY2tlZEJhbGFuY2VLZXkAAAABBQAAAAdhY2NvdW50CAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGGdldEJhbGFuY2VVbmxvY2tCbG9ja0tleQAAAAEFAAAAB2FjY291bnQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAABtiYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAAGQAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UIBQAAAANwbXQAAAAGYW1vdW50BQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAACAAAAB2FjY291bnQAAAAFaW5kZXgEAAAAC3VzZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAdhY2NvdW50BAAAABFmZWVNYW5hZ2VyQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABVGZWVzTWFuYWdlckFkZHJlc3NLZXkJAAEsAAAAAgUAAAAVRmVlc01hbmFnZXJBZGRyZXNzS2V5AgAAABEgaXMgbm90IHNwZWNpZmllZAkAASwAAAACBQAAABVGZWVzTWFuYWdlckFkZHJlc3NLZXkCAAAAFyBpbnZhbGlkIGFkZHJlc3MgZm9ybWF0BAAAAAx1bmxvY2tIZWlnaHQJAQAAABVnZXRVbmxvY2tCYWxhbmNlQmxvY2sAAAABBQAAAAdhY2NvdW50BAAAABZ1c2VyV2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAVZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAQUAAAAHYWNjb3VudAQAAAAZdXNlck5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAGGdldE5ldXRyaW5vTG9ja2VkQmFsYW5jZQAAAAEFAAAAB2FjY291bnQEAAAAC2luZGV4SGVpZ2h0CQEAAAAVZ2V0SGVpZ2h0UHJpY2VCeUluZGV4AAAAAQUAAAAFaW5kZXgEAAAAD3ByZXZJbmRleEhlaWdodAkBAAAAFWdldEhlaWdodFByaWNlQnlJbmRleAAAAAEJAABlAAAAAgUAAAAFaW5kZXgAAAAAAAAAAAEEAAAADHByaWNlQnlJbmRleAkBAAAAD2dldFByaWNlSGlzdG9yeQAAAAEFAAAAC2luZGV4SGVpZ2h0BAAAABNuZXV0cmlub0Ftb3VudEdyb3NzCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAFnVzZXJXYXZlc0xvY2tlZEJhbGFuY2UFAAAADHByaWNlQnlJbmRleAQAAAAQd2F2ZXNBbW91bnRHcm9zcwkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAABl1c2VyTmV1dHJpbm9Mb2NrZWRCYWxhbmNlBQAAAAxwcmljZUJ5SW5kZXgEAAAAEm5ldXRyaW5vT3V0RmVlUGFydAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABVOZXV0cmlub091dEZlZVBhcnRLZXkFAAAADkRFRkFVTFRTV0FQRkVFBAAAAA93YXZlc091dEZlZVBhcnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAASV2F2ZXNPdXRGZWVQYXJ0S2V5BQAAAA5ERUZBVUxUU1dBUEZFRQQAAAAUbmV1dHJpbm9QYXlvdXRzQXJyYXkJAQAAAAlhcHBseUZlZXMAAAACBQAAABNuZXV0cmlub0Ftb3VudEdyb3NzBQAAABJuZXV0cmlub091dEZlZVBhcnQEAAAAEXdhdmVzUGF5b3V0c0FycmF5CQEAAAAJYXBwbHlGZWVzAAAAAgUAAAAQd2F2ZXNBbW91bnRHcm9zcwUAAAAPd2F2ZXNPdXRGZWVQYXJ0AwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAABmAAAAAgUAAAAMdW5sb2NrSGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAEXBsZWFzZSB3YWl0IGZvcjogCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAAlIGJsb2NrIGhlaWdodCB0byB3aXRoZHJhdyBXQVZFUyBmdW5kcwMDAwkAAGYAAAACBQAAAAVpbmRleAUAAAAKcHJpY2VJbmRleAYJAABmAAAAAgUAAAAMdW5sb2NrSGVpZ2h0BQAAAAtpbmRleEhlaWdodAYDCQEAAAACIT0AAAACBQAAAA9wcmV2SW5kZXhIZWlnaHQAAAAAAAAAAAAJAABnAAAAAgUAAAAPcHJldkluZGV4SGVpZ2h0BQAAAAx1bmxvY2tIZWlnaHQHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI2ludmFsaWQgcHJpY2UgaGlzdG9yeSBpbmRleDogaW5kZXg9CQABpAAAAAEFAAAABWluZGV4AgAAAAwgcHJpY2VJbmRleD0JAAGkAAAAAQUAAAAKcHJpY2VJbmRleAIAAAANIGluZGV4SGVpZ2h0PQkAAaQAAAABBQAAAAtpbmRleEhlaWdodAIAAAAOIHVubG9ja0hlaWdodD0JAAGkAAAAAQUAAAAMdW5sb2NrSGVpZ2h0AgAAABEgcHJldkluZGV4SGVpZ2h0PQkAAaQAAAABBQAAAA9wcmV2SW5kZXhIZWlnaHQDAwkAAGcAAAACAAAAAAAAAAAABQAAABNuZXV0cmlub0Ftb3VudEdyb3NzCQAAZwAAAAIAAAAAAAAAAAAFAAAAEHdhdmVzQW1vdW50R3Jvc3MHCQAAAgAAAAECAAAAE2JhbGFuY2UgZXF1YWxzIHplcm8DAwMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEm5ldXRyaW5vT3V0RmVlUGFydAYJAABnAAAAAgUAAAASbmV1dHJpbm9PdXRGZWVQYXJ0BQAAAAVQQVVMSQYJAABmAAAAAgAAAAAAAAAAAAUAAAAPd2F2ZXNPdXRGZWVQYXJ0BgkAAGcAAAACBQAAAA93YXZlc091dEZlZVBhcnQFAAAABVBBVUxJCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJmludmFsaWQgZmVlcyBkYXRhOiBuZXV0cmlub091dEZlZVBhcnQ9CQABpAAAAAEFAAAAEm5ldXRyaW5vT3V0RmVlUGFydAIAAAARIHdhdmVzT3V0RmVlUGFydD0JAAGkAAAAAQUAAAAPd2F2ZXNPdXRGZWVQYXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYZ2V0V2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAQUAAAAHYWNjb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAG2dldE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UFAAAAFnVzZXJXYXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAAGUAAAACBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UFAAAAGXVzZXJOZXV0cmlub0xvY2tlZEJhbGFuY2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MJAAGRAAAAAgUAAAARd2F2ZXNQYXlvdXRzQXJyYXkFAAAADElkeE5ldEFtb3VudAUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABFmZWVNYW5hZ2VyQWRkcmVzcwkAAZEAAAACBQAAABF3YXZlc1BheW91dHNBcnJheQUAAAAMSWR4RmVlQW1vdW50BQAAAAR1bml0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzCQABkQAAAAIFAAAAFG5ldXRyaW5vUGF5b3V0c0FycmF5BQAAAAxJZHhOZXRBbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABFmZWVNYW5hZ2VyQWRkcmVzcwkAAZEAAAACBQAAABRuZXV0cmlub1BheW91dHNBcnJheQUAAAAMSWR4RmVlQW1vdW50BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAABF0cmFuc2ZlclRvQXVjdGlvbgAAAAAEAAAAD2F1Y3Rpb25OQkFtb3VudAkAAGUAAAACBQAAAA5uZXV0cmlub1N1cHBseQkAA/AAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA9hdWN0aW9uQ29udHJhY3QFAAAAC2JvbmRBc3NldElkBAAAABZzdXJwbHVzV2l0aExpcXVpZGF0aW9uCQAAZQAAAAIFAAAAB3N1cnBsdXMJAAPwAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAABmAAAAAgUAAAAPYXVjdGlvbk5CQW1vdW50CQAAaAAAAAIAAAAAAAAAAAEFAAAABVBBVUxJCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAA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", "chainId": 87, "height": 2344641, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EJtVRoCpNbnXwpoTqVmdpvCMex7FWfecd5BogfAbUrKk Next: E8WtRULqzDnb95xYZmy31gkPnd7x9tnJDnb1Fjj9tdG1 Diff:
OldNewDifferences
3333
3434 let PRICELET = 1000000
3535
36+let DEFAULTSWAPFEE = 20000
37+
38+let IdxNetAmount = 0
39+
40+let IdxFeeAmount = 1
41+
3642 let NeutrinoAssetIdKey = "neutrino_asset_id"
3743
3844 let BondAssetIdKey = "bond_asset_id"
5460 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
5561
5662 let NodeOracleProviderPubKeyKey = "node_oracle_provider"
63+
64+let NeutrinoOutFeePartKey = "neutrinoOut_swap_feePart"
65+
66+let WavesOutFeePartKey = "wavesOut_swap_feePart"
67+
68+let FeesManagerAddressKey = "fees_manager_address"
5769
5870 let RPDBalanceKey = "rpd_balance"
5971
193205 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
194206
195207
208+func applyFees (amountGross,feePart) = {
209+ let feeAmount = fraction(amountGross, feePart, PAULI)
210+[(amountGross - feeAmount), feeAmount]
211+ }
212+
213+
196214 @Callable(i)
197215 func swapWavesToNeutrino () = {
198216 let pmt = value(i.payments[0])
237255
238256 @Callable(i)
239257 func withdraw (account,index) = {
258+ let userAddress = addressFromStringValue(account)
259+ let feeManagerAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, FeesManagerAddressKey), (FeesManagerAddressKey + " is not specified"))), (FeesManagerAddressKey + " invalid address format"))
240260 let unlockHeight = getUnlockBalanceBlock(account)
241261 let userWavesLockedBalance = getWavesLockedBalance(account)
242262 let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
243263 let indexHeight = getHeightPriceByIndex(index)
244264 let prevIndexHeight = getHeightPriceByIndex((index - 1))
245265 let priceByIndex = getPriceHistory(indexHeight)
246- let spread = 0
247- let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, (priceByIndex - spread))
248- let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, (priceByIndex + spread))
266+ let neutrinoAmountGross = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
267+ let wavesAmountGross = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
268+ let neutrinoOutFeePart = valueOrElse(getInteger(this, NeutrinoOutFeePartKey), DEFAULTSWAPFEE)
269+ let wavesOutFeePart = valueOrElse(getInteger(this, WavesOutFeePartKey), DEFAULTSWAPFEE)
270+ let neutrinoPayoutsArray = applyFees(neutrinoAmountGross, neutrinoOutFeePart)
271+ let wavesPayoutsArray = applyFees(wavesAmountGross, wavesOutFeePart)
249272 if (isBlocked)
250273 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
251274 else if ((unlockHeight > height))
258281 then (prevIndexHeight >= unlockHeight)
259282 else false)
260283 then throw(((((((((("invalid price history index: index=" + toString(index)) + " priceIndex=") + toString(priceIndex)) + " indexHeight=") + toString(indexHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIndexHeight=") + toString(prevIndexHeight)))
261- else if (if ((0 >= neutrinoAmount))
262- then (0 >= wavesAmount)
284+ else if (if ((0 >= neutrinoAmountGross))
285+ then (0 >= wavesAmountGross)
263286 else false)
264287 then throw("balance equals zero")
265- else [IntegerEntry(getWavesLockedBalanceKey(account), 0), IntegerEntry(getNeutrinoLockedBalanceKey(account), 0), IntegerEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), IntegerEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance)), ScriptTransfer(addressFromStringValue(account), wavesAmount, unit), ScriptTransfer(addressFromStringValue(account), neutrinoAmount, neutrinoAssetId)]
288+ else if (if (if (if ((0 > neutrinoOutFeePart))
289+ then true
290+ else (neutrinoOutFeePart >= PAULI))
291+ then true
292+ else (0 > wavesOutFeePart))
293+ then true
294+ else (wavesOutFeePart >= PAULI))
295+ then throw(((("invalid fees data: neutrinoOutFeePart=" + toString(neutrinoOutFeePart)) + " wavesOutFeePart=") + toString(wavesOutFeePart)))
296+ else [IntegerEntry(getWavesLockedBalanceKey(account), 0), IntegerEntry(getNeutrinoLockedBalanceKey(account), 0), IntegerEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), IntegerEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance)), ScriptTransfer(userAddress, wavesPayoutsArray[IdxNetAmount], unit), ScriptTransfer(feeManagerAddress, wavesPayoutsArray[IdxFeeAmount], unit), ScriptTransfer(userAddress, neutrinoPayoutsArray[IdxNetAmount], neutrinoAssetId), ScriptTransfer(feeManagerAddress, neutrinoPayoutsArray[IdxFeeAmount], neutrinoAssetId)]
266297 }
267298
268299
278309 else if ((surplusWithLiquidation >= (1 * PAULI)))
279310 then [ScriptTransfer(addressFromStringValue(liquidationContract), surplusWithLiquidation, neutrinoAssetId)]
280311 else throw(((((((("bond were generated or do not need it. Deficit:" + toString(auctionNBAmount)) + "|") + toString(0)) + ". Surplus:") + toString(surplusWithLiquidation)) + "|") + toString(surplus)))
281- }
282-
283-
284-
285-@Callable(i)
286-func transfer (account) = {
287- let pmt = value(i.payments[0])
288-[ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)]
289- }
290-
291-
292-
293-@Callable(i)
294-func migrationUSDNB2NSBTSwap () = {
295- let pmt = value(i.payments[0])
296- let account = i.caller
297- if ((deprecatedBondAssetId != pmt.assetId))
298- then throw("error: attempt to swap not USDNB tokens")
299- else [ScriptTransfer(account, (pmt.amount * PAULI), bondAssetId)]
300312 }
301313
302314
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
55
66
77 func getStringByKey (key) = valueOrElse(getString(this, key), "")
88
99
1010 func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false)
1111
1212
1313 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0)
1414
1515
1616 func getStringByAddressAndKey (address,key) = valueOrElse(getString(addressFromStringValue(address), key), "")
1717
1818
1919 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(addressFromStringValue(address), key), false)
2020
2121
2222 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
2323
2424 let SENDTXEXPIRE = 30
2525
2626 let LISTSPLITSYMBOL = "_"
2727
2828 let LISTDATASYMBOL = "+"
2929
3030 let WAVELET = 100000000
3131
3232 let PAULI = 1000000
3333
3434 let PRICELET = 1000000
3535
36+let DEFAULTSWAPFEE = 20000
37+
38+let IdxNetAmount = 0
39+
40+let IdxFeeAmount = 1
41+
3642 let NeutrinoAssetIdKey = "neutrino_asset_id"
3743
3844 let BondAssetIdKey = "bond_asset_id"
3945
4046 let AuctionContractKey = "auction_contract"
4147
4248 let LiquidationContractKey = "liquidation_contract"
4349
4450 let RPDContractKey = "rpd_contract"
4551
4652 let ContolContractKey = "control_contract"
4753
4854 let BalanceWavesLockIntervalKey = "balance_waves_lock_interval"
4955
5056 let BalanceNeutrinoLockIntervalKey = "balance_neutrino_lock_interval"
5157
5258 let MinWavesSwapAmountKey = "min_waves_swap_amount"
5359
5460 let MinNeutrinoSwapAmountKey = "min_neutrino_swap_amount"
5561
5662 let NodeOracleProviderPubKeyKey = "node_oracle_provider"
63+
64+let NeutrinoOutFeePartKey = "neutrinoOut_swap_feePart"
65+
66+let WavesOutFeePartKey = "wavesOut_swap_feePart"
67+
68+let FeesManagerAddressKey = "fees_manager_address"
5769
5870 let RPDBalanceKey = "rpd_balance"
5971
6072 func getRPDContractBalanceKey (assetId) = ((RPDBalanceKey + "_") + toBase58String(assetId))
6173
6274
6375 let PriceKey = "price"
6476
6577 let PriceIndexKey = "price_index"
6678
6779 let IsBlockedKey = "is_blocked"
6880
6981 func getPriceHistoryKey (block) = ((PriceKey + "_") + toString(block))
7082
7183
7284 func getHeightPriceByIndexKey (index) = ((PriceIndexKey + "_") + toString(index))
7385
7486
7587 let BalanceLockedkKey = "balance_lock_"
7688
7789 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
7890
7991 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
8092
8193 func getRPDSnapshotContractBalanceKey (count,assetId) = ((((RPDBalanceKey + "_") + toBase58String(assetId)) + "_") + toString(count))
8294
8395
8496 func getCancelLeaseTxReserveFeeKey (hash) = (("cancel_lease_tx_reserve_fee" + "_") + hash)
8597
8698
8799 func getWavesLockedBalanceKey (owner) = ((WavesLockedBalanceKey + "_") + owner)
88100
89101
90102 func getNeutrinoLockedBalanceKey (owner) = ((NeutrinoLockedBalanceKey + "_") + owner)
91103
92104
93105 func getBalanceUnlockBlockKey (owner) = ("balance_unlock_block_" + owner)
94106
95107
96108 func getRPDProfitKey (count) = (("rpd_profit" + "_") + toString(count))
97109
98110
99111 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
100112
101113
102114 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
103115
104116
105117 func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
106118
107119
108120 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
109121
110122
111123 let liquidationContract = getStringByKey(LiquidationContractKey)
112124
113125 let neutrinoAssetIdString = getStringByKey(NeutrinoAssetIdKey)
114126
115127 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
116128
117129 let auctionContract = getStringByKey(AuctionContractKey)
118130
119131 let rpdContract = getStringByKey(RPDContractKey)
120132
121133 let controlContract = getStringByKey(ContolContractKey)
122134
123135 let priceIndex = getNumberByAddressAndKey(controlContract, PriceIndexKey)
124136
125137 let isBlocked = getBoolByAddressAndKey(controlContract, IsBlockedKey)
126138
127139 let nodeOracleProviderPubKey = fromBase58String(getStringByKey(NodeOracleProviderPubKeyKey))
128140
129141 let balanceWavesLockInterval = getNumberByKey(BalanceWavesLockIntervalKey)
130142
131143 let balanceNeutrinoLockInterval = getNumberByKey(BalanceNeutrinoLockIntervalKey)
132144
133145 let minWavesSwapAmount = getNumberByKey(MinWavesSwapAmountKey)
134146
135147 let minNeutrinoSwapAmount = getNumberByKey(MinNeutrinoSwapAmountKey)
136148
137149 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
138150
139151 let deprecatedBondAssetId = fromBase58String("975akZBfnMj513U7MZaHKzQrmsEx5aE3wdWKTrHBhbjF")
140152
141153 let neutrinoContract = this
142154
143155 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
144156
145157 let neutrinoLockedBalance = getNumberByKey(NeutrinoLockedBalanceKey)
146158
147159 let wavesLockedBalance = getNumberByKey(WavesLockedBalanceKey)
148160
149161 let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
150162
151163 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
152164
153165 let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
154166
155167 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
156168
157169 func checkIsValidMinSponsoredFee (tx) = {
158170 let MINTRANSFERFEE = 100000
159171 let SponsoredFeeUpperBound = 1000
160172 let realNeutrinoFee = convertWavesToNeutrino(MINTRANSFERFEE, currentPrice)
161173 let minNeutrinoFee = (realNeutrinoFee * 2)
162174 let maxNeutrinoFee = fraction(realNeutrinoFee, SponsoredFeeUpperBound, 100)
163175 let inputFee = value(tx.minSponsoredAssetFee)
164176 if (if ((inputFee >= minNeutrinoFee))
165177 then (maxNeutrinoFee >= inputFee)
166178 else false)
167179 then (tx.assetId == neutrinoAssetId)
168180 else false
169181 }
170182
171183
172184 func getRPDContractBalance (assetId) = getNumberByAddressAndKey(rpdContract, getRPDContractBalanceKey(assetId))
173185
174186
175187 func getPriceHistory (block) = getNumberByAddressAndKey(controlContract, getPriceHistoryKey(block))
176188
177189
178190 func getHeightPriceByIndex (index) = getNumberByAddressAndKey(controlContract, getHeightPriceByIndexKey(index))
179191
180192
181193 func getCancelLeaseTxReserveFee (hash) = getNumberByKey(getCancelLeaseTxReserveFeeKey(hash))
182194
183195
184196 func getWavesLockedBalance (owner) = getNumberByKey(getWavesLockedBalanceKey(owner))
185197
186198
187199 func getNeutrinoLockedBalance (owner) = getNumberByKey(getNeutrinoLockedBalanceKey(owner))
188200
189201
190202 func getUnlockBalanceBlock (owner) = getNumberByKey(getBalanceUnlockBlockKey(owner))
191203
192204
193205 func getRPDProfit (count) = getNumberByKey(getRPDProfitKey(count))
194206
195207
208+func applyFees (amountGross,feePart) = {
209+ let feeAmount = fraction(amountGross, feePart, PAULI)
210+[(amountGross - feeAmount), feeAmount]
211+ }
212+
213+
196214 @Callable(i)
197215 func swapWavesToNeutrino () = {
198216 let pmt = value(i.payments[0])
199217 let account = toString(i.caller)
200218 if ((minWavesSwapAmount > pmt.amount))
201219 then throw((("The specified Waves amount is less than the required minimum of " + toString(minWavesSwapAmount)) + " wavelets."))
202220 else if (isDefined(pmt.assetId))
203221 then throw("Only Waves token is allowed for swapping.")
204222 else if (isBlocked)
205223 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
206224 else if ((getUnlockBalanceBlock(account) > height))
207225 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
208226 else if (if ((getNeutrinoLockedBalance(account) != 0))
209227 then true
210228 else (getWavesLockedBalance(account) != 0))
211229 then throw("please withdraw locked funds first")
212230 else [IntegerEntry(getWavesLockedBalanceKey(account), pmt.amount), IntegerEntry(getBalanceUnlockBlockKey(account), (height + balanceWavesLockInterval)), IntegerEntry(WavesLockedBalanceKey, (wavesLockedBalance + pmt.amount))]
213231 }
214232
215233
216234
217235 @Callable(i)
218236 func swapNeutrinoToWaves () = {
219237 let pmt = value(i.payments[0])
220238 let account = toString(i.caller)
221239 if ((minNeutrinoSwapAmount > pmt.amount))
222240 then throw((("The specified Neutrino amount is less than the required minimum of " + toString(minNeutrinoSwapAmount)) + " Neutrino cents."))
223241 else if (isBlocked)
224242 then throw("The contract is blocked by EMERGENCY SHUTDOWN. Please wait for reactivation by emergency oracles.")
225243 else if ((pmt.assetId != neutrinoAssetId))
226244 then throw("Only appropriate Neutrino tokens are allowed for swapping.")
227245 else if ((getUnlockBalanceBlock(account) > height))
228246 then throw((("await " + toString((getUnlockBalanceBlock(account) - height))) + " blocks"))
229247 else if (if ((getNeutrinoLockedBalance(account) != 0))
230248 then true
231249 else (getWavesLockedBalance(account) != 0))
232250 then throw("please withdraw locked funds first")
233251 else [IntegerEntry(getNeutrinoLockedBalanceKey(account), pmt.amount), IntegerEntry(getBalanceUnlockBlockKey(account), (height + balanceNeutrinoLockInterval)), IntegerEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance + pmt.amount))]
234252 }
235253
236254
237255
238256 @Callable(i)
239257 func withdraw (account,index) = {
258+ let userAddress = addressFromStringValue(account)
259+ let feeManagerAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, FeesManagerAddressKey), (FeesManagerAddressKey + " is not specified"))), (FeesManagerAddressKey + " invalid address format"))
240260 let unlockHeight = getUnlockBalanceBlock(account)
241261 let userWavesLockedBalance = getWavesLockedBalance(account)
242262 let userNeutrinoLockedBalance = getNeutrinoLockedBalance(account)
243263 let indexHeight = getHeightPriceByIndex(index)
244264 let prevIndexHeight = getHeightPriceByIndex((index - 1))
245265 let priceByIndex = getPriceHistory(indexHeight)
246- let spread = 0
247- let neutrinoAmount = convertWavesToNeutrino(userWavesLockedBalance, (priceByIndex - spread))
248- let wavesAmount = convertNeutrinoToWaves(userNeutrinoLockedBalance, (priceByIndex + spread))
266+ let neutrinoAmountGross = convertWavesToNeutrino(userWavesLockedBalance, priceByIndex)
267+ let wavesAmountGross = convertNeutrinoToWaves(userNeutrinoLockedBalance, priceByIndex)
268+ let neutrinoOutFeePart = valueOrElse(getInteger(this, NeutrinoOutFeePartKey), DEFAULTSWAPFEE)
269+ let wavesOutFeePart = valueOrElse(getInteger(this, WavesOutFeePartKey), DEFAULTSWAPFEE)
270+ let neutrinoPayoutsArray = applyFees(neutrinoAmountGross, neutrinoOutFeePart)
271+ let wavesPayoutsArray = applyFees(wavesAmountGross, wavesOutFeePart)
249272 if (isBlocked)
250273 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
251274 else if ((unlockHeight > height))
252275 then throw((("please wait for: " + toString(unlockHeight)) + " block height to withdraw WAVES funds"))
253276 else if (if (if ((index > priceIndex))
254277 then true
255278 else (unlockHeight > indexHeight))
256279 then true
257280 else if ((prevIndexHeight != 0))
258281 then (prevIndexHeight >= unlockHeight)
259282 else false)
260283 then throw(((((((((("invalid price history index: index=" + toString(index)) + " priceIndex=") + toString(priceIndex)) + " indexHeight=") + toString(indexHeight)) + " unlockHeight=") + toString(unlockHeight)) + " prevIndexHeight=") + toString(prevIndexHeight)))
261- else if (if ((0 >= neutrinoAmount))
262- then (0 >= wavesAmount)
284+ else if (if ((0 >= neutrinoAmountGross))
285+ then (0 >= wavesAmountGross)
263286 else false)
264287 then throw("balance equals zero")
265- else [IntegerEntry(getWavesLockedBalanceKey(account), 0), IntegerEntry(getNeutrinoLockedBalanceKey(account), 0), IntegerEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), IntegerEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance)), ScriptTransfer(addressFromStringValue(account), wavesAmount, unit), ScriptTransfer(addressFromStringValue(account), neutrinoAmount, neutrinoAssetId)]
288+ else if (if (if (if ((0 > neutrinoOutFeePart))
289+ then true
290+ else (neutrinoOutFeePart >= PAULI))
291+ then true
292+ else (0 > wavesOutFeePart))
293+ then true
294+ else (wavesOutFeePart >= PAULI))
295+ then throw(((("invalid fees data: neutrinoOutFeePart=" + toString(neutrinoOutFeePart)) + " wavesOutFeePart=") + toString(wavesOutFeePart)))
296+ else [IntegerEntry(getWavesLockedBalanceKey(account), 0), IntegerEntry(getNeutrinoLockedBalanceKey(account), 0), IntegerEntry(WavesLockedBalanceKey, (wavesLockedBalance - userWavesLockedBalance)), IntegerEntry(NeutrinoLockedBalanceKey, (neutrinoLockedBalance - userNeutrinoLockedBalance)), ScriptTransfer(userAddress, wavesPayoutsArray[IdxNetAmount], unit), ScriptTransfer(feeManagerAddress, wavesPayoutsArray[IdxFeeAmount], unit), ScriptTransfer(userAddress, neutrinoPayoutsArray[IdxNetAmount], neutrinoAssetId), ScriptTransfer(feeManagerAddress, neutrinoPayoutsArray[IdxFeeAmount], neutrinoAssetId)]
266297 }
267298
268299
269300
270301 @Callable(i)
271302 func transferToAuction () = {
272303 let auctionNBAmount = (neutrinoSupply - assetBalance(addressFromStringValue(auctionContract), bondAssetId))
273304 let surplusWithLiquidation = (surplus - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
274305 if (isBlocked)
275306 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
276307 else if ((auctionNBAmount > (1 * PAULI)))
277308 then [ScriptTransfer(addressFromStringValue(auctionContract), auctionNBAmount, bondAssetId)]
278309 else if ((surplusWithLiquidation >= (1 * PAULI)))
279310 then [ScriptTransfer(addressFromStringValue(liquidationContract), surplusWithLiquidation, neutrinoAssetId)]
280311 else throw(((((((("bond were generated or do not need it. Deficit:" + toString(auctionNBAmount)) + "|") + toString(0)) + ". Surplus:") + toString(surplusWithLiquidation)) + "|") + toString(surplus)))
281- }
282-
283-
284-
285-@Callable(i)
286-func transfer (account) = {
287- let pmt = value(i.payments[0])
288-[ScriptTransfer(addressFromStringValue(account), pmt.amount, pmt.assetId)]
289- }
290-
291-
292-
293-@Callable(i)
294-func migrationUSDNB2NSBTSwap () = {
295- let pmt = value(i.payments[0])
296- let account = i.caller
297- if ((deprecatedBondAssetId != pmt.assetId))
298- then throw("error: attempt to swap not USDNB tokens")
299- else [ScriptTransfer(account, (pmt.amount * PAULI), bondAssetId)]
300312 }
301313
302314
303315 @Verifier(tx)
304316 func verify () = {
305317 let id = toBase58String(tx.id)
306318 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
307319 then 1
308320 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
309321 then 1
310322 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
311323 then 1
312324 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
313325 then 2
314326 else 0))
315327 match tx {
316328 case leasingTx: LeaseCancelTransaction|LeaseTransaction =>
317329 sigVerify(leasingTx.bodyBytes, leasingTx.proofs[0], nodeOracleProviderPubKey)
318330 case sponsorTx: SponsorFeeTransaction =>
319331 if (checkIsValidMinSponsoredFee(sponsorTx))
320332 then (count >= 3)
321333 else false
322334 case _ =>
323335 (count >= 3)
324336 }
325337 }
326338

github/deemru/w8io/6500d08 
76.71 ms