2022.05.08 13:11 [3108040] smart account 3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ > SELF 0.00000000 Waves

{ "type": 13, "id": "4Xp4HeHyaB5Arcxx2EUG9y7jRmwERGqmYDakT5D73q5f", "fee": 1400000, "feeAssetId": null, "timestamp": 1652003641653, "version": 2, "chainId": 87, "sender": "3PNVFWopwCD9CgGXkpYWEY94oQ5XCAEXBmQ", "senderPublicKey": "4DPL6q4zXX76yLqAjsQwFsruX4hUF8eKzqRdTkfprQgu", "proofs": [ "", "Y6pkLARpyuAQP2A8eBbZgFobmPkajK6KaDhtB1cVRHVTf3B8yNrNNnpX64tDHYVRdLewRnQdt4bB2w2emSvaNcD", "2bKQEUGNFENk5TGaGTaLjFP9ug75Tgo3bf6UHwEQzjMwhTypu3fcHeGc5aQx26XN1MQo4QtNdGtodjzRvH6jtGMo" ], "script": "base64:AAIFAAAAAAAAADAIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgASBQoDBAEIEgAAAABUAAAAAAd2ZXJzaW9uAgAAAAUxLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa0JhbGFuY2VJbml0QQIAAAAMQV9hc3NldF9pbml0AAAAAA1rQmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAADWtTaGFyZUFzc2V0SWQCAAAADnNoYXJlX2Fzc2V0X2lkAAAAABFrU2hhcmVBc3NldFN1cHBseQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAARrRmVlAgAAAApjb21taXNzaW9uAAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA1rRmlyc3RIYXJ2ZXN0AgAAAA1maXJzdF9oYXJ2ZXN0AAAAABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAALa1NoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAC2tCYXNlUGVyaW9kAgAAAAtiYXNlX3BlcmlvZAAAAAANa1BlcmlvZExlbmd0aAIAAAANcGVyaW9kX2xlbmd0aAAAAAAMa1N0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAADGtVU0ROQWRkcmVzcwIAAAAYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAAAAAxrRVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAAxrTGVhc2luZ1Bvb2wCAAAAD2xlYXNpbmdfYWRkcmVzcwAAAAAOa0xlYXNpbmdBbW91bnQCAAAADmxlYXNpbmdfYW1vdW50AAAAAAprTGVhc2luZ0lkAgAAAApsZWFzaW5nX2lkAAAAAA1rQWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAANa0FkbWluUHViS2V5MgIAAAALYWRtaW5fcHViXzIAAAAADWtBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABJrQWRtaW5JbnZva2VQdWJLZXkCAAAAEGFkbWluX2ludm9rZV9wdWIAAAAAEGtNb25leUJveEFkZHJlc3MCAAAAEW1vbmV5X2JveF9hZGRyZXNzAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVeK/whomjW6QM1hdPISN96mN/D6OM7oHjgBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZvcmFjbGUFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAEJAAEsAAAAAgUAAAADa2V5AgAAAAhpcyBlbXB0eQAAAAAMYWRtaW5QdWJLZXkxCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTEAAAAADGFkbWluUHViS2V5MgkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkyAAAAAAxhZG1pblB1YktleTMJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MwAAAAARYWRtaW5JbnZva2VQdWJLZXkJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAASa0FkbWluSW52b2tlUHViS2V5AAAAAA9tb25leUJveEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABBrTW9uZXlCb3hBZGRyZXNzAAAAAA12b3RpbmdBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFX+D/7rE/JYs2NlJlbruypSwjc8IykrCK7AAAAAARVU0ROAQAAACC2JinDBPXOU5GkDkt1JC9k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BEVVUk4JAAQaAAAAAgUAAAASc3Rha2luZ0VVUk5BZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABglcyVzJXNfX3N0YWtpbmdCYWxhbmNlX18JAAJYAAAAAQUAAAADYUlkAgAAAAJfXwkABCUAAAABBQAAAAR0aGlzAAAAAAAAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADmtMZWFzaW5nQW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAAckbWF0Y2gwBQAAABZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWkFAAAAByRtYXRjaDAFAAAAAWkAAAAAAAAAAAAAAAAADXN0YWtlZEFtb3VudEEJAQAAAAxzdGFrZWRBbW91bnQAAAABBQAAAAhhc3NldElkQQAAAAANc3Rha2VkQW1vdW50QgkBAAAADHN0YWtlZEFtb3VudAAAAAEFAAAACGFzc2V0SWRCAAAAAAphc3NldEluaXRBCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA1rQmFsYW5jZUluaXRBAAAAAAphc3NldEluaXRCCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA1rQmFsYW5jZUluaXRCAAAAABFhdmFpbGFibGVCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANc3Rha2VkQW1vdW50QQAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADXN0YWtlZEFtb3VudEIAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEEFAAAADXN0YWtlZEFtb3VudEEAAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIJAABkAAAAAgkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAIYXNzZXRJZEIFAAAADXN0YWtlZEFtb3VudEIAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQAAAAhhc3NldFN0cgMJAAAAAAAAAgUAAAAIYXNzZXRTdHICAAAABVdBVkVTCQAFFQAAAAMCAAAABVdBVkVTAgAAAAVXQVZFUwAAAAAAAAAACAQAAAAIc3RyaW5nSWQFAAAACGFzc2V0U3RyBAAAAAJpZAkAAlkAAAABBQAAAAhhc3NldFN0cgQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAAmlkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAhzdHJpbmdJZAIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAAIc3RyaW5nSWQIBQAAAARpbmZvAAAABG5hbWUIBQAAAARpbmZvAAAACGRlY2ltYWxzAQAAAAdzdXNwZW5kAAAAAQAAAAVjYXVzZQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAGa0NhdXNlBQAAAAVjYXVzZQUAAAADbmlsAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACAAAABXN0YWtlAAAAB2Fzc2V0SWQDBQAAAAVzdGFrZQMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAAxsb2NrTmV1dHJpbm8FAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkABRQAAAACAgAAAAxzdGFydFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAA51bmxvY2tOZXV0cmlubwUAAAASc3Rha2luZ1VTRE5BZGRyZXNzCQAFFAAAAAICAAAAC3N0b3BTdGFraW5nBQAAABJzdGFraW5nRVVSTkFkZHJlc3MBAAAAEWNhbGNTdGFraW5nUGFyYW1zAAAAAwAAAAVzdGFrZQAAAAZhbW91bnQAAAAHYXNzZXRJZAMFAAAABXN0YWtlBAAAAAskdDA2MDg5NjE1NQkBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIFAAAABXN0YWtlBQAAAAdhc3NldElkBAAAAARjYWxsCAUAAAALJHQwNjA4OTYxNTUAAAACXzEEAAAAC3N0YWtpbmdBZGRyCAUAAAALJHQwNjA4OTYxNTUAAAACXzIJAAUWAAAABAUAAAAEY2FsbAUAAAALc3Rha2luZ0FkZHIFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BQAAAANuaWwEAAAACyR0MDYyNDE2MzA3CQEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgUAAAAFc3Rha2UFAAAAB2Fzc2V0SWQEAAAABGNhbGwIBQAAAAskdDA2MjQxNjMwNwAAAAJfMQQAAAALc3Rha2luZ0FkZHIIBQAAAAskdDA2MjQxNjMwNwAAAAJf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QW1vdW50QgkABEwAAAACBQAAAA5wbXRTdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyBAAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAIa1ZlcnNpb24FAAAAB3ZlcnNpb24JAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tBY3RpdmUGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfY3BtbQkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAMFAAAADGZpcnN0SGFydmVzdAkABE4AAAACBQAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAADWtGaXJzdEhhcnZlc3QFAAAADGZpcnN0SGFydmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa0ZpcnN0SGFydmVzdEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAkAAGgAAAACBQAAABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFAAAADHBlcmlvZExlbmd0aAUAAAADbmlsBQAAAAliYXNlRW50cnkJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABFpbml0V2l0aEluaXRSYXRpbwAAAAUAAAAJYW10QXNzZXRBAAAACWFtdEFzc2V0QgAAAAtzdHJBc3NldElkQQAAAAtzdHJBc3NldElkQgAAAAxmaXJzdEhhcnZlc3QEAAAADSR0MDEwMjQ2MTAzMzMJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTAyNDYxMDMzMwAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDEwMjQ2MTAzMzMAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDEwMjQ2MTAzMzMAAAACXzMEAAAADSR0MDEwMzM4MTA0MjUJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTAzMzgxMDQyNQAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEwMzM4MTA0MjUAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEwMzM4MTA0MjUAAAACXzMDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzCQAETAAAAAIFAAAAEWFkbWluSW52b2tlUHViS2V5BQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQEAAAAJaXNEZWZpbmVkAAAAAQkABBsAAAACBQAAAAR0aGlzBQAAAAdrQWN0aXZlCQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBBQAAAAtzdHJBc3NldElkQgkAAAIAAAABAgAAABhBc3NldHMgbXVzdCBiZSBkaWZmZXJlbnQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAASc2hhcmVJbml0aWFsU3VwcGx5AAAAAAAAAAAABAAAAApzaGFyZUlzc3VlCQAEQgAAAAUFAAAACXNoYXJlTmFtZQUAAAAQc2hhcmVEZXNjcmlwdGlvbgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAA1zaGFyZURlY2ltYWxzBgQAAAAMc2hhcmVJc3N1ZUlkCQAEOAAAAAEFAAAACnNoYXJlSXNzdWUEAAAACWJhc2VFbnRyeQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rQmFsYW5jZUluaXRBBQAAAAlhbXRBc3NldEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtCYWxhbmNlSW5pdEIFAAAACWFtdEFzc2V0QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfY3BtbQkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAANuaWwDBQAAAAxmaXJzdEhhcnZlc3QJAAROAAAAAgUAAAAJYmFzZUVudHJ5CQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA1rRmlyc3RIYXJ2ZXN0BQAAAAxmaXJzdEhhcnZlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tGaXJzdEhhcnZlc3RIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQJAABoAAAAAgUAAAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQAAAAxwZXJpb2RMZW5ndGgFAAAAA25pbAUAAAAJYmFzZUVudHJ5AAAAAWkBAAAAGGtlZXBMaW1pdEZvckZpcnN0SGFydmVzdAAAAAEAAAAKc2hhcmVMaW1pdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAARYWRtaW5JbnZva2VQdWJLZXkFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa1NoYXJlTGltaXQFAAAACnNoYXJlTGltaXQFAAAAA25pbAAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAALcG10QXNzZXRJZEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAC3BtdEFzc2V0SWRCCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACnBtdEFtb3VudEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAQAAAANJHQwMTI4MDQxMjg4MQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDEyODA0MTI4ODEAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxMjgwNDEyODgxAAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxMjgwNDEyODgxAAAAAl8zBAAAAA0k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aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAABAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOcG10U3RyQXNzZXRJZEEJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACnBtdEFtb3VudEEJAARMAAAAAgUAAAAOcG10U3RyQXNzZXRJZEEFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADnBtdFN0ckFzc2V0SWRCCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAApw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ZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBAAAAAthc3NldElkU2VuZAUAAAAIYXNzZXRJZEEEAAAADSR0MDE4ODc3MTg5OTkJAQAAAA1jYWxjdWxhdGVGZWVzAAAABAUAAAAJcG10QW1vdW50BQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACGJhbGFuY2VCBQAAAAhiYWxhbmNlQQQAAAAQYW1vdW50V2l0aG91dEZlZQgFAAAADSR0MDE4ODc3MTg5OTkAAAACXzEEAAAADWFtb3VudFdpdGhGZWUIBQAAAA0kdDAxODg3NzE4OTk5AAAAAl8yBAAAABBnb3Zlcm5hbmNlUmV3YXJkCAUAAAANJHQwMTg4NzcxODk5OQAAAAJfMwQAAAALbmV3QmFsYW5jZUEJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAQAAAALbmV3QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAAC3N0ckFzc2V0SWRBCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACCQAAZAAAAAIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAARMAAAAAgUAAAALc3RyQXNzZXRJZEEFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAAC3N0ckFzc2V0SWRCCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAlwbXRBbW91bnQJAARMAAAAAgUAAAALc3RyQXNzZXRJ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QgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAMc3Rha2VVbnN0YWtlAAAAAwAAAAVzdGFrZQAAAAZhbW91bnQAAAANYXNzZXRJZFN0cmluZwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAAC1Pbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gaW52b2tlIHRoaXMgZnVuY3Rpb24DCQAAAAAAAAIFAAAADWFzc2V0SWRTdHJpbmcCAAAABVdBVkVTBAAAAARwb29sCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAxrTGVhc2luZ1Bvb2wCAAAAGU5vIGxlYXNpbmcgcG9vbCBpbiBvcmFjbGUEAAAACWxlYXNpbmdJZAkABBwAAAACBQAAAAR0aGlzBQAAAAprTGVhc2luZ0lkBAAAAA1sZWFzaW5nQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADmtMZWFzaW5nQW1vdW50AAAAAAAAAAAABAAAAA5uZXdMZWFzZUFtb3VudAMFAAAABXN0YWtlCQAAZAAAAAIFAAAADWxlYXNpbmdBbW91bnQFAAAABmFtb3VudAkAAGUAAAACBQAAAA1sZWFzaW5nQW1vdW50BQAAAAZhbW91bnQEAAAACG5ld0xlYXNlCQAERAAAAAIFAAAABHBvb2wFAAAADm5ld0xlYXNlQW1vdW50BAAAAApuZXdMZWFzZUlkCQAEOQAAAAEFAAAACG5ld0xlYXNlBAAAAAhiYXNlRXRyeQkABEwAAAACBQAAAAhuZXdMZWFzZQkABEwAAAACCQEAAAALQmluYXJ5RW50cnkAAAACBQAAAAprTGVhc2luZ0lkBQAAAApuZXdMZWFzZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5rTGVhc2luZ0Ftb3VudAUAAAAO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", "height": 3108040, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9LGbxbpCBwBawRsPZpoMFpxSn32ycRQAPbtPEVy5VfwK Next: 24HgyqEXAAD23ank1mHmiNuhMo5757pWxtAG7yX38iZg 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
388374 let pmtAssetIdB = i.payments[1].assetId
389375 let pmtAmountA = i.payments[0].amount
390376 let pmtAmountB = i.payments[1].amount
391- let $t01387013947 = getAssetInfo(pmtAssetIdA)
392- let pmtStrAssetIdA = $t01387013947._1
393- let pmtAssetNameA = $t01387013947._2
394- let pmtDecimalsA = $t01387013947._3
395- let $t01395214029 = getAssetInfo(pmtAssetIdB)
396- let pmtStrAssetIdB = $t01395214029._1
397- let pmtAssetNameB = $t01395214029._2
398- let pmtDecimalsB = $t01395214029._3
377+ let $t01280412881 = getAssetInfo(pmtAssetIdA)
378+ let pmtStrAssetIdA = $t01280412881._1
379+ let pmtAssetNameA = $t01280412881._2
380+ let pmtDecimalsA = $t01280412881._3
381+ let $t01288612963 = getAssetInfo(pmtAssetIdB)
382+ let pmtStrAssetIdB = $t01288612963._1
383+ let pmtAssetNameB = $t01288612963._2
384+ let pmtDecimalsB = $t01288612963._3
399385 let inital = if (if ((balanceA == 0))
400386 then (balanceB == 0)
401387 else false)
436422 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
437423 else 0
438424 if ((stake2 == stake2))
439- then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
425+ then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
440426 else throw("Strict value is not equal to itself.")
441427 }
442428 else throw("Strict value is not equal to itself.")
447433
448434 @Callable(i)
449435 func withdraw () = valueOrElse(isActive(), {
450- let $t01683516910 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01683516910._1
452- let pmtAssetId = $t01683516910._2
436+ let $t01576315838 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
437+ let pmtAmount = $t01576315838._1
438+ let pmtAssetId = $t01576315838._2
453439 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
454440 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
455441 if ((size(i.payments) != 1))
468454 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
469455 else 0
470456 if ((stake2 == stake2))
471- 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)]
457+ 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)]
472458 else throw("Strict value is not equal to itself.")
473459 }
474460 else throw("Strict value is not equal to itself.")
479465
480466 @Callable(i)
481467 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
482- let $t01821618291 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
483- let pmtAmount = $t01821618291._1
484- let pmtAssetId = $t01821618291._2
468+ let $t01713717212 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
469+ let pmtAmount = $t01713717212._1
470+ let pmtAssetId = $t01713717212._2
485471 if (if ((balanceA == 0))
486472 then true
487473 else (balanceB == 0))
495481 else if ((pmtAssetId == assetIdA))
496482 then {
497483 let assetIdSend = assetIdB
498- let $t01884618968 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
499- let amountWithoutFee = $t01884618968._1
500- let amountWithFee = $t01884618968._2
501- let governanceReward = $t01884618968._3
484+ let $t01776317885 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
485+ let amountWithoutFee = $t01776317885._1
486+ let amountWithFee = $t01776317885._2
487+ let governanceReward = $t01776317885._3
502488 let newBalanceA = (balanceA + pmtAmount)
503489 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
504490 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
510496 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
511497 else 0
512498 if ((stake2 == stake2))
513- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
499+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
514500 else throw("Strict value is not equal to itself.")
515501 }
516502 else throw("Strict value is not equal to itself.")
518504 else if ((pmtAssetId == assetIdB))
519505 then {
520506 let assetIdSend = assetIdA
521- let $t01992320045 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
522- let amountWithoutFee = $t01992320045._1
523- let amountWithFee = $t01992320045._2
524- let governanceReward = $t01992320045._3
507+ let $t01887718999 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
508+ let amountWithoutFee = $t01887718999._1
509+ let amountWithFee = $t01887718999._2
510+ let governanceReward = $t01887718999._3
525511 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
526512 let newBalanceB = (balanceB + pmtAmount)
527513 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
533519 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
534520 else 0
535521 if ((stake2 == stake2))
536- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
522+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
537523 else throw("Strict value is not equal to itself.")
538524 }
539525 else throw("Strict value is not equal to itself.")
545531
546532 @Callable(i)
547533 func shutdown () = if (!(active))
548- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
549- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
534+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
535+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
550536 then throw("Only admin can call this function")
551537 else suspend("Paused by admin")
552538
555541 @Callable(i)
556542 func activate () = if (active)
557543 then throw("DApp is already active")
558- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
544+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
559545 then throw("Only admin can call this function")
560- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
546+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
561547
562548
563549
565551 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
566552 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
567553 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
568- if ((i.caller != walletAddress))
554+ if ((i.caller != moneyBoxAddress))
569555 then throw("Only the wallet can call this function")
570556 else if (if ((0 > amountEnrollA))
571557 then true
585571 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
586572 else 0
587573 if ((stake2 == stake2))
588- then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
574+ then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
589575 else throw("Strict value is not equal to itself.")
590576 }
591577 else throw("Strict value is not equal to itself.")
599585 then throw("Only contract itself can invoke this function")
600586 else if ((assetIdString == "WAVES"))
601587 then {
602- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
603- let leasingId = getBinary(this, keyLeasingId)
604- let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
588+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
589+ let leasingId = getBinary(this, kLeasingId)
590+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
605591 let newLeaseAmount = if (stake)
606592 then (leasingAmount + amount)
607593 else (leasingAmount - amount)
608594 let newLease = Lease(pool, newLeaseAmount)
609595 let newLeaseId = calculateLeaseId(newLease)
610- let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
596+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
611597 match leasingId {
612598 case lId: ByteVector =>
613599 ([LeaseCancel(lId)] ++ baseEtry)
616602 }
617603 }
618604 else {
619- let $t02377923882 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
620- let call = $t02377923882._1
621- let addr = $t02377923882._2
622- let params = $t02377923882._3
623- let payments = $t02377923882._4
605+ let $t02275322856 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
606+ let call = $t02275322856._1
607+ let addr = $t02275322856._2
608+ let params = $t02275322856._3
609+ let payments = $t02275322856._4
624610 let inv = invoke(addr, call, params, payments)
625611 if ((inv == inv))
626612 then nil
630616
631617
632618 @Callable(i)
633-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
619+func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
634620 then throw("Only admin can call this function")
635621 else {
636622 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
678664 let callTakeIntoAccount = if ((inv.dApp == this))
679665 then (inv.function == "takeIntoAccountExtraFunds")
680666 else false
681- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
682- then (inv.function == "exchange")
683- else false)
684- then (assetIdA == USDN)
685- else false)
686- then true
687- else if (if ((assetIdB == USDN))
688- then (size(inv.payments) == 1)
689- else false)
690- then (inv.payments[0].assetId == USDN)
691- else false
692- let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
693- then (inv.function == "exchange")
694- else false)
695- then (assetIdA == NSBT)
696- else false)
697- then true
698- else if (if ((assetIdB == NSBT))
699- then (size(inv.payments) == 1)
700- else false)
701- then (inv.payments[0].assetId == USDN)
702- else false
703667 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
704668 then true
705669 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
706670 then true
707671 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
708672 then true
709- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
710- if (if (if (if (callTakeIntoAccount)
711- then true
712- else exchangeToWaves)
713- then true
714- else exchangeToNSBTs)
673+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
674+ if (if (callTakeIntoAccount)
715675 then signedByAdmin
716676 else false)
717677 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) = valueOrElse(isActive(), {
387373 let pmtAssetIdA = i.payments[0].assetId
388374 let pmtAssetIdB = i.payments[1].assetId
389375 let pmtAmountA = i.payments[0].amount
390376 let pmtAmountB = i.payments[1].amount
391- let $t01387013947 = getAssetInfo(pmtAssetIdA)
392- let pmtStrAssetIdA = $t01387013947._1
393- let pmtAssetNameA = $t01387013947._2
394- let pmtDecimalsA = $t01387013947._3
395- let $t01395214029 = getAssetInfo(pmtAssetIdB)
396- let pmtStrAssetIdB = $t01395214029._1
397- let pmtAssetNameB = $t01395214029._2
398- let pmtDecimalsB = $t01395214029._3
377+ let $t01280412881 = getAssetInfo(pmtAssetIdA)
378+ let pmtStrAssetIdA = $t01280412881._1
379+ let pmtAssetNameA = $t01280412881._2
380+ let pmtDecimalsA = $t01280412881._3
381+ let $t01288612963 = getAssetInfo(pmtAssetIdB)
382+ let pmtStrAssetIdB = $t01288612963._1
383+ let pmtAssetNameB = $t01288612963._2
384+ let pmtDecimalsB = $t01288612963._3
399385 let inital = if (if ((balanceA == 0))
400386 then (balanceB == 0)
401387 else false)
402388 then true
403389 else false
404390 let tokenRatio = if (inital)
405391 then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
406392 else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
407393 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
408394 let shareTokenToPayAmount = if (inital)
409395 then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
410396 else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
411397 if (if ((0 > slippageTolerance))
412398 then true
413399 else (slippageTolerance > slippageToleranceDelimiter))
414400 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
415401 else if ((size(i.payments) != 2))
416402 then throw("Two attached assets expected")
417403 else if (if ((pmtAssetIdA != assetIdA))
418404 then true
419405 else (pmtAssetIdB != assetIdB))
420406 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
421407 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
422408 then true
423409 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
424410 then throw("Incorrect assets amount: amounts must have the contract ratio")
425411 else if ((shareTokenToPayAmount == 0))
426412 then throw("Too small amount to replenish")
427413 else if (!(hasEnoughBalance))
428414 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
429415 else {
430416 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
431417 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
432418 else 0
433419 if ((stake1 == stake1))
434420 then {
435421 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
436422 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
437423 else 0
438424 if ((stake2 == stake2))
439- then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
425+ then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
440426 else throw("Strict value is not equal to itself.")
441427 }
442428 else throw("Strict value is not equal to itself.")
443429 }
444430 })
445431
446432
447433
448434 @Callable(i)
449435 func withdraw () = valueOrElse(isActive(), {
450- let $t01683516910 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01683516910._1
452- let pmtAssetId = $t01683516910._2
436+ let $t01576315838 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
437+ let pmtAmount = $t01576315838._1
438+ let pmtAssetId = $t01576315838._2
453439 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
454440 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
455441 if ((size(i.payments) != 1))
456442 then throw("One attached payment expected")
457443 else if ((pmtAssetId != shareAssetId))
458444 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
459445 else if (!(hasEnoughBalance))
460446 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
461447 else {
462448 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
463449 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
464450 else 0
465451 if ((stake1 == stake1))
466452 then {
467453 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
468454 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
469455 else 0
470456 if ((stake2 == stake2))
471- 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)]
457+ 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)]
472458 else throw("Strict value is not equal to itself.")
473459 }
474460 else throw("Strict value is not equal to itself.")
475461 }
476462 })
477463
478464
479465
480466 @Callable(i)
481467 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
482- let $t01821618291 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
483- let pmtAmount = $t01821618291._1
484- let pmtAssetId = $t01821618291._2
468+ let $t01713717212 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
469+ let pmtAmount = $t01713717212._1
470+ let pmtAssetId = $t01713717212._2
485471 if (if ((balanceA == 0))
486472 then true
487473 else (balanceB == 0))
488474 then throw("Can't exchange with zero balance")
489475 else if ((0 >= minAmountToReceive))
490476 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
491477 else if ((size(i.payments) != 1))
492478 then throw("One attached payment expected")
493479 else if (!(hasEnoughBalance))
494480 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
495481 else if ((pmtAssetId == assetIdA))
496482 then {
497483 let assetIdSend = assetIdB
498- let $t01884618968 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
499- let amountWithoutFee = $t01884618968._1
500- let amountWithFee = $t01884618968._2
501- let governanceReward = $t01884618968._3
484+ let $t01776317885 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB)
485+ let amountWithoutFee = $t01776317885._1
486+ let amountWithFee = $t01776317885._2
487+ let governanceReward = $t01776317885._3
502488 let newBalanceA = (balanceA + pmtAmount)
503489 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
504490 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
505491 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
506492 else 0
507493 if ((stake1 == stake1))
508494 then {
509495 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
510496 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
511497 else 0
512498 if ((stake2 == stake2))
513- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
499+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
514500 else throw("Strict value is not equal to itself.")
515501 }
516502 else throw("Strict value is not equal to itself.")
517503 }
518504 else if ((pmtAssetId == assetIdB))
519505 then {
520506 let assetIdSend = assetIdA
521- let $t01992320045 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
522- let amountWithoutFee = $t01992320045._1
523- let amountWithFee = $t01992320045._2
524- let governanceReward = $t01992320045._3
507+ let $t01887718999 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA)
508+ let amountWithoutFee = $t01887718999._1
509+ let amountWithFee = $t01887718999._2
510+ let governanceReward = $t01887718999._3
525511 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
526512 let newBalanceB = (balanceB + pmtAmount)
527513 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
528514 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
529515 else 0
530516 if ((stake1 == stake1))
531517 then {
532518 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
533519 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
534520 else 0
535521 if ((stake2 == stake2))
536- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
522+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
537523 else throw("Strict value is not equal to itself.")
538524 }
539525 else throw("Strict value is not equal to itself.")
540526 }
541527 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
542528 })
543529
544530
545531
546532 @Callable(i)
547533 func shutdown () = if (!(active))
548- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
549- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
534+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
535+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
550536 then throw("Only admin can call this function")
551537 else suspend("Paused by admin")
552538
553539
554540
555541 @Callable(i)
556542 func activate () = if (active)
557543 then throw("DApp is already active")
558- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
544+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
559545 then throw("Only admin can call this function")
560- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
546+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
561547
562548
563549
564550 @Callable(i)
565551 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
566552 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
567553 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
568- if ((i.caller != walletAddress))
554+ if ((i.caller != moneyBoxAddress))
569555 then throw("Only the wallet can call this function")
570556 else if (if ((0 > amountEnrollA))
571557 then true
572558 else (0 > amountEnrollB))
573559 then suspend("Enroll amount negative")
574560 else if (if ((amountEnrollA == 0))
575561 then (amountEnrollB == 0)
576562 else false)
577563 then throw("No money to take")
578564 else {
579565 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
580566 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
581567 else 0
582568 if ((stake1 == stake1))
583569 then {
584570 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
585571 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
586572 else 0
587573 if ((stake2 == stake2))
588- then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
574+ then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
589575 else throw("Strict value is not equal to itself.")
590576 }
591577 else throw("Strict value is not equal to itself.")
592578 }
593579 })
594580
595581
596582
597583 @Callable(i)
598584 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
599585 then throw("Only contract itself can invoke this function")
600586 else if ((assetIdString == "WAVES"))
601587 then {
602- let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
603- let leasingId = getBinary(this, keyLeasingId)
604- let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
588+ let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
589+ let leasingId = getBinary(this, kLeasingId)
590+ let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
605591 let newLeaseAmount = if (stake)
606592 then (leasingAmount + amount)
607593 else (leasingAmount - amount)
608594 let newLease = Lease(pool, newLeaseAmount)
609595 let newLeaseId = calculateLeaseId(newLease)
610- let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
596+ let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
611597 match leasingId {
612598 case lId: ByteVector =>
613599 ([LeaseCancel(lId)] ++ baseEtry)
614600 case _ =>
615601 baseEtry
616602 }
617603 }
618604 else {
619- let $t02377923882 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
620- let call = $t02377923882._1
621- let addr = $t02377923882._2
622- let params = $t02377923882._3
623- let payments = $t02377923882._4
605+ let $t02275322856 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
606+ let call = $t02275322856._1
607+ let addr = $t02275322856._2
608+ let params = $t02275322856._3
609+ let payments = $t02275322856._4
624610 let inv = invoke(addr, call, params, payments)
625611 if ((inv == inv))
626612 then nil
627613 else throw("Strict value is not equal to itself.")
628614 }
629615
630616
631617
632618 @Callable(i)
633-func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
619+func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
634620 then throw("Only admin can call this function")
635621 else {
636622 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
637623 then {
638624 let amountA = (balanceA - stakedAmountA)
639625 if ((amountA > 0))
640626 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
641627 else 0
642628 }
643629 else 0
644630 if ((stake1 == stake1))
645631 then {
646632 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
647633 then {
648634 let amountB = (balanceB - stakedAmountB)
649635 if ((amountB > 0))
650636 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
651637 else 0
652638 }
653639 else 0
654640 if ((stake2 == stake2))
655641 then nil
656642 else throw("Strict value is not equal to itself.")
657643 }
658644 else throw("Strict value is not equal to itself.")
659645 })
660646
661647
662648 @Verifier(tx)
663649 func verify () = {
664650 let multiSignedByAdmins = {
665651 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
666652 then 1
667653 else 0
668654 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
669655 then 1
670656 else 0
671657 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
672658 then 1
673659 else 0
674660 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
675661 }
676662 match tx {
677663 case inv: InvokeScriptTransaction =>
678664 let callTakeIntoAccount = if ((inv.dApp == this))
679665 then (inv.function == "takeIntoAccountExtraFunds")
680666 else false
681- let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
682- then (inv.function == "exchange")
683- else false)
684- then (assetIdA == USDN)
685- else false)
686- then true
687- else if (if ((assetIdB == USDN))
688- then (size(inv.payments) == 1)
689- else false)
690- then (inv.payments[0].assetId == USDN)
691- else false
692- let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
693- then (inv.function == "exchange")
694- else false)
695- then (assetIdA == NSBT)
696- else false)
697- then true
698- else if (if ((assetIdB == NSBT))
699- then (size(inv.payments) == 1)
700- else false)
701- then (inv.payments[0].assetId == USDN)
702- else false
703667 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
704668 then true
705669 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
706670 then true
707671 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
708672 then true
709- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
710- if (if (if (if (callTakeIntoAccount)
711- then true
712- else exchangeToWaves)
713- then true
714- else exchangeToNSBTs)
673+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
674+ if (if (callTakeIntoAccount)
715675 then signedByAdmin
716676 else false)
717677 then true
718678 else multiSignedByAdmins
719679 case _ =>
720680 multiSignedByAdmins
721681 }
722682 }
723683

github/deemru/w8io/786bc32 
150.02 ms