tx · G97pwnfE9KKKuycUTPZt4LAFsurX2uCx87XmdZT6i4wr

3MqK3QivUqcHSqrFc9xujtfQm5V23muXK8V:  -0.14000000 Waves

2022.05.30 15:59 [2074428] smart account 3MqK3QivUqcHSqrFc9xujtfQm5V23muXK8V > SELF 0.00000000 Waves

{ "type": 13, "id": "G97pwnfE9KKKuycUTPZt4LAFsurX2uCx87XmdZT6i4wr", "fee": 14000000, "feeAssetId": null, "timestamp": 1653915542589, "version": 2, "chainId": 84, "sender": "3MqK3QivUqcHSqrFc9xujtfQm5V23muXK8V", "senderPublicKey": "fQPbnv8c6teuJQb4xTtny9SsaxUFGZsANEVjZaNDWdj", "proofs": [ "5KekkZtUBLTMgXFv9STngC71XFNaPyK6gpE7dqscZkAak7JvnBPbdZtoCFJBBK2Q5vrQcTGifFAzSKj7Mnfqd2Hk", "2uqEHU8CyZEFTg2VvXiFoyAqbRtC5aRTNFZzNv9VQXcNnhg3pMdPmTk6h5x1S9Fx2ZshPSvC5aKmBzNGxUYwQnU5" ], "script": "base64:AAIFAAAAAAAAADAIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgASBQoDBAEIEgAAAABaAAAAAAd2ZXJzaW9uAgAAAAUxLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa0JhbGFuY2VJbml0QQIAAAAMQV9hc3NldF9pbml0AAAAAA1rQmFsYW5jZUluaXRCAgAAAAxCX2Fzc2V0X2luaXQAAAAADWtTaGFyZUFzc2V0SWQCAAAADnNoYXJlX2Fzc2V0X2lkAAAAABFrU2hhcmVBc3NldFN1cHBseQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAARrRmVlAgAAAApjb21taXNzaW9uAAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA1rRmlyc3RIYXJ2ZXN0AgAAAA1maXJzdF9oYXJ2ZXN0AAAAABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAALa1NoYXJlTGltaXQCAAAAHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAAAAAC2tCYXNlUGVyaW9kAgAAAAtiYXNlX3BlcmlvZAAAAAANa1BlcmlvZExlbmd0aAIAAAANcGVyaW9kX2xlbmd0aAAAAAAMa1N0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAADGtVU0ROQWRkcmVzcwIAAAAYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAAAAAxrRVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAAxrTGVhc2luZ1Bvb2wCAAAAD2xlYXNpbmdfYWRkcmVzcwAAAAAOa0xlYXNpbmdBbW91bnQCAAAADmxlYXNpbmdfYW1vdW50AAAAAAprTGVhc2luZ0lkAgAAAApsZWFzaW5nX2lkAAAAAAprRGlzY291bnRzAgAAAAlkaXNjb3VudHMAAAAAD2tEaXNjb3VudFZhbHVlcwIAAAAPZGlzY291bnRfdmFsdWVzAAAAAA5rVXNlclN3b3BJbkdvdgIAAAAMX1NXT1BfYW1vdW50AAAAAA1rQWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAANa0FkbWluUHViS2V5MgIAAAALYWRtaW5fcHViXzIAAAAADWtBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABJrQWRtaW5JbnZva2VQdWJLZXkCAAAAEGFkbWluX2ludm9rZV9wdWIAAAAAEGtNb25leUJveEFkZHJlc3MCAAAAEW1vbmV5X2JveF9hZGRyZXNzAAAAAAtrR292QWRkcmVzcwIAAAASZ292ZXJuYW5jZV9hZGRyZXNzAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZvcmFjbGUFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAEJAAEsAAAAAgUAAAADa2V5AgAAAAhpcyBlbXB0eQAAAAAMYWRtaW5QdWJLZXkxCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTEAAAAADGFkbWluUHViS2V5MgkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkyAAAAAAxhZG1pblB1YktleTMJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MwAAAAARYWRtaW5JbnZva2VQdWJLZXkJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAASa0FkbWluSW52b2tlUHViS2V5AAAAAA9tb25leUJveEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkB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YWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAANc3Rha2VkQW1vdW50QgAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQQUAAAANc3Rha2VkQW1vdW50QQAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgUAAAANc3Rha2VkQW1vdW50QgAAAAAQaGFzRW5vdWdoQmFsYW5jZQMJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEJAABnAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIHAQAAAAxnZXRBc3NldEluZm8AAAABAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwBAAAAAhzdHJpbmdJZAkAAlgAAAABBQAAAAJpZAQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAAAmlkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAhzdHJpbmdJZAIAAAAOIGRvZXNuJ3QgZXhpc3QJAAUVAAAAAwUAAAAIc3RyaW5nSWQIBQAAAARpbmZvAAAABG5hbWUIBQAAAARpbmZvAAAACGRlY2ltYWxzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAkABRUAAAADAgAAAAVXQVZFUwIAAAAFV0FWRVMAAAAAAAAAAAgJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAAFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcAAAABAAAACGFzc2V0U3RyAwkAAAAAAAACBQAAAAhhc3NldFN0cgIAAAAFV0FWRVMJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAIBAAAAAhzdHJpbmdJZAUAAAAIYXNzZXRTdHIEAAAAAmlkCQACWQAAAAEFAAAACGFzc2V0U3RyBAAAAARpbmZvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAACaWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAFAAAACHN0cmluZ0lkAgAAAA4gZG9lc24ndCBleGlzdAkABRUAAAADBQAAAAhzdHJpbmdJZAgFAAAABGluZm8AAAAEbmFtZQgFAAAABGluZm8AAAAIZGVjaW1hbHMBAAAAB3N1c3BlbmQAAAABAAAABWNhdXNlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAZrQ2F1c2UFAAAABWNhdXNlBQAAAANuaWwBAAAAGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwAAAAIAAAAFc3Rha2UAAAAHYXNzZXRJZAMFAAAABXN0YWtlAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAFFAAAAAICAAAADGxvY2tOZXV0cmlubwUAAAASc3Rha2luZ1VTRE5BZGRyZXNzCQAFFAAAAAICAAAADHN0YXJ0U3Rha2luZwUAAAASc3Rha2luZ0VVUk5BZGRyZXNzAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAARVU0ROCQAFFAAAAAICAAAADnVubG9ja05ldXRyaW5vBQAAABJzdGFraW5nVVNETkFkZHJlc3MJAAUUAAAAAgIAAAALc3RvcFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwEAAAARY2FsY1N0YWtpbmdQYXJhbXMAAAADAAAABXN0YWtlAAAABmFtb3VudAAAAAdhc3NldElkAwUAAAAFc3Rha2UEAAAACyR0MDYyOTA2MzU2CQEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgUAAAAFc3Rha2UFAAAAB2Fzc2V0SWQEAAAABGNhbGwIBQAAAAskdDA2MjkwNjM1NgAAAAJfMQQAAAALc3Rha2luZ0FkZHIIBQAAAAskdDA2MjkwNjM1NgAAAAJfMgkABRYAAAAEBQAAAARjYWxsBQAAAAtzdGFr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Em1pbkFtb3VudFRvUmVjZWl2ZQAAAAl0b2tlbkZyb20AAAAHdG9rZW5UbwAAAAZjYWxsZXIEAAAAEGFtb3VudFdpdGhvdXRGZWUJAABrAAAAAwUAAAAHdG9rZW5UbwUAAAAJcG10QW1vdW50CQAAZAAAAAIFAAAACXBtdEFtb3VudAUAAAAJdG9rZW5Gcm9tBAAAAAtmZWVEaXNjb3VudAkBAAAAFGNhbGN1bGF0ZUZlZURpc2NvdW50AAAAAQUAAAAGY2FsbGVyBAAAAA1hbW91bnRXaXRoRmVlCQEAAAAIZnJhY3Rpb24AAAAECQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgUAAAAJZmVlU2NhbGU2BQAAAANmZWUFAAAACWZlZVNjYWxlNgUAAAALZmVlRGlzY291bnQAAAAAAAAAAGQFAAAAB0NFSUxJTkcEAAAAEGdvdmVybmFuY2VSZXdhcmQJAQAAAAhmcmFjdGlvbgAAAAQJAABrAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANZmVlR292ZXJuYW5jZQUAAAAJZmVlU2NhbGU2BQAAAAtmZWVEaXNjb3VudAAAAAAAAAAAZAUAAAAHQ0VJTElORwMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAA1hbW91bnRXaXRoRmVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHUNhbGN1bGF0ZWQgYW1vdW50IHRvIHJlY2VpdmUgCQABpAAAAAEFAAAADWFtb3VudFdpdGhGZWUCAAAAICBpcyBsZXNzIHRoYW4gc3BlY2lmaWVkIG1pbmltdW0gCQABpAAAAAEFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkABRUAAAADBQAAABBhbW91bnRXaXRob3V0RmVlBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAJAQAAAAdzdXNwZW5kAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAA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DEJvb2xlYW5FbnRyeQAAAAIFAAAADWtGaXJzdEhhcnZlc3QFAAAADGZpcnN0SGFydmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa0ZpcnN0SGFydmVzdEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAkAAGgAAAACBQAAABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFAAAADHBlcmlvZExlbmd0aAUAAAADbmlsBQAAAAliYXNlRW50cnkJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABFpbml0V2l0aEluaXRSYXRpbwAAAAUAAAAJYW10QXNzZXRBAAAACWFtdEFzc2V0QgAAAAtzdHJBc3NldElkQQAAAAtzdHJBc3NldElkQgAAAAxmaXJzdEhhcnZlc3QEAAAADSR0MDExNjE1MTE3MDIJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTE2MTUxMTcwMgAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDExNjE1MTE3MDIAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDExNjE1MTE3MDIAAAACXzMEAAAADSR0MDExNzA3MTE3OTQJAQAAABZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAAAAAQUAAAALc3RyQXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTE3MDcxMTc5NAAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDExNzA3MTE3OTQAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDExNzA3MTE3OTQAAAACXzMDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzCQAETAAAAAIFAAAAEWFkbWluSW52b2tlUHViS2V5BQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQEAAAAJaXNEZWZpbmVkAAAAAQkABBsAAAACBQAAAAR0aGlzBQAAAAdrQWN0aXZlCQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBBQAAAAtzdHJBc3NldElkQgkAAAIAAAABAgAAABhBc3NldHMgbXVzdCBiZSBkaWZmZXJlbnQEAAAACXNoYXJlTmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAABcwkAAS8AAAACBQAAAA1wbXRBc3NldE5hbWVBAAAAAAAAAAAHAgAAAAFfCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUIAAAAAAAAAAAcEAAAAEHNoYXJlRGVzY3JpcHRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQAAAA1wbXRBc3NldE5hbWVBAgAAAAUgYW5kIAUAAAANcG10QXNzZXROYW1lQgIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAABHRoaXMEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAASc2hhcmVJbml0aWFsU3VwcGx5AAAAAAAAAAAABAAAAApzaGFyZUlzc3VlCQAEQgAAAAUFAAAACXNoYXJlTmFtZQUAAAAQc2hhcmVEZXNjcmlwdGlvbgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAA1zaGFyZURlY2ltYWxzBgQAAAAMc2hhcmVJc3N1ZUlkCQAEOAAAAAEFAAAACnNoYXJlSXNzdWUEAAAACWJhc2VFbnRyeQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rQmFsYW5jZUluaXRBBQAAAAlhbXRBc3NldEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtCYWxhbmNlSW5pdEIFAAAACWFtdEFzc2V0QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfY3BtbQkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAANuaWwDBQAAAAxmaXJzdEhhcnZlc3QJAAROAAAAAgUAAAAJYmFzZUVudHJ5CQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA1rRmlyc3RIYXJ2ZXN0BQAAAAxmaXJzdEhhcnZlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tGaXJzdEhhcnZlc3RIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQJAABoAAAAAgUAAAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQAAAAxwZXJpb2RMZW5ndGgFAAAAA25pbAUAAAAJYmFzZUVudHJ5AAAAAWkBAAAAGGtlZXBMaW1pdEZvckZpcnN0SGFydmVzdAAAAAEAAAAKc2hhcmVMaW1pdAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAARYWRtaW5JbnZva2VQdWJLZXkFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa1NoYXJlTGltaXQFAAAACnNoYXJlTGltaXQFAAAAA25pbAAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAALcG10QXNzZXRJZEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAC3BtdEFzc2V0SWRCCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACnBtdEFtb3VudEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAQAAAANJHQwMTQxNzMxNDI1MAkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDE0MTczMTQyNTAAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxNDE3MzE0MjUwAAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxNDE3MzE0MjUwAAAAAl8zBAAAAA0kdDAxNDI1NTE0MzMyCQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTQyNTUxNDMzMgAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDE0MjU1MTQzMzIAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDE0MjU1MTQzMzIAAAACXzMEAAAABmluaXRhbAMDCQAAAAAAAAIFAAAACGJhbGFuY2VBAAAAAAAAAAAACQAAAAAAAAIFAAAACGJhbGFuY2VCAAAAAAAAAAAABwYHBAAAAAp0b2tlblJhdGlvAwUAAAAGaW5pdGFsCQAAawAAAAMJAABrAAAAAwUAAAAKYXNzZXRJbml0QQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACmFzc2V0SW5pdEIFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRCCQAAawAAAAMJAABrAAAAAwUAAAAIYmFsYW5jZUEFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlMwkAAGsAAAADBQAAAAhiYWxhbmNlQgUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEIEAAAADXNoYXJlRGVjaW1hbHMJAABpAAAAAgkAAGQAAAACBQAAAAxwbXREZWNpbWFsc0EFAAAADHBtdERlY2ltYWxzQgAAAAAAAAAAAgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AwUAAAAGaW5pdGFsCQAAawAAAAMJAABsAAAABgUAAAAKcG10QW1vdW50QQUAAAAMcG10RGVjaW1hbHNBAAAAAAAAAAAFAAAAAAAAAAABBQAAAAxwbXREZWNpbWFsc0EFAAAABERPV04JAABsAAAABgUAAAAKcG10QW1vdW50QgUAAAAMcG10RGVjaW1hbHNCAAAAAAAAAAAFAAAAAAAAAAABBQAAAAxwbXREZWNpbWFsc0IFAAAABERPV04JAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAUAAAANc2hhcmVEZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAERE9XTgkAAGsAAAADCQABlwAAAAEJAARMAAAAAgkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEJAARMAAAAAgkAAGsAAAADBQAAAApwbXRBbW91bnRCBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAALc2NhbGVWYWx1ZTgDAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKVNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgCQABpAAAAAEFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyAgAAABYgaW5jbHVzaXZlbHkuIEFjdHVhbDogCQABpAAAAAEFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRBBQAAAAhhc3NldElkQQYJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRCBQAAAAhhc3NldElkQgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACVJbmNvcnJlY3QgYXNzZXRzIGF0dGFjaGVkLiBFeHBlY3RlZDogBQAAAAtzdHJBc3NldElkQQIAAAAFIGFuZCAFAAAAC3N0ckFzc2V0SWRCAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZQAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAtzY2FsZVZhbHVlMwkAAGQAAAACBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAABAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOcG10U3RyQXNzZXRJZEEJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACnBtdEFtb3VudEEJAARMAAAAAgUAAAAOcG10U3RyQXNzZXRJZEEFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADnBtdFN0ckFzc2V0SWRCCQAD/AAAAAQFAAAABHRo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AAALYXNzZXRJZFNlbmQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQQQAAAANJHQwMjAyNTYyMDM4OAkBAAAADWNhbGN1bGF0ZUZlZXMAAAAFBQAAAAlwbXRBbW91bnQFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAIYmFsYW5jZUIFAAAACGJhbGFuY2VBCAUAAAABaQAAAAZjYWxsZXIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAyMDI1NjIwMzg4AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMjAyNTYyMDM4OAAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDIwMjU2MjAzODgAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQEAAAAC25ld0JhbGFuY2VCCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAAtzdHJBc3NldElkQQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgcJAARMAAAAAgkAAGQAAAACBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAETAAAAAIFAAAAC3N0ckFzc2V0SWRBBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UxBQAAAAZzdGFrZTEEAAAABnN0YWtlMgMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAAtzdHJBc3NldElkQgkAA/wAAAAEBQAA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AAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAADGxhc3RfaW5jb21lXwUAAAALc3RyQXNzZXRJZEIFAAAADWFtb3VudEVucm9sbEIFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADHN0YWtlVW5zdGFrZQAAAAMAAAAFc3Rha2UAAAAGYW1vdW50AAAADWFzc2V0SWRTdHJpbmcDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAtT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGludm9rZSB0aGlzIGZ1bmN0aW9uAwkAAAAAAAACBQAAAA1hc3NldElkU3RyaW5nAgAAAAVXQVZFUwQAAAAEcG9vbAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABm9yYWNsZQUAAAAMa0xlYXNpbmdQb29sAgAAABlObyBsZWFzaW5nIHBvb2wgaW4gb3JhY2xlBAAAAAlsZWFzaW5nSWQJAAQcAAAAAgUAAAAEdGhpcwUAAAAKa0xlYXNpbmdJZAQAAAANbGVhc2luZ0Ftb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA5rTGVhc2luZ0Ftb3VudAAAAAAAAAAAAAQAAAAObmV3TGVhc2VBbW91bnQDBQAAAAVzdGFrZQkAAGQAAAACBQAAAA1sZWFzaW5nQW1vdW50BQAAAAZhbW91bnQJAABlAAAAAgUAAAANbGVhc2luZ0Ftb3VudAUAAAAGYW1vdW50BAAAAAhuZXdMZWFzZQkABEQAAAACBQAAAARwb29sBQAAAA5uZXdMZWFzZUFtb3VudAQAAAAKbmV3TGVhc2VJZAkABDkAAAABBQAAAAhuZXdMZWFzZQQAAAAIYmFzZUV0cnkJAARMAAAAAgUAAAAIbmV3TGVhc2UJAARMAAAAAgkBAAAAC0JpbmFyeUVudHJ5AAAAAgUAAAAKa0xl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", "height": 2074428, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F4ZmAzEeoFNHPtXaFL1ELD2d1FTsraRhJ9gBzeTY1SAK Next: 695ozuDYJefsktSe848AaSrqoVgrM9yaJLHoTFFgqjnv Diff:
OldNewDifferences
294294
295295 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,caller) = {
296296 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
297- let amountWithFee = fraction(fraction(amountWithoutFee, (feeScale6 - fee), feeScale6), calculateFeeDiscount(caller), 100, CEILING)
298- let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
297+ let feeDiscount = calculateFeeDiscount(caller)
298+ let amountWithFee = fraction(fraction(amountWithoutFee, (feeScale6 - fee), feeScale6), feeDiscount, 100, CEILING)
299+ let governanceReward = fraction(fraction(amountWithoutFee, feeGovernance, feeScale6), feeDiscount, 100, CEILING)
299300 if ((minAmountToReceive > amountWithFee))
300301 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
301302 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
312313
313314 @Callable(i)
314315 func init (firstHarvest) = {
315- let $t087208797 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
316- let pmtAmountA = $t087208797._1
317- let pmtAssetIdA = $t087208797._2
318- let $t088028879 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
319- let pmtAmountB = $t088028879._1
320- let pmtAssetIdB = $t088028879._2
321- let $t088848961 = getAssetInfo(pmtAssetIdA)
322- let pmtStrAssetIdA = $t088848961._1
323- let pmtAssetNameA = $t088848961._2
324- let pmtDecimalsA = $t088848961._3
325- let $t089669043 = getAssetInfo(pmtAssetIdB)
326- let pmtStrAssetIdB = $t089669043._1
327- let pmtAssetNameB = $t089669043._2
328- let pmtDecimalsB = $t089669043._3
316+ let $t087878864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
317+ let pmtAmountA = $t087878864._1
318+ let pmtAssetIdA = $t087878864._2
319+ let $t088698946 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
320+ let pmtAmountB = $t088698946._1
321+ let pmtAssetIdB = $t088698946._2
322+ let $t089519028 = getAssetInfo(pmtAssetIdA)
323+ let pmtStrAssetIdA = $t089519028._1
324+ let pmtAssetNameA = $t089519028._2
325+ let pmtDecimalsA = $t089519028._3
326+ let $t090339110 = getAssetInfo(pmtAssetIdB)
327+ let pmtStrAssetIdB = $t090339110._1
328+ let pmtAssetNameB = $t090339110._2
329+ let pmtDecimalsB = $t090339110._3
329330 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
330331 then throw("Only admin can call this function")
331332 else if (isDefined(getBoolean(this, kActive)))
367368
368369 @Callable(i)
369370 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
370- let $t01154811635 = getAssetInfoFromString(strAssetIdA)
371- let pmtStrAssetIdA = $t01154811635._1
372- let pmtAssetNameA = $t01154811635._2
373- let pmtDecimalsA = $t01154811635._3
374- let $t01164011727 = getAssetInfoFromString(strAssetIdB)
375- let pmtStrAssetIdB = $t01164011727._1
376- let pmtAssetNameB = $t01164011727._2
377- let pmtDecimalsB = $t01164011727._3
371+ let $t01161511702 = getAssetInfoFromString(strAssetIdA)
372+ let pmtStrAssetIdA = $t01161511702._1
373+ let pmtAssetNameA = $t01161511702._2
374+ let pmtDecimalsA = $t01161511702._3
375+ let $t01170711794 = getAssetInfoFromString(strAssetIdB)
376+ let pmtStrAssetIdB = $t01170711794._1
377+ let pmtAssetNameB = $t01170711794._2
378+ let pmtDecimalsB = $t01170711794._3
378379 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
379380 then throw("Only admin can call this function")
380381 else if (isDefined(getBoolean(this, kActive)))
410411 let pmtAssetIdB = i.payments[1].assetId
411412 let pmtAmountA = i.payments[0].amount
412413 let pmtAmountB = i.payments[1].amount
413- let $t01410614183 = getAssetInfo(pmtAssetIdA)
414- let pmtStrAssetIdA = $t01410614183._1
415- let pmtAssetNameA = $t01410614183._2
416- let pmtDecimalsA = $t01410614183._3
417- let $t01418814265 = getAssetInfo(pmtAssetIdB)
418- let pmtStrAssetIdB = $t01418814265._1
419- let pmtAssetNameB = $t01418814265._2
420- let pmtDecimalsB = $t01418814265._3
414+ let $t01417314250 = getAssetInfo(pmtAssetIdA)
415+ let pmtStrAssetIdA = $t01417314250._1
416+ let pmtAssetNameA = $t01417314250._2
417+ let pmtDecimalsA = $t01417314250._3
418+ let $t01425514332 = getAssetInfo(pmtAssetIdB)
419+ let pmtStrAssetIdB = $t01425514332._1
420+ let pmtAssetNameB = $t01425514332._2
421+ let pmtDecimalsB = $t01425514332._3
421422 let inital = if (if ((balanceA == 0))
422423 then (balanceB == 0)
423424 else false)
469470
470471 @Callable(i)
471472 func withdraw () = valueOrElse(isActive(), {
472- let $t01706517140 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473- let pmtAmount = $t01706517140._1
474- let pmtAssetId = $t01706517140._2
473+ let $t01713217207 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01713217207._1
475+ let pmtAssetId = $t01713217207._2
475476 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
476477 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
477478 if ((size(i.payments) != 1))
501502
502503 @Callable(i)
503504 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
504- let $t01843918514 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
505- let pmtAmount = $t01843918514._1
506- let pmtAssetId = $t01843918514._2
505+ let $t01850618581 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
506+ let pmtAmount = $t01850618581._1
507+ let pmtAssetId = $t01850618581._2
507508 if (if ((balanceA == 0))
508509 then true
509510 else (balanceB == 0))
517518 else if ((pmtAssetId == assetIdA))
518519 then {
519520 let assetIdSend = assetIdB
520- let $t01906519197 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.caller)
521- let amountWithoutFee = $t01906519197._1
522- let amountWithFee = $t01906519197._2
523- let governanceReward = $t01906519197._3
521+ let $t01913219264 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.caller)
522+ let amountWithoutFee = $t01913219264._1
523+ let amountWithFee = $t01913219264._2
524+ let governanceReward = $t01913219264._3
524525 let newBalanceA = (balanceA + pmtAmount)
525526 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
526527 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
540541 else if ((pmtAssetId == assetIdB))
541542 then {
542543 let assetIdSend = assetIdA
543- let $t02018920321 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.caller)
544- let amountWithoutFee = $t02018920321._1
545- let amountWithFee = $t02018920321._2
546- let governanceReward = $t02018920321._3
544+ let $t02025620388 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.caller)
545+ let amountWithoutFee = $t02025620388._1
546+ let amountWithFee = $t02025620388._2
547+ let governanceReward = $t02025620388._3
547548 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
548549 let newBalanceB = (balanceB + pmtAmount)
549550 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
638639 }
639640 }
640641 else {
641- let $t02407524178 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
642- let call = $t02407524178._1
643- let addr = $t02407524178._2
644- let params = $t02407524178._3
645- let payments = $t02407524178._4
642+ let $t02414224245 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
643+ let call = $t02414224245._1
644+ let addr = $t02414224245._2
645+ let params = $t02414224245._3
646+ let payments = $t02414224245._4
646647 let inv = invoke(addr, call, params, payments)
647648 if ((inv == inv))
648649 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kBalanceInitA = "A_asset_init"
1919
2020 let kBalanceInitB = "B_asset_init"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kFirstHarvest = "first_harvest"
3131
3232 let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
4242 let kUSDNAddress = "staking_usdnnsbt_address"
4343
4444 let kEURNAddress = "staking_eurn_address"
4545
4646 let kLeasingPool = "leasing_address"
4747
4848 let kLeasingAmount = "leasing_amount"
4949
5050 let kLeasingId = "leasing_id"
5151
5252 let kDiscounts = "discounts"
5353
5454 let kDiscountValues = "discount_values"
5555
5656 let kUserSwopInGov = "_SWOP_amount"
5757
5858 let kAdminPubKey1 = "admin_pub_1"
5959
6060 let kAdminPubKey2 = "admin_pub_2"
6161
6262 let kAdminPubKey3 = "admin_pub_3"
6363
6464 let kAdminInvokePubKey = "admin_invoke_pub"
6565
6666 let kMoneyBoxAddress = "money_box_address"
6767
6868 let kGovAddress = "governance_address"
6969
7070 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7171
7272 func getBase58FromOracle (key) = match getString(oracle, key) {
7373 case string: String =>
7474 fromBase58String(string)
7575 case nothing =>
7676 throw((key + "is empty"))
7777 }
7878
7979
8080 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8181
8282 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8383
8484 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8585
8686 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
8787
8888 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8989
9090 let govAddress = Address(getBase58FromOracle(kGovAddress))
9191
9292 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
9393
9494 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
9595
9696 let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
9797
9898 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
9999
100100 let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(EURN)]
101101
102102 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
103103
104104 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
105105
106106 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
107107
108108 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
109109
110110 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
111111
112112 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
113113
114114 let active = getBooleanValue(this, kActive)
115115
116116 let strAssetIdA = getStringValue(this, kAssetIdA)
117117
118118 let strAssetIdB = getStringValue(this, kAssetIdB)
119119
120120 let assetIdA = if ((strAssetIdA == "WAVES"))
121121 then unit
122122 else fromBase58String(strAssetIdA)
123123
124124 let assetIdB = if ((strAssetIdB == "WAVES"))
125125 then unit
126126 else fromBase58String(strAssetIdB)
127127
128128 let assetNameA = match assetIdA {
129129 case id: ByteVector =>
130130 value(assetInfo(id)).name
131131 case waves: Unit =>
132132 "WAVES"
133133 case _ =>
134134 throw("Match error")
135135 }
136136
137137 let assetNameB = match assetIdB {
138138 case id: ByteVector =>
139139 value(assetInfo(id)).name
140140 case waves: Unit =>
141141 "WAVES"
142142 case _ =>
143143 throw("Match error")
144144 }
145145
146146 let balanceA = getIntegerValue(this, kBalanceA)
147147
148148 let balanceB = getIntegerValue(this, kBalanceB)
149149
150150 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
151151
152152 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
153153
154154 let fee = getIntegerValue(this, kFee)
155155
156156 let feeGovernance = fraction(fee, 40, 100)
157157
158158 let feeScale6 = 1000000
159159
160160 let scaleValue3 = 1000
161161
162162 let scaleValue8 = 100000000
163163
164164 let slippageToleranceDelimiter = 1000
165165
166166 let scaleValue8Digits = 8
167167
168168 func accountBalance (assetId) = match assetId {
169169 case id: ByteVector =>
170170 assetBalance(this, id)
171171 case waves: Unit =>
172172 wavesBalance(this).available
173173 case _ =>
174174 throw("Match error")
175175 }
176176
177177
178178 func stakedAmount (assetId) = {
179179 let stakedAmountCalculated = match assetId {
180180 case aId: ByteVector =>
181181 if ((aId == USDN))
182182 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
183183 else if ((aId == EURN))
184184 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
185185 else 0
186186 case _: Unit =>
187187 valueOrElse(getInteger(this, kLeasingAmount), 0)
188188 case _ =>
189189 throw("Match error")
190190 }
191191 match stakedAmountCalculated {
192192 case i: Int =>
193193 i
194194 case _ =>
195195 0
196196 }
197197 }
198198
199199
200200 let stakedAmountA = stakedAmount(assetIdA)
201201
202202 let stakedAmountB = stakedAmount(assetIdB)
203203
204204 let assetInitA = getIntegerValue(this, kBalanceInitA)
205205
206206 let assetInitB = getIntegerValue(this, kBalanceInitB)
207207
208208 let availableBalanceA = (balanceA - stakedAmountA)
209209
210210 let availableBalanceB = (balanceB - stakedAmountB)
211211
212212 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213213
214214 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215215
216216 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217217 then (accountBalanceWithStakedB >= balanceB)
218218 else false
219219
220220 func getAssetInfo (assetId) = match assetId {
221221 case id: ByteVector =>
222222 let stringId = toBase58String(id)
223223 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
224224 $Tuple3(stringId, info.name, info.decimals)
225225 case waves: Unit =>
226226 $Tuple3("WAVES", "WAVES", 8)
227227 case _ =>
228228 throw("Match error")
229229 }
230230
231231
232232 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
233233 then $Tuple3("WAVES", "WAVES", 8)
234234 else {
235235 let stringId = assetStr
236236 let id = fromBase58String(assetStr)
237237 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
238238 $Tuple3(stringId, info.name, info.decimals)
239239 }
240240
241241
242242 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
243243
244244
245245 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
246246 then if ((assetId == USDN))
247247 then $Tuple2("lockNeutrino", stakingUSDNAddress)
248248 else $Tuple2("startStaking", stakingEURNAddress)
249249 else if ((assetId == USDN))
250250 then $Tuple2("unlockNeutrino", stakingUSDNAddress)
251251 else $Tuple2("stopStaking", stakingEURNAddress)
252252
253253
254254 func calcStakingParams (stake,amount,assetId) = if (stake)
255255 then {
256256 let $t062906356 = calcStakingFuncAndAddres(stake, assetId)
257257 let call = $t062906356._1
258258 let stakingAddr = $t062906356._2
259259 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
260260 }
261261 else {
262262 let $t064426508 = calcStakingFuncAndAddres(stake, assetId)
263263 let call = $t064426508._1
264264 let stakingAddr = $t064426508._2
265265 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
266266 }
267267
268268
269269 func calculateFeeDiscount (userAddr) = {
270270 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
271271 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
272272 let discounts = split(getStringValue(oracle, kDiscounts), ",")
273273 if (if ((swopAmount >= parseIntValue(discountValues[0])))
274274 then (parseIntValue(discountValues[1]) > swopAmount)
275275 else false)
276276 then (100 - parseIntValue(discounts[0]))
277277 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
278278 then (parseIntValue(discountValues[2]) > swopAmount)
279279 else false)
280280 then (100 - parseIntValue(discounts[1]))
281281 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
282282 then (parseIntValue(discountValues[3]) > swopAmount)
283283 else false)
284284 then (100 - parseIntValue(discounts[2]))
285285 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
286286 then (parseIntValue(discountValues[4]) > swopAmount)
287287 else false)
288288 then (100 - parseIntValue(discounts[3]))
289289 else if ((swopAmount >= parseIntValue(discountValues[4])))
290290 then (100 - parseIntValue(discounts[4]))
291291 else 100
292292 }
293293
294294
295295 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,caller) = {
296296 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
297- let amountWithFee = fraction(fraction(amountWithoutFee, (feeScale6 - fee), feeScale6), calculateFeeDiscount(caller), 100, CEILING)
298- let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
297+ let feeDiscount = calculateFeeDiscount(caller)
298+ let amountWithFee = fraction(fraction(amountWithoutFee, (feeScale6 - fee), feeScale6), feeDiscount, 100, CEILING)
299+ let governanceReward = fraction(fraction(amountWithoutFee, feeGovernance, feeScale6), feeDiscount, 100, CEILING)
299300 if ((minAmountToReceive > amountWithFee))
300301 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
301302 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
302303 }
303304
304305
305306 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
306307
307308
308309 func isActive () = if (active)
309310 then unit
310311 else throw("DApp is inactive at this moment")
311312
312313
313314 @Callable(i)
314315 func init (firstHarvest) = {
315- let $t087208797 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
316- let pmtAmountA = $t087208797._1
317- let pmtAssetIdA = $t087208797._2
318- let $t088028879 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
319- let pmtAmountB = $t088028879._1
320- let pmtAssetIdB = $t088028879._2
321- let $t088848961 = getAssetInfo(pmtAssetIdA)
322- let pmtStrAssetIdA = $t088848961._1
323- let pmtAssetNameA = $t088848961._2
324- let pmtDecimalsA = $t088848961._3
325- let $t089669043 = getAssetInfo(pmtAssetIdB)
326- let pmtStrAssetIdB = $t089669043._1
327- let pmtAssetNameB = $t089669043._2
328- let pmtDecimalsB = $t089669043._3
316+ let $t087878864 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
317+ let pmtAmountA = $t087878864._1
318+ let pmtAssetIdA = $t087878864._2
319+ let $t088698946 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
320+ let pmtAmountB = $t088698946._1
321+ let pmtAssetIdB = $t088698946._2
322+ let $t089519028 = getAssetInfo(pmtAssetIdA)
323+ let pmtStrAssetIdA = $t089519028._1
324+ let pmtAssetNameA = $t089519028._2
325+ let pmtDecimalsA = $t089519028._3
326+ let $t090339110 = getAssetInfo(pmtAssetIdB)
327+ let pmtStrAssetIdB = $t090339110._1
328+ let pmtAssetNameB = $t090339110._2
329+ let pmtDecimalsB = $t090339110._3
329330 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
330331 then throw("Only admin can call this function")
331332 else if (isDefined(getBoolean(this, kActive)))
332333 then throw("DApp is already active")
333334 else if ((pmtAssetIdA == pmtAssetIdB))
334335 then throw("Assets must be different")
335336 else {
336337 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
337338 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
338339 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
339340 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
340341 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
341342 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
342343 let shareInitialSupply = fraction(arg1, arg2, arg3)
343344 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
344345 let shareIssueId = calculateAssetId(shareIssue)
345346 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
346347 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
347348 else 0
348349 if ((stake1 == stake1))
349350 then {
350351 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
351352 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
352353 else 0
353354 if ((stake2 == stake2))
354355 then {
355356 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)]
356357 if (firstHarvest)
357358 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
358359 else baseEntry
359360 }
360361 else throw("Strict value is not equal to itself.")
361362 }
362363 else throw("Strict value is not equal to itself.")
363364 }
364365 }
365366
366367
367368
368369 @Callable(i)
369370 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
370- let $t01154811635 = getAssetInfoFromString(strAssetIdA)
371- let pmtStrAssetIdA = $t01154811635._1
372- let pmtAssetNameA = $t01154811635._2
373- let pmtDecimalsA = $t01154811635._3
374- let $t01164011727 = getAssetInfoFromString(strAssetIdB)
375- let pmtStrAssetIdB = $t01164011727._1
376- let pmtAssetNameB = $t01164011727._2
377- let pmtDecimalsB = $t01164011727._3
371+ let $t01161511702 = getAssetInfoFromString(strAssetIdA)
372+ let pmtStrAssetIdA = $t01161511702._1
373+ let pmtAssetNameA = $t01161511702._2
374+ let pmtDecimalsA = $t01161511702._3
375+ let $t01170711794 = getAssetInfoFromString(strAssetIdB)
376+ let pmtStrAssetIdB = $t01170711794._1
377+ let pmtAssetNameB = $t01170711794._2
378+ let pmtDecimalsB = $t01170711794._3
378379 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
379380 then throw("Only admin can call this function")
380381 else if (isDefined(getBoolean(this, kActive)))
381382 then throw("DApp is already active")
382383 else if ((strAssetIdA == strAssetIdB))
383384 then throw("Assets must be different")
384385 else {
385386 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
386387 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
387388 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
388389 let shareInitialSupply = 0
389390 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
390391 let shareIssueId = calculateAssetId(shareIssue)
391392 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)]
392393 if (firstHarvest)
393394 then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
394395 else baseEntry
395396 }
396397 }
397398
398399
399400
400401 @Callable(i)
401402 func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.callerPublicKey)))
402403 then throw("Only admin can call this function")
403404 else [IntegerEntry(kShareLimit, shareLimit)])
404405
405406
406407
407408 @Callable(i)
408409 func replenishWithTwoTokens (slippageTolerance) = valueOrElse(isActive(), {
409410 let pmtAssetIdA = i.payments[0].assetId
410411 let pmtAssetIdB = i.payments[1].assetId
411412 let pmtAmountA = i.payments[0].amount
412413 let pmtAmountB = i.payments[1].amount
413- let $t01410614183 = getAssetInfo(pmtAssetIdA)
414- let pmtStrAssetIdA = $t01410614183._1
415- let pmtAssetNameA = $t01410614183._2
416- let pmtDecimalsA = $t01410614183._3
417- let $t01418814265 = getAssetInfo(pmtAssetIdB)
418- let pmtStrAssetIdB = $t01418814265._1
419- let pmtAssetNameB = $t01418814265._2
420- let pmtDecimalsB = $t01418814265._3
414+ let $t01417314250 = getAssetInfo(pmtAssetIdA)
415+ let pmtStrAssetIdA = $t01417314250._1
416+ let pmtAssetNameA = $t01417314250._2
417+ let pmtDecimalsA = $t01417314250._3
418+ let $t01425514332 = getAssetInfo(pmtAssetIdB)
419+ let pmtStrAssetIdB = $t01425514332._1
420+ let pmtAssetNameB = $t01425514332._2
421+ let pmtDecimalsB = $t01425514332._3
421422 let inital = if (if ((balanceA == 0))
422423 then (balanceB == 0)
423424 else false)
424425 then true
425426 else false
426427 let tokenRatio = if (inital)
427428 then fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
428429 else fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
429430 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
430431 let shareTokenToPayAmount = if (inital)
431432 then fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
432433 else fraction(min([fraction(pmtAmountA, scaleValue8, balanceA), fraction(pmtAmountB, scaleValue8, balanceB)]), shareAssetSupply, scaleValue8)
433434 if (if ((0 > slippageTolerance))
434435 then true
435436 else (slippageTolerance > slippageToleranceDelimiter))
436437 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
437438 else if ((size(i.payments) != 2))
438439 then throw("Two attached assets expected")
439440 else if (if ((pmtAssetIdA != assetIdA))
440441 then true
441442 else (pmtAssetIdB != assetIdB))
442443 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
443444 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
444445 then true
445446 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
446447 then throw("Incorrect assets amount: amounts must have the contract ratio")
447448 else if ((shareTokenToPayAmount == 0))
448449 then throw("Too small amount to replenish")
449450 else if (!(hasEnoughBalance))
450451 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
451452 else {
452453 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
453454 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
454455 else 0
455456 if ((stake1 == stake1))
456457 then {
457458 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
458459 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
459460 else 0
460461 if ((stake2 == stake2))
461462 then [Reissue(shareAssetId, shareTokenToPayAmount, true), IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
462463 else throw("Strict value is not equal to itself.")
463464 }
464465 else throw("Strict value is not equal to itself.")
465466 }
466467 })
467468
468469
469470
470471 @Callable(i)
471472 func withdraw () = valueOrElse(isActive(), {
472- let $t01706517140 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473- let pmtAmount = $t01706517140._1
474- let pmtAssetId = $t01706517140._2
473+ let $t01713217207 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01713217207._1
475+ let pmtAssetId = $t01713217207._2
475476 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
476477 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
477478 if ((size(i.payments) != 1))
478479 then throw("One attached payment expected")
479480 else if ((pmtAssetId != shareAssetId))
480481 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
481482 else if (!(hasEnoughBalance))
482483 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
483484 else {
484485 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
485486 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
486487 else 0
487488 if ((stake1 == stake1))
488489 then {
489490 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
490491 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
491492 else 0
492493 if ((stake2 == stake2))
493494 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)]
494495 else throw("Strict value is not equal to itself.")
495496 }
496497 else throw("Strict value is not equal to itself.")
497498 }
498499 })
499500
500501
501502
502503 @Callable(i)
503504 func exchange (minAmountToReceive) = valueOrElse(isActive(), {
504- let $t01843918514 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
505- let pmtAmount = $t01843918514._1
506- let pmtAssetId = $t01843918514._2
505+ let $t01850618581 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
506+ let pmtAmount = $t01850618581._1
507+ let pmtAssetId = $t01850618581._2
507508 if (if ((balanceA == 0))
508509 then true
509510 else (balanceB == 0))
510511 then throw("Can't exchange with zero balance")
511512 else if ((0 >= minAmountToReceive))
512513 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
513514 else if ((size(i.payments) != 1))
514515 then throw("One attached payment expected")
515516 else if (!(hasEnoughBalance))
516517 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
517518 else if ((pmtAssetId == assetIdA))
518519 then {
519520 let assetIdSend = assetIdB
520- let $t01906519197 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.caller)
521- let amountWithoutFee = $t01906519197._1
522- let amountWithFee = $t01906519197._2
523- let governanceReward = $t01906519197._3
521+ let $t01913219264 = calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, i.caller)
522+ let amountWithoutFee = $t01913219264._1
523+ let amountWithFee = $t01913219264._2
524+ let governanceReward = $t01913219264._3
524525 let newBalanceA = (balanceA + pmtAmount)
525526 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
526527 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
527528 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
528529 else 0
529530 if ((stake1 == stake1))
530531 then {
531532 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
532533 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
533534 else 0
534535 if ((stake2 == stake2))
535536 then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
536537 else throw("Strict value is not equal to itself.")
537538 }
538539 else throw("Strict value is not equal to itself.")
539540 }
540541 else if ((pmtAssetId == assetIdB))
541542 then {
542543 let assetIdSend = assetIdA
543- let $t02018920321 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.caller)
544- let amountWithoutFee = $t02018920321._1
545- let amountWithFee = $t02018920321._2
546- let governanceReward = $t02018920321._3
544+ let $t02025620388 = calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, i.caller)
545+ let amountWithoutFee = $t02025620388._1
546+ let amountWithFee = $t02025620388._2
547+ let governanceReward = $t02025620388._3
547548 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
548549 let newBalanceB = (balanceB + pmtAmount)
549550 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
550551 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
551552 else 0
552553 if ((stake1 == stake1))
553554 then {
554555 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
555556 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
556557 else 0
557558 if ((stake2 == stake2))
558559 then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], $Tuple2(amountWithFee, assetIdSend))
559560 else throw("Strict value is not equal to itself.")
560561 }
561562 else throw("Strict value is not equal to itself.")
562563 }
563564 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
564565 })
565566
566567
567568
568569 @Callable(i)
569570 func shutdown () = if (!(active))
570571 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
571572 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
572573 then throw("Only admin can call this function")
573574 else suspend("Paused by admin")
574575
575576
576577
577578 @Callable(i)
578579 func activate () = if (active)
579580 then throw("DApp is already active")
580581 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
581582 then throw("Only admin can call this function")
582583 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
583584
584585
585586
586587 @Callable(i)
587588 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
588589 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
589590 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
590591 if ((i.caller != moneyBoxAddress))
591592 then throw("Only the wallet can call this function")
592593 else if (if ((0 > amountEnrollA))
593594 then true
594595 else (0 > amountEnrollB))
595596 then suspend("Enroll amount negative")
596597 else if (if ((amountEnrollA == 0))
597598 then (amountEnrollB == 0)
598599 else false)
599600 then throw("No money to take")
600601 else {
601602 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
602603 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
603604 else 0
604605 if ((stake1 == stake1))
605606 then {
606607 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
607608 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
608609 else 0
609610 if ((stake2 == stake2))
610611 then [IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
611612 else throw("Strict value is not equal to itself.")
612613 }
613614 else throw("Strict value is not equal to itself.")
614615 }
615616 })
616617
617618
618619
619620 @Callable(i)
620621 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
621622 then throw("Only contract itself can invoke this function")
622623 else if ((assetIdString == "WAVES"))
623624 then {
624625 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, kLeasingPool), "No leasing pool in oracle"))
625626 let leasingId = getBinary(this, kLeasingId)
626627 let leasingAmount = valueOrElse(getInteger(this, kLeasingAmount), 0)
627628 let newLeaseAmount = if (stake)
628629 then (leasingAmount + amount)
629630 else (leasingAmount - amount)
630631 let newLease = Lease(pool, newLeaseAmount)
631632 let newLeaseId = calculateLeaseId(newLease)
632633 let baseEtry = [newLease, BinaryEntry(kLeasingId, newLeaseId), IntegerEntry(kLeasingAmount, newLeaseAmount)]
633634 match leasingId {
634635 case lId: ByteVector =>
635636 ([LeaseCancel(lId)] ++ baseEtry)
636637 case _ =>
637638 baseEtry
638639 }
639640 }
640641 else {
641- let $t02407524178 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
642- let call = $t02407524178._1
643- let addr = $t02407524178._2
644- let params = $t02407524178._3
645- let payments = $t02407524178._4
642+ let $t02414224245 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
643+ let call = $t02414224245._1
644+ let addr = $t02414224245._2
645+ let params = $t02414224245._3
646+ let payments = $t02414224245._4
646647 let inv = invoke(addr, call, params, payments)
647648 if ((inv == inv))
648649 then nil
649650 else throw("Strict value is not equal to itself.")
650651 }
651652
652653
653654
654655 @Callable(i)
655656 func stakeAll () = valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
656657 then throw("Only admin can call this function")
657658 else {
658659 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
659660 then {
660661 let amountA = (balanceA - stakedAmountA)
661662 if ((amountA > 0))
662663 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
663664 else 0
664665 }
665666 else 0
666667 if ((stake1 == stake1))
667668 then {
668669 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
669670 then {
670671 let amountB = (balanceB - stakedAmountB)
671672 if ((amountB > 0))
672673 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
673674 else 0
674675 }
675676 else 0
676677 if ((stake2 == stake2))
677678 then nil
678679 else throw("Strict value is not equal to itself.")
679680 }
680681 else throw("Strict value is not equal to itself.")
681682 })
682683
683684
684685 @Verifier(tx)
685686 func verify () = {
686687 let multiSignedByAdmins = {
687688 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
688689 then 1
689690 else 0
690691 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
691692 then 1
692693 else 0
693694 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
694695 then 1
695696 else 0
696697 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
697698 }
698699 match tx {
699700 case inv: InvokeScriptTransaction =>
700701 let callTakeIntoAccount = if ((inv.dApp == this))
701702 then (inv.function == "takeIntoAccountExtraFunds")
702703 else false
703704 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
704705 then true
705706 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
706707 then true
707708 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
708709 then true
709710 else sigVerify(tx.bodyBytes, tx.proofs[0], adminInvokePubKey)
710711 if (if (callTakeIntoAccount)
711712 then signedByAdmin
712713 else false)
713714 then true
714715 else multiSignedByAdmins
715716 case _ =>
716717 multiSignedByAdmins
717718 }
718719 }
719720

github/deemru/w8io/169f3d6 
100.84 ms