2020.11.25 19:15 [2344881] smart account 3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG > SELF 0.00000000 Waves

{ "type": 13, "id": "7HcornyN38fQq4ucjuZW1AHDcnwAo3yQq7da8fYTbAnd", "fee": 1400000, "feeAssetId": null, "timestamp": 1606319863706, "version": 2, "chainId": 87, "sender": "3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG", "senderPublicKey": "84f8fhgdAL5ihoyPzy1vQRG5CviL7VwfiMLTQaADwtZH", "proofs": [ "", "2BWoyDKfTVAekwVsU4uE5BrDmrYp4zmKiX3zTisHqkzRr3zBYoMRx9e8sbaftrqKWg3z9JaVBRyXraLHwf4SJgBv", "5zMn4jjsU1AswiJtYckRmgcBpWzcUzDHWCXDwFwTFvNoCkMFohDx9Zbg7acmJRugD7bqJiPeY8grDmtuVjC7JkjE" ], "script": "base64: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AARVU0ROAgAAAAFfCQAEJQAAAAEFAAAABHRoaXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGc3Rha2VkBQAAAAckbWF0Y2gwBQAAAAZzdGFrZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAAAAAAAAAAAAAJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAAEWF2YWlsYWJsZUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBAwkAAAAAAAACBQAAAAhhc3NldElkQQUAAAAEVVNETgUAAAAQc3Rha2VkQW1vdW50VVNETgAAAAAAAAAAAAAAAAARYXZhaWxhYmxlQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIDCQAAAAAAAAIFAAAACGFzc2V0SWRCBQAAAARVU0ROBQAAABBzdGFrZWRBbW91bnRVU0ROAAAAAAAAAAAAAAAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBCQAAZAAAAAIJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBAwkAAAAAAAACBQAAAAhhc3NldElkQQUAAAAEVVNETgUAAAAQc3Rha2VkQW1vdW50VVNETgAAAAAAAAAAAAAAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgkAAGQAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABFVTRE4FAAAAEHN0YWtlZEFtb3VudFVTRE4AAAAAAAAAAAAAAAAAEGhhc0Vub3VnaEJhbGFuY2UDCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEEFAAAACGJhbGFuY2VBCQAAZwAAAAIFAAAAGWFjY291bnRCYWxhbmNlV2l0aFN0YWtlZEIFAAAACGJhbGFuY2VCBwEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAI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bmdFbnRyeQAAAAIFAAAAC2tleUFzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rZXlDb21taXNzaW9uBQAAAApjb21taXNzaW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABtrZXlDb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2tleVNoYXJlQXNzZXRJZAkAAlgAAAABBQAAAAxzaGFyZUlzc3VlSWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVJc3N1ZUlkBQAAAANuaWwAAAABaQEAAAAWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwAAAAEAAAARc2xpcHBhZ2VUb2xlcmFuY2UEAAAAC3BtdEFzc2V0SWRBCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAtwbXRBc3NldElkQggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAHYXNzZXRJZAQAAAAKcG10QW1vdW50QQkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQFAAAAC3BtdEFzc2V0SWRBBAAAAApwbXRBbW91bnRCCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAUAAAALcG10QXNzZXRJZEIEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAhiYWxhbmNlQQUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEEFAAAAC3NjYWxlVmFsdWUzCQAAawAAAAMFAAAACGJhbGFuY2VCBQAAAAtzY2FsZVZhbHVlOAUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlOAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAKcG10QW1vdW50QgUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEI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CGFzc2V0SWRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tleVNoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDEwODE0MTA4ODkJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxMDgxNDEwODg5AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTA4MTQxMDg4OQAAAAJfMgoBAAAADWNhbGN1bGF0ZUZlZXMAAAACAAAACXRva2VuRnJvbQAAAAd0b2tlblRvBAAAABBhbW91bnRXaXRob3V0RmVlCQAAawAAAAMFAAAAB3Rva2VuVG8FAAAACXBtdEFtb3VudAkAAGQAAAACBQAAAAlwbXRBbW91bnQFAAAACXRva2VuRnJvbQQAAAANYW1vdW50V2l0aEZlZQkAAGsAAAADBQAAABBhbW91bnRXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUFAAAAFGNvbW1pc3Npb25Hb3Zlcm5hbmNlBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAANYW1vdW50V2l0aEZlZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkAAaQAAAABBQAAAA1hbW91bnRXaXRoRmVlAgAAACAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAAUVAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAANYW1vdW50V2l0aEZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAABnAAAAAgAAAAAAAAAAAAUAAAASbWluQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAA0TWluaW1hbCBhbW91bnQgdG8gcmVjZWl2ZSBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQEAAAAHc3VzcGVuZAAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQABpAAAAAEFAAAACGJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABBQAAAAhiYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAAAJLiBTdGF0ZTogCQABpAAAAAEJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAANJHQwMTIyNDgxMjMzOQkBAAAADWNhbGN1bGF0ZUZlZXMAAAACBQAAAAhiYWxhbmNlQQUAAAAIYmFsYW5jZUIEAAAAEGFtb3VudFdpdGhvdXRGZWUIBQAAAA0kdDAxMjI0ODEyMzM5AAAAAl8xBAAAAA1hbW91bnRXaXRoRmVlCAUAAAANJHQwMTIyNDgxMjMzOQAAAAJfMgQAAAAQZ292ZXJuYW5jZVJld2FyZAgFAAAADSR0MDEyMjQ4MTIzMzkAAAACXzMEAAAAC25ld0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VCCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQDAwMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABFVTRE4JAABnAAAAAgUAAAAQc3Rha2VkQW1vdW50VVNETgUAAAALbmV3QmFsYW5jZUEHBgMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABFVTRE4JAABnAAAAAgUAAAAQc3Rha2VkQW1vdW50VVNETgUAAAALbmV3QmFsYW5jZUIHCQEAAAAhdGhyb3dJbnN1ZmZpY2llbnRBdmFpbGFibGVCYWxhbmNlAAAAAwUAAAANYW1vdW50V2l0aEZlZQUAAAARYXZhaWxhYmxlQmFsYW5jZUIFAAAACmFzc2V0TmFtZUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAANYW1vdW50V2l0aEZlZQUAAAALYXNzZXRJZFNlbmQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAARZ292ZXJuYW5jZUFkZHJlc3MFAAAAEGdvdmVybmFuY2VSZXdhcmQFAAAAC2Fzc2V0SWRTZW5kBQAAAANuaWwDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBAAAAAthc3NldElkU2VuZAUAAAAIYXNzZXRJZEEEAAAADSR0MDEzMjEyMTMzMDMJAQAAAA1jYWxjdWxhdGVGZWVzAAAAAgUAAAAIYmFsYW5jZUIFAAAACGJhbGFuY2VBBAAAABBhbW91bnRXaXRob3V0RmVlCAUAAAANJHQwMTMyMTIxMzMwMwAAAAJfMQQAAAANYW1vdW50V2l0aEZlZQgFAAAADSR0MDEzMjEyMTMzMDMAAAACXzIEAAAAEGdvdmVybmFuY2VSZXdhcmQIBQAAAA0kdDAxMzIxMjEzMzAzAAAAAl8zBAAAAAtuZXdCYWxhbmNlQQkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkBAAAAAtuZXdCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50AwMDCQAAAAAAAAIFAAAACGFzc2V0SWRBBQAAAARVU0ROCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VBBwYDCQAAAAAAAAIFAAAACGFzc2V0SWRCBQAAAARVU0ROCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VCBwkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADWFtb3VudFdpdGhGZWUFAAAAEWF2YWlsYWJsZUJhbGFuY2VBBQAAAAphc3NldE5hbWVBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADWFtb3VudFdpdGhGZWUFAAAAC2Fzc2V0SWRTZW5kCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEWdvdmVybmFuY2VBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAthc3NldElkU2VuZAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAUAAAALc3RyQXNzZXRJZEECAAAABCBvciAFAAAAC3N0ckFzc2V0SWRCAAAAAWkBAAAACHNodXRkb3duAAAAAAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAACGtleUNhdXNlAgAAABp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAUYWRtaW5QdWJLZXlTdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkBAAAAB3N1c3BlbmQAAAABAgAAAA9QYXVzZWQgYnkgYWRtaW4AAAABaQEAAAAIYWN0aXZhdGUAAAAAAwUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAWREFwcCBpcyBhbHJlYWR5IGFjdGl2ZQMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAUYWRtaW5QdWJLZXlTdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAhrZXlDYXVzZQUAAAADbmlsAAAAAWkBAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMAAAABAAAAC2Ftb3VudExlYXZlBAAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBBQAAAAhiYWxhbmNlQQQAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIEAAAADWFtb3VudEVucm9sbEEJAABlAAAAAgUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEDCQAAAAAAAAIFAAAACGFzc2V0SWRBBQAAAARVU0ROBQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAANYW1vdW50RW5yb2xsQgkAAGUAAAACBQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QgMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABFVTRE4FAAAAC2Ftb3VudExlYXZlAAAAAAAAAAAAAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABJhZG1pblB1YktleVN0YWtpbmcFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAB11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QQYJAABmAAAAAgAAAAAAAAAAAAUAAAAddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIJAQAAAAdzdXNwZW5kAAAAAQIAAAAWRW5yb2xsIGFtb3VudCBuZWdhdGl2ZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADWFtb3VudEVucm9sbEIJAAACAAAAAQIAAAAVVG9vIGxhcmdlIGFtb3VudExlYXZlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAAGaW52b2tlBQAAAAckbWF0Y2gwAwkAAfQAAAADCAUAAAAGaW52b2tlAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAGaW52b2tlAAAABnByb29mcwAAAAAAAAAAAAUAAAASYWRtaW5QdWJLZXlTdGFraW5nCQAAAAAAAAIIBQAAAAZpbnZva2UAAAAEZEFwcAUAAAAOc3Rha2luZ0FkZHJlc3MHBAAAABJhZG1pblB1YktleTFTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTJTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQUAAAAMYWRtaW5QdWJLZXkyAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTNTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgUAAAAMYWRtaW5QdWJLZXkzAAAAAAAAAAABAAAAAAAAAAAACQAAZwAAAAIJAABkAAAAAgkAAGQAAAACBQAAABJhZG1pblB1YktleTFTaWduZWQFAAAAEmFkbWluUHViS2V5MlNpZ25lZAUAAAASYWRtaW5QdWJLZXkzU2lnbmVkAAAAAAAAAAACaVUuOA==", "height": 2344881, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ArMCR4P7QkUhXNT5Fo9ZV3E47dHDyigenPd7zWosxe45 Next: 8SrXLu2LiCAq2MzgvaY5D5MARmAYkuAgizmMKbv5pHbb Diff:
OldNewDifferences
3131
3232 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
3333
34+let adminPubKeyStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
35+
36+let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
37+
3438 let governanceAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
39+
40+let stakingAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
41+
42+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
43+
44+let stakingFeeInUSDN = (9 * value(value(assetInfo(USDN)).minSponsoredFee))
3545
3646 let isActive = getBooleanValue(this, keyActive)
3747
97107 }
98108
99109
100-let hasEnoughBalance = if ((accountBalance(assetIdA) >= balanceA))
101- then (accountBalance(assetIdB) >= balanceB)
110+let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
111+ case staked: Int =>
112+ staked
113+ case nothing: Unit =>
114+ 0
115+ case _ =>
116+ throw("Match error")
117+}
118+
119+let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
120+ then stakedAmountUSDN
121+ else 0))
122+
123+let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
124+ then stakedAmountUSDN
125+ else 0))
126+
127+let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
128+ then stakedAmountUSDN
129+ else 0))
130+
131+let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
132+ then stakedAmountUSDN
133+ else 0))
134+
135+let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
136+ then (accountBalanceWithStakedB >= balanceB)
102137 else false
103138
104139 func getAssetInfo (assetId) = match assetId {
116151 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
117152
118153
154+func deductStakingFee (amount,assetId) = if ((assetId == USDN))
155+ then {
156+ let result = (amount - stakingFeeInUSDN)
157+ if ((0 >= result))
158+ then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakedAmountUSDN)) + " USD-N"))
159+ else result
160+ }
161+ else amount
162+
163+
164+func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
165+
166+
167+func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Not enough balance on DApp to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " at this moment. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
168+
169+
119170 @Callable(i)
120171 func init () = {
121- let $t026462723 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
122- let pmtAmountA = $t026462723._1
123- let pmtAssetIdA = $t026462723._2
124- let $t027282805 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
125- let pmtAmountB = $t027282805._1
126- let pmtAssetIdB = $t027282805._2
127- let $t028102887 = getAssetInfo(pmtAssetIdA)
128- let pmtStrAssetIdA = $t028102887._1
129- let pmtAssetNameA = $t028102887._2
130- let pmtDecimalsA = $t028102887._3
131- let $t028922969 = getAssetInfo(pmtAssetIdB)
132- let pmtStrAssetIdB = $t028922969._1
133- let pmtAssetNameB = $t028922969._2
134- let pmtDecimalsB = $t028922969._3
172+ let $t047574834 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
173+ let pmtAmountA = $t047574834._1
174+ let pmtAssetIdA = $t047574834._2
175+ let $t048394916 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
176+ let pmtAmountB = $t048394916._1
177+ let pmtAssetIdB = $t048394916._2
178+ let $t049214998 = getAssetInfo(pmtAssetIdA)
179+ let pmtStrAssetIdA = $t049214998._1
180+ let pmtAssetNameA = $t049214998._2
181+ let pmtDecimalsA = $t049214998._3
182+ let $t050035080 = getAssetInfo(pmtAssetIdB)
183+ let pmtStrAssetIdB = $t050035080._1
184+ let pmtAssetNameB = $t050035080._2
185+ let pmtDecimalsB = $t050035080._3
135186 if (isDefined(getBoolean(this, keyActive)))
136187 then throw("DApp is already active")
137188 else if ((pmtAssetIdA == pmtAssetIdB))
151202
152203 @Callable(i)
153204 func replenishWithTwoTokens (slippageTolerance) = {
154- let $t046304707 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
155- let pmtAmountA = $t046304707._1
156- let pmtAssetIdA = $t046304707._2
157- let $t047124906 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
158- let pmtAmountB = $t047124906._1
159- let pmtAssetIdB = $t047124906._2
160- let tokenRatio = (fraction(balanceA, (scaleValue8 * scaleValue3), pmtAmountA) / fraction(balanceB, scaleValue8, pmtAmountB))
205+ let pmtAssetIdA = i.payments[0].assetId
206+ let pmtAssetIdB = i.payments[1].assetId
207+ let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
208+ let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
209+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
161210 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
162211 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
163212 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
188237
189238 @Callable(i)
190239 func withdraw () = {
191- let $t070127087 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
192- let pmtAmount = $t070127087._1
193- let pmtAssetId = $t070127087._2
194- let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
195- let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
240+ let $t092749424 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
241+ let pmtAmount = $t092749424._1
242+ let pmtAssetId = $t092749424._2
243+ let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
244+ let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
196245 if (!(isActive))
197246 then throw("DApp is inactive at this moment")
198247 else if ((size(i.payments) != 1))
201250 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
202251 else if (!(hasEnoughBalance))
203252 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
204- else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
253+ else if (if ((amountToPayA > availableBalanceA))
254+ then true
255+ else (amountToPayB > availableBalanceB))
256+ then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
257+ else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
205258 }
206259
207260
208261
209262 @Callable(i)
210263 func exchange (minAmountToReceive) = {
211- let $t082698344 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
212- let pmtAmount = $t082698344._1
213- let pmtAssetId = $t082698344._2
264+ let $t01081410889 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
265+ let pmtAmount = $t01081410889._1
266+ let pmtAssetId = $t01081410889._2
214267 func calculateFees (tokenFrom,tokenTo) = {
215268 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
216269 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
231284 else if ((pmtAssetId == assetIdA))
232285 then {
233286 let assetIdSend = assetIdB
234- let $t097039938 = calculateFees(balanceA, balanceB)
235- let amountWithoutFee = $t097039938._1
236- let amountWithFee = $t097039938._2
237- let governanceReward = $t097039938._3
238-[IntegerEntry(keyBalanceA, (balanceA + pmtAmount)), IntegerEntry(keyBalanceB, ((balanceB - amountWithFee) - governanceReward)), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
287+ let $t01224812339 = calculateFees(balanceA, balanceB)
288+ let amountWithoutFee = $t01224812339._1
289+ let amountWithFee = $t01224812339._2
290+ let governanceReward = $t01224812339._3
291+ let newBalanceA = (balanceA + pmtAmount)
292+ let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
293+ if (if (if ((assetIdA == USDN))
294+ then (stakedAmountUSDN >= newBalanceA)
295+ else false)
296+ then true
297+ else if ((assetIdB == USDN))
298+ then (stakedAmountUSDN >= newBalanceB)
299+ else false)
300+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
301+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
239302 }
240303 else if ((pmtAssetId == assetIdB))
241304 then {
242305 let assetIdSend = assetIdA
243- let $t01033410569 = calculateFees(balanceB, balanceA)
244- let amountWithoutFee = $t01033410569._1
245- let amountWithFee = $t01033410569._2
246- let governanceReward = $t01033410569._3
247-[IntegerEntry(keyBalanceA, ((balanceA - amountWithFee) - governanceReward)), IntegerEntry(keyBalanceB, (balanceB + pmtAmount)), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
306+ let $t01321213303 = calculateFees(balanceB, balanceA)
307+ let amountWithoutFee = $t01321213303._1
308+ let amountWithFee = $t01321213303._2
309+ let governanceReward = $t01321213303._3
310+ let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
311+ let newBalanceB = (balanceB + pmtAmount)
312+ if (if (if ((assetIdA == USDN))
313+ then (stakedAmountUSDN >= newBalanceA)
314+ else false)
315+ then true
316+ else if ((assetIdB == USDN))
317+ then (stakedAmountUSDN >= newBalanceB)
318+ else false)
319+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
320+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
248321 }
249322 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
250323 }
252325
253326
254327 @Callable(i)
255-func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
256- then suspend("Paused by admin")
257- else throw("Only admin can call this function")
328+func shutdown () = if (!(isActive))
329+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
330+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
331+ then throw("Only admin can call this function")
332+ else suspend("Paused by admin")
258333
259334
260335
261336 @Callable(i)
262-func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
263- then [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
264- else throw("Only admin can call this function")
337+func activate () = if (isActive)
338+ then throw("DApp is already active")
339+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
340+ then throw("Only admin can call this function")
341+ else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
342+
343+
344+
345+@Callable(i)
346+func takeIntoAccountExtraFunds (amountLeave) = {
347+ let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
348+ let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
349+ let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == USDN))
350+ then amountLeave
351+ else 0))
352+ let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == USDN))
353+ then amountLeave
354+ else 0))
355+ if (!(isActive))
356+ then throw("DApp is inactive at this moment")
357+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
358+ then throw("Only admin can call this function")
359+ else if ((0 > amountLeave))
360+ then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
361+ else if (if ((0 > uncountableAmountEnrollAssetA))
362+ then true
363+ else (0 > uncountableAmountEnrollAssetB))
364+ then suspend("Enroll amount negative")
365+ else if (if ((0 > amountEnrollA))
366+ then true
367+ else (0 > amountEnrollB))
368+ then throw("Too large amountLeave")
369+ else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB))]
370+ }
265371
266372
267373 @Verifier(tx)
268-func verify () = {
269- let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
270- then 1
271- else 0
272- let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
273- then 1
274- else 0
275- let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
276- then 1
277- else 0
278- (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
279- }
374+func verify () = match tx {
375+ case invoke: InvokeScriptTransaction =>
376+ if (sigVerify(invoke.bodyBytes, invoke.proofs[0], adminPubKeyStaking))
377+ then (invoke.dApp == stakingAddress)
378+ else false
379+ case _ =>
380+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
381+ then 1
382+ else 0
383+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
384+ then 1
385+ else 0
386+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
387+ then 1
388+ else 0
389+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
390+}
280391
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
1818 let keyShareAssetId = "share_asset_id"
1919
2020 let keyShareAssetSupply = "share_asset_supply"
2121
2222 let keyCommission = "commission"
2323
2424 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2525
2626 let keyCause = "shutdown_cause"
2727
2828 let adminPubKey1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
2929
3030 let adminPubKey2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
3131
3232 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
3333
34+let adminPubKeyStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
35+
36+let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
37+
3438 let governanceAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
39+
40+let stakingAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
41+
42+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
43+
44+let stakingFeeInUSDN = (9 * value(value(assetInfo(USDN)).minSponsoredFee))
3545
3646 let isActive = getBooleanValue(this, keyActive)
3747
3848 let strAssetIdA = getStringValue(this, keyAssetIdA)
3949
4050 let strAssetIdB = getStringValue(this, keyAssetIdB)
4151
4252 let assetIdA = if ((strAssetIdA == "WAVES"))
4353 then unit
4454 else fromBase58String(strAssetIdA)
4555
4656 let assetIdB = if ((strAssetIdB == "WAVES"))
4757 then unit
4858 else fromBase58String(strAssetIdB)
4959
5060 let assetNameA = match assetIdA {
5161 case id: ByteVector =>
5262 value(assetInfo(id)).name
5363 case waves: Unit =>
5464 "WAVES"
5565 case _ =>
5666 throw("Match error")
5767 }
5868
5969 let assetNameB = match assetIdB {
6070 case id: ByteVector =>
6171 value(assetInfo(id)).name
6272 case waves: Unit =>
6373 "WAVES"
6474 case _ =>
6575 throw("Match error")
6676 }
6777
6878 let balanceA = getIntegerValue(this, keyBalanceA)
6979
7080 let balanceB = getIntegerValue(this, keyBalanceB)
7181
7282 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
7383
7484 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
7585
7686 let commission = 3000
7787
7888 let commissionGovernance = 1200
7989
8090 let commissionScaleDelimiter = 1000000
8191
8292 let scaleValue3 = 1000
8393
8494 let scaleValue8 = 100000000
8595
8696 let slippageToleranceDelimiter = 1000
8797
8898 let scaleValue8Digits = 8
8999
90100 func accountBalance (assetId) = match assetId {
91101 case id: ByteVector =>
92102 assetBalance(this, id)
93103 case waves: Unit =>
94104 wavesBalance(this).available
95105 case _ =>
96106 throw("Match error")
97107 }
98108
99109
100-let hasEnoughBalance = if ((accountBalance(assetIdA) >= balanceA))
101- then (accountBalance(assetIdB) >= balanceB)
110+let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
111+ case staked: Int =>
112+ staked
113+ case nothing: Unit =>
114+ 0
115+ case _ =>
116+ throw("Match error")
117+}
118+
119+let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
120+ then stakedAmountUSDN
121+ else 0))
122+
123+let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
124+ then stakedAmountUSDN
125+ else 0))
126+
127+let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
128+ then stakedAmountUSDN
129+ else 0))
130+
131+let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
132+ then stakedAmountUSDN
133+ else 0))
134+
135+let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
136+ then (accountBalanceWithStakedB >= balanceB)
102137 else false
103138
104139 func getAssetInfo (assetId) = match assetId {
105140 case id: ByteVector =>
106141 let stringId = toBase58String(id)
107142 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
108143 $Tuple3(stringId, info.name, info.decimals)
109144 case waves: Unit =>
110145 $Tuple3("WAVES", "WAVES", 8)
111146 case _ =>
112147 throw("Match error")
113148 }
114149
115150
116151 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
117152
118153
154+func deductStakingFee (amount,assetId) = if ((assetId == USDN))
155+ then {
156+ let result = (amount - stakingFeeInUSDN)
157+ if ((0 >= result))
158+ then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakedAmountUSDN)) + " USD-N"))
159+ else result
160+ }
161+ else amount
162+
163+
164+func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
165+
166+
167+func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Not enough balance on DApp to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " at this moment. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
168+
169+
119170 @Callable(i)
120171 func init () = {
121- let $t026462723 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
122- let pmtAmountA = $t026462723._1
123- let pmtAssetIdA = $t026462723._2
124- let $t027282805 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
125- let pmtAmountB = $t027282805._1
126- let pmtAssetIdB = $t027282805._2
127- let $t028102887 = getAssetInfo(pmtAssetIdA)
128- let pmtStrAssetIdA = $t028102887._1
129- let pmtAssetNameA = $t028102887._2
130- let pmtDecimalsA = $t028102887._3
131- let $t028922969 = getAssetInfo(pmtAssetIdB)
132- let pmtStrAssetIdB = $t028922969._1
133- let pmtAssetNameB = $t028922969._2
134- let pmtDecimalsB = $t028922969._3
172+ let $t047574834 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
173+ let pmtAmountA = $t047574834._1
174+ let pmtAssetIdA = $t047574834._2
175+ let $t048394916 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
176+ let pmtAmountB = $t048394916._1
177+ let pmtAssetIdB = $t048394916._2
178+ let $t049214998 = getAssetInfo(pmtAssetIdA)
179+ let pmtStrAssetIdA = $t049214998._1
180+ let pmtAssetNameA = $t049214998._2
181+ let pmtDecimalsA = $t049214998._3
182+ let $t050035080 = getAssetInfo(pmtAssetIdB)
183+ let pmtStrAssetIdB = $t050035080._1
184+ let pmtAssetNameB = $t050035080._2
185+ let pmtDecimalsB = $t050035080._3
135186 if (isDefined(getBoolean(this, keyActive)))
136187 then throw("DApp is already active")
137188 else if ((pmtAssetIdA == pmtAssetIdB))
138189 then throw("Assets must be different")
139190 else {
140191 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
141192 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
142193 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
143194 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, HALFDOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, HALFDOWN), pow(10, 0, shareDecimals, 0, 0, HALFDOWN))
144195 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
145196 let shareIssueId = calculateAssetId(shareIssue)
146197 [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
147198 }
148199 }
149200
150201
151202
152203 @Callable(i)
153204 func replenishWithTwoTokens (slippageTolerance) = {
154- let $t046304707 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
155- let pmtAmountA = $t046304707._1
156- let pmtAssetIdA = $t046304707._2
157- let $t047124906 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
158- let pmtAmountB = $t047124906._1
159- let pmtAssetIdB = $t047124906._2
160- let tokenRatio = (fraction(balanceA, (scaleValue8 * scaleValue3), pmtAmountA) / fraction(balanceB, scaleValue8, pmtAmountB))
205+ let pmtAssetIdA = i.payments[0].assetId
206+ let pmtAssetIdB = i.payments[1].assetId
207+ let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
208+ let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
209+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
161210 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
162211 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
163212 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
164213 if (!(isActive))
165214 then throw("DApp is inactive at this moment")
166215 else if (if ((0 > slippageTolerance))
167216 then true
168217 else (slippageTolerance > slippageToleranceDelimiter))
169218 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
170219 else if ((size(i.payments) != 2))
171220 then throw("Two attached assets expected")
172221 else if (if ((pmtAssetIdA != assetIdA))
173222 then true
174223 else (pmtAssetIdB != assetIdB))
175224 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
176225 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
177226 then true
178227 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
179228 then throw("Incorrect assets amount: amounts must have the contract ratio")
180229 else if ((shareTokenToPayAmount == 0))
181230 then throw("Too small amount to replenish")
182231 else if (!(hasEnoughBalance))
183232 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
184233 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
185234 }
186235
187236
188237
189238 @Callable(i)
190239 func withdraw () = {
191- let $t070127087 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
192- let pmtAmount = $t070127087._1
193- let pmtAssetId = $t070127087._2
194- let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
195- let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
240+ let $t092749424 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
241+ let pmtAmount = $t092749424._1
242+ let pmtAssetId = $t092749424._2
243+ let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
244+ let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
196245 if (!(isActive))
197246 then throw("DApp is inactive at this moment")
198247 else if ((size(i.payments) != 1))
199248 then throw("One attached payment expected")
200249 else if ((pmtAssetId != shareAssetId))
201250 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
202251 else if (!(hasEnoughBalance))
203252 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
204- else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
253+ else if (if ((amountToPayA > availableBalanceA))
254+ then true
255+ else (amountToPayB > availableBalanceB))
256+ then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
257+ else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
205258 }
206259
207260
208261
209262 @Callable(i)
210263 func exchange (minAmountToReceive) = {
211- let $t082698344 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
212- let pmtAmount = $t082698344._1
213- let pmtAssetId = $t082698344._2
264+ let $t01081410889 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
265+ let pmtAmount = $t01081410889._1
266+ let pmtAssetId = $t01081410889._2
214267 func calculateFees (tokenFrom,tokenTo) = {
215268 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
216269 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
217270 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
218271 if ((minAmountToReceive > amountWithFee))
219272 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
220273 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
221274 }
222275
223276 if (!(isActive))
224277 then throw("DApp is inactive at this moment")
225278 else if ((0 >= minAmountToReceive))
226279 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
227280 else if ((size(i.payments) != 1))
228281 then throw("One attached payment expected")
229282 else if (!(hasEnoughBalance))
230283 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
231284 else if ((pmtAssetId == assetIdA))
232285 then {
233286 let assetIdSend = assetIdB
234- let $t097039938 = calculateFees(balanceA, balanceB)
235- let amountWithoutFee = $t097039938._1
236- let amountWithFee = $t097039938._2
237- let governanceReward = $t097039938._3
238-[IntegerEntry(keyBalanceA, (balanceA + pmtAmount)), IntegerEntry(keyBalanceB, ((balanceB - amountWithFee) - governanceReward)), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
287+ let $t01224812339 = calculateFees(balanceA, balanceB)
288+ let amountWithoutFee = $t01224812339._1
289+ let amountWithFee = $t01224812339._2
290+ let governanceReward = $t01224812339._3
291+ let newBalanceA = (balanceA + pmtAmount)
292+ let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
293+ if (if (if ((assetIdA == USDN))
294+ then (stakedAmountUSDN >= newBalanceA)
295+ else false)
296+ then true
297+ else if ((assetIdB == USDN))
298+ then (stakedAmountUSDN >= newBalanceB)
299+ else false)
300+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
301+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
239302 }
240303 else if ((pmtAssetId == assetIdB))
241304 then {
242305 let assetIdSend = assetIdA
243- let $t01033410569 = calculateFees(balanceB, balanceA)
244- let amountWithoutFee = $t01033410569._1
245- let amountWithFee = $t01033410569._2
246- let governanceReward = $t01033410569._3
247-[IntegerEntry(keyBalanceA, ((balanceA - amountWithFee) - governanceReward)), IntegerEntry(keyBalanceB, (balanceB + pmtAmount)), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
306+ let $t01321213303 = calculateFees(balanceB, balanceA)
307+ let amountWithoutFee = $t01321213303._1
308+ let amountWithFee = $t01321213303._2
309+ let governanceReward = $t01321213303._3
310+ let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
311+ let newBalanceB = (balanceB + pmtAmount)
312+ if (if (if ((assetIdA == USDN))
313+ then (stakedAmountUSDN >= newBalanceA)
314+ else false)
315+ then true
316+ else if ((assetIdB == USDN))
317+ then (stakedAmountUSDN >= newBalanceB)
318+ else false)
319+ then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
320+ else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
248321 }
249322 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
250323 }
251324
252325
253326
254327 @Callable(i)
255-func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
256- then suspend("Paused by admin")
257- else throw("Only admin can call this function")
328+func shutdown () = if (!(isActive))
329+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
330+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
331+ then throw("Only admin can call this function")
332+ else suspend("Paused by admin")
258333
259334
260335
261336 @Callable(i)
262-func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
263- then [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
264- else throw("Only admin can call this function")
337+func activate () = if (isActive)
338+ then throw("DApp is already active")
339+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
340+ then throw("Only admin can call this function")
341+ else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
342+
343+
344+
345+@Callable(i)
346+func takeIntoAccountExtraFunds (amountLeave) = {
347+ let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
348+ let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
349+ let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == USDN))
350+ then amountLeave
351+ else 0))
352+ let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == USDN))
353+ then amountLeave
354+ else 0))
355+ if (!(isActive))
356+ then throw("DApp is inactive at this moment")
357+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
358+ then throw("Only admin can call this function")
359+ else if ((0 > amountLeave))
360+ then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
361+ else if (if ((0 > uncountableAmountEnrollAssetA))
362+ then true
363+ else (0 > uncountableAmountEnrollAssetB))
364+ then suspend("Enroll amount negative")
365+ else if (if ((0 > amountEnrollA))
366+ then true
367+ else (0 > amountEnrollB))
368+ then throw("Too large amountLeave")
369+ else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB))]
370+ }
265371
266372
267373 @Verifier(tx)
268-func verify () = {
269- let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
270- then 1
271- else 0
272- let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
273- then 1
274- else 0
275- let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
276- then 1
277- else 0
278- (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
279- }
374+func verify () = match tx {
375+ case invoke: InvokeScriptTransaction =>
376+ if (sigVerify(invoke.bodyBytes, invoke.proofs[0], adminPubKeyStaking))
377+ then (invoke.dApp == stakingAddress)
378+ else false
379+ case _ =>
380+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
381+ then 1
382+ else 0
383+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
384+ then 1
385+ else 0
386+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
387+ then 1
388+ else 0
389+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
390+}
280391

github/deemru/w8io/786bc32 
82.66 ms