tx · GmdAHQbsfBwX3r58XHPA6KzwnBUXsVC5sHctXS15Qu6J

3N7RiqzjeQsn43sLWshFSGWFiPP3DoQY233:  -0.01400000 Waves

2022.04.06 12:45 [1996543] smart account 3N7RiqzjeQsn43sLWshFSGWFiPP3DoQY233 > SELF 0.00000000 Waves

{ "type": 13, "id": "GmdAHQbsfBwX3r58XHPA6KzwnBUXsVC5sHctXS15Qu6J", "fee": 1400000, "feeAssetId": null, "timestamp": 1649238404919, "version": 2, "chainId": 84, "sender": "3N7RiqzjeQsn43sLWshFSGWFiPP3DoQY233", "senderPublicKey": "DCA3cJK3scwSC3AvDB2yyP3TH1XY3MVy9KypWX2FY6PC", "proofs": [ "3ctC7T7b1pWsEdaMkrF6VEiLDr12ZaZmLmG5gL7rQ47gXgXBS14S4cHZdWKDds9yMjX7RXS45GH1g6kz9Zsu4iyc", "FNhgm3pXtL7n4fWszVcshHzGZSsZRHetrGiUfNvNDsbZatd5quwPRsVqStXXXrTmccsCWee41iXphjMZ6nZURqx" ], "script": "base64:AAIFAAAAAAAAACEIAhIAEgASBAoCAQESABIECgIBARIAEgASABIFCgMEAQgAAABPAAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa1NoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAEWtTaGFyZUFzc2V0U3VwcGx5AgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAABGtGZWUCAAAACmNvbW1pc3Npb24AAAAACmtJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAGa0NhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAAMa1VTRE5BZGRyZXNzAgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAADGtFVVJOQWRkcmVzcwIAAAAUc3Rha2luZ19ldXJuX2FkZHJlc3MAAAAADWtBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA1rQWRtaW5QdWJLZXkyAgAAAAthZG1pbl9wdWJfMgAAAAANa0FkbWluUHViS2V5MwIAAAALYWRtaW5fcHViXzMAAAAAEmtBZG1pbkludm9rZVB1YktleQIAAAAQYWRtaW5faW52b2tlX3B1YgAAAAAQa01vbmV5Qm94QWRkcmVzcwIAAAARbW9uZXlfYm94X2FkZHJlc3MAAAAABm9yYWNsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAZzdHJpbmcEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAJAAACAAAAAQkAASwAAAACBQAAAANrZXkCAAAACGlzIGVtcHR5AAAAAAxhZG1pblB1YktleTEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MQAAAAAMYWRtaW5QdWJLZXkyCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTIAAAAADGFkbWluUHViS2V5MwkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkzAAAAABFhZG1pblB1YktleUludm9rZQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABJrQWRtaW5JbnZva2VQdWJLZXkAAAAAD21vbmV5Qm94QWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAAEGtNb25leUJveEFkZHJlc3MAAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADGtVU0ROQWRkcmVzcwAAAAAEVVNETgEAAAAgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EAAAAADXN0YWtpbmdBc3NldHMJAARMAAAAAgkAAlgAAAABBQAAAARVU0ROBQAAAANuaWwAAAAABmFjdGl2ZQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQAAAAALc3RyQXNzZXRJZEEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQQAAAAALc3RyQXNzZXRJZEIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACWtBc3NldElkQgAAAAAIYXNzZXRJZEEDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRBAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAtzdHJBc3NldElkQQAAAAAIYXNzZXRJZEIDCQAAAAAAAAIFAAAAC3N0ckFzc2V0SWRC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AQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQQUAAAAOcG10U3RyQXNzZXRJZEEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQIAAAANYmFzZV9mZWVfZmxhdAkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAIaXNBY3RpdmUAAAAABAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAGc2NhbGU4CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAACGJhbGFuY2VBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAABnNjYWxlOAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAhiYWxhbmNlQgQAAAANJHQwMTI0MzUxMjUxMgkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDEyNDM1MTI1MTIAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxMjQzNTEyNTEyAAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxMjQzNTEyNTEyAAAAAl8zBAAAAA0kdDAxMjUxNzEyNjM0CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTI1MTcxMjYzNAAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEyNTE3MTI2MzQAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEyNTE3MTI2MzQAAAACXzMEAAAADSR0MDEyNjM5MTMxNDMDCQAAZgAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEEAAAAA3BtdAkBAAAACGZyYWN0aW9uAAAABAUAAAAIYmFsYW5jZUIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEFAAAABnNjYWxlOAUAAAAHQ0VJTElORwkABRcAAAAFCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAAA3BtdAkAAGUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50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SW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmNoYW5nZQUAAAANY2hhbmdlQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAABN2aXJ0dWFsU3dhcFRva2VuUGF5AAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADSR0MDE0ODc2MTQ5NTEJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxNDg3NjE0OTUxAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTQ4NzYxNDk1MQAAAAJfMgQAAAANJHQwMTQ5NTYxNTAyOQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAACnBtdEFzc2V0SWQEAAAADXBtdFN0ckFzc2V0SWQIBQAAAA0kdDAxNDk1NjE1MDI5AAAAAl8xBAAAAAxwbXRBc3NldE5hbWUIBQAAAA0kdDAxNDk1NjE1MDI5AAAAAl8yBAAAAAtwbXREZWNpbWFscwgFAAAADSR0MDE0OTU2MTUwMjkAAAACXzMEAAAAD3BtdE1pblRocmVzaG9sZAAAAAAAAExLQAQAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UAAAAAAAL68IAEAAAACXRvbGVyYW5jZQMJAABmAAAAAgUAAAAddGhyZXNob2xkVmFsdWVGb3JNaW5Ub2xlcmFuY2UFAAAACXBtdEFtb3VudAAAAAAAAAGGoAAAAAAAAAAAAQQAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAGQAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgFAAAACXRvbGVyYW5jZQAAAAAAAJiWgAQAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4AAAAAAAAAAABAAAAAAAAmJaAAwkAAGYAAAACBQAAAA9wbXRNaW5UaHJlc2hvbGQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAlwbXRBbW91bnQCAAAAJyBkb2VzIG5vdCBleGNlZWQgdGhlIG1pbmltdW0gYW1vdW50IG9mIAkAAaQAAAABBQAAAA9wbXRNaW5UaHJlc2hvbGQCAAAAByB0b2tlbnMDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTYwMDcxNjY0OQMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUYAAAABgkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUIJAAUYAAAABgUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAEXZpcnR1YWxSZXBsZW5pc2hBCAUAAAANJHQwMTYwMDcxNjY0OQAAAAJfMQQAAAARdmlydHVhbFJlcGxlbmlzaEIIBQAAAA0kdDAxNjAwNzE2NjQ5AAAAAl8yBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQQgFAAAADSR0MDE2MDA3MTY2NDkAAAACXzMEAAAAEWJhbGFuY2VBZnRlclN3YXBCCAUAAAANJHQwMTYwMDcxNjY0OQAAAAJfNAQAAAALbmV3QmFsYW5jZUEIBQAAAA0kdDAxNjAwNzE2NjQ5AAAAAl81BAAAAAtuZXdCYWxhbmNlQggFAAAADSR0MDE2MDA3MTY2NDkAAAACXzYEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gJAABpAAAAAgkAAGsAAAADBQAAAAdzY2FsZTE2BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAARdmlydHVhbFJlcGxlbmlzaEIEAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQJAABrAAAAAwkAAGQAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAATZEFwcFRocmVzaG9sZFNjYWxlMgMDCQAAZwAAAAIFAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcGCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAECAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUDAwkAAGYAAAACBQAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBgkAAGYAAAACBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBQAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgEAAAAHXNoYXJlVG9rZW5Ub1BheUFtb3VudEFmdGVyRmVlCQAAawAAAAMFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYJAABpAAAAAgUAAAADZmVlAAAAAAAAAAACBQAAAAlmZWVTY2FsZTYEAAAAGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGkAAAACBQAAAA1mZWVHb3Zlcm5hbmNlAAAAAAAAAAACBQAAAAlmZWVTY2FsZTYEAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEJAABrAAAAAwUAAAAac2hhcmVUb2tlbkdvdmVybmFuY2VSZXdhcmQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CCQAAawAAAAMFAAAAGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkBQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAANJHQwMTg2MzYxODkzMQMJAAAAAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAALc3RyQXNzZXRJZEEJAAUVAAAAAwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkIFAAAAC3N0ckFzc2V0SWRCCQAFFQAAAAMJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BBQAAAAtzdHJBc3NldElkQQQAAAALc3Rha2VBbW91bnQIBQAAAA0kdDAxODYzNjE4OTMxAAAAAl8xBAAAAA11bnN0YWtlQW1vdW50CAUAAAANJHQwMTg2MzYxODkzMQAAAAJfMgQAAAAMdW5zdGFrZUFzc2V0CAUAAAANJHQwMTg2MzYxODkzMQAAAAJfMwQAAAAGc3Rha2UxAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADXBtdFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAAC3N0YWtlQW1vdW50CQAETAAAAAIFAAAADXBtdFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADHVuc3Rha2VBc3NldAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgcJAARMAAAAAgUAAAANdW5zdGFrZUFtb3VudAkABEwAAAACBQAAAAx1bnN0YWtlQXNzZXQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA9tb25leUJveEFkZHJlc3MFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD21vbmV5Qm94QWRkcmVzcwUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgUAAAAIYXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGUAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VCBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAB1zaGFyZVRva2VuVG9QYXlBbW91bnRBZnRlckZlZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VBBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VCBQAA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AAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAhleGNoYW5nZQAAAAIAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMjE4NDQyMTkxOQkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDIxODQ0MjE5MTkAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAyMTg0NDIxOTE5AAAAAl8yAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQIAAAAvTWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4DCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQEAAAAPdGhyb3dPbmVQYXltZW50AAAAAAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMzIyNTIzNDg3AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIzMjI1MjM0ODcAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjMyMjUyMzQ4NwAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAADSR0MDIzNzg2MjM4NTkJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMjM3ODYyMzg1OQAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMjM3ODYyMzg1OQAAAAJfMgQA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", "height": 1996543, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: k2eW2aGMoVd1qrBHsaav7ZGRjgubr6Hri35b9QiwCjb Next: none 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 _ =>
315307
316308
317309 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
318- then if ((assetId == USDN))
319- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
320- else $Tuple2("startStaking", stakingEURNAddress)
321- else if ((assetId == USDN))
322- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
323- else $Tuple2("stopStaking", stakingEURNAddress)
310+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
311+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
324312
325313
326314 func calcStakingParams (stake,amount,assetId) = if (stake)
327315 then {
328- let $t098569922 = calcStakingFuncAndAddres(stake, assetId)
329- let call = $t098569922._1
330- let stakingAddr = $t098569922._2
316+ let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317+ let call = $t091419207._1
318+ let stakingAddr = $t091419207._2
331319 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
332320 }
333321 else {
334- let $t01000810074 = calcStakingFuncAndAddres(stake, assetId)
335- let call = $t01000810074._1
336- let stakingAddr = $t01000810074._2
322+ let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323+ let call = $t092939359._1
324+ let stakingAddr = $t092939359._2
337325 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
338326 }
339327
340328
341329 @Callable(i)
342330 func init () = {
343- let $t01017910256 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
344- let pmtAmountA = $t01017910256._1
345- let pmtAssetIdA = $t01017910256._2
346- let $t01026110338 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
347- let pmtAmountB = $t01026110338._1
348- let pmtAssetIdB = $t01026110338._2
349- let $t01034310420 = getAssetInfo(pmtAssetIdA)
350- let pmtStrAssetIdA = $t01034310420._1
351- let pmtAssetNameA = $t01034310420._2
352- let pmtDecimalsA = $t01034310420._3
353- let $t01042510502 = getAssetInfo(pmtAssetIdB)
354- let pmtStrAssetIdB = $t01042510502._1
355- let pmtAssetNameB = $t01042510502._2
356- let pmtDecimalsB = $t01042510502._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
357345 if (isDefined(getBoolean(this, kActive)))
358346 then throwIsActive()
359347 else if ((pmtAssetIdA == pmtAssetIdB))
375363 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
376364 else 0
377365 if ((stake2 == stake2))
378- 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)]
379367 else throw("Strict value is not equal to itself.")
380368 }
381369 else throw("Strict value is not equal to itself.")
390378 let pmtAssetIdB = i.payments[1].assetId
391379 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
392380 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
393- let $t01308313160 = getAssetInfo(pmtAssetIdA)
394- let pmtStrAssetIdA = $t01308313160._1
395- let pmtAssetNameA = $t01308313160._2
396- let pmtDecimalsA = $t01308313160._3
397- let $t01316513282 = getAssetInfo(pmtAssetIdB)
398- let pmtStrAssetIdB = $t01316513282._1
399- let pmtAssetNameB = $t01316513282._2
400- let pmtDecimalsB = $t01316513282._3
401- let $t01328713791 = 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))
402390 then {
403391 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
404392 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
407395 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
408396 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
409397 }
410- let pmtAmountA = $t01328713791._1
411- let pmtAmountB = $t01328713791._2
412- let change = $t01328713791._3
413- let changeAssetId = $t01328713791._4
414- let shareTokenRatio = $t01328713791._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
415403 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
416404 if ((size(i.payments) != 2))
417405 then throw("Two attached assets expected")
446434
447435 @Callable(i)
448436 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
449- let $t01544015515 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
450- let pmtAmount = $t01544015515._1
451- let pmtAssetId = $t01544015515._2
452- let $t01552015593 = getAssetInfo(pmtAssetId)
453- let pmtStrAssetId = $t01552015593._1
454- let pmtAssetName = $t01552015593._2
455- let pmtDecimals = $t01552015593._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
456444 let pmtMinThreshold = 5000000
457445 let thresholdValueForMinTolerance = 50000000
458446 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
472460 else false)
473461 then throwAssets()
474462 else {
475- let $t01653117137 = if ((pmtAssetId == assetIdA))
463+ let $t01600716649 = if ((pmtAssetId == assetIdA))
476464 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
477465 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
478- let virtualReplenishA = $t01653117137._1
479- let virtualReplenishB = $t01653117137._2
480- let balanceAfterSwapA = $t01653117137._3
481- let balanceAfterSwapB = $t01653117137._4
482- let newBalanceA = $t01653117137._5
483- let newBalanceB = $t01653117137._6
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
484472 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
485- let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
473+ let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
486474 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
487475 if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
488476 then true
504492 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
505493 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
506494 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
507- let $t01913919434 = if ((pmtStrAssetId == strAssetIdA))
495+ let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
508496 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
509497 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
510- let stakeAmount = $t01913919434._1
511- let unstakeAmount = $t01913919434._2
512- let unstakeAsset = $t01913919434._3
498+ let stakeAmount = $t01863618931._1
499+ let unstakeAmount = $t01863618931._2
500+ let unstakeAsset = $t01863618931._3
513501 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
514502 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
515503 else 0
519507 then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
520508 else 0
521509 if ((stake2 == stake2))
522- then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(walletAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(walletAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
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)))]
523511 else throw("Strict value is not equal to itself.")
524512 }
525513 else throw("Strict value is not equal to itself.")
531519
532520 @Callable(i)
533521 func withdraw () = valueOrElse(isActive(), {
534- let $t02061320688 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
535- let pmtAmount = $t02061320688._1
536- let pmtAssetId = $t02061320688._2
522+ let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523+ let pmtAmount = $t02021820293._1
524+ let pmtAssetId = $t02021820293._2
537525 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
538526 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
539527 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
564552
565553 @Callable(i)
566554 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
567- let $t02215122226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
568- let pmtAmount = $t02215122226._1
569- let pmtAssetId = $t02215122226._2
555+ let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556+ let pmtAmount = $t02184421919._1
557+ let pmtAssetId = $t02184421919._2
570558 if ((0 >= estimatedAmountToReceive))
571559 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
572560 else if ((minAmountToReceive > estimatedAmountToReceive))
592580 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
593581 let governanceReward = fraction(amount, feeGovernance, feeScale6)
594582 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
595- let $t02347623738 = if ((pmtAssetId == assetIdA))
583+ let $t02322523487 = if ((pmtAssetId == assetIdA))
596584 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
597585 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
598- let newBalanceA = $t02347623738._1
599- let newBalanceB = $t02347623738._2
586+ let newBalanceA = $t02322523487._1
587+ let newBalanceB = $t02322523487._2
600588 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
601589 if (if ((dAppThresholdAmount > newBalanceA))
602590 then true
603591 else (dAppThresholdAmount > newBalanceB))
604592 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
605593 else {
606- let $t02403624109 = getAssetInfo(pmtAssetId)
607- let pmtStrAssetId = $t02403624109._1
608- let pmtAssetName = $t02403624109._2
609- let pmtDecimals = $t02403624109._3
610- let $t02412224199 = getAssetInfo(sendAssetId)
611- let sendStrAssetId = $t02412224199._1
612- let sendAssetName = $t02412224199._2
613- let sendDecimals = $t02412224199._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
614602 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
615603 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
616604 else 0
620608 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
621609 else 0
622610 if ((stake2 == stake2))
623- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), 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))
624612 else throw("Strict value is not equal to itself.")
625613 }
626614 else throw("Strict value is not equal to itself.")
649637 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
650638 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
651639 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
652- if ((i.caller != walletAddress))
653- 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")
654642 else if (if ((0 > amountEnrollA))
655643 then true
656644 else (0 > amountEnrollB))
673661 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
674662 else 0
675663 if ((stake2 == stake2))
676- 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))]
677665 else throw("Strict value is not equal to itself.")
678666 }
679667 else throw("Strict value is not equal to itself.")
686674 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
687675 then throw("Only contract itself can invoke this function")
688676 else {
689- let $t02701127114 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
690- let call = $t02701127114._1
691- let addr = $t02701127114._2
692- let params = $t02701127114._3
693- let payments = $t02701127114._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
694682 let inv = invoke(addr, call, params, payments)
695683 if ((inv == inv))
696684 then nil
723711 then true
724712 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
725713 then true
726- else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
714+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
727715 if (if (callTakeIntoAccount)
728716 then signedByAdmin
729717 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) = {
204196 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")
229221 if ((invariant > invEstimated))
230222 then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
231223 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))
248240 then amountToSendMin._1
249241 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
269261 if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
270262 then throw("The requested price is too not profitable for user")
271263 else tupleSendBetter._1
272264 }
273265 }
274266 }
275267
276268
277269 func getAssetInfo (assetId) = match assetId {
278270 case id: ByteVector =>
279271 let stringId = toBase58String(id)
280272 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
281273 $Tuple3(stringId, info.name, info.decimals)
282274 case waves: Unit =>
283275 $Tuple3("WAVES", "WAVES", 8)
284276 case _ =>
285277 throw("Match error")
286278 }
287279
288280
289281 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
290282
291283
292284 func throwIsActive () = throw("DApp is already active")
293285
294286
295287 func isActive () = if (active)
296288 then unit
297289 else throw("DApp is inactive at this moment")
298290
299291
300292 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
301293 then unit
302294 else throw("Only admin can call this function")
303295
304296
305297 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
306298
307299
308300 func throwOnePayment () = throw("One attached payment expected")
309301
310302
311303 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))
312304
313305
314306 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
315307
316308
317309 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
318- then if ((assetId == USDN))
319- then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
320- else $Tuple2("startStaking", stakingEURNAddress)
321- else if ((assetId == USDN))
322- then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
323- else $Tuple2("stopStaking", stakingEURNAddress)
310+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
311+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
324312
325313
326314 func calcStakingParams (stake,amount,assetId) = if (stake)
327315 then {
328- let $t098569922 = calcStakingFuncAndAddres(stake, assetId)
329- let call = $t098569922._1
330- let stakingAddr = $t098569922._2
316+ let $t091419207 = calcStakingFuncAndAddres(stake, assetId)
317+ let call = $t091419207._1
318+ let stakingAddr = $t091419207._2
331319 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
332320 }
333321 else {
334- let $t01000810074 = calcStakingFuncAndAddres(stake, assetId)
335- let call = $t01000810074._1
336- let stakingAddr = $t01000810074._2
322+ let $t092939359 = calcStakingFuncAndAddres(stake, assetId)
323+ let call = $t092939359._1
324+ let stakingAddr = $t092939359._2
337325 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
338326 }
339327
340328
341329 @Callable(i)
342330 func init () = {
343- let $t01017910256 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
344- let pmtAmountA = $t01017910256._1
345- let pmtAssetIdA = $t01017910256._2
346- let $t01026110338 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
347- let pmtAmountB = $t01026110338._1
348- let pmtAssetIdB = $t01026110338._2
349- let $t01034310420 = getAssetInfo(pmtAssetIdA)
350- let pmtStrAssetIdA = $t01034310420._1
351- let pmtAssetNameA = $t01034310420._2
352- let pmtDecimalsA = $t01034310420._3
353- let $t01042510502 = getAssetInfo(pmtAssetIdB)
354- let pmtStrAssetIdB = $t01042510502._1
355- let pmtAssetNameB = $t01042510502._2
356- let pmtDecimalsB = $t01042510502._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
357345 if (isDefined(getBoolean(this, kActive)))
358346 then throwIsActive()
359347 else if ((pmtAssetIdA == pmtAssetIdB))
360348 then throw("Assets must be different")
361349 else {
362350 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
363351 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
364352 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
365353 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
366354 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
367355 let shareIssueId = calculateAssetId(shareIssue)
368356 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
369357 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
370358 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
371359 else 0
372360 if ((stake1 == stake1))
373361 then {
374362 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
375363 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
376364 else 0
377365 if ((stake2 == stake2))
378- 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)]
379367 else throw("Strict value is not equal to itself.")
380368 }
381369 else throw("Strict value is not equal to itself.")
382370 }
383371 }
384372
385373
386374
387375 @Callable(i)
388376 func replenishWithTwoTokens () = valueOrElse(isActive(), {
389377 let pmtAssetIdA = i.payments[0].assetId
390378 let pmtAssetIdB = i.payments[1].assetId
391379 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
392380 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
393- let $t01308313160 = getAssetInfo(pmtAssetIdA)
394- let pmtStrAssetIdA = $t01308313160._1
395- let pmtAssetNameA = $t01308313160._2
396- let pmtDecimalsA = $t01308313160._3
397- let $t01316513282 = getAssetInfo(pmtAssetIdB)
398- let pmtStrAssetIdB = $t01316513282._1
399- let pmtAssetNameB = $t01316513282._2
400- let pmtDecimalsB = $t01316513282._3
401- let $t01328713791 = 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))
402390 then {
403391 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
404392 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
405393 }
406394 else {
407395 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
408396 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
409397 }
410- let pmtAmountA = $t01328713791._1
411- let pmtAmountB = $t01328713791._2
412- let change = $t01328713791._3
413- let changeAssetId = $t01328713791._4
414- let shareTokenRatio = $t01328713791._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
415403 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
416404 if ((size(i.payments) != 2))
417405 then throw("Two attached assets expected")
418406 else if (if ((pmtAssetIdA != assetIdA))
419407 then true
420408 else (pmtAssetIdB != assetIdB))
421409 then throwAssets()
422410 else if ((shareTokenToPayAmount == 0))
423411 then throw("Too small amount to replenish")
424412 else if ((0 > change))
425413 then throw("Change < 0")
426414 else if (!(hasEnoughBalance))
427415 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
428416 else {
429417 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
430418 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
431419 else 0
432420 if ((stake1 == stake1))
433421 then {
434422 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
435423 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
436424 else 0
437425 if ((stake2 == stake2))
438426 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)]
439427 else throw("Strict value is not equal to itself.")
440428 }
441429 else throw("Strict value is not equal to itself.")
442430 }
443431 })
444432
445433
446434
447435 @Callable(i)
448436 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
449- let $t01544015515 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
450- let pmtAmount = $t01544015515._1
451- let pmtAssetId = $t01544015515._2
452- let $t01552015593 = getAssetInfo(pmtAssetId)
453- let pmtStrAssetId = $t01552015593._1
454- let pmtAssetName = $t01552015593._2
455- let pmtDecimals = $t01552015593._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
456444 let pmtMinThreshold = 5000000
457445 let thresholdValueForMinTolerance = 50000000
458446 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
459447 then 100000
460448 else 1
461449 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
462450 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
463451 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
464452 if ((pmtMinThreshold > pmtAmount))
465453 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
466454 else if ((size(i.payments) != 1))
467455 then throwOnePayment()
468456 else if (!(hasEnoughBalance))
469457 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
470458 else if (if ((pmtAssetId != assetIdA))
471459 then (pmtAssetId != assetIdB)
472460 else false)
473461 then throwAssets()
474462 else {
475- let $t01653117137 = if ((pmtAssetId == assetIdA))
463+ let $t01600716649 = if ((pmtAssetId == assetIdA))
476464 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
477465 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
478- let virtualReplenishA = $t01653117137._1
479- let virtualReplenishB = $t01653117137._2
480- let balanceAfterSwapA = $t01653117137._3
481- let balanceAfterSwapB = $t01653117137._4
482- let newBalanceA = $t01653117137._5
483- let newBalanceB = $t01653117137._6
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
484472 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
485- let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
473+ let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
486474 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
487475 if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
488476 then true
489477 else (invariant > invariantNew))
490478 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
491479 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
492480 then true
493481 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
494482 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
495483 else if (if ((dAppThresholdAmount > newBalanceA))
496484 then true
497485 else (dAppThresholdAmount > newBalanceB))
498486 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
499487 else {
500488 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
501489 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
502490 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
503491 let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
504492 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
505493 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
506494 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
507- let $t01913919434 = if ((pmtStrAssetId == strAssetIdA))
495+ let $t01863618931 = if ((pmtStrAssetId == strAssetIdA))
508496 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
509497 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
510- let stakeAmount = $t01913919434._1
511- let unstakeAmount = $t01913919434._2
512- let unstakeAsset = $t01913919434._3
498+ let stakeAmount = $t01863618931._1
499+ let unstakeAmount = $t01863618931._2
500+ let unstakeAsset = $t01863618931._3
513501 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
514502 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
515503 else 0
516504 if ((stake1 == stake1))
517505 then {
518506 let stake2 = if (containsElement(stakingAssets, unstakeAsset))
519507 then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
520508 else 0
521509 if ((stake2 == stake2))
522- then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(walletAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(walletAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
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)))]
523511 else throw("Strict value is not equal to itself.")
524512 }
525513 else throw("Strict value is not equal to itself.")
526514 }
527515 }
528516 })
529517
530518
531519
532520 @Callable(i)
533521 func withdraw () = valueOrElse(isActive(), {
534- let $t02061320688 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
535- let pmtAmount = $t02061320688._1
536- let pmtAssetId = $t02061320688._2
522+ let $t02021820293 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
523+ let pmtAmount = $t02021820293._1
524+ let pmtAssetId = $t02021820293._2
537525 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
538526 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
539527 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
540528 if ((size(i.payments) != 1))
541529 then throwOnePayment()
542530 else if ((pmtAssetId != shareAssetId))
543531 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
544532 else if (!(hasEnoughBalance))
545533 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
546534 else {
547535 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
548536 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
549537 else 0
550538 if ((stake1 == stake1))
551539 then {
552540 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
553541 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
554542 else 0
555543 if ((stake2 == stake2))
556544 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)]
557545 else throw("Strict value is not equal to itself.")
558546 }
559547 else throw("Strict value is not equal to itself.")
560548 }
561549 })
562550
563551
564552
565553 @Callable(i)
566554 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
567- let $t02215122226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
568- let pmtAmount = $t02215122226._1
569- let pmtAssetId = $t02215122226._2
555+ let $t02184421919 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
556+ let pmtAmount = $t02184421919._1
557+ let pmtAssetId = $t02184421919._2
570558 if ((0 >= estimatedAmountToReceive))
571559 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
572560 else if ((minAmountToReceive > estimatedAmountToReceive))
573561 then throw("Minimal amount can't be greater than estimated.")
574562 else if ((size(i.payments) != 1))
575563 then throwOnePayment()
576564 else if (!(hasEnoughBalance))
577565 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
578566 else if (if ((pmtAssetId != assetIdA))
579567 then (pmtAssetId != assetIdB)
580568 else false)
581569 then throwAssets()
582570 else if ((10000000 > pmtAmount))
583571 then throw("Only swap of 10.000000 or more tokens is allowed")
584572 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
585573 then true
586574 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
587575 then throw("Incorrect args and pmt ratio")
588576 else {
589577 let sendAssetId = if ((pmtAssetId == assetIdA))
590578 then assetIdB
591579 else assetIdA
592580 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
593581 let governanceReward = fraction(amount, feeGovernance, feeScale6)
594582 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
595- let $t02347623738 = if ((pmtAssetId == assetIdA))
583+ let $t02322523487 = if ((pmtAssetId == assetIdA))
596584 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
597585 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
598- let newBalanceA = $t02347623738._1
599- let newBalanceB = $t02347623738._2
586+ let newBalanceA = $t02322523487._1
587+ let newBalanceB = $t02322523487._2
600588 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
601589 if (if ((dAppThresholdAmount > newBalanceA))
602590 then true
603591 else (dAppThresholdAmount > newBalanceB))
604592 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
605593 else {
606- let $t02403624109 = getAssetInfo(pmtAssetId)
607- let pmtStrAssetId = $t02403624109._1
608- let pmtAssetName = $t02403624109._2
609- let pmtDecimals = $t02403624109._3
610- let $t02412224199 = getAssetInfo(sendAssetId)
611- let sendStrAssetId = $t02412224199._1
612- let sendAssetName = $t02412224199._2
613- let sendDecimals = $t02412224199._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
614602 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
615603 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
616604 else 0
617605 if ((stake1 == stake1))
618606 then {
619607 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
620608 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
621609 else 0
622610 if ((stake2 == stake2))
623- then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), 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))
624612 else throw("Strict value is not equal to itself.")
625613 }
626614 else throw("Strict value is not equal to itself.")
627615 }
628616 }
629617 })
630618
631619
632620
633621 @Callable(i)
634622 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
635623 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
636624 else suspend("Paused by admin"))
637625
638626
639627
640628 @Callable(i)
641629 func activate () = valueOrElse(isAdminCall(i), if (active)
642630 then throwIsActive()
643631 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
644632
645633
646634
647635 @Callable(i)
648636 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
649637 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
650638 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
651639 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
652- if ((i.caller != walletAddress))
653- 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")
654642 else if (if ((0 > amountEnrollA))
655643 then true
656644 else (0 > amountEnrollB))
657645 then suspend("Enroll amount negative")
658646 else if (if ((amountEnrollA == 0))
659647 then (amountEnrollB == 0)
660648 else false)
661649 then throw("No money to take")
662650 else {
663651 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
664652 then (amountEnrollA > 0)
665653 else false)
666654 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
667655 else 0
668656 if ((stake1 == stake1))
669657 then {
670658 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
671659 then (amountEnrollB > 0)
672660 else false)
673661 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
674662 else 0
675663 if ((stake2 == stake2))
676- 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))]
677665 else throw("Strict value is not equal to itself.")
678666 }
679667 else throw("Strict value is not equal to itself.")
680668 }
681669 })
682670
683671
684672
685673 @Callable(i)
686674 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
687675 then throw("Only contract itself can invoke this function")
688676 else {
689- let $t02701127114 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
690- let call = $t02701127114._1
691- let addr = $t02701127114._2
692- let params = $t02701127114._3
693- let payments = $t02701127114._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
694682 let inv = invoke(addr, call, params, payments)
695683 if ((inv == inv))
696684 then nil
697685 else throw("Strict value is not equal to itself.")
698686 }
699687
700688
701689 @Verifier(tx)
702690 func verify () = {
703691 let multiSignedByAdmins = {
704692 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
705693 then 1
706694 else 0
707695 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
708696 then 1
709697 else 0
710698 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
711699 then 1
712700 else 0
713701 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
714702 }
715703 match tx {
716704 case inv: InvokeScriptTransaction =>
717705 let callTakeIntoAccount = if ((inv.dApp == this))
718706 then (inv.function == "takeIntoAccountExtraFunds")
719707 else false
720708 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
721709 then true
722710 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
723711 then true
724712 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
725713 then true
726- else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
714+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
727715 if (if (callTakeIntoAccount)
728716 then signedByAdmin
729717 else false)
730718 then true
731719 else multiSignedByAdmins
732720 case _ =>
733721 multiSignedByAdmins
734722 }
735723 }
736724

github/deemru/w8io/c3f4982 
133.50 ms