tx · Hk5A3HYYmFMu3ZikfN2pJyY76QixeoTj65AQ5kAqVNK

3P286TmTHARtrJzxUhPoHXardvutC37a9rM:  -0.01400000 Waves

2022.05.08 13:12 [3108041] smart account 3P286TmTHARtrJzxUhPoHXardvutC37a9rM > SELF 0.00000000 Waves

{ "type": 13, "id": "Hk5A3HYYmFMu3ZikfN2pJyY76QixeoTj65AQ5kAqVNK", "fee": 1400000, "feeAssetId": null, "timestamp": 1652003641783, "version": 2, "chainId": 87, "sender": "3P286TmTHARtrJzxUhPoHXardvutC37a9rM", "senderPublicKey": "5tWMJfu8C7x8gTe8rkfaejk8fwLFZZRt1zE4bWDnTsGU", "proofs": [ "", "ph2tqtqM7YLoQiY9y3ws1Z9cEWcV5xQx4qXT8e1LULezz8htoDfoK8G8mfuFPSvGqYMLg46y2E1mej1GbkTKpjY", "2y8GvW55wRaGZ9NLeUxkLaQputp68gjriuTpVH85DEUJ2E95x7nu4gpTukvA6XYKeqmcn9QTdR1huNBdehYxqEsG" ], "script": "base64:AAIFAAAAAAAAADAIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgASBQoDBAEIEgAAAABUAAAAAAd2ZXJzaW9uAgAAAAUxLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa0JhbGFuY2VJbml0QQIAAAAMQV9hc3NldF9pbml0AAAAAA1rQmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAADWtTaGFyZUFzc2V0SWQCAAAADnNoYXJlX2Fzc2V0X2lkAAAAABFrU2hhcmVBc3NldFN1cHBseQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAARrRmVlAgAAAApjb21taXNzaW9uAAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA1rRmlyc3RIYXJ2ZXN0AgAAAA1maXJzdF9oYXJ2ZXN0AAAAABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAALa1NoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAC2tCYXNlUGVyaW9kAgAAAAtiYXNlX3BlcmlvZAAAAAANa1BlcmlvZExlbmd0aAIAAAANcGVyaW9kX2xlbmd0aAAAAAAMa1N0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAADGtVU0ROQWRkcmVzcwIAAAAYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAAAAAxrRVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAAxrTGVhc2luZ1Bvb2wCAAAAD2xlYXNpbmdfYWRkcmVzcwAAAAAOa0xlYXNpbmdBbW91bnQCAAAADmxlYXNpbmdfYW1vdW50AAAAAAprTGVhc2luZ0lkAgAAAApsZWFzaW5nX2lkAAAAAA1rQWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAANa0FkbWluUHViS2V5MgIAAAALYWRtaW5fcHViXzIAAAAADWtBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABJrQWRtaW5JbnZva2VQdWJLZXkCAAAAEGFkbWluX2ludm9rZV9wdWIAAAAAEGtNb25leUJveEFkZHJlc3MCAAAAEW1vbmV5X2JveF9hZGRyZXNzAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVeK/whomjW6QM1hdPISN96mN/D6OM7oHjgBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZvcmFjbGUFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAEJAAEsAAAAAgUAAAADa2V5AgAAAAhpcyBlbXB0eQAAAAAMYWRtaW5QdWJLZXkxCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTEAAAAADGFkbWluUHViS2V5MgkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkyAAAAAAxhZG1pblB1YktleTMJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MwAAAAARYWRtaW5JbnZva2VQdWJLZXkJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAASa0FkbWluSW52b2tlUHViS2V5AAAAAA9tb25leUJveEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABBrTW9uZXlCb3hBZGRyZXNzAAAAAA12b3RpbmdBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFX+D/7rE/JYs2NlJlbruypSwjc8IykrCK7AAAAAARVU0ROAQAAACC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAAAAAEU1dPUAEAAAAgy5Y+heb1k1ZPj3mDERR4TyZ+jN5UknzW4a3AXGioruwAAAAABEVVUk4BAAAAILlnk0YDbifFhRsRc92utktjhLGLpJMHqwnDzITAsy51AAAAAA1zdGFraW5nQXNzZXRzCQAETAAAAAICAAAABVdBVkVTCQAETAAAAAIJAAJYAAAAAQUAAAAEVVNETgkABEwAAAACCQACWAAAAAEFAAAABEVVUk4FAAAAA25pbAAAAAASc3Rha2luZ1VTRE5BZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAAMa1VTRE5BZGRyZXNzAAAAABJzdGFraW5nRVVSTkFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAAxrRVVSTkFkZHJlc3MAAAAACmJhc2VQZXJpb2QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA12b3RpbmdBZGRyZXNzBQAAAAtrQmFzZVBlcmlvZAIAAAARRW1wdHkga0Jhc2VQZXJpb2QAAAAAC3N0YXJ0SGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAAMa1N0YXJ0SGVpZ2h0AgAAABJFbXB0eSBrU3RhcnRIZWlnaHQAAAAADHBlcmlvZExlbmd0aAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADXZvdGluZ0FkZHJlc3MFAAAADWtQZXJpb2RMZW5ndGgCAAAAE0VtcHR5IGtQZXJpb2RMZW5ndGgAAAAAFWZpcnN0SGFydmVzdEVuZFBlcmlvZAkAAGQAAAACCQAAZAAAAAIFAAAACmJhc2VQZXJpb2QJAABpAAAAAgkAAGUAAAACBQAAAAZoZWlnaHQFAAAAC3N0YXJ0SGVpZ2h0BQAAAAxwZXJpb2RMZW5ndGgAAAAAAAAAAAMAAAAABmFjdGl2ZQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQAAAAALc3RyQXNzZXRJZEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQQAAAAALc3RyQXNzZXRJZEIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQgAAAAAIYXNzZXRJZEEDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQQAAAAAIYXNzZXRJZEIDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRCAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQgAAAAAKYXNzZXROYW1lQQQAAAAHJG1hdGNoMAUAAAAIYXNzZXRJZEEDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAJpZAAAAARuYW1lAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAACmFzc2V0TmFtZUIEAAAAByRtYXRjaDAFAAAACGFzc2V0SWRCAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAACaWQAAAAEbmFtZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDACAAAABVdBVkVTCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAAAAAAhiYWxhbmNlQQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAJa0JhbGFuY2VBAAAAAAhiYWxhbmNlQgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAJa0JhbGFuY2VCAAAAAAxzaGFyZUFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAANa1NoYXJlQXNzZXRJZAAAAAAQc2hhcmVBc3NldFN1cHBseQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAARa1NoYXJlQXNzZXRTdXBwbHkAAAAAA2ZlZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAEa0ZlZQAAAAANZmVlR292ZXJuYW5jZQkAAGsAAAADBQAAAANmZWUAAAAAAAAAACgAAAAAAAAAAGQAAAAACWZlZVNjYWxlNgAAAAAAAA9CQAAAAAALc2NhbGVWYWx1ZTMAAAAAAAAAA+gAAAAAC3NjYWxlVmFsdWU4AAAAAAAF9eEAAAAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgAAAAAAAAAD6AAAAAARc2NhbGVWYWx1ZThEaWdpdHMAAAAAAAAAAAgBAAAADmFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAkAA/AAAAACBQAAAAR0aGlzBQAAAAJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAxzdGFrZWRBbW91bnQAAAABAAAAB2Fzc2V0SWQEAAAAFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAA2FJZAUAAAAHJG1hdGNoMAMJAAAAAAAAAgUAAAADYUlkBQAAAARVU0ROCQAEGgAAAAIFAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcnBkX2JhbGFuY2VfCQACWAAAAAEFAAAAA2FJZAIAAAABXwkABCUAAAABBQAAAAR0aGlzAwkAAAAAAAACBQAAAANhSWQFAAAABEVVUk4JAAQaAAAAAgUAAAASc3Rha2luZ0VVUk5BZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABglcyVzJXNfX3N0YWtpbmdCYWxhbmNlX18JAAJYAAAAAQUAAAADYUlkAgAAAAJfXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADmtMZWFzaW5nQW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAAckbWF0Y2gwBQAAABZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWkFAAAAByRtYXRjaDAFAAAAAWkAAAAAAAAAAAAAAAAADXN0YWtlZEFtb3VudEEJAQAAAAxzdGFrZWRBbW91bnQAAAABBQAAAAhhc3NldElkQQAAAAANc3Rha2VkQW1vdW50QgkBAAAADHN0YWtlZEFtb3VudAAAAAEFAAAACGFzc2V0SWRCAAAAAAphc3NldEluaXRBCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA1rQmFsYW5jZUluaXRBAAAAAAphc3NldEluaXRCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA1rQmFsYW5jZUluaXRCAAAAABFhdmFpbGFibGVCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANc3Rha2VkQW1vdW50QQAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADXN0YWtlZEFtb3VudEIAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEEFAAAADXN0YWtlZEFtb3VudEEAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEIFAAAADXN0YWtlZEFtb3VudEIAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQAAAAhhc3NldFN0cgMJAAAAAAAAAgUAAAAIYXNzZXRTdHICAAAABVdBVkVTCQAFFQAAAAMCAAAABVdBVkVTAgAAAAVXQVZFUwAAAAAAAAAACAQAAAAIc3RyaW5nSWQFAAAACGFzc2V0U3RyBAAAAAJpZAkAAlkAAAABBQAAAAhhc3NldFN0cgQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAAmlkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAhzdHJpbmdJZAIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAAIc3RyaW5nSWQIBQAAAARpbmZvAAAABG5hbWUIBQAAAARpbmZvAAAACGRlY2ltYWxzAQAAAAdzdXNwZW5kAAAAAQAAAAVjYXVzZQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAGa0NhdXNlBQAAAAVjYXVzZQUAAAADbmlsAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACAAAABXN0YWtlAAAAB2Fzc2V0SWQDBQAAAAVzdGFrZQMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAAxsb2NrTmV1dHJpbm8FAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkABRQAAAACAgAAAAxzdGFydFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAA51bmxvY2tOZXV0cmlubwUAAAASc3Rha2luZ1VTRE5BZGRyZXNzCQAFFAAAAAICAAAAC3N0b3BTdGFraW5nBQAAABJzdGFraW5nRVVSTkFkZHJlc3MBAAAAEWNhbGNTdGFraW5nUGFyYW1zAAAAAwAAAAVzdGFrZQAAAAZhbW91bnQAAAAHYXNzZXRJZAMFAAAABXN0YWtlBAAAAAskdDA2MDg5NjE1NQkBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIFAAAABXN0YWtlBQAAAAdhc3NldElkBAAAAARjYWxsCAUAAAALJHQwNjA4OTYxNTUAAAACXzEEAAAAC3N0YWtpbmdBZGRyCAUAAAALJHQwNjA4OTYxNTUAAAACXzIJAAUWAAAABAUAAAAEY2FsbAUAAAALc3Rha2luZ0FkZHIFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BQAAAANuaWwEAAAACyR0MDYyNDE2MzA3CQEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgUAAAAFc3Rha2UFAAAAB2Fzc2V0SWQEAAAABGNhbGwIBQAAAAskdDA2MjQxNjMwNwAAAAJfMQQAAAALc3Rha2luZ0FkZHIIBQAAAAskdDA2MjQxNjMwNwAAAAJfMgkABRYAAAAEBQAAAARjYWxsBQAAAAtzdGFraW5nQWRkcgkABEwAAAACBQAAAAZhbW91bnQJAARMAAAAAgkAAlgAAAABBQAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAEAAAANY2FsY3VsYXRlRmVlcwAAAAQAAAAJcG10QW1vdW50AAAAEm1pbkFtb3VudFRvUmVjZWl2ZQAAAAl0b2tlbkZyb20AAAAHdG9rZW5UbwQAAAAQYW1vdW50V2l0aG91dEZlZQkAAGsAAAADBQAAAAd0b2tlblRvBQAAAAlwbXRBbW91bnQJAABkAAAAAgUAAAAJcG10QW1vdW50BQAAAAl0b2tlbkZyb20EAAAADWFtb3VudFdpdGhGZWUJAABrAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAA1hbW91bnRXaXRoRmVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHUNhbGN1bGF0ZWQgYW1vdW50IHRvIHJlY2VpdmUgCQABpAAAAAEFAAAADWFtb3VudFdpdGhGZWUCAAAAICBpcyBsZXNzIHRoYW4gc3BlY2lmaWVkIG1pbmltdW0gCQABpAAAAAEFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkABRUAAAADBQAAABBhbW91bnRXaXRob3V0RmVlBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAQAAAAdzdXNwZW5kAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAjU3VzcGljaW91cyBzdGF0ZS4gQWN0dWFsIGJhbGFuY2VzOiAJAAGkAAAAAQUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQIAAAABIAUAAAAKYXNzZXROYW1lQQIAAAACLCAJAAGkAAAAAQUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAAAJLiBTdGF0ZTogCQABpAAAAAEFAAAACGJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABBQAAAAhiYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgEAAAAIaXNBY3RpdmUAAAAAAwUAAAAGYWN0aXZlBQAAAAR1bml0CQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQAAAALAAAAAWkBAAAABGluaXQAAAABAAAADGZpcnN0SGFydmVzdAQAAAALJHQwNzQxODc0OTUJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCAUAAAALJHQwNzQxODc0OTUAAAACXzEEAAAAC3BtdEFzc2V0SWRBCAUAAAALJHQwNzQxODc0OTUAAAACXzIEAAAACyR0MDc1MDA3NTc3CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAHYXNzZXRJZAQAAAAKcG10QW1vdW50QggFAAAACyR0MDc1MDA3NTc3AAAAAl8xBAAAAAtwbXRBc3NldElkQggFAAAACyR0MDc1MDA3NTc3AAAAAl8yBAAAAAskdDA3NTgyNzY1OQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAACyR0MDc1ODI3NjU5AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVBCAUAAAALJHQwNzU4Mjc2NTkAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAACyR0MDc1ODI3NjU5AAAAAl8zBAAAAAskdDA3NjY0Nzc0MQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRCBAAAAA5wbXRTdHJBc3NldElkQggFAAAACyR0MDc2NjQ3NzQxAAAAAl8xBAAAAA1wbXRBc3NldE5hbWVCCAUAAAALJHQwNzY2NDc3NDEAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAACyR0MDc2NjQ3NzQxAAAAAl8zAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABFhZG1pbkludm9rZVB1YktleQUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQbAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQkAAAIAAAABAgAAABZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAAAAAACBQAAAAtwbXRBc3NldElkQQUAAAALcG10QXNzZXRJZEIJAAACAAAAAQIAAAAYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAAAAAlzaGFyZU5hbWUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAAXMJAAEvAAAAAgUAAAANcG10QXNzZXROYW1lQQAAAAAAAAAABwIAAAABXwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVCAAAAAAAAAAAHBAAAABBzaGFyZURlc2NyaXB0aW9uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAiU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIAUAAAANcG10QXNzZXROYW1lQQIAAAAFIGFuZCAFAAAADXBtdEFzc2V0TmFtZUICAAAADCBhdCBhZGRyZXNzIAkABCUAAAABBQAAAAR0aGlzBAAAAA1zaGFyZURlY2ltYWxzCQAAaQAAAAIJAABkAAAAAgUAAAAMcG10RGVjaW1hbHNBBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAIEAAAABGFyZzEJAABsAAAABgUAAAAKcG10QW1vdW50QQUAAAAMcG10RGVjaW1hbHNBAAAAAAAAAAAFAAAAAAAAAAABBQAAAAxwbXREZWNpbWFsc0EFAAAABERPV04EAAAABGFyZzIJAABsAAAABgUAAAAKcG10QW1vdW50QgUAAAAMcG10RGVjaW1hbHNCAAAAAAAAAAAFAAAAAAAAAAABBQAAAAxwbXREZWNpbWFsc0IFAAAABERPV04EAAAABGFyZzMJAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAUAAAANc2hhcmVEZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgQAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAAawAAAAMFAAAABGFyZzEFAAAABGFyZzIFAAAABGFyZzMEAAAACnNoYXJlSXNzdWUJAARCAAAABQUAAAAJc2hhcmVOYW1lBQAAABBzaGFyZURlc2NyaXB0aW9uBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADXNoYXJlRGVjaW1hbHMGBAAAAAxzaGFyZUlzc3VlSWQJAAQ4AAAAAQUAAAAKc2hhcmVJc3N1ZQQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADnBtdFN0ckFzc2V0SWRBCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAApwbXRBbW91bnRBCQAETAAAAAIFAAAADnBtdFN0ckFzc2V0SWRBBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAABnN0YWtlMgMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5wbXRTdHJBc3NldElkQgkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAKcG10QW1vdW50QgkABEwAAAACBQAAAA5wbXRTdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAIa1ZlcnNpb24FAAAAB3ZlcnNpb24JAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tBY3RpdmUGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfY3BtbQkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAMFAAAADGZpcnN0SGFydmVzdAkABE4AAAACBQAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAADWtGaXJzdEhhcnZlc3QFAAAADGZpcnN0SGFydmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa0ZpcnN0SGFydmVzdEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAkAAGgAAAACBQAAABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFAAAADHBlcmlvZExlbmd0aAUAAAADbmlsBQAAAAliYXNlRW50cnkJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABFpbml0V2l0aEluaXRSYXRpbwAAAAUAAAAJYW10QXNzZXRBAAAACWFtdEFzc2V0QgAAAAtzdHJBc3NldElkQQAAAAtzdHJBc3NldElkQgAAAAxmaXJzdEhhcnZlc3QEAAAADSR0MDEwMjQ2MTAzMzMJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTAyNDYxMDMzMwAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDEwMjQ2MTAzMzMAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDEwMjQ2MTAzMzMAAAACXzMEAAAADSR0MDEwMzM4MTA0MjUJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTAzMzgxMDQyNQAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEwMzM4MTA0MjUAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEwMzM4MTA0MjUAAAACXzMDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzCQAETAAAAAIFAAAAEWFkbWluSW52b2tlUHViS2V5BQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQEAAAAJaXNEZWZpbmVkAAAAAQkABBsAAAACBQAAAAR0aGlzBQAAAAdrQWN0aXZlCQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBBQAAAAtzdHJBc3NldElkQgkAAAIAAAABAgAAABhBc3NldHMgbXVzdCBiZSBkaWZmZXJlbnQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAASc2hhcmVJbml0aWFsU3VwcGx5AAAAAAAAAAAABAAAAApzaGFyZUlzc3VlCQAEQgAAAAUFAAAACXNoYXJlTmFtZQUAAAAQc2hhcmVEZXNjcmlwdGlvbgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAA1zaGFyZURlY2ltYWxzBgQAAAAMc2hhcmVJc3N1ZUlkCQAEOAAAAAEFAAAACnNoYXJlSXNzdWUEAAAACWJhc2VFbnRyeQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rQmFsYW5jZUluaXRBBQAAAAlhbXRBc3NldEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtCYWxhbmNlSW5pdEIFAAAACWFtdEFzc2V0QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfY3BtbQkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAANuaWwDBQAAAAxmaXJzdEhhcnZlc3QJAAROAAAAAgUAAAAJYmFzZUVudHJ5CQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA1rRmlyc3RIYXJ2ZXN0BQAAAAxmaXJzdEhhcnZlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tGaXJzdEhhcnZlc3RIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQJAABoAAAAAgUAAAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQAAAAxwZXJpb2RMZW5ndGgFAAAAA25pbAUAAAAJYmFzZUVudHJ5AAAAAWkBAAAAGGtlZXBMaW1pdEZv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AAAAAQkAASwAAAACAgAAADRNaW5pbWFsIGFtb3VudCB0byByZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQQAAAALYXNzZXRJZFNlbmQFAAAACGFzc2V0SWRCBAAAAA0kdDAxNDcxNDE0ODM2CQEAAAANY2FsY3VsYXRlRmVlcwAAAAQFAAAACXBtdEFtb3VudAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAxNDcxNDE0ODM2AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMTQ3MTQxNDgzNgAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDE0NzE0MTQ4MzYAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAAtzdHJBc3NldElkQQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJ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", "height": 3108041, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9Tetyjf1ss8hvC6hyUwaAMd82hCZFJMGq3wWTEuGBzNG Next: 9bMsVbJYGEtG7KgiPptU5n2RxBuFjFqAK1X3kJUYo67A Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
6-let keyVersion = "version"
6+let kVersion = "version"
77
8-let keyActive = "active"
8+let kActive = "active"
99
10-let keyAssetIdA = "A_asset_id"
10+let kAssetIdA = "A_asset_id"
1111
12-let keyAssetIdB = "B_asset_id"
12+let kAssetIdB = "B_asset_id"
1313
14-let keyBalanceA = "A_asset_balance"
14+let kBalanceA = "A_asset_balance"
1515
16-let keyBalanceB = "B_asset_balance"
16+let kBalanceB = "B_asset_balance"
1717
18-let keyBalanceInitA = "A_asset_init"
18+let kBalanceInitA = "A_asset_init"
1919
20-let keyBalanceInitB = "B_asset_init"
20+let kBalanceInitB = "B_asset_init"
2121
22-let keyShareAssetId = "share_asset_id"
22+let kShareAssetId = "share_asset_id"
2323
24-let keyShareAssetSupply = "share_asset_supply"
24+let kShareAssetSupply = "share_asset_supply"
2525
26-let keyCommission = "commission"
26+let kFee = "commission"
2727
28-let keyCommissionScaleDelimiter = "commission_scale_delimiter"
28+let kCause = "shutdown_cause"
2929
30-let keyCause = "shutdown_cause"
30+let kFirstHarvest = "first_harvest"
3131
32-let keyFirstHarvest = "first_harvest"
33-
34-let keyFirstHarvestHeight = "first_harvest_height"
32+let kFirstHarvestHeight = "first_harvest_height"
3533
3634 let kShareLimit = "share_limit_on_first_harvest"
3735
4139
4240 let kStartHeight = "start_height"
4341
44-let kFirstHarvestHeight = "first_harvest_height"
42+let kUSDNAddress = "staking_usdnnsbt_address"
4543
46-let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
44+let kEURNAddress = "staking_eurn_address"
4745
48-let keyEURNAddress = "staking_eurn_address"
46+let kLeasingPool = "leasing_address"
4947
50-let keyLeasingPool = "leasing_address"
48+let kLeasingAmount = "leasing_amount"
5149
52-let keyLeasingAmount = "leasing_amount"
50+let kLeasingId = "leasing_id"
5351
54-let keyLeasingId = "leasing_id"
52+let kAdminPubKey1 = "admin_pub_1"
5553
56-let keyAdminPubKey1 = "admin_pub_1"
54+let kAdminPubKey2 = "admin_pub_2"
5755
58-let keyAdminPubKey2 = "admin_pub_2"
56+let kAdminPubKey3 = "admin_pub_3"
5957
60-let keyAdminPubKey3 = "admin_pub_3"
58+let kAdminInvokePubKey = "admin_invoke_pub"
59+
60+let kMoneyBoxAddress = "money_box_address"
6161
6262 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
6363
64-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
64+func getBase58FromOracle (key) = match getString(oracle, key) {
6565 case string: String =>
6666 fromBase58String(string)
6767 case nothing =>
68- throw("Admin public key is empty")
68+ throw((key + "is empty"))
6969 }
7070
7171
72-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
72+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7373
74-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
74+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7575
76-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
76+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7777
78-let adminPubKeyStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
78+let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
7979
80-let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
81-
82-let walletAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
80+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8381
8482 let votingAddress = Address(base58'3PQZWxShKGRgBN1qoJw6B4s9YWS9FneZTPg')
8583
8684 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
8785
88-let NSBT = base58'6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g'
89-
9086 let SWOP = base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT'
9187
9288 let EURN = base58'DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t'
9389
94-let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(NSBT), toBase58String(EURN)]
90+let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
9591
96-let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
92+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9793
98-let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no eurn staking address")))
99-
100-let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
101-
102-let USDNToNSBTExchanger = Address(base58'3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m')
94+let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
10395
10496 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
10597
109101
110102 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
111103
112-let active = getBooleanValue(this, keyActive)
104+let active = getBooleanValue(this, kActive)
113105
114-let strAssetIdA = getStringValue(this, keyAssetIdA)
106+let strAssetIdA = getStringValue(this, kAssetIdA)
115107
116-let strAssetIdB = getStringValue(this, keyAssetIdB)
108+let strAssetIdB = getStringValue(this, kAssetIdB)
117109
118110 let assetIdA = if ((strAssetIdA == "WAVES"))
119111 then unit
141133 throw("Match error")
142134 }
143135
144-let balanceA = getIntegerValue(this, keyBalanceA)
136+let balanceA = getIntegerValue(this, kBalanceA)
145137
146-let balanceB = getIntegerValue(this, keyBalanceB)
138+let balanceB = getIntegerValue(this, kBalanceB)
147139
148-let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
140+let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
149141
150-let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
142+let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
151143
152-let commission = 3000
144+let fee = getIntegerValue(this, kFee)
153145
154-let commissionGovernance = 1200
146+let feeGovernance = fraction(fee, 40, 100)
155147
156-let commissionScaleDelimiter = 1000000
148+let feeScale6 = 1000000
157149
158150 let scaleValue3 = 1000
159151
176168 func stakedAmount (assetId) = {
177169 let stakedAmountCalculated = match assetId {
178170 case aId: ByteVector =>
179- if (if ((aId == USDN))
180- then true
181- else (aId == NSBT))
182- then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
171+ if ((aId == USDN))
172+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183173 else if ((aId == EURN))
184174 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185175 else 0
186176 case _: Unit =>
187- valueOrElse(getInteger(this, keyLeasingAmount), 0)
177+ valueOrElse(getInteger(this, kLeasingAmount), 0)
188178 case _ =>
189179 throw("Match error")
190180 }
201191
202192 let stakedAmountB = stakedAmount(assetIdB)
203193
204-let assetInitA = getIntegerValue(this, keyBalanceInitA)
194+let assetInitA = getIntegerValue(this, kBalanceInitA)
205195
206-let assetInitB = getIntegerValue(this, keyBalanceInitB)
196+let assetInitB = getIntegerValue(this, kBalanceInitB)
207197
208198 let availableBalanceA = (balanceA - stakedAmountA)
209199
239229 }
240230
241231
242-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
232+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
243233
244234
245235 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
246236 then if ((assetId == USDN))
247- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
248- else if ((assetId == NSBT))
249- then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
250- else $Tuple2("startStaking", stakingEURNAddress)
237+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
238+ else $Tuple2("startStaking", stakingEURNAddress)
251239 else if ((assetId == USDN))
252- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
253- else if ((assetId == NSBT))
254- then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
255- else $Tuple2("stopStaking", stakingEURNAddress)
240+ then $Tuple2("unlockNeutrino", stakingUSDNAddress)
241+ else $Tuple2("stopStaking", stakingEURNAddress)
256242
257243
258244 func calcStakingParams (stake,amount,assetId) = if (stake)
259245 then {
260- let $t069236989 = calcStakingFuncAndAddres(stake, assetId)
261- let call = $t069236989._1
262- let stakingAddr = $t069236989._2
246+ let $t060896155 = calcStakingFuncAndAddres(stake, assetId)
247+ let call = $t060896155._1
248+ let stakingAddr = $t060896155._2
263249 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
264250 }
265251 else {
266- let $t070757141 = calcStakingFuncAndAddres(stake, assetId)
267- let call = $t070757141._1
268- let stakingAddr = $t070757141._2
252+ let $t062416307 = calcStakingFuncAndAddres(stake, assetId)
253+ let call = $t062416307._1
254+ let stakingAddr = $t062416307._2
269255 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
270256 }
271257
272258
273259 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo) = {
274260 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
275- let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
276- let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
261+ let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
262+ let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
277263 if ((minAmountToReceive > amountWithFee))
278264 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
279265 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
290276
291277 @Callable(i)
292278 func init (firstHarvest) = {
293- let $t083118388 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
294- let pmtAmountA = $t083118388._1
295- let pmtAssetIdA = $t083118388._2
296- let $t083938470 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
297- let pmtAmountB = $t083938470._1
298- let pmtAssetIdB = $t083938470._2
299- let $t084758552 = getAssetInfo(pmtAssetIdA)
300- let pmtStrAssetIdA = $t084758552._1
301- let pmtAssetNameA = $t084758552._2
302- let pmtDecimalsA = $t084758552._3
303- let $t085578634 = getAssetInfo(pmtAssetIdB)
304- let pmtStrAssetIdB = $t085578634._1
305- let pmtAssetNameB = $t085578634._2
306- let pmtDecimalsB = $t085578634._3
307- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
279+ let $t074187495 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280+ let pmtAmountA = $t074187495._1
281+ let pmtAssetIdA = $t074187495._2
282+ let $t075007577 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
283+ let pmtAmountB = $t075007577._1
284+ let pmtAssetIdB = $t075007577._2
285+ let $t075827659 = getAssetInfo(pmtAssetIdA)
286+ let pmtStrAssetIdA = $t075827659._1
287+ let pmtAssetNameA = $t075827659._2
288+ let pmtDecimalsA = $t075827659._3
289+ let $t076647741 = getAssetInfo(pmtAssetIdB)
290+ let pmtStrAssetIdB = $t076647741._1
291+ let pmtAssetNameB = $t076647741._2
292+ let pmtDecimalsB = $t076647741._3
293+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
308294 then throw("Only admin can call this function")
309- else if (isDefined(getBoolean(this, keyActive)))
295+ else if (isDefined(getBoolean(this, kActive)))
310296 then throw("DApp is already active")
311297 else if ((pmtAssetIdA == pmtAssetIdB))
312298 then throw("Assets must be different")
330316 else 0
331317 if ((stake2 == stake2))
332318 then {
333- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
319+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
334320 if (firstHarvest)
335- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
321+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
336322 else baseEntry
337323 }
338324 else throw("Strict value is not equal to itself.")
345331
346332 @Callable(i)
347333 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
348- let $t01122311310 = getAssetInfoFromString(strAssetIdA)
349- let pmtStrAssetIdA = $t01122311310._1
350- let pmtAssetNameA = $t01122311310._2
351- let pmtDecimalsA = $t01122311310._3
352- let $t01131511402 = getAssetInfoFromString(strAssetIdB)
353- let pmtStrAssetIdB = $t01131511402._1
354- let pmtAssetNameB = $t01131511402._2
355- let pmtDecimalsB = $t01131511402._3
356- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
334+ let $t01024610333 = getAssetInfoFromString(strAssetIdA)
335+ let pmtStrAssetIdA = $t01024610333._1
336+ let pmtAssetNameA = $t01024610333._2
337+ let pmtDecimalsA = $t01024610333._3
338+ let $t01033810425 = getAssetInfoFromString(strAssetIdB)
339+ let pmtStrAssetIdB = $t01033810425._1
340+ let pmtAssetNameB = $t01033810425._2
341+ let pmtDecimalsB = $t01033810425._3
342+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
357343 then throw("Only admin can call this function")
358- else if (isDefined(getBoolean(this, keyActive)))
344+ else if (isDefined(getBoolean(this, kActive)))
359345 then throw("DApp is already active")
360346 else if ((strAssetIdA == strAssetIdB))
361347 then throw("Assets must be different")
366352 let shareInitialSupply = 0
367353 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
368354 let shareIssueId = calculateAssetId(shareIssue)
369- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
355+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
370356 if (firstHarvest)
371- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
357+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
372358 else baseEntry
373359 }
374360 }
376362
377363
378364 @Callable(i)
379-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
365+func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
380366 then throw("Only admin can call this function")
381367 else [IntegerEntry(kShareLimit, shareLimit)])
382368
389375
390376 @Callable(i)
391377 func withdraw () = valueOrElse(isActive(), {
392- let $t01378013855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393- let pmtAmount = $t01378013855._1
394- let pmtAssetId = $t01378013855._2
378+ let $t01271412789 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
379+ let pmtAmount = $t01271412789._1
380+ let pmtAssetId = $t01271412789._2
395381 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
396382 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
397383 if ((size(i.payments) != 1))
410396 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
411397 else 0
412398 if ((stake2 == stake2))
413- then [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
399+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
414400 else throw("Strict value is not equal to itself.")
415401 }
416402 else throw("Strict value is not equal to itself.")
421407
422408 @Callable(i)
423409 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
424- let $t01516115236 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
425- let pmtAmount = $t01516115236._1
426- let pmtAssetId = $t01516115236._2
410+ let $t01408814163 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
411+ let pmtAmount = $t01408814163._1
412+ let pmtAssetId = $t01408814163._2
427413 if (if ((balanceA == 0))
428414 then true
429415 else (balanceB == 0))
437423 else if ((pmtAssetId == assetIdA))
438424 then {
439425 let assetIdSend = assetIdB
440- let $t01579115913 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
441- let amountWithoutFee = $t01579115913._1
442- let amountWithFee = $t01579115913._2
443- let governanceReward = $t01579115913._3
426+ let $t01471414836 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
427+ let amountWithoutFee = $t01471414836._1
428+ let amountWithFee = $t01471414836._2
429+ let governanceReward = $t01471414836._3
444430 let newBalanceA = (balanceA + pmtAmount)
445431 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
446432 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
452438 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
453439 else 0
454440 if ((stake2 == stake2))
455- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
441+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
456442 else throw("Strict value is not equal to itself.")
457443 }
458444 else throw("Strict value is not equal to itself.")
460446 else if ((pmtAssetId == assetIdB))
461447 then {
462448 let assetIdSend = assetIdA
463- let $t01686816990 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
464- let amountWithoutFee = $t01686816990._1
465- let amountWithFee = $t01686816990._2
466- let governanceReward = $t01686816990._3
449+ let $t01582815950 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
450+ let amountWithoutFee = $t01582815950._1
451+ let amountWithFee = $t01582815950._2
452+ let governanceReward = $t01582815950._3
467453 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
468454 let newBalanceB = (balanceB + pmtAmount)
469455 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
475461 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
476462 else 0
477463 if ((stake2 == stake2))
478- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
464+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
479465 else throw("Strict value is not equal to itself.")
480466 }
481467 else throw("Strict value is not equal to itself.")
487473
488474 @Callable(i)
489475 func shutdown () = if (!(active))
490- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
491- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
476+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
477+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
492478 then throw("Only admin can call this function")
493479 else suspend("Paused by admin")
494480
497483 @Callable(i)
498484 func activate () = if (active)
499485 then throw("DApp is already active")
500- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
486+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
501487 then throw("Only admin can call this function")
502- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
488+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
503489
504490
505491
507493 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
508494 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
509495 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
510- if ((i.caller != walletAddress))
496+ if ((i.caller != moneyBoxAddress))
511497 then throw("Only the wallet can call this function")
512498 else if (if ((0 > amountEnrollA))
513499 then true
527513 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
528514 else 0
529515 if ((stake2 == stake2))
530- then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
516+ then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
531517 else throw("Strict value is not equal to itself.")
532518 }
533519 else throw("Strict value is not equal to itself.")
541527 then throw("Only contract itself can invoke this function")
542528 else if ((assetIdString == "WAVES"))
543529 then {
544- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
545- let leasingId = getBinary(this, keyLeasingId)
546- let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
530+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
531+ let leasingId = getBinary(this, kLeasingId)
532+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
547533 let newLeaseAmount = if (stake)
548534 then (leasingAmount + amount)
549535 else (leasingAmount - amount)
550536 let newLease = Lease(pool, newLeaseAmount)
551537 let newLeaseId = calculateLeaseId(newLease)
552- let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
538+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
553539 match leasingId {
554540 case lId: ByteVector =>
555541 ([LeaseCancel(lId)] ++ baseEtry)
558544 }
559545 }
560546 else {
561- let $t02072420827 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
562- let call = $t02072420827._1
563- let addr = $t02072420827._2
564- let params = $t02072420827._3
565- let payments = $t02072420827._4
547+ let $t01970419807 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
548+ let call = $t01970419807._1
549+ let addr = $t01970419807._2
550+ let params = $t01970419807._3
551+ let payments = $t01970419807._4
566552 let inv = invoke(addr, call, params, payments)
567553 if ((inv == inv))
568554 then nil
572558
573559
574560 @Callable(i)
575-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
561+func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
576562 then throw("Only admin can call this function")
577563 else {
578564 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
620606 let callTakeIntoAccount = if ((inv.dApp == this))
621607 then (inv.function == "takeIntoAccountExtraFunds")
622608 else false
623- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
624- then (inv.function == "exchange")
625- else false)
626- then (size(inv.payments) == 1)
627- else false)
628- then if ((inv.payments[0].assetId == USDN))
629- then true
630- else (inv.payments[0].assetId == unit)
631- else false
632- let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
633- then (inv.function == "exchange")
634- else false)
635- then (assetIdA == NSBT)
636- else false)
637- then true
638- else if (if ((assetIdB == NSBT))
639- then (size(inv.payments) == 1)
640- else false)
641- then (inv.payments[0].assetId == USDN)
642- else false
643609 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
644610 then true
645611 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
646612 then true
647613 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
648614 then true
649- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
650- if (if (if (if (callTakeIntoAccount)
651- then true
652- else exchangeToWaves)
653- then true
654- else exchangeToNSBTs)
615+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
616+ if (if (callTakeIntoAccount)
655617 then signedByAdmin
656618 else false)
657619 then true
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
6-let keyVersion = "version"
6+let kVersion = "version"
77
8-let keyActive = "active"
8+let kActive = "active"
99
10-let keyAssetIdA = "A_asset_id"
10+let kAssetIdA = "A_asset_id"
1111
12-let keyAssetIdB = "B_asset_id"
12+let kAssetIdB = "B_asset_id"
1313
14-let keyBalanceA = "A_asset_balance"
14+let kBalanceA = "A_asset_balance"
1515
16-let keyBalanceB = "B_asset_balance"
16+let kBalanceB = "B_asset_balance"
1717
18-let keyBalanceInitA = "A_asset_init"
18+let kBalanceInitA = "A_asset_init"
1919
20-let keyBalanceInitB = "B_asset_init"
20+let kBalanceInitB = "B_asset_init"
2121
22-let keyShareAssetId = "share_asset_id"
22+let kShareAssetId = "share_asset_id"
2323
24-let keyShareAssetSupply = "share_asset_supply"
24+let kShareAssetSupply = "share_asset_supply"
2525
26-let keyCommission = "commission"
26+let kFee = "commission"
2727
28-let keyCommissionScaleDelimiter = "commission_scale_delimiter"
28+let kCause = "shutdown_cause"
2929
30-let keyCause = "shutdown_cause"
30+let kFirstHarvest = "first_harvest"
3131
32-let keyFirstHarvest = "first_harvest"
33-
34-let keyFirstHarvestHeight = "first_harvest_height"
32+let kFirstHarvestHeight = "first_harvest_height"
3533
3634 let kShareLimit = "share_limit_on_first_harvest"
3735
3836 let kBasePeriod = "base_period"
3937
4038 let kPeriodLength = "period_length"
4139
4240 let kStartHeight = "start_height"
4341
44-let kFirstHarvestHeight = "first_harvest_height"
42+let kUSDNAddress = "staking_usdnnsbt_address"
4543
46-let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
44+let kEURNAddress = "staking_eurn_address"
4745
48-let keyEURNAddress = "staking_eurn_address"
46+let kLeasingPool = "leasing_address"
4947
50-let keyLeasingPool = "leasing_address"
48+let kLeasingAmount = "leasing_amount"
5149
52-let keyLeasingAmount = "leasing_amount"
50+let kLeasingId = "leasing_id"
5351
54-let keyLeasingId = "leasing_id"
52+let kAdminPubKey1 = "admin_pub_1"
5553
56-let keyAdminPubKey1 = "admin_pub_1"
54+let kAdminPubKey2 = "admin_pub_2"
5755
58-let keyAdminPubKey2 = "admin_pub_2"
56+let kAdminPubKey3 = "admin_pub_3"
5957
60-let keyAdminPubKey3 = "admin_pub_3"
58+let kAdminInvokePubKey = "admin_invoke_pub"
59+
60+let kMoneyBoxAddress = "money_box_address"
6161
6262 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
6363
64-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
64+func getBase58FromOracle (key) = match getString(oracle, key) {
6565 case string: String =>
6666 fromBase58String(string)
6767 case nothing =>
68- throw("Admin public key is empty")
68+ throw((key + "is empty"))
6969 }
7070
7171
72-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
72+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7373
74-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
74+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7575
76-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
76+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
7777
78-let adminPubKeyStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
78+let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
7979
80-let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
81-
82-let walletAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
80+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8381
8482 let votingAddress = Address(base58'3PQZWxShKGRgBN1qoJw6B4s9YWS9FneZTPg')
8583
8684 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
8785
88-let NSBT = base58'6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g'
89-
9086 let SWOP = base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT'
9187
9288 let EURN = base58'DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t'
9389
94-let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(NSBT), toBase58String(EURN)]
90+let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
9591
96-let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
92+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9793
98-let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no eurn staking address")))
99-
100-let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
101-
102-let USDNToNSBTExchanger = Address(base58'3P2V63Xd6BviDkeMzxhUw2SJyojByRz8a8m')
94+let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
10395
10496 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
10597
10698 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
10799
108100 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109101
110102 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
111103
112-let active = getBooleanValue(this, keyActive)
104+let active = getBooleanValue(this, kActive)
113105
114-let strAssetIdA = getStringValue(this, keyAssetIdA)
106+let strAssetIdA = getStringValue(this, kAssetIdA)
115107
116-let strAssetIdB = getStringValue(this, keyAssetIdB)
108+let strAssetIdB = getStringValue(this, kAssetIdB)
117109
118110 let assetIdA = if ((strAssetIdA == "WAVES"))
119111 then unit
120112 else fromBase58String(strAssetIdA)
121113
122114 let assetIdB = if ((strAssetIdB == "WAVES"))
123115 then unit
124116 else fromBase58String(strAssetIdB)
125117
126118 let assetNameA = match assetIdA {
127119 case id: ByteVector =>
128120 value(assetInfo(id)).name
129121 case waves: Unit =>
130122 "WAVES"
131123 case _ =>
132124 throw("Match error")
133125 }
134126
135127 let assetNameB = match assetIdB {
136128 case id: ByteVector =>
137129 value(assetInfo(id)).name
138130 case waves: Unit =>
139131 "WAVES"
140132 case _ =>
141133 throw("Match error")
142134 }
143135
144-let balanceA = getIntegerValue(this, keyBalanceA)
136+let balanceA = getIntegerValue(this, kBalanceA)
145137
146-let balanceB = getIntegerValue(this, keyBalanceB)
138+let balanceB = getIntegerValue(this, kBalanceB)
147139
148-let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
140+let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
149141
150-let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
142+let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
151143
152-let commission = 3000
144+let fee = getIntegerValue(this, kFee)
153145
154-let commissionGovernance = 1200
146+let feeGovernance = fraction(fee, 40, 100)
155147
156-let commissionScaleDelimiter = 1000000
148+let feeScale6 = 1000000
157149
158150 let scaleValue3 = 1000
159151
160152 let scaleValue8 = 100000000
161153
162154 let slippageToleranceDelimiter = 1000
163155
164156 let scaleValue8Digits = 8
165157
166158 func accountBalance (assetId) = match assetId {
167159 case id: ByteVector =>
168160 assetBalance(this, id)
169161 case waves: Unit =>
170162 wavesBalance(this).available
171163 case _ =>
172164 throw("Match error")
173165 }
174166
175167
176168 func stakedAmount (assetId) = {
177169 let stakedAmountCalculated = match assetId {
178170 case aId: ByteVector =>
179- if (if ((aId == USDN))
180- then true
181- else (aId == NSBT))
182- then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
171+ if ((aId == USDN))
172+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183173 else if ((aId == EURN))
184174 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185175 else 0
186176 case _: Unit =>
187- valueOrElse(getInteger(this, keyLeasingAmount), 0)
177+ valueOrElse(getInteger(this, kLeasingAmount), 0)
188178 case _ =>
189179 throw("Match error")
190180 }
191181 match stakedAmountCalculated {
192182 case i: Int =>
193183 i
194184 case _ =>
195185 0
196186 }
197187 }
198188
199189
200190 let stakedAmountA = stakedAmount(assetIdA)
201191
202192 let stakedAmountB = stakedAmount(assetIdB)
203193
204-let assetInitA = getIntegerValue(this, keyBalanceInitA)
194+let assetInitA = getIntegerValue(this, kBalanceInitA)
205195
206-let assetInitB = getIntegerValue(this, keyBalanceInitB)
196+let assetInitB = getIntegerValue(this, kBalanceInitB)
207197
208198 let availableBalanceA = (balanceA - stakedAmountA)
209199
210200 let availableBalanceB = (balanceB - stakedAmountB)
211201
212202 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213203
214204 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215205
216206 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217207 then (accountBalanceWithStakedB >= balanceB)
218208 else false
219209
220210 func getAssetInfo (assetId) = match assetId {
221211 case id: ByteVector =>
222212 let stringId = toBase58String(id)
223213 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224214 $Tuple3(stringId, info.name, info.decimals)
225215 case waves: Unit =>
226216 $Tuple3("WAVES", "WAVES", 8)
227217 case _ =>
228218 throw("Match error")
229219 }
230220
231221
232222 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233223 then $Tuple3("WAVES", "WAVES", 8)
234224 else {
235225 let stringId = assetStr
236226 let id = fromBase58String(assetStr)
237227 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238228 $Tuple3(stringId, info.name, info.decimals)
239229 }
240230
241231
242-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
232+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
243233
244234
245235 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
246236 then if ((assetId == USDN))
247- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
248- else if ((assetId == NSBT))
249- then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
250- else $Tuple2("startStaking", stakingEURNAddress)
237+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
238+ else $Tuple2("startStaking", stakingEURNAddress)
251239 else if ((assetId == USDN))
252- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
253- else if ((assetId == NSBT))
254- then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
255- else $Tuple2("stopStaking", stakingEURNAddress)
240+ then $Tuple2("unlockNeutrino", stakingUSDNAddress)
241+ else $Tuple2("stopStaking", stakingEURNAddress)
256242
257243
258244 func calcStakingParams (stake,amount,assetId) = if (stake)
259245 then {
260- let $t069236989 = calcStakingFuncAndAddres(stake, assetId)
261- let call = $t069236989._1
262- let stakingAddr = $t069236989._2
246+ let $t060896155 = calcStakingFuncAndAddres(stake, assetId)
247+ let call = $t060896155._1
248+ let stakingAddr = $t060896155._2
263249 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
264250 }
265251 else {
266- let $t070757141 = calcStakingFuncAndAddres(stake, assetId)
267- let call = $t070757141._1
268- let stakingAddr = $t070757141._2
252+ let $t062416307 = calcStakingFuncAndAddres(stake, assetId)
253+ let call = $t062416307._1
254+ let stakingAddr = $t062416307._2
269255 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
270256 }
271257
272258
273259 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo) = {
274260 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
275- let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
276- let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
261+ let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
262+ let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
277263 if ((minAmountToReceive > amountWithFee))
278264 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
279265 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
280266 }
281267
282268
283269 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
284270
285271
286272 func isActive () = if (active)
287273 then unit
288274 else throw("DApp is inactive at this moment")
289275
290276
291277 @Callable(i)
292278 func init (firstHarvest) = {
293- let $t083118388 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
294- let pmtAmountA = $t083118388._1
295- let pmtAssetIdA = $t083118388._2
296- let $t083938470 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
297- let pmtAmountB = $t083938470._1
298- let pmtAssetIdB = $t083938470._2
299- let $t084758552 = getAssetInfo(pmtAssetIdA)
300- let pmtStrAssetIdA = $t084758552._1
301- let pmtAssetNameA = $t084758552._2
302- let pmtDecimalsA = $t084758552._3
303- let $t085578634 = getAssetInfo(pmtAssetIdB)
304- let pmtStrAssetIdB = $t085578634._1
305- let pmtAssetNameB = $t085578634._2
306- let pmtDecimalsB = $t085578634._3
307- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
279+ let $t074187495 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280+ let pmtAmountA = $t074187495._1
281+ let pmtAssetIdA = $t074187495._2
282+ let $t075007577 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
283+ let pmtAmountB = $t075007577._1
284+ let pmtAssetIdB = $t075007577._2
285+ let $t075827659 = getAssetInfo(pmtAssetIdA)
286+ let pmtStrAssetIdA = $t075827659._1
287+ let pmtAssetNameA = $t075827659._2
288+ let pmtDecimalsA = $t075827659._3
289+ let $t076647741 = getAssetInfo(pmtAssetIdB)
290+ let pmtStrAssetIdB = $t076647741._1
291+ let pmtAssetNameB = $t076647741._2
292+ let pmtDecimalsB = $t076647741._3
293+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
308294 then throw("Only admin can call this function")
309- else if (isDefined(getBoolean(this, keyActive)))
295+ else if (isDefined(getBoolean(this, kActive)))
310296 then throw("DApp is already active")
311297 else if ((pmtAssetIdA == pmtAssetIdB))
312298 then throw("Assets must be different")
313299 else {
314300 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
315301 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
316302 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
317303 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
318304 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
319305 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
320306 let shareInitialSupply = fraction(arg1, arg2, arg3)
321307 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
322308 let shareIssueId = calculateAssetId(shareIssue)
323309 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
324310 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
325311 else 0
326312 if ((stake1 == stake1))
327313 then {
328314 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
329315 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
330316 else 0
331317 if ((stake2 == stake2))
332318 then {
333- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
319+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
334320 if (firstHarvest)
335- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
321+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
336322 else baseEntry
337323 }
338324 else throw("Strict value is not equal to itself.")
339325 }
340326 else throw("Strict value is not equal to itself.")
341327 }
342328 }
343329
344330
345331
346332 @Callable(i)
347333 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
348- let $t01122311310 = getAssetInfoFromString(strAssetIdA)
349- let pmtStrAssetIdA = $t01122311310._1
350- let pmtAssetNameA = $t01122311310._2
351- let pmtDecimalsA = $t01122311310._3
352- let $t01131511402 = getAssetInfoFromString(strAssetIdB)
353- let pmtStrAssetIdB = $t01131511402._1
354- let pmtAssetNameB = $t01131511402._2
355- let pmtDecimalsB = $t01131511402._3
356- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
334+ let $t01024610333 = getAssetInfoFromString(strAssetIdA)
335+ let pmtStrAssetIdA = $t01024610333._1
336+ let pmtAssetNameA = $t01024610333._2
337+ let pmtDecimalsA = $t01024610333._3
338+ let $t01033810425 = getAssetInfoFromString(strAssetIdB)
339+ let pmtStrAssetIdB = $t01033810425._1
340+ let pmtAssetNameB = $t01033810425._2
341+ let pmtDecimalsB = $t01033810425._3
342+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
357343 then throw("Only admin can call this function")
358- else if (isDefined(getBoolean(this, keyActive)))
344+ else if (isDefined(getBoolean(this, kActive)))
359345 then throw("DApp is already active")
360346 else if ((strAssetIdA == strAssetIdB))
361347 then throw("Assets must be different")
362348 else {
363349 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
364350 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
365351 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
366352 let shareInitialSupply = 0
367353 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
368354 let shareIssueId = calculateAssetId(shareIssue)
369- let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
355+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
370356 if (firstHarvest)
371- then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
357+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
372358 else baseEntry
373359 }
374360 }
375361
376362
377363
378364 @Callable(i)
379-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
365+func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
380366 then throw("Only admin can call this function")
381367 else [IntegerEntry(kShareLimit, shareLimit)])
382368
383369
384370
385371 @Callable(i)
386372 func replenishWithTwoTokens (slippageTolerance) = throw("Adding liquidity to the pool is disabled")
387373
388374
389375
390376 @Callable(i)
391377 func withdraw () = valueOrElse(isActive(), {
392- let $t01378013855 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393- let pmtAmount = $t01378013855._1
394- let pmtAssetId = $t01378013855._2
378+ let $t01271412789 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
379+ let pmtAmount = $t01271412789._1
380+ let pmtAssetId = $t01271412789._2
395381 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
396382 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
397383 if ((size(i.payments) != 1))
398384 then throw("One attached payment expected")
399385 else if ((pmtAssetId != shareAssetId))
400386 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
401387 else if (!(hasEnoughBalance))
402388 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
403389 else {
404390 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
405391 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
406392 else 0
407393 if ((stake1 == stake1))
408394 then {
409395 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
410396 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
411397 else 0
412398 if ((stake2 == stake2))
413- then [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
399+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
414400 else throw("Strict value is not equal to itself.")
415401 }
416402 else throw("Strict value is not equal to itself.")
417403 }
418404 })
419405
420406
421407
422408 @Callable(i)
423409 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
424- let $t01516115236 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
425- let pmtAmount = $t01516115236._1
426- let pmtAssetId = $t01516115236._2
410+ let $t01408814163 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
411+ let pmtAmount = $t01408814163._1
412+ let pmtAssetId = $t01408814163._2
427413 if (if ((balanceA == 0))
428414 then true
429415 else (balanceB == 0))
430416 then throw("Can't exchange with zero balance")
431417 else if ((0 >= minAmountToReceive))
432418 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
433419 else if ((size(i.payments) != 1))
434420 then throw("One attached payment expected")
435421 else if (!(hasEnoughBalance))
436422 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
437423 else if ((pmtAssetId == assetIdA))
438424 then {
439425 let assetIdSend = assetIdB
440- let $t01579115913 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
441- let amountWithoutFee = $t01579115913._1
442- let amountWithFee = $t01579115913._2
443- let governanceReward = $t01579115913._3
426+ let $t01471414836 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
427+ let amountWithoutFee = $t01471414836._1
428+ let amountWithFee = $t01471414836._2
429+ let governanceReward = $t01471414836._3
444430 let newBalanceA = (balanceA + pmtAmount)
445431 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
446432 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
447433 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
448434 else 0
449435 if ((stake1 == stake1))
450436 then {
451437 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
452438 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
453439 else 0
454440 if ((stake2 == stake2))
455- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
441+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
456442 else throw("Strict value is not equal to itself.")
457443 }
458444 else throw("Strict value is not equal to itself.")
459445 }
460446 else if ((pmtAssetId == assetIdB))
461447 then {
462448 let assetIdSend = assetIdA
463- let $t01686816990 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
464- let amountWithoutFee = $t01686816990._1
465- let amountWithFee = $t01686816990._2
466- let governanceReward = $t01686816990._3
449+ let $t01582815950 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
450+ let amountWithoutFee = $t01582815950._1
451+ let amountWithFee = $t01582815950._2
452+ let governanceReward = $t01582815950._3
467453 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
468454 let newBalanceB = (balanceB + pmtAmount)
469455 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
470456 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
471457 else 0
472458 if ((stake1 == stake1))
473459 then {
474460 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
475461 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
476462 else 0
477463 if ((stake2 == stake2))
478- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
464+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
479465 else throw("Strict value is not equal to itself.")
480466 }
481467 else throw("Strict value is not equal to itself.")
482468 }
483469 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
484470 })
485471
486472
487473
488474 @Callable(i)
489475 func shutdown () = if (!(active))
490- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
491- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
476+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
477+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
492478 then throw("Only admin can call this function")
493479 else suspend("Paused by admin")
494480
495481
496482
497483 @Callable(i)
498484 func activate () = if (active)
499485 then throw("DApp is already active")
500- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
486+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
501487 then throw("Only admin can call this function")
502- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
488+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
503489
504490
505491
506492 @Callable(i)
507493 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
508494 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
509495 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
510- if ((i.caller != walletAddress))
496+ if ((i.caller != moneyBoxAddress))
511497 then throw("Only the wallet can call this function")
512498 else if (if ((0 > amountEnrollA))
513499 then true
514500 else (0 > amountEnrollB))
515501 then suspend("Enroll amount negative")
516502 else if (if ((amountEnrollA == 0))
517503 then (amountEnrollB == 0)
518504 else false)
519505 then throw("No money to take")
520506 else {
521507 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
522508 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
523509 else 0
524510 if ((stake1 == stake1))
525511 then {
526512 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
527513 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
528514 else 0
529515 if ((stake2 == stake2))
530- then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
516+ then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
531517 else throw("Strict value is not equal to itself.")
532518 }
533519 else throw("Strict value is not equal to itself.")
534520 }
535521 })
536522
537523
538524
539525 @Callable(i)
540526 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
541527 then throw("Only contract itself can invoke this function")
542528 else if ((assetIdString == "WAVES"))
543529 then {
544- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
545- let leasingId = getBinary(this, keyLeasingId)
546- let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
530+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
531+ let leasingId = getBinary(this, kLeasingId)
532+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
547533 let newLeaseAmount = if (stake)
548534 then (leasingAmount + amount)
549535 else (leasingAmount - amount)
550536 let newLease = Lease(pool, newLeaseAmount)
551537 let newLeaseId = calculateLeaseId(newLease)
552- let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
538+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
553539 match leasingId {
554540 case lId: ByteVector =>
555541 ([LeaseCancel(lId)] ++ baseEtry)
556542 case _ =>
557543 baseEtry
558544 }
559545 }
560546 else {
561- let $t02072420827 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
562- let call = $t02072420827._1
563- let addr = $t02072420827._2
564- let params = $t02072420827._3
565- let payments = $t02072420827._4
547+ let $t01970419807 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
548+ let call = $t01970419807._1
549+ let addr = $t01970419807._2
550+ let params = $t01970419807._3
551+ let payments = $t01970419807._4
566552 let inv = invoke(addr, call, params, payments)
567553 if ((inv == inv))
568554 then nil
569555 else throw("Strict value is not equal to itself.")
570556 }
571557
572558
573559
574560 @Callable(i)
575-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
561+func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
576562 then throw("Only admin can call this function")
577563 else {
578564 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
579565 then {
580566 let amountA = (balanceA - stakedAmountA)
581567 if ((amountA > 0))
582568 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
583569 else 0
584570 }
585571 else 0
586572 if ((stake1 == stake1))
587573 then {
588574 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
589575 then {
590576 let amountB = (balanceB - stakedAmountB)
591577 if ((amountB > 0))
592578 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
593579 else 0
594580 }
595581 else 0
596582 if ((stake2 == stake2))
597583 then nil
598584 else throw("Strict value is not equal to itself.")
599585 }
600586 else throw("Strict value is not equal to itself.")
601587 })
602588
603589
604590 @Verifier(tx)
605591 func verify () = {
606592 let multiSignedByAdmins = {
607593 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
608594 then 1
609595 else 0
610596 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
611597 then 1
612598 else 0
613599 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
614600 then 1
615601 else 0
616602 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
617603 }
618604 match tx {
619605 case inv: InvokeScriptTransaction =>
620606 let callTakeIntoAccount = if ((inv.dApp == this))
621607 then (inv.function == "takeIntoAccountExtraFunds")
622608 else false
623- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
624- then (inv.function == "exchange")
625- else false)
626- then (size(inv.payments) == 1)
627- else false)
628- then if ((inv.payments[0].assetId == USDN))
629- then true
630- else (inv.payments[0].assetId == unit)
631- else false
632- let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
633- then (inv.function == "exchange")
634- else false)
635- then (assetIdA == NSBT)
636- else false)
637- then true
638- else if (if ((assetIdB == NSBT))
639- then (size(inv.payments) == 1)
640- else false)
641- then (inv.payments[0].assetId == USDN)
642- else false
643609 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
644610 then true
645611 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
646612 then true
647613 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
648614 then true
649- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
650- if (if (if (if (callTakeIntoAccount)
651- then true
652- else exchangeToWaves)
653- then true
654- else exchangeToNSBTs)
615+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
616+ if (if (callTakeIntoAccount)
655617 then signedByAdmin
656618 else false)
657619 then true
658620 else multiSignedByAdmins
659621 case _ =>
660622 multiSignedByAdmins
661623 }
662624 }
663625

github/deemru/w8io/6500d08 
140.60 ms