tx · D9DTL56wMz4KpxYu2QYMcRNYE9iNFFfDieJBXenjahhf

3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW:  -0.14000000 Waves

2022.05.04 10:15 [2036629] smart account 3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW > SELF 0.00000000 Waves

{ "type": 13, "id": "D9DTL56wMz4KpxYu2QYMcRNYE9iNFFfDieJBXenjahhf", "fee": 14000000, "feeAssetId": null, "timestamp": 1651648603755, "version": 2, "chainId": 84, "sender": "3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW", "senderPublicKey": "DfbjpZJBbZwnUKysUkxCbWTE1ZWuoUb6Y6BZdu5iAE8j", "proofs": [ "3uHbzrGNefu1NTsVvyTiAFgNxB5Bz5RmuUuVXcWjdRKe4oK62ipXyM8BKy6oJqqmv5oco8uguVTcp9JGToWATbLt", "t7o9nVbidQgfKiPYNQKQvUFPNunRZoLfC85oejPFMbNwmGwx1gACL2QhTyMTZiexZdooRqhFCv6t4yeGrwSnGpt" ], "script": "base64:AAIFAAAAAAAAACEIAhIAEgASBAoCAQESABIECgIBARIAEgASABIFCgMEAQgAAABPAAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa1NoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAEWtTaGFyZUFzc2V0U3VwcGx5AgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAABGtGZWUCAAAACmNvbW1pc3Npb24AAAAACmtJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAGa0NhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAAMa1VTRE5BZGRyZXNzAgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAADGtFVVJOQWRkcmVzcwIAAAAUc3Rha2luZ19ldXJuX2FkZHJlc3MAAAAADWtBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA1rQWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAANa0FkbWluUHViS2V5MwIAAAALYWRtaW5fcHViXzMAAAAAEmtBZG1pbkludm9rZVB1YktleQIAAAAQYWRtaW5faW52b2tlX3B1YgAAAAAQa01vbmV5Qm94QWRkcmVzcwIAAAARbW9uZXlfYm94X2FkZHJlc3MAAAAABm9yYWNsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAZzdHJpbmcEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAJAAACAAAAAQkAASwAAAACBQAAAANrZXkCAAAACGlzIGVtcHR5AAAAAAxhZG1pblB1YktleTEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MQAAAAAMYWRtaW5QdWJLZXkyCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTIAAAAADGFkbWluUHViS2V5MwkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkzAAAAABFhZG1pblB1YktleUludm9rZQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABJrQWRtaW5JbnZva2VQdWJLZXkAAAAAD21vbmV5Qm94QWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAAEGtNb25leUJveEFkZHJlc3MAAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADGtVU0ROQWRkcmVzcwAAAAAEVVNETgEAAAAgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EAAAAADXN0YWtpbmdBc3NldHMJAARMAAAAAgkAAlgAAAABBQAAAARVU0ROBQAAAANuaWwAAAAABmFjdGl2ZQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQAAAAALc3RyQXNzZXRJZEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQQAAAAALc3RyQXNzZXRJZEIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQgAAAAAIYXNzZXRJZEEDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQQAAAAAIYXNzZXRJZEIDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRC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AQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfZmxhdAkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAIaXNBY3RpdmUAAAAABAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAGc2NhbGU4CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAACGJhbGFuY2VBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAABnNjYWxlOAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAhiYWxhbmNlQgQAAAANJHQwMTI0MzUxMjUxMgkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDEyNDM1MTI1MTIAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxMjQzNTEyNTEyAAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxMjQzNTEyNTEyAAAAAl8zBAAAAA0kdDAxMjUxNzEyNjM0CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTI1MTcxMjYzNAAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEyNTE3MTI2MzQAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEyNTE3MTI2MzQAAAACXzMEAAAADSR0MDEyNjM5MTMxNDMDCQAAZgAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEEAAAAA3BtdAkBAAAACGZyYWN0aW9uAAAABAUAAAAIYmFsYW5jZUIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEFAAAABnNjYWxlOAUAAAAHQ0VJTElORwkABRcAAAAFCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAAA3BtdAkAAGUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50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SW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmNoYW5nZQUAAAANY2hhbmdlQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAABN2aXJ0dWFsU3dhcFRva2VuUGF5AAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADSR0MDE0ODc2MTQ5NTEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxNDg3NjE0OTUxAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTQ4NzYxNDk1MQAAAAJfMgQAAAANJHQwMTQ5NTYxNTAyOQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAxNDk1NjE1MDI5AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAxNDk1NjE1MDI5AAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDE0OTU2MTUwMjkAAAACXzMEAAAAD3BtdE1pblRocmVzaG9sZAAAAAAAAExLQAQAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UAAAAAAAL68IAEAAAACXRvbGVyYW5jZQMJAABmAAAAAgUAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UFAAAACXBtdEFtb3VudAAAAAAAAAGGoAAAAAAAAAAAAQQAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAGQAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4AAAAAAAAAAABAAAAAAAAmJaAAwkAAGYAAAACBQAAAA9wbXRNaW5UaHJlc2hvbGQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAlwbXRBbW91bnQCAAAAJyBkb2VzIG5vdCBleGNlZWQgdGhlIG1pbmltdW0gYW1vdW50IG9mIAkAAaQAAAABBQAAAA9wbXRNaW5UaHJlc2hvbGQCAAAAByB0b2tlbnMDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTYwMDcxNjY0OQMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUYAAAABgkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAAUYAAAABgUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAEXZpcnR1YWxSZXBsZW5pc2hBCAUAAAANJHQwMTYwMDcxNjY0OQAAAAJfMQQAAAARdmlydHVhbFJlcGxlbmlzaEIIBQAAAA0kdDAxNjAwNzE2NjQ5AAAAAl8yBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQQgFAAAADSR0MDE2MDA3MTY2NDkAAAACXzMEAAAAEWJhbGFuY2VBZnRlclN3YXBCCAUAAAANJHQwMTYwMDcxNjY0OQAAAAJfNAQAAAALbmV3QmFsYW5jZUEIBQAAAA0kdDAxNjAwNzE2NjQ5AAAAAl81BAAAAAtuZXdCYWxhbmNlQggFAAAADSR0MDE2MDA3MTY2NDkAAAACXzYEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gJAABpAAAAAgkAAGsAAAADBQAAAAdzY2FsZTE2BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAARdmlydHVhbFJlcGxlbmlzaEIEAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQJAABrAAAAAwkAAGQAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAATZEFwcFRocmVzaG9sZFNjYWxlMgMDCQAAZwAAAAIFAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcGCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAECAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUDAwkAAGYAAAACBQAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBgkAAGYAAAACBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBQAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgEAAAAHXNoYXJlVG9rZW5Ub1BheUFtb3VudEFmdGVyRmVlCQAAawAAAAMFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYJAABpAAAAAgUAAAADZmVlAAAAAAAAAAACBQAAAAlmZWVTY2FsZTYEAAAAGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGkAAAACBQAAAA1mZWVHb3Zlcm5hbmNlAAAAAAAAAAACBQAAAAlmZWVTY2FsZTYEAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEJAABrAAAAAwUAAAAac2hhcmVUb2tlbkdvdmVybmFuY2VSZXdhcmQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CCQAAawAAAAMFAAAAGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkBQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAANJHQwMTg2MzYxODkzMQMJAAAAAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAALc3RyQXNzZXRJZEEJAAUVAAAAAwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkIFAAAAC3N0ckFzc2V0SWRCCQAFFQAAAAMJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BBQAAAAtzdHJBc3NldElkQQQAAAALc3Rha2VBbW91bnQIBQAAAA0kdDAxODYzNjE4OTMxAAAAAl8xBAAAAA11bnN0YWtlQW1vdW50CAUAAAANJHQwMTg2MzYxODkzMQAAAAJfMgQAAAAMdW5zdGFrZUFzc2V0CAUAAAANJHQwMTg2MzYxODkzMQAAAAJfMwQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAC3N0YWtlQW1vdW50CQAETAAAAAIFAAAADXBtdFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADHVuc3Rha2VBc3NldAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgcJAARMAAAAAgUAAAANdW5zdGFrZUFtb3VudAkABEwAAAACBQAAAAx1bnN0YWtlQXNzZXQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9tb25leUJveEFkZHJlc3MFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD21vbmV5Qm94QWRkcmVzcwUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgUAAAAIYXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGUAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VCBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAB1zaGFyZVRva2VuVG9QYXlBbW91bnRBZnRlckZlZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VBBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VCBQAA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AAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhleGNoYW5nZQAAAAIAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMjE4NDQyMTkxOQkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDIxODQ0MjE5MTkAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAyMTg0NDIxOTE5AAAAAl8yAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQIAAAAvTWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4DCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMzIyNTIzNDg3AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIzMjI1MjM0ODcAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjMyMjUyMzQ4NwAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAADSR0MDIzNzg2MjM4NTkJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMjM3ODYyMzg1OQAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMjM3ODYyMzg1OQAAAAJfMgQA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", "height": 2036629, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3oNdnKiyuANEpJbMupk5q8pj7NGcrCTzG6KLYQUSQvmv Next: HvBX6rbes7Xe22P7b79zbtoEr41F1zck2pEQyJzGUW7q Diff:
OldNewDifferences
2121
2222 let kFee = "commission"
2323
24-let kFeeScaleDelimiter = "commission_scale_delimiter"
25-
2624 let kInvariant = "invariant"
2725
2826 let kCause = "shutdown_cause"
2927
30-let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
28+let kUSDNAddress = "staking_usdnnsbt_address"
3129
32-let keyEURNAddress = "staking_eurn_address"
30+let kEURNAddress = "staking_eurn_address"
3331
34-let keyAdminPubKey1 = "admin_pub_1"
32+let kAdminPubKey1 = "admin_pub_1"
3533
36-let keyAdminPubKey2 = "admin_pub_2"
34+let kAdminPubKey2 = "admin_pub_2"
3735
38-let keyAdminPubKey3 = "admin_pub_3"
36+let kAdminPubKey3 = "admin_pub_3"
3937
40-let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
38+let kAdminInvokePubKey = "admin_invoke_pub"
39+
40+let kMoneyBoxAddress = "money_box_address"
4141
4242 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4343
44-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
44+func getBase58FromOracle (key) = match getString(oracle, key) {
4545 case string: String =>
4646 fromBase58String(string)
4747 case nothing =>
48- throw("Admin public key is empty")
48+ throw((key + "is empty"))
4949 }
5050
5151
52-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
52+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
5353
54-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
54+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
5555
56-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
56+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5757
58-let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
58+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5959
60-let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
60+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
6161
62-let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
62+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
6363
6464 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6565
66-let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
67-
68-let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
69-
70-let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
71-
72-let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
66+let stakingAssets = [toBase58String(USDN)]
7367
7468 let active = getBooleanValue(this, kActive)
7569
113107
114108 let invariant = getIntegerValue(this, kInvariant)
115109
116-let fee = 500
110+let fee = getIntegerValue(this, kFee)
117111
118-let feeGovernance = 200
112+let feeGovernance = fraction(fee, 40, 100)
119113
120114 let feeScale6 = 1000000
121115
157151 let stakedAmountCalculated = match assetId {
158152 case aId: ByteVector =>
159153 if ((aId == USDN))
160- then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
161- else if ((aId == EURN))
162- then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
163- else 0
154+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
155+ else 0
164156 case _: Unit =>
165157 0
166158 case _ =>
201193
202194
203195 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
204- let worstAllowedNewInvariantRatio = (scale8 - ((scale8 * 1) / 10000000))
196+ let worstAllowedNewInvariantRatio = (scale16 - ((scale16 * 1) / 10000000))
205197 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
206198 let x = (balanceA + tokenReceiveAmount)
207199 let y = (balanceB + tokenReceiveAmount)
226218 else if ((tokenId == assetIdB))
227219 then invariantCalc((balanceA - amountToSendEstimated), y)
228220 else throw("Wrong asset in payment")
229- let amountToSendBest = if ((invariant > invEstimated))
230- then if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, invEstimated)))
231- then throw("Bad estimation provided 1")
221+ if ((invariant > invEstimated))
222+ then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
223+ then throw("The requested price is too not profitable for user")
232224 else {
233225 let a = {
234226 let $l = [25, 200, 500]
245237 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
246238 }
247239 if ((0 > a._1))
248- then amountToSendMin
249- else a
240+ then amountToSendMin._1
241+ else a._1
250242 }
251243 else {
252244 let a = {
266258 let tupleSendBetter = if ((0 > a._1))
267259 then $Tuple2(amountToSendEstimated, invEstimated)
268260 else a
269- if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, tupleSendBetter._2)))
270- then throw("Bad estimation provided 2")
271- else tupleSendBetter
261+ if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
262+ then throw("The requested price is too not profitable for user")
263+ else tupleSendBetter._1
272264 }
273- amountToSendBest
274265 }
275266 }
276267
316307
317308
318309 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
319- then if ((assetId == USDN))
320- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
321- else $Tuple2("startStaking", stakingEURNAddress)
322- else if ((assetId == USDN))
323- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
324- else $Tuple2("stopStaking", stakingEURNAddress)
310+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
311+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
325312
326313
327314 func calcStakingParams (stake,amount,assetId) = if (stake)
328315 then {
329- let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330- let call = $t097119777._1
331- let stakingAddr = $t097119777._2
316+ let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317+ let call = $t091419207._1
318+ let stakingAddr = $t091419207._2
332319 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
333320 }
334321 else {
335- let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336- let call = $t098639929._1
337- let stakingAddr = $t098639929._2
322+ let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323+ let call = $t092939359._1
324+ let stakingAddr = $t092939359._2
338325 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
339326 }
340327
341328
342329 @Callable(i)
343330 func init () = {
344- let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345- let pmtAmountA = $t01003410111._1
346- let pmtAssetIdA = $t01003410111._2
347- let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348- let pmtAmountB = $t01011610193._1
349- let pmtAssetIdB = $t01011610193._2
350- let $t01019810275 = getAssetInfo(pmtAssetIdA)
351- let pmtStrAssetIdA = $t01019810275._1
352- let pmtAssetNameA = $t01019810275._2
353- let pmtDecimalsA = $t01019810275._3
354- let $t01028010357 = getAssetInfo(pmtAssetIdB)
355- let pmtStrAssetIdB = $t01028010357._1
356- let pmtAssetNameB = $t01028010357._2
357- let pmtDecimalsB = $t01028010357._3
331+ let $t094649541 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
332+ let pmtAmountA = $t094649541._1
333+ let pmtAssetIdA = $t094649541._2
334+ let $t095469623 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
335+ let pmtAmountB = $t095469623._1
336+ let pmtAssetIdB = $t095469623._2
337+ let $t096289705 = getAssetInfo(pmtAssetIdA)
338+ let pmtStrAssetIdA = $t096289705._1
339+ let pmtAssetNameA = $t096289705._2
340+ let pmtDecimalsA = $t096289705._3
341+ let $t097109787 = getAssetInfo(pmtAssetIdB)
342+ let pmtStrAssetIdB = $t097109787._1
343+ let pmtAssetNameB = $t097109787._2
344+ let pmtDecimalsB = $t097109787._3
358345 if (isDefined(getBoolean(this, kActive)))
359346 then throwIsActive()
360347 else if ((pmtAssetIdA == pmtAssetIdB))
376363 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
377364 else 0
378365 if ((stake2 == stake2))
379- then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
366+ then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
380367 else throw("Strict value is not equal to itself.")
381368 }
382369 else throw("Strict value is not equal to itself.")
391378 let pmtAssetIdB = i.payments[1].assetId
392379 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
393380 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
394- let $t01293813015 = getAssetInfo(pmtAssetIdA)
395- let pmtStrAssetIdA = $t01293813015._1
396- let pmtAssetNameA = $t01293813015._2
397- let pmtDecimalsA = $t01293813015._3
398- let $t01302013137 = getAssetInfo(pmtAssetIdB)
399- let pmtStrAssetIdB = $t01302013137._1
400- let pmtAssetNameB = $t01302013137._2
401- let pmtDecimalsB = $t01302013137._3
402- let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
381+ let $t01243512512 = getAssetInfo(pmtAssetIdA)
382+ let pmtStrAssetIdA = $t01243512512._1
383+ let pmtAssetNameA = $t01243512512._2
384+ let pmtDecimalsA = $t01243512512._3
385+ let $t01251712634 = getAssetInfo(pmtAssetIdB)
386+ let pmtStrAssetIdB = $t01251712634._1
387+ let pmtAssetNameB = $t01251712634._2
388+ let pmtDecimalsB = $t01251712634._3
389+ let $t01263913143 = if ((ratioShareTokensInB > ratioShareTokensInA))
403390 then {
404391 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
405392 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
406393 }
407394 else {
408- let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
395+ let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
409396 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
410397 }
411- let pmtAmountA = $t01314213646._1
412- let pmtAmountB = $t01314213646._2
413- let change = $t01314213646._3
414- let changeAssetId = $t01314213646._4
415- let shareTokenRatio = $t01314213646._5
398+ let pmtAmountA = $t01263913143._1
399+ let pmtAmountB = $t01263913143._2
400+ let change = $t01263913143._3
401+ let changeAssetId = $t01263913143._4
402+ let shareTokenRatio = $t01263913143._5
416403 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
417404 if ((size(i.payments) != 2))
418405 then throw("Two attached assets expected")
447434
448435 @Callable(i)
449436 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
450- let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01529515370._1
452- let pmtAssetId = $t01529515370._2
453- let $t01537515448 = getAssetInfo(pmtAssetId)
454- let pmtStrAssetId = $t01537515448._1
455- let pmtAssetName = $t01537515448._2
456- let pmtDecimals = $t01537515448._3
437+ let $t01487614951 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
438+ let pmtAmount = $t01487614951._1
439+ let pmtAssetId = $t01487614951._2
440+ let $t01495615029 = getAssetInfo(pmtAssetId)
441+ let pmtStrAssetId = $t01495615029._1
442+ let pmtAssetName = $t01495615029._2
443+ let pmtDecimals = $t01495615029._3
457444 let pmtMinThreshold = 5000000
458445 let thresholdValueForMinTolerance = 50000000
459446 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
473460 else false)
474461 then throwAssets()
475462 else {
476- let $t01638617151 = if ((pmtAssetId == assetIdA))
477- then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
478- else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
479- let virtualReplenishA = $t01638617151._1
480- let virtualReplenishB = $t01638617151._2
481- let balanceAfterSwapA = $t01638617151._3
482- let balanceAfterSwapB = $t01638617151._4
483- let invariantCalculated = $t01638617151._5
484- let newBalanceA = $t01638617151._6
485- let newBalanceB = $t01638617151._7
486- let newBalanceEntry = if ((pmtAssetId == assetIdA))
487- then IntegerEntry(kBalanceA, newBalanceA)
488- else IntegerEntry(kBalanceB, newBalanceB)
463+ let $t01600716649 = if ((pmtAssetId == assetIdA))
464+ then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
465+ else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
466+ let virtualReplenishA = $t01600716649._1
467+ let virtualReplenishB = $t01600716649._2
468+ let balanceAfterSwapA = $t01600716649._3
469+ let balanceAfterSwapB = $t01600716649._4
470+ let newBalanceA = $t01600716649._5
471+ let newBalanceB = $t01600716649._6
489472 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
490- let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
491- let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
473+ let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
492474 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
493- if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
475+ if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
494476 then true
495477 else (invariant > invariantNew))
496478 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
503485 else (dAppThresholdAmount > newBalanceB))
504486 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
505487 else {
488+ let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
489+ let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
490+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
491+ let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
492+ let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
493+ let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
494+ let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
495+ let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
496+ then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
497+ else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
498+ let stakeAmount = $t01863618931._1
499+ let unstakeAmount = $t01863618931._2
500+ let unstakeAsset = $t01863618931._3
506501 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
507- then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
502+ then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
508503 else 0
509504 if ((stake1 == stake1))
510505 then {
511- let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
512- let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
513- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
514-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
506+ let stake2 = if (containsElement(stakingAssets, unstakeAsset))
507+ then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
508+ else 0
509+ if ((stake2 == stake2))
510+ then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(moneyBoxAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(moneyBoxAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
511+ else throw("Strict value is not equal to itself.")
515512 }
516513 else throw("Strict value is not equal to itself.")
517514 }
522519
523520 @Callable(i)
524521 func withdraw () = valueOrElse(isActive(), {
525- let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526- let pmtAmount = $t01940119544._1
527- let pmtAssetId = $t01940119544._2
522+ let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523+ let pmtAmount = $t02021820293._1
524+ let pmtAssetId = $t02021820293._2
528525 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
529526 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
530527 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
555552
556553 @Callable(i)
557554 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
558- let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02100721082._1
560- let pmtAssetId = $t02100721082._2
555+ let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556+ let pmtAmount = $t02184421919._1
557+ let pmtAssetId = $t02184421919._2
561558 if ((0 >= estimatedAmountToReceive))
562559 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
563560 else if ((minAmountToReceive > estimatedAmountToReceive))
564- then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
561+ then throw("Minimal amount can't be greater than estimated.")
565562 else if ((size(i.payments) != 1))
566563 then throwOnePayment()
567564 else if (!(hasEnoughBalance))
580577 let sendAssetId = if ((pmtAssetId == assetIdA))
581578 then assetIdB
582579 else assetIdA
583- let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584- let amount = $t02217322292._1
585- let amountInvarian = $t02217322292._2
580+ let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
586581 let governanceReward = fraction(amount, feeGovernance, feeScale6)
587582 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
588- let $t02244822710 = if ((pmtAssetId == assetIdA))
583+ let $t02322523487 = if ((pmtAssetId == assetIdA))
589584 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
590585 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
591- let newBalanceA = $t02244822710._1
592- let newBalanceB = $t02244822710._2
586+ let newBalanceA = $t02322523487._1
587+ let newBalanceB = $t02322523487._2
593588 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
594589 if (if ((dAppThresholdAmount > newBalanceA))
595590 then true
596591 else (dAppThresholdAmount > newBalanceB))
597592 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
598593 else {
599- let $t02300823081 = getAssetInfo(pmtAssetId)
600- let pmtStrAssetId = $t02300823081._1
601- let pmtAssetName = $t02300823081._2
602- let pmtDecimals = $t02300823081._3
603- let $t02309423171 = getAssetInfo(sendAssetId)
604- let sendStrAssetId = $t02309423171._1
605- let sendAssetName = $t02309423171._2
606- let sendDecimals = $t02309423171._3
594+ let $t02378623859 = getAssetInfo(pmtAssetId)
595+ let pmtStrAssetId = $t02378623859._1
596+ let pmtAssetName = $t02378623859._2
597+ let pmtDecimals = $t02378623859._3
598+ let $t02387223949 = getAssetInfo(sendAssetId)
599+ let sendStrAssetId = $t02387223949._1
600+ let sendAssetName = $t02387223949._2
601+ let sendDecimals = $t02387223949._3
607602 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
608603 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
609604 else 0
613608 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
614609 else 0
615610 if ((stake2 == stake2))
616- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, amountInvarian), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
611+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(moneyBoxAddress, governanceReward, sendAssetId)], $Tuple2(amountMinusFee, sendAssetId))
617612 else throw("Strict value is not equal to itself.")
618613 }
619614 else throw("Strict value is not equal to itself.")
642637 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
643638 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
644639 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
645- if ((i.caller != walletAddress))
646- then throw("Only the wallet can call this function")
640+ if ((i.caller != moneyBoxAddress))
641+ then throw("Only the money box can call this function")
647642 else if (if ((0 > amountEnrollA))
648643 then true
649644 else (0 > amountEnrollB))
666661 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
667662 else 0
668663 if ((stake2 == stake2))
669- then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
664+ then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))]
670665 else throw("Strict value is not equal to itself.")
671666 }
672667 else throw("Strict value is not equal to itself.")
676671
677672
678673 @Callable(i)
679-func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680- let invariantNew = invariantCalc(balanceA, balanceB)
681-[IntegerEntry(kInvariant, invariantNew)]
682- })
683-
684-
685-
686-@Callable(i)
687674 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688675 then throw("Only contract itself can invoke this function")
689676 else {
690- let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691- let call = $t02613626239._1
692- let addr = $t02613626239._2
693- let params = $t02613626239._3
694- let payments = $t02613626239._4
677+ let $t02695327056 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
678+ let call = $t02695327056._1
679+ let addr = $t02695327056._2
680+ let params = $t02695327056._3
681+ let payments = $t02695327056._4
695682 let inv = invoke(addr, call, params, payments)
696683 if ((inv == inv))
697684 then nil
724711 then true
725712 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726713 then true
727- else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
714+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
728715 if (if (callTakeIntoAccount)
729716 then signedByAdmin
730717 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.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 kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
24-let kFeeScaleDelimiter = "commission_scale_delimiter"
25-
2624 let kInvariant = "invariant"
2725
2826 let kCause = "shutdown_cause"
2927
30-let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
28+let kUSDNAddress = "staking_usdnnsbt_address"
3129
32-let keyEURNAddress = "staking_eurn_address"
30+let kEURNAddress = "staking_eurn_address"
3331
34-let keyAdminPubKey1 = "admin_pub_1"
32+let kAdminPubKey1 = "admin_pub_1"
3533
36-let keyAdminPubKey2 = "admin_pub_2"
34+let kAdminPubKey2 = "admin_pub_2"
3735
38-let keyAdminPubKey3 = "admin_pub_3"
36+let kAdminPubKey3 = "admin_pub_3"
3937
40-let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
38+let kAdminInvokePubKey = "admin_invoke_pub"
39+
40+let kMoneyBoxAddress = "money_box_address"
4141
4242 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4343
44-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
44+func getBase58FromOracle (key) = match getString(oracle, key) {
4545 case string: String =>
4646 fromBase58String(string)
4747 case nothing =>
48- throw("Admin public key is empty")
48+ throw((key + "is empty"))
4949 }
5050
5151
52-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
52+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
5353
54-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
54+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
5555
56-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
56+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
5757
58-let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
58+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
5959
60-let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
60+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
6161
62-let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
62+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
6363
6464 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6565
66-let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
67-
68-let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
69-
70-let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
71-
72-let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
66+let stakingAssets = [toBase58String(USDN)]
7367
7468 let active = getBooleanValue(this, kActive)
7569
7670 let strAssetIdA = getStringValue(this, kAssetIdA)
7771
7872 let strAssetIdB = getStringValue(this, kAssetIdB)
7973
8074 let assetIdA = if ((strAssetIdA == "WAVES"))
8175 then unit
8276 else fromBase58String(strAssetIdA)
8377
8478 let assetIdB = if ((strAssetIdB == "WAVES"))
8579 then unit
8680 else fromBase58String(strAssetIdB)
8781
8882 let assetNameA = match assetIdA {
8983 case id: ByteVector =>
9084 value(assetInfo(id)).name
9185 case waves: Unit =>
9286 "WAVES"
9387 case _ =>
9488 throw("Match error")
9589 }
9690
9791 let assetNameB = match assetIdB {
9892 case id: ByteVector =>
9993 value(assetInfo(id)).name
10094 case waves: Unit =>
10195 "WAVES"
10296 case _ =>
10397 throw("Match error")
10498 }
10599
106100 let balanceA = getIntegerValue(this, kBalanceA)
107101
108102 let balanceB = getIntegerValue(this, kBalanceB)
109103
110104 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
111105
112106 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
113107
114108 let invariant = getIntegerValue(this, kInvariant)
115109
116-let fee = 500
110+let fee = getIntegerValue(this, kFee)
117111
118-let feeGovernance = 200
112+let feeGovernance = fraction(fee, 40, 100)
119113
120114 let feeScale6 = 1000000
121115
122116 let scale3 = 1000
123117
124118 let scale8 = 100000000
125119
126120 let scale16 = 10000000000000000
127121
128122 let slippageScale3 = 1000
129123
130124 let digits8 = 8
131125
132126 let dAppThreshold = 50
133127
134128 let dAppThresholdScale2 = 100
135129
136130 let exchangeRatioLimitMin = 90000000
137131
138132 let exchangeRatioLimitMax = 110000000
139133
140134 let alpha = 50
141135
142136 let alphaDigits = 2
143137
144138 let beta = 4600000000000000
145139
146140 func accountBalance (assetId) = match assetId {
147141 case id: ByteVector =>
148142 assetBalance(this, id)
149143 case waves: Unit =>
150144 wavesBalance(this).available
151145 case _ =>
152146 throw("Match error")
153147 }
154148
155149
156150 func stakedAmount (assetId) = {
157151 let stakedAmountCalculated = match assetId {
158152 case aId: ByteVector =>
159153 if ((aId == USDN))
160- then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
161- else if ((aId == EURN))
162- then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
163- else 0
154+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
155+ else 0
164156 case _: Unit =>
165157 0
166158 case _ =>
167159 throw("Match error")
168160 }
169161 match stakedAmountCalculated {
170162 case i: Int =>
171163 i
172164 case _ =>
173165 0
174166 }
175167 }
176168
177169
178170 let stakedAmountA = stakedAmount(assetIdA)
179171
180172 let stakedAmountB = stakedAmount(assetIdB)
181173
182174 let availableBalanceA = (balanceA - stakedAmountA)
183175
184176 let availableBalanceB = (balanceB - stakedAmountB)
185177
186178 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
187179
188180 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
189181
190182 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
191183 then (accountBalanceWithStakedB >= balanceB)
192184 else false
193185
194186 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
195187
196188
197189 func invariantCalc (x,y) = {
198190 let sk = skewness(x, y)
199191 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
200192 }
201193
202194
203195 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
204- let worstAllowedNewInvariantRatio = (scale8 - ((scale8 * 1) / 10000000))
196+ let worstAllowedNewInvariantRatio = (scale16 - ((scale16 * 1) / 10000000))
205197 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
206198 let x = (balanceA + tokenReceiveAmount)
207199 let y = (balanceB + tokenReceiveAmount)
208200 func getStepAmount (acc,step) = if ((acc._1 == -1))
209201 then {
210202 let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
211203 let stepInvariant = if ((tokenId == assetIdA))
212204 then invariantCalc(x, (balanceB - amountToSend))
213205 else invariantCalc((balanceA - amountToSend), y)
214206 if ((stepInvariant > invariant))
215207 then $Tuple2(amountToSend, stepInvariant)
216208 else $Tuple2(-1, 0)
217209 }
218210 else acc
219211
220212 let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
221213 if ((0 > amountToSendMin._1))
222214 then throw("Price is worse than minReceived")
223215 else {
224216 let invEstimated = if ((tokenId == assetIdA))
225217 then invariantCalc(x, (balanceB - amountToSendEstimated))
226218 else if ((tokenId == assetIdB))
227219 then invariantCalc((balanceA - amountToSendEstimated), y)
228220 else throw("Wrong asset in payment")
229- let amountToSendBest = if ((invariant > invEstimated))
230- then if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, invEstimated)))
231- then throw("Bad estimation provided 1")
221+ if ((invariant > invEstimated))
222+ then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
223+ then throw("The requested price is too not profitable for user")
232224 else {
233225 let a = {
234226 let $l = [25, 200, 500]
235227 let $s = size($l)
236228 let $acc0 = $Tuple2(-1, 0)
237229 func $f0_1 ($a,$i) = if (($i >= $s))
238230 then $a
239231 else getStepAmount($a, $l[$i])
240232
241233 func $f0_2 ($a,$i) = if (($i >= $s))
242234 then $a
243235 else throw("List size exceeds 3")
244236
245237 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
246238 }
247239 if ((0 > a._1))
248- then amountToSendMin
249- else a
240+ then amountToSendMin._1
241+ else a._1
250242 }
251243 else {
252244 let a = {
253245 let $l = [-500, -200, -25]
254246 let $s = size($l)
255247 let $acc0 = $Tuple2(-1, 0)
256248 func $f0_1 ($a,$i) = if (($i >= $s))
257249 then $a
258250 else getStepAmount($a, $l[$i])
259251
260252 func $f0_2 ($a,$i) = if (($i >= $s))
261253 then $a
262254 else throw("List size exceeds 3")
263255
264256 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
265257 }
266258 let tupleSendBetter = if ((0 > a._1))
267259 then $Tuple2(amountToSendEstimated, invEstimated)
268260 else a
269- if ((worstAllowedNewInvariantRatio >= fraction(scale8, invariant, tupleSendBetter._2)))
270- then throw("Bad estimation provided 2")
271- else tupleSendBetter
261+ if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
262+ then throw("The requested price is too not profitable for user")
263+ else tupleSendBetter._1
272264 }
273- amountToSendBest
274265 }
275266 }
276267
277268
278269 func getAssetInfo (assetId) = match assetId {
279270 case id: ByteVector =>
280271 let stringId = toBase58String(id)
281272 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
282273 $Tuple3(stringId, info.name, info.decimals)
283274 case waves: Unit =>
284275 $Tuple3("WAVES", "WAVES", 8)
285276 case _ =>
286277 throw("Match error")
287278 }
288279
289280
290281 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
291282
292283
293284 func throwIsActive () = throw("DApp is already active")
294285
295286
296287 func isActive () = if (active)
297288 then unit
298289 else throw("DApp is inactive at this moment")
299290
300291
301292 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
302293 then unit
303294 else throw("Only admin can call this function")
304295
305296
306297 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
307298
308299
309300 func throwOnePayment () = throw("One attached payment expected")
310301
311302
312303 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
313304
314305
315306 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
316307
317308
318309 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
319- then if ((assetId == USDN))
320- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
321- else $Tuple2("startStaking", stakingEURNAddress)
322- else if ((assetId == USDN))
323- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
324- else $Tuple2("stopStaking", stakingEURNAddress)
310+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
311+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
325312
326313
327314 func calcStakingParams (stake,amount,assetId) = if (stake)
328315 then {
329- let $t097119777 = calcStakingFuncAndAddres(stake, assetId)
330- let call = $t097119777._1
331- let stakingAddr = $t097119777._2
316+ let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317+ let call = $t091419207._1
318+ let stakingAddr = $t091419207._2
332319 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
333320 }
334321 else {
335- let $t098639929 = calcStakingFuncAndAddres(stake, assetId)
336- let call = $t098639929._1
337- let stakingAddr = $t098639929._2
322+ let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323+ let call = $t092939359._1
324+ let stakingAddr = $t092939359._2
338325 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
339326 }
340327
341328
342329 @Callable(i)
343330 func init () = {
344- let $t01003410111 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
345- let pmtAmountA = $t01003410111._1
346- let pmtAssetIdA = $t01003410111._2
347- let $t01011610193 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
348- let pmtAmountB = $t01011610193._1
349- let pmtAssetIdB = $t01011610193._2
350- let $t01019810275 = getAssetInfo(pmtAssetIdA)
351- let pmtStrAssetIdA = $t01019810275._1
352- let pmtAssetNameA = $t01019810275._2
353- let pmtDecimalsA = $t01019810275._3
354- let $t01028010357 = getAssetInfo(pmtAssetIdB)
355- let pmtStrAssetIdB = $t01028010357._1
356- let pmtAssetNameB = $t01028010357._2
357- let pmtDecimalsB = $t01028010357._3
331+ let $t094649541 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
332+ let pmtAmountA = $t094649541._1
333+ let pmtAssetIdA = $t094649541._2
334+ let $t095469623 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
335+ let pmtAmountB = $t095469623._1
336+ let pmtAssetIdB = $t095469623._2
337+ let $t096289705 = getAssetInfo(pmtAssetIdA)
338+ let pmtStrAssetIdA = $t096289705._1
339+ let pmtAssetNameA = $t096289705._2
340+ let pmtDecimalsA = $t096289705._3
341+ let $t097109787 = getAssetInfo(pmtAssetIdB)
342+ let pmtStrAssetIdB = $t097109787._1
343+ let pmtAssetNameB = $t097109787._2
344+ let pmtDecimalsB = $t097109787._3
358345 if (isDefined(getBoolean(this, kActive)))
359346 then throwIsActive()
360347 else if ((pmtAssetIdA == pmtAssetIdB))
361348 then throw("Assets must be different")
362349 else {
363350 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
364351 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
365352 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
366353 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
367354 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
368355 let shareIssueId = calculateAssetId(shareIssue)
369356 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
370357 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
371358 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
372359 else 0
373360 if ((stake1 == stake1))
374361 then {
375362 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
376363 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
377364 else 0
378365 if ((stake2 == stake2))
379- then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
366+ then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
380367 else throw("Strict value is not equal to itself.")
381368 }
382369 else throw("Strict value is not equal to itself.")
383370 }
384371 }
385372
386373
387374
388375 @Callable(i)
389376 func replenishWithTwoTokens () = valueOrElse(isActive(), {
390377 let pmtAssetIdA = i.payments[0].assetId
391378 let pmtAssetIdB = i.payments[1].assetId
392379 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
393380 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
394- let $t01293813015 = getAssetInfo(pmtAssetIdA)
395- let pmtStrAssetIdA = $t01293813015._1
396- let pmtAssetNameA = $t01293813015._2
397- let pmtDecimalsA = $t01293813015._3
398- let $t01302013137 = getAssetInfo(pmtAssetIdB)
399- let pmtStrAssetIdB = $t01302013137._1
400- let pmtAssetNameB = $t01302013137._2
401- let pmtDecimalsB = $t01302013137._3
402- let $t01314213646 = if ((ratioShareTokensInB > ratioShareTokensInA))
381+ let $t01243512512 = getAssetInfo(pmtAssetIdA)
382+ let pmtStrAssetIdA = $t01243512512._1
383+ let pmtAssetNameA = $t01243512512._2
384+ let pmtDecimalsA = $t01243512512._3
385+ let $t01251712634 = getAssetInfo(pmtAssetIdB)
386+ let pmtStrAssetIdB = $t01251712634._1
387+ let pmtAssetNameB = $t01251712634._2
388+ let pmtDecimalsB = $t01251712634._3
389+ let $t01263913143 = if ((ratioShareTokensInB > ratioShareTokensInA))
403390 then {
404391 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
405392 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
406393 }
407394 else {
408- let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
395+ let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
409396 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
410397 }
411- let pmtAmountA = $t01314213646._1
412- let pmtAmountB = $t01314213646._2
413- let change = $t01314213646._3
414- let changeAssetId = $t01314213646._4
415- let shareTokenRatio = $t01314213646._5
398+ let pmtAmountA = $t01263913143._1
399+ let pmtAmountB = $t01263913143._2
400+ let change = $t01263913143._3
401+ let changeAssetId = $t01263913143._4
402+ let shareTokenRatio = $t01263913143._5
416403 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
417404 if ((size(i.payments) != 2))
418405 then throw("Two attached assets expected")
419406 else if (if ((pmtAssetIdA != assetIdA))
420407 then true
421408 else (pmtAssetIdB != assetIdB))
422409 then throwAssets()
423410 else if ((shareTokenToPayAmount == 0))
424411 then throw("Too small amount to replenish")
425412 else if ((0 > change))
426413 then throw("Change < 0")
427414 else if (!(hasEnoughBalance))
428415 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
429416 else {
430417 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
431418 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
432419 else 0
433420 if ((stake1 == stake1))
434421 then {
435422 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
436423 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
437424 else 0
438425 if ((stake2 == stake2))
439426 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
440427 else throw("Strict value is not equal to itself.")
441428 }
442429 else throw("Strict value is not equal to itself.")
443430 }
444431 })
445432
446433
447434
448435 @Callable(i)
449436 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
450- let $t01529515370 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
451- let pmtAmount = $t01529515370._1
452- let pmtAssetId = $t01529515370._2
453- let $t01537515448 = getAssetInfo(pmtAssetId)
454- let pmtStrAssetId = $t01537515448._1
455- let pmtAssetName = $t01537515448._2
456- let pmtDecimals = $t01537515448._3
437+ let $t01487614951 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
438+ let pmtAmount = $t01487614951._1
439+ let pmtAssetId = $t01487614951._2
440+ let $t01495615029 = getAssetInfo(pmtAssetId)
441+ let pmtStrAssetId = $t01495615029._1
442+ let pmtAssetName = $t01495615029._2
443+ let pmtDecimals = $t01495615029._3
457444 let pmtMinThreshold = 5000000
458445 let thresholdValueForMinTolerance = 50000000
459446 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
460447 then 100000
461448 else 1
462449 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
463450 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
464451 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
465452 if ((pmtMinThreshold > pmtAmount))
466453 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
467454 else if ((size(i.payments) != 1))
468455 then throwOnePayment()
469456 else if (!(hasEnoughBalance))
470457 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
471458 else if (if ((pmtAssetId != assetIdA))
472459 then (pmtAssetId != assetIdB)
473460 else false)
474461 then throwAssets()
475462 else {
476- let $t01638617151 = if ((pmtAssetId == assetIdA))
477- then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
478- else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
479- let virtualReplenishA = $t01638617151._1
480- let virtualReplenishB = $t01638617151._2
481- let balanceAfterSwapA = $t01638617151._3
482- let balanceAfterSwapB = $t01638617151._4
483- let invariantCalculated = $t01638617151._5
484- let newBalanceA = $t01638617151._6
485- let newBalanceB = $t01638617151._7
486- let newBalanceEntry = if ((pmtAssetId == assetIdA))
487- then IntegerEntry(kBalanceA, newBalanceA)
488- else IntegerEntry(kBalanceB, newBalanceB)
463+ let $t01600716649 = if ((pmtAssetId == assetIdA))
464+ then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
465+ else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
466+ let virtualReplenishA = $t01600716649._1
467+ let virtualReplenishB = $t01600716649._2
468+ let balanceAfterSwapA = $t01600716649._3
469+ let balanceAfterSwapB = $t01600716649._4
470+ let newBalanceA = $t01600716649._5
471+ let newBalanceB = $t01600716649._6
489472 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
490- let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
491- let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
473+ let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
492474 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
493- if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
475+ if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
494476 then true
495477 else (invariant > invariantNew))
496478 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
497479 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
498480 then true
499481 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
500482 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
501483 else if (if ((dAppThresholdAmount > newBalanceA))
502484 then true
503485 else (dAppThresholdAmount > newBalanceB))
504486 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
505487 else {
488+ let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
489+ let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
490+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
491+ let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
492+ let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
493+ let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
494+ let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
495+ let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
496+ then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
497+ else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
498+ let stakeAmount = $t01863618931._1
499+ let unstakeAmount = $t01863618931._2
500+ let unstakeAsset = $t01863618931._3
506501 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
507- then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
502+ then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
508503 else 0
509504 if ((stake1 == stake1))
510505 then {
511- let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
512- let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
513- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
514-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
506+ let stake2 = if (containsElement(stakingAssets, unstakeAsset))
507+ then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
508+ else 0
509+ if ((stake2 == stake2))
510+ then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(moneyBoxAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(moneyBoxAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
511+ else throw("Strict value is not equal to itself.")
515512 }
516513 else throw("Strict value is not equal to itself.")
517514 }
518515 }
519516 })
520517
521518
522519
523520 @Callable(i)
524521 func withdraw () = valueOrElse(isActive(), {
525- let $t01940119544 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
526- let pmtAmount = $t01940119544._1
527- let pmtAssetId = $t01940119544._2
522+ let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523+ let pmtAmount = $t02021820293._1
524+ let pmtAssetId = $t02021820293._2
528525 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
529526 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
530527 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
531528 if ((size(i.payments) != 1))
532529 then throwOnePayment()
533530 else if ((pmtAssetId != shareAssetId))
534531 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
535532 else if (!(hasEnoughBalance))
536533 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
537534 else {
538535 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
539536 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
540537 else 0
541538 if ((stake1 == stake1))
542539 then {
543540 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
544541 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
545542 else 0
546543 if ((stake2 == stake2))
547544 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
548545 else throw("Strict value is not equal to itself.")
549546 }
550547 else throw("Strict value is not equal to itself.")
551548 }
552549 })
553550
554551
555552
556553 @Callable(i)
557554 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
558- let $t02100721082 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02100721082._1
560- let pmtAssetId = $t02100721082._2
555+ let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556+ let pmtAmount = $t02184421919._1
557+ let pmtAssetId = $t02184421919._2
561558 if ((0 >= estimatedAmountToReceive))
562559 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
563560 else if ((minAmountToReceive > estimatedAmountToReceive))
564- then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
561+ then throw("Minimal amount can't be greater than estimated.")
565562 else if ((size(i.payments) != 1))
566563 then throwOnePayment()
567564 else if (!(hasEnoughBalance))
568565 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
569566 else if (if ((pmtAssetId != assetIdA))
570567 then (pmtAssetId != assetIdB)
571568 else false)
572569 then throwAssets()
573570 else if ((10000000 > pmtAmount))
574571 then throw("Only swap of 10.000000 or more tokens is allowed")
575572 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
576573 then true
577574 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
578575 then throw("Incorrect args and pmt ratio")
579576 else {
580577 let sendAssetId = if ((pmtAssetId == assetIdA))
581578 then assetIdB
582579 else assetIdA
583- let $t02217322292 = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
584- let amount = $t02217322292._1
585- let amountInvarian = $t02217322292._2
580+ let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
586581 let governanceReward = fraction(amount, feeGovernance, feeScale6)
587582 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
588- let $t02244822710 = if ((pmtAssetId == assetIdA))
583+ let $t02322523487 = if ((pmtAssetId == assetIdA))
589584 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
590585 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
591- let newBalanceA = $t02244822710._1
592- let newBalanceB = $t02244822710._2
586+ let newBalanceA = $t02322523487._1
587+ let newBalanceB = $t02322523487._2
593588 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
594589 if (if ((dAppThresholdAmount > newBalanceA))
595590 then true
596591 else (dAppThresholdAmount > newBalanceB))
597592 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
598593 else {
599- let $t02300823081 = getAssetInfo(pmtAssetId)
600- let pmtStrAssetId = $t02300823081._1
601- let pmtAssetName = $t02300823081._2
602- let pmtDecimals = $t02300823081._3
603- let $t02309423171 = getAssetInfo(sendAssetId)
604- let sendStrAssetId = $t02309423171._1
605- let sendAssetName = $t02309423171._2
606- let sendDecimals = $t02309423171._3
594+ let $t02378623859 = getAssetInfo(pmtAssetId)
595+ let pmtStrAssetId = $t02378623859._1
596+ let pmtAssetName = $t02378623859._2
597+ let pmtDecimals = $t02378623859._3
598+ let $t02387223949 = getAssetInfo(sendAssetId)
599+ let sendStrAssetId = $t02387223949._1
600+ let sendAssetName = $t02387223949._2
601+ let sendDecimals = $t02387223949._3
607602 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
608603 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
609604 else 0
610605 if ((stake1 == stake1))
611606 then {
612607 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
613608 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
614609 else 0
615610 if ((stake2 == stake2))
616- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, amountInvarian), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
611+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(moneyBoxAddress, governanceReward, sendAssetId)], $Tuple2(amountMinusFee, sendAssetId))
617612 else throw("Strict value is not equal to itself.")
618613 }
619614 else throw("Strict value is not equal to itself.")
620615 }
621616 }
622617 })
623618
624619
625620
626621 @Callable(i)
627622 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
628623 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
629624 else suspend("Paused by admin"))
630625
631626
632627
633628 @Callable(i)
634629 func activate () = valueOrElse(isAdminCall(i), if (active)
635630 then throwIsActive()
636631 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
637632
638633
639634
640635 @Callable(i)
641636 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
642637 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
643638 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
644639 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
645- if ((i.caller != walletAddress))
646- then throw("Only the wallet can call this function")
640+ if ((i.caller != moneyBoxAddress))
641+ then throw("Only the money box can call this function")
647642 else if (if ((0 > amountEnrollA))
648643 then true
649644 else (0 > amountEnrollB))
650645 then suspend("Enroll amount negative")
651646 else if (if ((amountEnrollA == 0))
652647 then (amountEnrollB == 0)
653648 else false)
654649 then throw("No money to take")
655650 else {
656651 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
657652 then (amountEnrollA > 0)
658653 else false)
659654 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
660655 else 0
661656 if ((stake1 == stake1))
662657 then {
663658 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
664659 then (amountEnrollB > 0)
665660 else false)
666661 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
667662 else 0
668663 if ((stake2 == stake2))
669- then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
664+ then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))]
670665 else throw("Strict value is not equal to itself.")
671666 }
672667 else throw("Strict value is not equal to itself.")
673668 }
674669 })
675670
676671
677672
678673 @Callable(i)
679-func writeBigIntInvariant () = valueOrElse(isAdminCall(i), {
680- let invariantNew = invariantCalc(balanceA, balanceB)
681-[IntegerEntry(kInvariant, invariantNew)]
682- })
683-
684-
685-
686-@Callable(i)
687674 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
688675 then throw("Only contract itself can invoke this function")
689676 else {
690- let $t02613626239 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
691- let call = $t02613626239._1
692- let addr = $t02613626239._2
693- let params = $t02613626239._3
694- let payments = $t02613626239._4
677+ let $t02695327056 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
678+ let call = $t02695327056._1
679+ let addr = $t02695327056._2
680+ let params = $t02695327056._3
681+ let payments = $t02695327056._4
695682 let inv = invoke(addr, call, params, payments)
696683 if ((inv == inv))
697684 then nil
698685 else throw("Strict value is not equal to itself.")
699686 }
700687
701688
702689 @Verifier(tx)
703690 func verify () = {
704691 let multiSignedByAdmins = {
705692 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
706693 then 1
707694 else 0
708695 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
709696 then 1
710697 else 0
711698 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
712699 then 1
713700 else 0
714701 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
715702 }
716703 match tx {
717704 case inv: InvokeScriptTransaction =>
718705 let callTakeIntoAccount = if ((inv.dApp == this))
719706 then (inv.function == "takeIntoAccountExtraFunds")
720707 else false
721708 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
722709 then true
723710 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
724711 then true
725712 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726713 then true
727- else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
714+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
728715 if (if (callTakeIntoAccount)
729716 then signedByAdmin
730717 else false)
731718 then true
732719 else multiSignedByAdmins
733720 case _ =>
734721 multiSignedByAdmins
735722 }
736723 }
737724

github/deemru/w8io/026f985 
130.60 ms