From 86afcefcf5c3e970922b289e5880869ff9b48670 Mon Sep 17 00:00:00 2001 From: rassadin11 Date: Wed, 15 Jul 2026 13:27:30 +0300 Subject: [PATCH] fix --- dist/assets/index-B04m7avt.js | 2 +- src/pages/politika-cookie/model/content.ts | 2 +- src/pages/politika-personalnyh-dannyh/model/content.ts | 4 ++-- src/pages/publichnaya-oferta/model/content.ts | 2 +- src/pages/reestr-pd-rkn/model/content.ts | 2 +- src/pages/soglasie-personalnyh-dannyh/model/content.ts | 6 +++--- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dist/assets/index-B04m7avt.js b/dist/assets/index-B04m7avt.js index 06ec943..3ae9144 100644 --- a/dist/assets/index-B04m7avt.js +++ b/dist/assets/index-B04m7avt.js @@ -186,4 +186,4 @@ Please change the parent to "u" || !i.containerRef)) { var r = !0; i.resizeObserver = new window.ResizeObserver(function (d) { if (r) { r = !1; return } i.computeSizes() }), i.resizeObserver.observe(i.containerRef) } }, i.preventZoomSafari = function (r) { return r.preventDefault() }, i.cleanEvents = function () { i.currentDoc && (i.currentDoc.removeEventListener("mousemove", i.onMouseMove), i.currentDoc.removeEventListener("mouseup", i.onDragStopped), i.currentDoc.removeEventListener("touchmove", i.onTouchMove), i.currentDoc.removeEventListener("touchend", i.onDragStopped), i.currentDoc.removeEventListener("gesturechange", i.onGestureChange), i.currentDoc.removeEventListener("gestureend", i.onGestureEnd), i.currentDoc.removeEventListener("scroll", i.onScroll)) }, i.clearScrollEvent = function () { i.containerRef && i.containerRef.removeEventListener("wheel", i.onWheel), i.wheelTimer && clearTimeout(i.wheelTimer) }, i.onMediaLoad = function () { var r = i.computeSizes(); r && (i.previousCropSize = r, i.emitCropData(), i.setInitialCrop(r), i.isInitialized = !0), i.props.onMediaLoaded && i.props.onMediaLoaded(i.mediaSize) }, i.setInitialCrop = function (r) { if (i.props.initialCroppedAreaPercentages) { var d = Sk(i.props.initialCroppedAreaPercentages, i.mediaSize, i.props.rotation, r, i.props.minZoom, i.props.maxZoom), f = d.crop, h = d.zoom; i.props.onCropChange(f), i.props.onZoomChange && i.props.onZoomChange(h) } else if (i.props.initialCroppedAreaPixels) { var g = wk(i.props.initialCroppedAreaPixels, i.mediaSize, i.props.rotation, r, i.props.minZoom, i.props.maxZoom), f = g.crop, h = g.zoom; i.props.onCropChange(f), i.props.onZoomChange && i.props.onZoomChange(h) } }, i.computeSizes = function () { var r, d, f, h, g, m, p = i.imageRef.current || i.videoRef.current; if (p && i.containerRef) { i.containerRect = i.containerRef.getBoundingClientRect(), i.saveContainerPosition(); var y = i.containerRect.width / i.containerRect.height, _ = ((r = i.imageRef.current) === null || r === void 0 ? void 0 : r.naturalWidth) || ((d = i.videoRef.current) === null || d === void 0 ? void 0 : d.videoWidth) || 0, b = ((f = i.imageRef.current) === null || f === void 0 ? void 0 : f.naturalHeight) || ((h = i.videoRef.current) === null || h === void 0 ? void 0 : h.videoHeight) || 0, S = p.offsetWidth < _ || p.offsetHeight < b, j = _ / b, w = void 0; if (S) switch (i.state.mediaObjectFit) { default: case "contain": w = y > j ? { width: i.containerRect.height * j, height: i.containerRect.height } : { width: i.containerRect.width, height: i.containerRect.width / j }; break; case "horizontal-cover": w = { width: i.containerRect.width, height: i.containerRect.width / j }; break; case "vertical-cover": w = { width: i.containerRect.height * j, height: i.containerRect.height }; break } else w = { width: p.offsetWidth, height: p.offsetHeight }; i.mediaSize = Ht(Ht({}, w), { naturalWidth: _, naturalHeight: b }), i.props.setMediaSize && i.props.setMediaSize(i.mediaSize); var E = i.props.cropSize ? i.props.cropSize : yk(i.mediaSize.width, i.mediaSize.height, i.containerRect.width, i.containerRect.height, i.props.aspect, i.props.rotation); return (((g = i.state.cropSize) === null || g === void 0 ? void 0 : g.height) !== E.height || ((m = i.state.cropSize) === null || m === void 0 ? void 0 : m.width) !== E.width) && i.props.onCropSizeChange && i.props.onCropSizeChange(E), i.setState({ cropSize: E }, i.recomputeCropPosition), i.props.setCropSize && i.props.setCropSize(E), E } }, i.saveContainerPosition = function () { if (i.containerRef) { var r = i.containerRef.getBoundingClientRect(); i.containerPosition = { x: r.left, y: r.top } } }, i.onMouseDown = function (r) { i.currentDoc && (r.preventDefault(), i.currentDoc.addEventListener("mousemove", i.onMouseMove), i.currentDoc.addEventListener("mouseup", i.onDragStopped), i.saveContainerPosition(), i.onDragStart(l.getMousePoint(r))) }, i.onMouseMove = function (r) { return i.onDrag(l.getMousePoint(r)) }, i.onScroll = function (r) { i.currentDoc && (r.preventDefault(), i.saveContainerPosition()) }, i.onTouchStart = function (r) { i.currentDoc && (i.isTouching = !0, !(i.props.onTouchRequest && !i.props.onTouchRequest(r)) && (i.currentDoc.addEventListener("touchmove", i.onTouchMove, { passive: !1 }), i.currentDoc.addEventListener("touchend", i.onDragStopped), i.saveContainerPosition(), r.touches.length === 2 ? i.onPinchStart(r) : r.touches.length === 1 && i.onDragStart(l.getTouchPoint(r.touches[0])))) }, i.onTouchMove = function (r) { r.preventDefault(), r.touches.length === 2 ? i.onPinchMove(r) : r.touches.length === 1 && i.onDrag(l.getTouchPoint(r.touches[0])) }, i.onGestureStart = function (r) { i.currentDoc && (r.preventDefault(), i.currentDoc.addEventListener("gesturechange", i.onGestureChange), i.currentDoc.addEventListener("gestureend", i.onGestureEnd), i.gestureZoomStart = i.props.zoom, i.gestureRotationStart = i.props.rotation) }, i.onGestureChange = function (r) { if (r.preventDefault(), !i.isTouching) { var d = l.getMousePoint(r), f = i.gestureZoomStart - 1 + r.scale; if (i.setNewZoom(f, d, { shouldUpdatePosition: !0 }), i.props.onRotationChange) { var h = i.gestureRotationStart + r.rotation; i.props.onRotationChange(h) } } }, i.onGestureEnd = function (r) { i.cleanEvents() }, i.onDragStart = function (r) { var d, f, h = r.x, g = r.y; i.dragStartPosition = { x: h, y: g }, i.dragStartCrop = Ht({}, i.props.crop), (f = (d = i.props).onInteractionStart) === null || f === void 0 || f.call(d) }, i.onDrag = function (r) { var d = r.x, f = r.y; i.currentWindow && (i.rafDragTimeout && i.currentWindow.cancelAnimationFrame(i.rafDragTimeout), i.rafDragTimeout = i.currentWindow.requestAnimationFrame(function () { if (i.state.cropSize && !(d === void 0 || f === void 0)) { var h = d - i.dragStartPosition.x, g = f - i.dragStartPosition.y, m = { x: i.dragStartCrop.x + h, y: i.dragStartCrop.y + g }, p = i.props.restrictPosition ? $o(m, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : m; i.props.onCropChange(p) } })) }, i.onDragStopped = function () { var r, d; i.isTouching = !1, i.cleanEvents(), i.emitCropData(), (d = (r = i.props).onInteractionEnd) === null || d === void 0 || d.call(r) }, i.onWheel = function (r) { if (i.currentWindow && !(i.props.onWheelRequest && !i.props.onWheelRequest(r))) { r.preventDefault(); var d = l.getMousePoint(r), f = vk(r).pixelY, h = i.props.zoom - f * i.props.zoomSpeed / 200; i.setNewZoom(h, d, { shouldUpdatePosition: !0 }), i.state.hasWheelJustStarted || i.setState({ hasWheelJustStarted: !0 }, function () { var g, m; return (m = (g = i.props).onInteractionStart) === null || m === void 0 ? void 0 : m.call(g) }), i.wheelTimer && clearTimeout(i.wheelTimer), i.wheelTimer = i.currentWindow.setTimeout(function () { return i.setState({ hasWheelJustStarted: !1 }, function () { var g, m; return (m = (g = i.props).onInteractionEnd) === null || m === void 0 ? void 0 : m.call(g) }) }, 250) } }, i.getPointOnContainer = function (r, d) { var f = r.x, h = r.y; if (!i.containerRect) throw new Error("The Cropper is not mounted"); return { x: i.containerRect.width / 2 - (f - d.x), y: i.containerRect.height / 2 - (h - d.y) } }, i.getPointOnMedia = function (r) { var d = r.x, f = r.y, h = i.props, g = h.crop, m = h.zoom; return { x: (d + g.x) / m, y: (f + g.y) / m } }, i.setNewZoom = function (r, d, f) { var h = f === void 0 ? {} : f, g = h.shouldUpdatePosition, m = g === void 0 ? !0 : g; if (!(!i.state.cropSize || !i.props.onZoomChange)) { var p = _u(r, i.props.minZoom, i.props.maxZoom); if (m) { var y = i.getPointOnContainer(d, i.containerPosition), _ = i.getPointOnMedia(y), b = { x: _.x * p - y.x, y: _.y * p - y.y }, S = i.props.restrictPosition ? $o(b, i.mediaSize, i.state.cropSize, p, i.props.rotation) : b; i.props.onCropChange(S) } i.props.onZoomChange(p) } }, i.getCropData = function () { if (!i.state.cropSize) return null; var r = i.props.restrictPosition ? $o(i.props.crop, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : i.props.crop; return bk(r, i.mediaSize, i.state.cropSize, i.getAspect(), i.props.zoom, i.props.rotation, i.props.restrictPosition) }, i.emitCropData = function () { var r = i.getCropData(); if (r) { var d = r.croppedAreaPercentages, f = r.croppedAreaPixels; i.props.onCropComplete && i.props.onCropComplete(d, f), i.props.onCropAreaChange && i.props.onCropAreaChange(d, f) } }, i.emitCropAreaChange = function () { var r = i.getCropData(); if (r) { var d = r.croppedAreaPercentages, f = r.croppedAreaPixels; i.props.onCropAreaChange && i.props.onCropAreaChange(d, f) } }, i.recomputeCropPosition = function () { var r, d; if (i.state.cropSize) { var f = i.props.crop; if (i.isInitialized && (!((r = i.previousCropSize) === null || r === void 0) && r.width) && (!((d = i.previousCropSize) === null || d === void 0) && d.height)) { var h = Math.abs(i.previousCropSize.width - i.state.cropSize.width) > 1e-6 || Math.abs(i.previousCropSize.height - i.state.cropSize.height) > 1e-6; if (h) { var g = i.state.cropSize.width / i.previousCropSize.width, m = i.state.cropSize.height / i.previousCropSize.height; f = { x: i.props.crop.x * g, y: i.props.crop.y * m } } } var p = i.props.restrictPosition ? $o(f, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : f; i.previousCropSize = i.state.cropSize, i.props.onCropChange(p), i.emitCropData() } }, i.onKeyDown = function (r) { var d, f, h = i.props, g = h.crop, m = h.onCropChange, p = h.keyboardStep, y = h.zoom, _ = h.rotation, b = p; if (i.state.cropSize) { r.shiftKey && (b *= .2); var S = Ht({}, g); switch (r.key) { case "ArrowUp": S.y -= b, r.preventDefault(); break; case "ArrowDown": S.y += b, r.preventDefault(); break; case "ArrowLeft": S.x -= b, r.preventDefault(); break; case "ArrowRight": S.x += b, r.preventDefault(); break; default: return }i.props.restrictPosition && (S = $o(S, i.mediaSize, i.state.cropSize, y, _)), r.repeat || (f = (d = i.props).onInteractionStart) === null || f === void 0 || f.call(d), m(S) } }, i.onKeyUp = function (r) { var d, f; switch (r.key) { case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight": r.preventDefault(); break; default: return }i.emitCropData(), (f = (d = i.props).onInteractionEnd) === null || f === void 0 || f.call(d) }, i } return l.prototype.componentDidMount = function () { !this.currentDoc || !this.currentWindow || (this.containerRef && (this.containerRef.ownerDocument && (this.currentDoc = this.containerRef.ownerDocument), this.currentDoc.defaultView && (this.currentWindow = this.currentDoc.defaultView), this.initResizeObserver(), typeof window.ResizeObserver > "u" && this.currentWindow.addEventListener("resize", this.computeSizes), this.props.zoomWithScroll && this.containerRef.addEventListener("wheel", this.onWheel, { passive: !1 }), this.containerRef.addEventListener("gesturestart", this.onGestureStart)), this.currentDoc.addEventListener("scroll", this.onScroll), this.props.disableAutomaticStylesInjection || (this.styleRef = this.currentDoc.createElement("style"), this.styleRef.setAttribute("type", "text/css"), this.props.nonce && this.styleRef.setAttribute("nonce", this.props.nonce), this.styleRef.innerHTML = Nk, this.currentDoc.head.appendChild(this.styleRef)), this.imageRef.current && this.imageRef.current.complete && this.onMediaLoad(), this.props.setImageRef && this.props.setImageRef(this.imageRef), this.props.setVideoRef && this.props.setVideoRef(this.videoRef), this.props.setCropperRef && this.props.setCropperRef(this.cropperRef)) }, l.prototype.componentWillUnmount = function () { var i, r; !this.currentDoc || !this.currentWindow || (typeof window.ResizeObserver > "u" && this.currentWindow.removeEventListener("resize", this.computeSizes), (i = this.resizeObserver) === null || i === void 0 || i.disconnect(), this.containerRef && this.containerRef.removeEventListener("gesturestart", this.preventZoomSafari), this.styleRef && ((r = this.styleRef.parentNode) === null || r === void 0 || r.removeChild(this.styleRef)), this.cleanEvents(), this.props.zoomWithScroll && this.clearScrollEvent()) }, l.prototype.componentDidUpdate = function (i) { var r, d, f, h, g, m, p, y, _; i.rotation !== this.props.rotation ? (this.computeSizes(), this.recomputeCropPosition()) : i.aspect !== this.props.aspect ? this.computeSizes() : i.objectFit !== this.props.objectFit ? this.computeSizes() : i.zoom !== this.props.zoom ? this.recomputeCropPosition() : ((r = i.cropSize) === null || r === void 0 ? void 0 : r.height) !== ((d = this.props.cropSize) === null || d === void 0 ? void 0 : d.height) || ((f = i.cropSize) === null || f === void 0 ? void 0 : f.width) !== ((h = this.props.cropSize) === null || h === void 0 ? void 0 : h.width) ? this.computeSizes() : (((g = i.crop) === null || g === void 0 ? void 0 : g.x) !== ((m = this.props.crop) === null || m === void 0 ? void 0 : m.x) || ((p = i.crop) === null || p === void 0 ? void 0 : p.y) !== ((y = this.props.crop) === null || y === void 0 ? void 0 : y.y)) && this.emitCropAreaChange(), i.zoomWithScroll !== this.props.zoomWithScroll && this.containerRef && (this.props.zoomWithScroll ? this.containerRef.addEventListener("wheel", this.onWheel, { passive: !1 }) : this.clearScrollEvent()), i.video !== this.props.video && ((_ = this.videoRef.current) === null || _ === void 0 || _.load()); var b = this.getObjectFit(); b !== this.state.mediaObjectFit && this.setState({ mediaObjectFit: b }, this.computeSizes) }, l.prototype.getAspect = function () { var i = this.props, r = i.cropSize, d = i.aspect; return r ? r.width / r.height : d }, l.prototype.getObjectFit = function () { var i, r, d, f; if (this.props.objectFit === "cover") { var h = this.imageRef.current || this.videoRef.current; if (h && this.containerRef) { this.containerRect = this.containerRef.getBoundingClientRect(); var g = this.containerRect.width / this.containerRect.height, m = ((i = this.imageRef.current) === null || i === void 0 ? void 0 : i.naturalWidth) || ((r = this.videoRef.current) === null || r === void 0 ? void 0 : r.videoWidth) || 0, p = ((d = this.imageRef.current) === null || d === void 0 ? void 0 : d.naturalHeight) || ((f = this.videoRef.current) === null || f === void 0 ? void 0 : f.videoHeight) || 0, y = m / p; return y < g ? "horizontal-cover" : "vertical-cover" } return "horizontal-cover" } return this.props.objectFit }, l.prototype.onPinchStart = function (i) { var r = l.getTouchPoint(i.touches[0]), d = l.getTouchPoint(i.touches[1]); this.lastPinchDistance = d1(r, d), this.lastPinchRotation = f1(r, d), this.onDragStart(h1(r, d)) }, l.prototype.onPinchMove = function (i) { var r = this; if (!(!this.currentDoc || !this.currentWindow)) { var d = l.getTouchPoint(i.touches[0]), f = l.getTouchPoint(i.touches[1]), h = h1(d, f); this.onDrag(h), this.rafPinchTimeout && this.currentWindow.cancelAnimationFrame(this.rafPinchTimeout), this.rafPinchTimeout = this.currentWindow.requestAnimationFrame(function () { var g = d1(d, f), m = r.props.zoom * (g / r.lastPinchDistance); r.setNewZoom(m, h, { shouldUpdatePosition: !1 }), r.lastPinchDistance = g; var p = f1(d, f), y = r.props.rotation + (p - r.lastPinchRotation); r.props.onRotationChange && r.props.onRotationChange(y), r.lastPinchRotation = p }) } }, l.prototype.render = function () { var i = this, r, d = this.props, f = d.image, h = d.video, g = d.mediaProps, m = d.cropperProps, p = d.transform, y = d.crop, _ = y.x, b = y.y, S = d.rotation, j = d.zoom, w = d.cropShape, E = d.showGrid, R = d.roundCropAreaPixels, L = d.style, B = L.containerStyle, P = L.cropAreaStyle, G = L.mediaStyle, V = d.classes, D = V.containerClassName, K = V.cropAreaClassName, ee = V.mediaClassName, re = (r = this.state.mediaObjectFit) !== null && r !== void 0 ? r : this.getObjectFit(); return A.createElement("div", { onMouseDown: this.onMouseDown, onTouchStart: this.onTouchStart, ref: function (ie) { return i.containerRef = ie }, "data-testid": "container", style: B, className: Yc("reactEasyCrop_Container", D) }, f ? A.createElement("img", Ht({ alt: "", className: Yc("reactEasyCrop_Image", re === "contain" && "reactEasyCrop_Contain", re === "horizontal-cover" && "reactEasyCrop_Cover_Horizontal", re === "vertical-cover" && "reactEasyCrop_Cover_Vertical", ee) }, g, { src: f, ref: this.imageRef, style: Ht(Ht({}, G), { transform: p || "translate(".concat(_, "px, ").concat(b, "px) rotate(").concat(S, "deg) scale(").concat(j, ")") }), onLoad: this.onMediaLoad })) : h && A.createElement("video", Ht({ autoPlay: !0, playsInline: !0, loop: !0, muted: !0, className: Yc("reactEasyCrop_Video", re === "contain" && "reactEasyCrop_Contain", re === "horizontal-cover" && "reactEasyCrop_Cover_Horizontal", re === "vertical-cover" && "reactEasyCrop_Cover_Vertical", ee) }, g, { ref: this.videoRef, onLoadedMetadata: this.onMediaLoad, style: Ht(Ht({}, G), { transform: p || "translate(".concat(_, "px, ").concat(b, "px) rotate(").concat(S, "deg) scale(").concat(j, ")") }), controls: !1 }), (Array.isArray(h) ? h : [{ src: h }]).map(function (ce) { return A.createElement("source", Ht({ key: ce.src }, ce)) })), this.state.cropSize && A.createElement("div", Ht({ ref: this.cropperRef, style: Ht(Ht({}, P), { width: R ? Math.round(this.state.cropSize.width) : this.state.cropSize.width, height: R ? Math.round(this.state.cropSize.height) : this.state.cropSize.height }), tabIndex: 0, onKeyDown: this.onKeyDown, onKeyUp: this.onKeyUp, "data-testid": "cropper", className: Yc("reactEasyCrop_CropArea", w === "round" && "reactEasyCrop_CropAreaRound", E && "reactEasyCrop_CropAreaGrid", K) }, m))) }, l.defaultProps = { zoom: 1, rotation: 0, aspect: 4 / 3, maxZoom: Tk, minZoom: Ck, cropShape: "rect", objectFit: "contain", showGrid: !0, style: {}, classes: {}, mediaProps: {}, cropperProps: {}, zoomSpeed: 1, restrictPosition: !0, zoomWithScroll: !0, keyboardStep: Rk }, l.getMousePoint = function (i) { return { x: Number(i.clientX), y: Number(i.clientY) } }, l.getTouchPoint = function (i) { return { x: Number(i.clientX), y: Number(i.clientY) } }, l })(A.Component); function Bk(a) { return new Promise((l, i) => { const r = new Image; r.onload = () => l(r), r.onerror = () => i(new Error("Не удалось загрузить изображение")), r.src = a }) } async function Ok(a, l, i = 512) { const r = await Bk(a), d = document.createElement("canvas"); d.width = i, d.height = i; const f = d.getContext("2d"); if (!f) throw new Error("Canvas 2D context недоступен"); return f.drawImage(r, l.x, l.y, l.width, l.height, 0, 0, i, i), new Promise((h, g) => { d.toBlob(m => { m ? h(m) : g(new Error("Пустой Blob после обрезки")) }, "image/jpeg", .9) }) } const Lk = "_backdrop_1cfz6_1", Mk = "_card_1cfz6_12", zk = "_title_1cfz6_25", Dk = "_cropArea_1cfz6_31", Uk = "_controls_1cfz6_40", Hk = "_zoom_1cfz6_52", qk = "_actions_1cfz6_57", Pk = "_error_1cfz6_63", ks = { backdrop: Lk, card: Mk, title: zk, cropArea: Dk, controls: Uk, zoom: Hk, actions: qk, error: Pk }; function Qk({ imageSrc: a, isSaving: l, onCancel: i, onConfirm: r }) { const [d, f] = A.useState({ x: 0, y: 0 }), [h, g] = A.useState(1), [m, p] = A.useState(null), [y, _] = A.useState(null), b = A.useCallback((j, w) => { p(w) }, []); A.useEffect(() => { const j = w => { w.key === "Escape" && !l && i() }; return window.addEventListener("keydown", j), () => window.removeEventListener("keydown", j) }, [i, l]); const S = async () => { if (m) { _(null); try { const j = await Ok(a, m); await r(j) } catch { _("Не удалось обрезать изображение") } } }; return o.jsx("div", { className: ks.backdrop, onClick: l ? void 0 : i, children: o.jsxs("div", { className: ks.card, onClick: j => j.stopPropagation(), children: [o.jsx("h3", { className: ks.title, children: "Выберите область аватара" }), o.jsx("div", { className: ks.cropArea, children: o.jsx(kk, { image: a, crop: d, zoom: h, aspect: 1, cropShape: "round", showGrid: !1, onCropChange: f, onZoomChange: g, onCropComplete: b }) }), o.jsxs("div", { className: ks.controls, children: [o.jsx("label", { htmlFor: "avatar-zoom", children: "Масштаб" }), o.jsx("input", { id: "avatar-zoom", className: ks.zoom, type: "range", min: 1, max: 3, step: .01, value: h, onChange: j => g(Number(j.target.value)) })] }), y && o.jsx("span", { className: ks.error, children: y }), o.jsxs("div", { className: ks.actions, children: [o.jsx(Ln, { variant: "ghost", onClick: i, disabled: l, children: "Отмена" }), o.jsx(Ln, { variant: "primary", onClick: S, disabled: l || !m, children: l ? "Загрузка..." : "Сохранить" })] })] }) }) } const Fk = "_col_nam4n_1", Yk = "_avatar_nam4n_10", Ik = "_avatarImg_nam4n_31", Gk = "_error_nam4n_38", Kk = "_overlay_nam4n_44", Xk = "_addPhoto_nam4n_69", Si = { col: Fk, avatar: Yk, avatarImg: Ik, error: Gk, overlay: Kk, addPhoto: Xk }; function Vk(a) { return new Promise((l, i) => { const r = new FileReader; r.onload = () => { const d = r.result, f = d.indexOf(","); l(f >= 0 ? d.slice(f + 1) : d) }, r.onerror = () => i(r.error), r.readAsDataURL(a) }) } function Zk() { const { data: a } = yn(), { mutateAsync: l, isPending: i } = PN(), r = A.useRef(null), [d, f] = A.useState(null), [h, g] = A.useState(!1), [m, p] = A.useState(null), y = (a == null ? void 0 : a.avatar_link) ?? null, _ = y && !h; A.useEffect(() => { g(!1) }, [y]), A.useEffect(() => () => { m && URL.revokeObjectURL(m) }, [m]); const b = () => { var E; i || (E = r.current) == null || E.click() }, S = E => { var L; const R = (L = E.target.files) == null ? void 0 : L[0]; E.target.value = "", R && (f(null), p(URL.createObjectURL(R))) }, j = () => { m && URL.revokeObjectURL(m), p(null) }, w = async E => { try { const R = await Vk(E); await l({ photo_base64: R, decoded_bytes: String(E.size) }), j() } catch { f("Не удалось загрузить фото"), j() } }; return o.jsxs("div", { className: Si.col, children: [o.jsxs("div", { className: Si.avatar, onClick: b, children: [_ ? o.jsx("img", { src: y, alt: "avatar", className: Si.avatarImg, referrerPolicy: "no-referrer", onError: () => { console.warn("[avatar] failed to load", y), g(!0) } }) : o.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("circle", { cx: "12", cy: "8", r: "4" }), o.jsx("path", { d: "M4 20c0-4 4-7 8-7s8 3 8 7" })] }), o.jsx("div", { className: Si.overlay, children: o.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "#fff", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("path", { d: "M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z" }), o.jsx("circle", { cx: "12", cy: "13", r: "4" })] }) })] }), o.jsx("input", { ref: r, type: "file", accept: "image/*", onChange: S, hidden: !0 }), o.jsx("div", { className: Si.addPhoto, children: o.jsx(Ln, { variant: "ghost", onClick: b, disabled: i, children: i ? "ЗАГРУЗКА..." : "ДОБАВИТЬ ФОТО" }) }), d && o.jsx("span", { className: Si.error, children: d }), m && o.jsx(Qk, { imageSrc: m, isSaving: i, onCancel: j, onConfirm: w })] }) } const Wk = "_card_17od5_1", Jk = "_title_17od5_8", $k = "_actions_17od5_17", lh = { card: Wk, title: Jk, actions: $k }; function Tl({ title: a, children: l, actions: i }) { return o.jsxs("div", { className: lh.card, children: [o.jsx("div", { className: lh.title, children: a }), l, i && o.jsx("div", { className: lh.actions, children: i })] }) } function e6(a) { return a == null ? "$—" : `$${a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } const t6 = "_profileTop_1107i_2", n6 = "_userInfo_1107i_6", a6 = "_userName_1107i_26", s6 = "_userBalance_1107i_33", Ic = { profileTop: t6, userInfo: n6, userName: a6, userBalance: s6 }; function l6() { const { data: a } = yn(), { data: l } = yu(), i = a ? qN(a) : ""; return o.jsxs("div", { className: Ic.profileTop, children: [o.jsx(Zk, {}), o.jsxs("div", { className: Ic.userInfo, children: [o.jsx("span", { className: Ic.userName, children: i }), o.jsx("span", { className: Ic.userBalance, children: e6(l == null ? void 0 : l.totalUsd) })] })] }) } const i6 = "_menu_nxjwi_1", o6 = "_summary_nxjwi_7", r6 = "_nav_nxjwi_11", c6 = "_item_nxjwi_17", u6 = "_itemActive_nxjwi_35", d6 = "_select_nxjwi_42", pl = { menu: i6, summary: o6, nav: r6, item: c6, itemActive: u6, select: d6 }, au = [{ to: ae.PROFILE_DETAILS, label: "Данные профиля" }, { to: ae.PROFILE_SECURITY, label: "Безопасность" }, { to: ae.PROFILE_TRANSACTIONS, label: "Транзакции" }, { to: ae.PROFILE_MNEMONIC, label: "Мнемоническая фраза" }], f6 = au.map(({ to: a, label: l }) => ({ value: a, label: l })); function h6() { var r; const a = vn(), { pathname: l } = Zt(), i = ((r = au.find(d => l.startsWith(d.to))) == null ? void 0 : r.to) ?? au[0].to; return o.jsxs("aside", { className: pl.menu, children: [o.jsx("div", { className: pl.summary, children: o.jsx(l6, {}) }), o.jsx("div", { className: pl.select, children: o.jsx(Gh, { value: i, options: f6, onChange: d => a(d), label: "Раздел профиля" }) }), o.jsx("nav", { className: pl.nav, children: au.map(({ to: d, label: f }) => o.jsx(Fi, { to: d, className: ({ isActive: h }) => h ? `${pl.item} ${pl.itemActive}` : pl.item, children: f }, d)) })] }) } function m6(a) { const l = QN(), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(null); A.useEffect(() => { a != null && (r(a), f(a)) }, [a]); function m(y) { r(y.replace(/[^\d+\s()-]/g, "")) } function p() { const y = i.trim(); y === d || l.isPending || l.mutate(y, { onSuccess: () => { f(y), g({ status: "success", message: "Номер телефона обновлён" }) }, onError: () => { g({ status: "error", message: "Не удалось обновить номер телефона" }) } }) } return { phone: i, onPhoneChange: m, onPhoneBlur: p, notification: h, dismissNotification: () => g(null) } } const p6 = "_grid2_1y7u3_1", g6 = "_grid1_1y7u3_7", Ci = { grid2: p6, grid1: g6 }; function v6({ data: a }) { const l = Ov(a), { phone: i, onPhoneChange: r, onPhoneBlur: d, notification: f, dismissNotification: h } = m6(a.phone); return o.jsxs(o.Fragment, { children: [o.jsx(Tl, { title: "Личные данные", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Полное ФИО", value: l, placeholder: "Например: Иванов Иван Иванович", readOnly: !0 }), o.jsx(ke, { label: "Адрес электронной почты", value: a.email ?? "", type: "email", icon: "check", placeholder: "example@mail.ru", readOnly: !0 }), o.jsx(ke, { label: "Серия и номер паспорта", value: a.passport_data ?? "", placeholder: "0000 000000", readOnly: !0 }), o.jsx(ke, { label: "Номер телефона", value: i, onChange: r, onBlur: d, type: "tel", placeholder: "+7 (999) 000-00-00" })] }) }), o.jsx(Tl, { title: "Верификация", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "ИНН", value: a.inn ?? "", readOnly: !0, icon: "lock", placeholder: "000000000000" }), o.jsx(ke, { label: "ID аккаунта", value: a.id ?? "", readOnly: !0, icon: "lock", placeholder: "ECSA-00000000" })] }) }), f && o.jsx($a, { status: f.status, message: f.message, onClose: h, duration: 5e3 })] }) } function y6({ data: a }) { const l = a.legal_entity; return l ? o.jsxs(o.Fragment, { children: [o.jsx(Tl, { title: "Данные организации", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Наименование", value: l.name ?? "", placeholder: "ООО «Ромашка»", readOnly: !0 }), o.jsx(ke, { label: "Краткое наименование", value: l.short_name ?? "", placeholder: "Ромашка", readOnly: !0 }), o.jsx(ke, { label: "ИНН", value: l.inn ?? "", readOnly: !0, icon: "lock", placeholder: "000000000000" }), o.jsx(ke, { label: "ОГРН", value: l.ogrn ?? "", placeholder: "1027700132195", readOnly: !0 }), o.jsx(ke, { label: "КПП", value: l.kpp ?? "", placeholder: "770801001", readOnly: !0 }), o.jsx(ke, { label: "Адрес электронной почты", value: a.email ?? "", type: "email", icon: "check", placeholder: "org@mail.ru", readOnly: !0 })] }) }), o.jsx(Tl, { title: "Адреса", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Юридический адрес", value: l.legal_address ?? "", placeholder: "г. Москва, ул. Тверская, д. 1", readOnly: !0 }), o.jsx(ke, { label: "Фактический адрес", value: l.actual_address ?? "", placeholder: "г. Москва, ул. Тверская, д. 1", readOnly: !0 })] }) }), o.jsx(Tl, { title: "Контакты и верификация", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Контактное лицо", value: l.contact_person ?? "", placeholder: "Иванов Иван Иванович", readOnly: !0 }), o.jsx(ke, { label: "Контактный телефон", value: l.contact_phone ?? "", type: "tel", placeholder: "+7 (999) 000-00-00", readOnly: !0 }), o.jsx(ke, { label: "Статус", value: l.status ?? "", placeholder: "active", readOnly: !0 }), o.jsx(ke, { label: "ID аккаунта", value: a.id ?? "", readOnly: !0, icon: "lock", placeholder: "ECSA-00000000" })] }) })] }) : null } function _6() { const { data: a } = yn(); return a ? Bv(a) ? o.jsx(y6, { data: a }) : o.jsx(v6, { data: a }) : null } function b6() { const { data: a } = vu(); return o.jsx(Tl, { title: "Безопасность", children: o.jsx("div", { className: Ci.grid1, children: a == null ? void 0 : a.map(({ chain: l, address: i }) => o.jsx(ke, { label: `Адрес ${l}`, readOnly: !0, icon: "lock", value: i, placeholder: "—" }, l)) }) }) } const x6 = "_kycBanner_2th6o_1", A6 = { kycBanner: x6 }; function S6() { const { data: a } = yn(); return !a || a.kyc_verified ? null : o.jsx("div", { className: A6.kycBanner, children: "Для полного доступа к платформе необходимо пройти верификацию личности (KYC)" }) } const j6 = "_page_wlsc9_1", w6 = "_menu_wlsc9_12", E6 = "_content_wlsc9_16", ih = { page: j6, menu: w6, content: E6 }; function N6() { return o.jsxs("div", { className: ih.page, children: [o.jsx("div", { className: ih.menu, children: o.jsx(h6, {}) }), o.jsxs("main", { className: ih.content, children: [o.jsx(S6, {}), o.jsx(mu, {})] })] }) } function C6() { const { isLoading: a } = yn(); return a ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : o.jsx(_6, {}) } function T6() { const { isLoading: a } = yn(); return a ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : o.jsx(b6, {}) } const m1 = 52; function R6(a) { const [l, i] = A.useState(!1), [r, d] = A.useState(m1), [f, h] = A.useState(!1), g = A.useRef(null), m = A.useCallback(() => { g.current && clearInterval(g.current), d(m1), g.current = setInterval(() => { d(_ => _ <= 1 ? (clearInterval(g.current), i(!0), 0) : _ - 1) }, 1e3) }, []); A.useEffect(() => (m(), () => { g.current && clearInterval(g.current) }), [m]); const p = A.useCallback(() => { i(_ => _ ? (m(), !1) : (g.current && clearInterval(g.current), !0)) }, [m]), y = A.useCallback(() => { navigator.clipboard.writeText(a.join(" ")).then(() => { h(!0), setTimeout(() => h(!1), 1500) }) }, [a]); return { hidden: l, countdown: r, copied: f, handleHide: p, handleCopy: y } } const k6 = "_content_o6p8v_1", B6 = "_titleRow_o6p8v_6", O6 = "_title_o6p8v_6", L6 = "_titleButtons_o6p8v_19", M6 = "_btnFixed_o6p8v_26", z6 = "_subtitle_o6p8v_34", D6 = "_countdown_o6p8v_42", U6 = "_seedGrid_o6p8v_47", H6 = "_seedCard_o6p8v_54", q6 = "_seedNum_o6p8v_73", P6 = "_seedWord_o6p8v_80", Q6 = "_seedWordHidden_o6p8v_88", F6 = "_warning_o6p8v_93", Y6 = "_warningIcon_o6p8v_101", I6 = "_warningText_o6p8v_107", G6 = "_profileLinkRow_o6p8v_115", K6 = "_profileLink_o6p8v_115", zt = { content: k6, titleRow: B6, title: O6, titleButtons: L6, btnFixed: M6, subtitle: z6, countdown: D6, seedGrid: U6, seedCard: H6, seedNum: q6, seedWord: P6, seedWordHidden: Q6, warning: F6, warningIcon: Y6, warningText: I6, profileLinkRow: G6, profileLink: K6 }; function vy({ words: a, showProfileLink: l = !0 }) { const { hidden: i, countdown: r, copied: d, handleHide: f, handleCopy: h } = R6(a); return o.jsxs("div", { className: zt.content, children: [o.jsxs("div", { className: zt.titleRow, children: [o.jsx("h1", { className: zt.title, children: "СИД ФРАЗА" }), o.jsxs("div", { className: zt.titleButtons, children: [o.jsx("div", { className: zt.btnFixed, children: o.jsx(Ln, { variant: "outline", onClick: f, children: i ? "ПОКАЗАТЬ" : "СКРЫТЬ" }) }), o.jsx("div", { className: zt.btnFixed, children: o.jsx(Ln, { variant: "outline", onClick: h, children: d ? "СКОПИРОВАНО" : "КОПИРОВАТЬ" }) })] })] }), !i && o.jsxs("div", { className: zt.subtitle, children: ["АВТОМАТИЧЕСКОЕ СКРЫТИЕ ЧЕРЕЗ", " ", o.jsx("span", { className: zt.countdown, children: r }), "С"] }), o.jsx("div", { className: zt.seedGrid, children: a.map((g, m) => o.jsxs("div", { className: zt.seedCard, children: [o.jsxs("span", { className: zt.seedNum, children: [m + 1, "."] }), o.jsx("span", { className: `${zt.seedWord} ${i ? zt.seedWordHidden : ""}`, children: i ? "•••••" : g })] }, m)) }), o.jsxs("div", { className: zt.warning, children: [o.jsx("span", { className: zt.warningIcon, children: "⚠️" }), o.jsx("p", { className: zt.warningText, children: "Никогда не передавайте сид-фразу третьим лицам. Тот, кто знает фразу — владеет кошельком." })] }), l && o.jsx("div", { className: zt.profileLinkRow, children: o.jsx(gn, { to: ae.PROFILE, className: zt.profileLink, children: "Перейти в профиль" }) })] }) } const X6 = "_hint_1wz0k_1", V6 = { hint: X6 }; function Z6() { const [a, l] = A.useState(!1), { data: i, isLoading: r } = qv(a); if (!a) return o.jsx(Tl, { title: "Мнемоническая фраза", actions: o.jsx(Ln, { variant: "danger", onClick: () => l(!0), children: "Показать мнемонику" }), children: o.jsx("p", { className: V6.hint, children: "Сид-фраза из 12 слов для восстановления кошелька. Никогда не передавайте её третьим лицам." }) }); if (r) return o.jsx(zn, { fullscreen: !0, label: "Загрузка" }); const d = i ? i.split(" ") : []; return o.jsx(vy, { words: d, showProfileLink: !1 }) } function cr(a) { return a ? new Date(a).toLocaleString("ru-RU", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit" }) : "—" } function W6(a) { return a ? a.length <= 16 ? a : `${a.slice(0, 8)}…${a.slice(-6)}` : "—" } function am(a) { return Number(a).toLocaleString("ru-RU") } const J6 = { pending: "Ожидание", money_accepted: "Деньги получены", web3_processing: "Обработка в сети", web3_hash_error: "Ошибка хэша", web3_balance_problem: "Проблема с балансом", receipt_error: "Ошибка чека", completed: "Завершён", usdt_delivered: "USDT отправлен" }, $6 = "_badge_1d3cq_1", e7 = "_status_pending_1d3cq_10", t7 = "_status_completed_1d3cq_15", n7 = "_status_money_accepted_1d3cq_20", a7 = "_status_web3_processing_1d3cq_25", s7 = "_status_web3_hash_error_1d3cq_30", l7 = "_status_web3_balance_problem_1d3cq_35", i7 = "_status_receipt_error_1d3cq_40", o7 = "_status_usdt_delivered_1d3cq_45", p1 = { badge: $6, status_pending: e7, status_completed: t7, status_money_accepted: n7, status_web3_processing: a7, status_web3_hash_error: s7, status_web3_balance_problem: l7, status_receipt_error: i7, status_usdt_delivered: o7 }; function yy({ status: a }) { return o.jsx("span", { className: `${p1.badge} ${p1[`status_${a}`] ?? ""}`, children: J6[a] ?? a }) } const r7 = { created: "Создан", waiting_usdt: "Ожидание USDT", usdt_underpaid: "USDT недоплачен", usdt_received: "USDT получен", wallet_error: "Ошибка кошелька", payout_processing: "Выплата в обработке", payout_completed: "Выплата завершена", payout_failed: "Выплата не прошла", cancelled: "Отменён", expired: "Истёк" }, c7 = "_badge_lkcaw_1", u7 = "_status_usdt_received_lkcaw_11", d7 = "_status_payout_completed_lkcaw_12", f7 = "_status_created_lkcaw_18", h7 = "_status_waiting_usdt_lkcaw_23", m7 = "_status_payout_processing_lkcaw_24", p7 = "_status_usdt_underpaid_lkcaw_30", g7 = "_status_wallet_error_lkcaw_31", v7 = "_status_payout_failed_lkcaw_32", y7 = "_status_expired_lkcaw_33", _7 = "_status_cancelled_lkcaw_39", g1 = { badge: c7, status_usdt_received: u7, status_payout_completed: d7, status_created: f7, status_waiting_usdt: h7, status_payout_processing: m7, status_usdt_underpaid: p7, status_wallet_error: g7, status_payout_failed: v7, status_expired: y7, status_cancelled: _7 }; function _y({ status: a }) { return o.jsx("span", { className: `${g1.badge} ${g1[`status_${a}`] ?? ""}`, children: r7[a] ?? a }) } const b7 = "_button_1q7wx_1", x7 = { button: b7 }; function A7({ value: a }) { const [l, i] = A.useState(!1); function r() { navigator.clipboard.writeText(a).then(() => { i(!0), setTimeout(() => i(!1), 1500) }) } return o.jsx("button", { className: x7.button, onClick: r, type: "button", title: "Скопировать", children: l ? o.jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: o.jsx("polyline", { points: "20 6 9 17 4 12" }) }) : o.jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), o.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }) }) } const S7 = "_item_3k64v_1", j7 = "_summary_3k64v_8", w7 = "_summaryLeft_3k64v_25", E7 = "_opType_3k64v_34", N7 = "_summaryDate_3k64v_46", C7 = "_summaryRight_3k64v_53", T7 = "_amount_3k64v_60", R7 = "_totalAmount_3k64v_68", k7 = "_chevron_3k64v_76", B7 = "_chevronOpen_3k64v_82", O7 = "_bodyOuter_3k64v_86", L7 = "_bodyOuterOpen_3k64v_92", M7 = "_bodyInner_3k64v_96", z7 = "_body_3k64v_86", D7 = "_col_3k64v_108", U7 = "_colTitle_3k64v_113", H7 = "_infoRow_3k64v_122", q7 = "_infoRowTotal_3k64v_135", P7 = "_infoLabel_3k64v_140", Q7 = "_infoValue_3k64v_141", F7 = "_infoValueRow_3k64v_160", Y7 = "_infoLink_3k64v_166", xe = { item: S7, summary: j7, summaryLeft: w7, opType: E7, summaryDate: N7, summaryRight: C7, amount: T7, totalAmount: R7, chevron: k7, chevronOpen: B7, bodyOuter: O7, bodyOuterOpen: L7, bodyInner: M7, body: z7, col: D7, colTitle: U7, infoRow: H7, infoRowTotal: q7, infoLabel: P7, infoValue: Q7, infoValueRow: F7, infoLink: Y7 }; function I7({ op: a }) { const [l, i] = A.useState(!1); return (a.type === "withdrawal" || !a.payment) && !!a.withdrawal && a.withdrawal ? o.jsx(v1, { isOpen: l, onToggle: () => i(d => !d), summary: X7(a.withdrawal), children: V7(a.withdrawal) }) : a.payment ? o.jsx(v1, { isOpen: l, onToggle: () => i(d => !d), summary: G7(a.payment), children: K7(a.payment) }) : null } function v1({ isOpen: a, onToggle: l, summary: i, children: r }) { return o.jsxs("div", { className: xe.item, children: [o.jsxs("button", { className: xe.summary, onClick: l, type: "button", "aria-expanded": a, children: [i, o.jsx("svg", { className: `${xe.chevron} ${a ? xe.chevronOpen : ""}`, width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: o.jsx("polyline", { points: "6 9 12 15 18 9" }) })] }), o.jsx("div", { className: `${xe.bodyOuter} ${a ? xe.bodyOuterOpen : ""}`, children: o.jsx("div", { className: xe.bodyInner, children: o.jsx("div", { className: xe.body, children: r }) }) })] }) } function G7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("span", { className: xe.summaryLeft, children: [o.jsx("span", { className: xe.opType, children: "Платёж" }), o.jsx("span", { className: xe.summaryDate, children: cr(a.created_at) }), a.status && o.jsx(yy, { status: a.status })] }), o.jsx("span", { className: xe.summaryRight, children: a.itpay_paid_amount && o.jsxs("span", { className: xe.totalAmount, children: [am(a.itpay_paid_amount), " ₽"] }) })] }) } function K7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Платёж" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Статус" }), a.status ? o.jsx(yy, { status: a.status }) : o.jsx("span", { className: xe.infoValue, children: "—" })] }), o.jsx(sa, { label: "Оплачено", value: a.itpay_paid_amount || "—" }), o.jsx(sa, { label: "Истекает", value: cr(a.expired_date ?? "") })] }), o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Транзакция" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Хэш транзакции" }), o.jsxs("span", { className: xe.infoValueRow, children: [o.jsx("span", { className: xe.infoValue, title: a.web3_transaction_hash || void 0, children: W6(a.web3_transaction_hash ?? "") }), a.web3_transaction_hash && o.jsx(A7, { value: a.web3_transaction_hash })] })] }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Чек" }), a.receipt_cloudekassir_link ? o.jsx("a", { href: a.receipt_cloudekassir_link, target: "_blank", rel: "noopener noreferrer", className: xe.infoLink, children: "Открыть →" }) : o.jsx("span", { className: xe.infoValue, children: "—" })] })] })] }) } function X7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("span", { className: xe.summaryLeft, children: [o.jsx("span", { className: xe.opType, children: "Вывод СБП" }), o.jsx("span", { className: xe.summaryDate, children: cr(a.created_at ?? "") }), a.status && o.jsx(_y, { status: a.status })] }), o.jsxs("span", { className: xe.summaryRight, children: [a.usdt_amount && o.jsxs("span", { className: xe.amount, children: [a.usdt_amount, " USDT"] }), a.rub_amount && o.jsxs("span", { className: xe.totalAmount, children: [am(a.rub_amount), " ₽"] })] })] }) } function V7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Вывод (СБП)" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Статус" }), a.status ? o.jsx(_y, { status: a.status }) : o.jsx("span", { className: xe.infoValue, children: "—" })] }), o.jsx(sa, { label: "Банк", value: a.bank_name || "—" }), o.jsx(sa, { label: "Телефон", value: a.phone || "—" }), o.jsx(sa, { label: "Создан", value: cr(a.payout_created_at ?? a.created_at ?? "") }), o.jsx(sa, { label: "Завершён", value: cr(a.payout_completed_at ?? "") }), a.provider_error && o.jsx(sa, { label: "Ошибка", value: a.provider_error })] }), o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Суммы" }), o.jsx(sa, { label: "Сумма USDT", value: a.usdt_amount ? `${a.usdt_amount} USDT` : "—" }), o.jsx(sa, { label: "Курс обмена", value: a.usdt_exchange_rate ? `1 USDT = ${a.usdt_exchange_rate} ₽` : "—" }), o.jsx(sa, { label: "Сервисный сбор", value: a.service_fee_usdt ? `${a.service_fee_usdt} USDT` : "—" }), o.jsx(sa, { label: "Сумма к выводу", value: a.rub_amount ? `${am(a.rub_amount)} ₽` : "—", emphasised: !0 })] })] }) } function sa({ label: a, value: l, emphasised: i }) { return o.jsxs("div", { className: `${xe.infoRow} ${i ? xe.infoRowTotal : ""}`, children: [o.jsx("span", { className: xe.infoLabel, children: a }), o.jsx("span", { className: xe.infoValue, children: l })] }) } const Z7 = "_list_gxp0d_1", W7 = "_empty_gxp0d_9", J7 = "_statusError_gxp0d_23", $7 = "_loadMore_gxp0d_30", eB = "_loadMoreBtn_gxp0d_38", er = { list: Z7, empty: W7, statusError: J7, loadMore: $7, loadMoreBtn: eB }; function tB() { const { data: a, isLoading: l, isError: i, fetchNextPage: r, hasNextPage: d, isFetchingNextPage: f } = Jj(), h = (a == null ? void 0 : a.pages.flatMap(g => g.operations)) ?? []; return l ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : i ? o.jsx("p", { className: er.statusError, children: "Не удалось загрузить операции. Попробуйте обновить страницу." }) : h.length === 0 ? o.jsx("p", { className: er.empty, children: "У вас пока нет операций." }) : o.jsxs(o.Fragment, { children: [o.jsx("div", { className: er.list, children: h.map((g, m) => { var p, y; return o.jsx(I7, { op: g }, ((p = g.payment) == null ? void 0 : p.id) ?? ((y = g.withdrawal) == null ? void 0 : y.id) ?? m) }) }), d && o.jsx("div", { className: er.loadMore, children: o.jsx("button", { className: er.loadMoreBtn, onClick: () => r(), disabled: f, type: "button", children: f ? "Загрузка..." : "Загрузить ещё" }) })] }) } const nB = "_status_1yzxr_1", aB = "_statusError_1yzxr_8", sB = "_empty_1yzxr_15", lB = "_tableWrap_1yzxr_22", iB = "_table_1yzxr_22", oB = "_mono_1yzxr_53", rB = "_statusBadge_1yzxr_57", Ya = { status: nB, statusError: aB, empty: sB, tableWrap: lB, table: iB, mono: oB, statusBadge: rB }; function y1(a, l) { return a ? `${a} ${l}` : "—" } function cB(a) { if (!a) return "—"; const l = new Date(a); return Number.isNaN(l.getTime()) ? "—" : l.toLocaleString("ru-RU") } function uB() { const { data: a, isLoading: l, isError: i } = Mv(); return l ? o.jsx("p", { className: Ya.status, children: "Загрузка..." }) : i ? o.jsx("p", { className: Ya.statusError, children: "Не удалось загрузить заявки. Попробуйте обновить страницу." }) : !a || a.items.length === 0 ? o.jsx("p", { className: Ya.empty, children: "У вас пока нет заявок." }) : o.jsx("div", { className: Ya.tableWrap, children: o.jsxs("table", { className: Ya.table, children: [o.jsx("thead", { children: o.jsxs("tr", { children: [o.jsx("th", { children: "USDT" }), o.jsx("th", { children: "Сумма ₽" }), o.jsx("th", { children: "Курс" }), o.jsx("th", { children: "Статус" }), o.jsx("th", { children: "Создана" })] }) }), o.jsx("tbody", { children: a.items.map(r => o.jsxs("tr", { children: [o.jsx("td", { className: Ya.mono, children: y1(r.usdt_amount, "USDT") }), o.jsx("td", { className: Ya.mono, children: y1(r.rub_amount, "₽") }), o.jsx("td", { className: Ya.mono, children: r.exchange_rate ?? "—" }), o.jsx("td", { children: o.jsx("span", { className: Ya.statusBadge, children: r.status }) }), o.jsx("td", { children: cB(r.created_at) })] }, r.id)) })] }) }) } const dB = "_panel_11333_1", fB = "_tabs_11333_6", hB = "_tab_11333_6", Gc = { panel: dB, tabs: fB, tab: hB }; function mB() { const { data: a, isLoading: l } = yn(), [i, r] = A.useState("transactions"); if (l) return o.jsx(zn, { fullscreen: !0, label: "Загрузка" }); const d = !!a && a.account_type !== "individual", f = d ? i : "transactions"; return o.jsxs("div", { className: Gc.panel, children: [d && o.jsxs("div", { className: Gc.tabs, children: [o.jsx("button", { type: "button", className: Gc.tab, "data-active": f === "transactions" || void 0, onClick: () => r("transactions"), children: "Транзакции" }), o.jsx("button", { type: "button", className: Gc.tab, "data-active": f === "requests" || void 0, onClick: () => r("requests"), children: "Заявки" })] }), f === "transactions" ? o.jsx(tB, {}) : o.jsx(uB, {})] }) } function pB() { return o.jsx(mB, {}) } const gB = "_card_1erii_1", vB = "_logo_1erii_10", yB = "_title_1erii_20", _B = "_twoCol_1erii_29", bB = "_leftCol_1erii_36", xB = "_rightCol_1erii_42", AB = "_codeHint_1erii_48", SB = "_error_1erii_55", jB = "_submitWrapper_1erii_62", wB = "_footer_1erii_66", EB = "_forgot_1erii_73", NB = "_divider_1erii_88", Xn = { card: gB, logo: vB, title: yB, twoCol: _B, leftCol: bB, rightCol: xB, codeHint: AB, error: SB, submitWrapper: jB, footer: wB, forgot: EB, divider: NB }; function _1(a) { var i, r; const l = a; return ((r = (i = l == null ? void 0 : l.detail) == null ? void 0 : i[0]) == null ? void 0 : r.msg) ?? "Произошла ошибка" } function CB() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(!1), m = Wt(), p = vn(), y = yt({ mutationFn: kN, onSuccess: () => g(!0) }), _ = yt({ mutationFn: BN, onSuccess: async ({ access_token: w }) => { Jh(), m.clear(), w && Nt.set(w), await m.invalidateQueries({ queryKey: gu }), p(ae.PROFILE) } }), b = () => { a && y.mutate({ email: a }) }, S = w => { w.preventDefault(), _.mutate({ email: a, password: i, code: d }) }, j = (y.isError ? _1(y.error) : null) ?? (_.isError ? _1(_.error) : null); return { email: a, setEmail: l, password: i, setPassword: r, verificationCode: d, setVerificationCode: f, codeSent: h, isLoadingCode: y.isPending, isLoadingSubmit: _.isPending, error: j, handleRequestCode: b, handleSubmit: S } } function TB() { const { email: a, setEmail: l, password: i, setPassword: r, verificationCode: d, setVerificationCode: f, codeSent: h, isLoadingCode: g, isLoadingSubmit: m, error: p, handleRequestCode: y, handleSubmit: _ } = CB(), b = vn(); return o.jsxs("form", { className: Xn.card, onSubmit: _, children: [o.jsx("div", { className: Xn.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: Xn.title, children: "Войти в кошелёк ЭКСА" }), o.jsxs("div", { className: Xn.twoCol, children: [o.jsxs("div", { className: Xn.leftCol, children: [o.jsx(ke, { label: "Адрес электронной почты", type: "email", value: a, onChange: l, placeholder: "example@mail.ru", required: !0 }), o.jsx(ke, { label: "Пароль", type: "password", value: i, onChange: r, placeholder: "••••••••", required: !0 })] }), o.jsxs("div", { className: Xn.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", onClick: y, disabled: h || g, children: g ? "Отправка..." : h ? "Код отправлен" : "Получить код на email" }), o.jsx("span", { className: Xn.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: d, onChange: f, placeholder: "000 000", required: !0 })] })] }), p && o.jsx("p", { className: Xn.error, children: p }), o.jsx("div", { className: Xn.submitWrapper, children: o.jsx(Zn, { label: m ? "Вход..." : "Войти", disabled: m }) }), o.jsxs("div", { className: Xn.footer, children: [o.jsx("a", { className: Xn.forgot, onClick: () => b(ae.RESTORE_PASSWORD), children: "Забыли пароль?" }), o.jsx("div", { className: Xn.divider, children: o.jsx("span", { children: "или" }) }), o.jsx(Ln, { variant: "outline", type: "button", onClick: () => b(ae.REGISTER), children: "Создать новый кошелёк" })] })] }) } const RB = "_page_a6ygb_1", kB = { page: RB }; function BB() { return o.jsx("div", { className: kB.page, children: o.jsx(TB, {}) }) } function b1(a) { var i, r; const l = a; return ((r = (i = l == null ? void 0 : l.detail) == null ? void 0 : i[0]) == null ? void 0 : r.msg) ?? "Произошла ошибка" } function OB() { const a = vn(), l = Wt(), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(""), [m, p] = A.useState(""), [y, _] = A.useState(!1), [b, S] = A.useState(null), j = yt({ mutationFn: TN, onSuccess: () => _(!0) }), w = yt({ mutationFn: RN, onSuccess: async ({ access_token: B }) => { Jh(), l.clear(), B && Nt.set(B), await l.invalidateQueries({ queryKey: gu }), a(ae.WALLET) } }), E = () => { i && j.mutate({ email: i }) }, R = B => { if (B.preventDefault(), d !== h) { S("Пароли не совпадают"); return } S(null), w.mutate({ email: i, password: d, confirm_password: h, code: m }) }, L = b ?? (j.isError ? b1(j.error) : null) ?? (w.isError ? b1(w.error) : null); return { email: i, setEmail: r, password: d, setPassword: f, confirmPassword: h, setConfirmPassword: g, verificationCode: m, setVerificationCode: p, codeSent: y, isLoadingCode: j.isPending, isLoadingSubmit: w.isPending, error: L, handleRequestCode: E, handleSubmit: R } } const LB = "_card_4lgff_1", MB = "_logo_4lgff_10", zB = "_title_4lgff_20", DB = "_typeSelect_4lgff_29", UB = "_back_4lgff_39", HB = "_legalInfo_4lgff_55", qB = "_legalIntro_4lgff_61", PB = "_docsBlock_4lgff_67", QB = "_emailBlock_4lgff_68", FB = "_docsLabel_4lgff_74", YB = "_docsList_4lgff_80", IB = "_emailLink_4lgff_94", GB = "_legalDone_4lgff_105", KB = "_legalDoneTitle_4lgff_113", XB = "_legalDoneText_4lgff_119", VB = "_twoCol_4lgff_125", ZB = "_leftCol_4lgff_132", WB = "_rightCol_4lgff_138", JB = "_codeHint_4lgff_149", $B = "_error_4lgff_156", e9 = "_submitWrapper_4lgff_163", t9 = "_legal_4lgff_55", ct = { card: LB, logo: MB, title: zB, typeSelect: DB, back: UB, legalInfo: HB, legalIntro: qB, docsBlock: PB, emailBlock: QB, docsLabel: FB, docsList: YB, emailLink: IB, legalDone: GB, legalDoneTitle: KB, legalDoneText: XB, twoCol: VB, leftCol: ZB, rightCol: WB, codeHint: JB, error: $B, submitWrapper: e9, legal: t9 }; function n9() { const { email: a, setEmail: l, password: i, setPassword: r, confirmPassword: d, setConfirmPassword: f, verificationCode: h, setVerificationCode: g, codeSent: m, isLoadingCode: p, isLoadingSubmit: y, error: _, handleRequestCode: b, handleSubmit: S } = OB(); return o.jsxs("form", { onSubmit: S, children: [o.jsxs("div", { className: ct.twoCol, children: [o.jsxs("div", { className: ct.leftCol, children: [o.jsx(ke, { label: "Введите адрес электронной почты", type: "email", value: a, onChange: l, placeholder: "example@mail.ru", required: !0 }), o.jsx(ke, { label: "Придумайте пароль", type: "password", value: i, onChange: r, placeholder: "••••••••", required: !0 }), o.jsx(ke, { label: "Повторите пароль", type: "password", value: d, onChange: f, placeholder: "••••••••", required: !0 })] }), o.jsxs("div", { className: ct.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", onClick: b, disabled: m || p, children: p ? "Отправка..." : m ? "Код отправлен" : "Получить проверочный код" }), o.jsx("span", { className: ct.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: h, onChange: g, placeholder: "000 000", required: !0 })] })] }), _ && o.jsx("p", { className: ct.error, children: _ }), o.jsx("div", { className: ct.submitWrapper, children: o.jsx(Zn, { label: y ? "Создание..." : "Создать", disabled: y }) }), o.jsxs("p", { className: ct.legal, children: ["Нажимая «Создать», вы принимаете", o.jsx("br", {}), o.jsx("a", { href: "#", children: "Пользовательское соглашение" }), " и ", o.jsx("a", { href: "#", children: "Политику конфиденциальности" })] })] }) } const x1 = "company@elcsa.ru", a9 = ["Устав организации в действующей редакции", "Решение (протокол) о создании организации и о назначении руководителя", "Выписка по расчётному счёту из банка за последние шесть месяцев", "Выписка из Единого государственного реестра юридических лиц (ЕГРЮЛ)", "Идентификатор электронного документооборота (ЭДО)", "Реквизиты расчётного счёта: номер Р/С, БИК и наименование банка"]; function s9() { const [a, l] = A.useState(!1); return a ? o.jsxs("div", { className: ct.legalDone, children: [o.jsx("h2", { className: ct.legalDoneTitle, children: "Спасибо!" }), o.jsx("p", { className: ct.legalDoneText, children: "Мы получили уведомление об отправке документов. После проверки мы свяжемся с вами по указанному адресу электронной почты." })] }) : o.jsxs("div", { className: ct.legalInfo, children: [o.jsx("p", { className: ct.legalIntro, children: "Для регистрации юридического лица отправьте перечисленные ниже документы на нашу электронную почту. После проверки мы свяжемся с вами для завершения регистрации." }), o.jsxs("div", { className: ct.docsBlock, children: [o.jsx("span", { className: ct.docsLabel, children: "Необходимые документы" }), o.jsx("ul", { className: ct.docsList, children: a9.map(i => o.jsx("li", { children: i }, i)) })] }), o.jsxs("div", { className: ct.emailBlock, children: [o.jsx("span", { className: ct.docsLabel, children: "Адрес для отправки документов" }), o.jsx("a", { href: `mailto:${x1}`, className: ct.emailLink, children: x1 })] }), o.jsx("div", { className: ct.submitWrapper, children: o.jsx(Zn, { label: "Документы отправлены", type: "button", onClick: () => l(!0) }) })] }) } function l9() { const [a, l] = A.useState(null); return o.jsxs("div", { className: ct.card, children: [o.jsx("div", { className: ct.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: ct.title, children: "Создать кошелёк ЭКСА" }), a === null ? o.jsxs("div", { className: ct.typeSelect, children: [o.jsx(Ln, { variant: "primary", onClick: () => l("individual"), children: "Зарегистрироваться как физическое лицо" }), o.jsx(Ln, { variant: "outline", onClick: () => l("legal"), children: "Зарегистрироваться как юридическое лицо" })] }) : o.jsxs(o.Fragment, { children: [o.jsx("button", { type: "button", className: ct.back, onClick: () => l(null), children: "← Назад к выбору" }), a === "individual" ? o.jsx(n9, {}) : o.jsx(s9, {})] })] }) } const i9 = "_page_a6ygb_1", o9 = { page: i9 }; function r9() { return o.jsx("div", { className: o9.page, children: o.jsx(l9, {}) }) } const c9 = "_page_1bkwz_1", u9 = "_card_1bkwz_9", d9 = "_logo_1bkwz_18", f9 = "_title_1bkwz_28", h9 = "_typeSwitch_1bkwz_38", m9 = "_typeOption_1bkwz_49", p9 = "_typeOptionActive_1bkwz_66", g9 = "_twoCol_1bkwz_71", v9 = "_leftCol_1bkwz_78", y9 = "_rightCol_1bkwz_84", _9 = "_codeHint_1bkwz_90", b9 = "_backButton_1bkwz_98", x9 = "_documentsSubtitle_1bkwz_131", A9 = "_documentsList_1bkwz_137", S9 = "_documentItem_1bkwz_146", j9 = "_documentName_1bkwz_157", w9 = "_attachButton_1bkwz_163", E9 = "_fileInput_1bkwz_181", N9 = "_submitWrapper_1bkwz_192", C9 = "_legal_1bkwz_196", et = { page: c9, card: u9, logo: d9, title: f9, typeSwitch: h9, typeOption: m9, typeOptionActive: p9, twoCol: g9, leftCol: v9, rightCol: y9, codeHint: _9, backButton: b9, documentsSubtitle: x9, documentsList: A9, documentItem: S9, documentName: j9, attachButton: w9, fileInput: E9, submitWrapper: N9, legal: C9 }, T9 = ["Свидетельство о государственной регистрации (ОГРН)", "Свидетельство о постановке на учёт в налоговом органе (ИНН)", "Устав организации (действующая редакция)", "Решение/протокол о назначении руководителя", "Документ, подтверждающий полномочия лица, открывающего счёт", "Карточка с образцами подписей и оттиска печати"]; function R9() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(""), [m, p] = A.useState("individual"), [y, _] = A.useState("info"), b = m === "legal", S = w => { w.preventDefault(), _("documents") }, j = w => { w.preventDefault() }; return o.jsx("div", { className: et.page, children: y === "info" ? o.jsxs("form", { className: et.card, onSubmit: S, children: [o.jsx("div", { className: et.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: et.title, children: "Создать кошелёк ЭКСА" }), o.jsxs("div", { className: et.typeSwitch, role: "tablist", "aria-label": "Тип регистрации", children: [o.jsx("button", { type: "button", role: "tab", "aria-selected": !b, className: `${et.typeOption} ${b ? "" : et.typeOptionActive}`, onClick: () => p("individual"), children: "Физическое лицо" }), o.jsx("button", { type: "button", role: "tab", "aria-selected": b, className: `${et.typeOption} ${b ? et.typeOptionActive : ""}`, onClick: () => p("legal"), children: "Юридическое лицо" })] }), o.jsxs("div", { className: et.twoCol, children: [o.jsxs("div", { className: et.leftCol, children: [o.jsx(ke, { label: b ? "Введите корпоративный email" : "Введите адрес электронной почты", type: "email", value: a, onChange: l, placeholder: b ? "name@company.ru" : "example@mail.ru" }), o.jsx(ke, { label: "Придумайте пароль", type: "password", value: i, onChange: r, placeholder: "••••••••" }), o.jsx(ke, { label: "Повторите пароль", type: "password", value: d, onChange: f, placeholder: "••••••••" })] }), o.jsxs("div", { className: et.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", children: "Получить проверочный код" }), o.jsx("span", { className: et.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: h, onChange: g, placeholder: "000 000" })] })] }), o.jsx("div", { className: et.submitWrapper, children: o.jsx(Zn, { label: "Создать" }) }), o.jsxs("p", { className: et.legal, children: ["Нажимая «Создать», вы принимаете", o.jsx("br", {}), o.jsx("a", { href: "#", children: "Пользовательское соглашение" }), " и ", o.jsx("a", { href: "#", children: "Политику конфиденциальности" })] })] }) : o.jsxs("form", { className: et.card, onSubmit: j, children: [o.jsx("div", { className: et.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("button", { type: "button", className: et.backButton, onClick: () => _("info"), children: "← Назад к данным" }), o.jsx("h1", { className: et.title, children: "Прикрепите документы" }), o.jsx("p", { className: et.documentsSubtitle, children: "Для открытия счёта юридическому лицу прикрепите сканы или фотографии следующих документов:" }), o.jsx("ul", { className: et.documentsList, children: T9.map(w => o.jsxs("li", { className: et.documentItem, children: [o.jsx("span", { className: et.documentName, children: w }), o.jsxs("label", { className: et.attachButton, children: ["Прикрепить", o.jsx("input", { type: "file", className: et.fileInput, multiple: !0 })] })] }, w)) }), o.jsx("div", { className: et.submitWrapper, children: o.jsx(Zn, { label: "Создать аккаунт" }) })] }) }) } function k9() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(or[0].days), [m, p] = A.useState(null), { mutate: y, isPending: _ } = VN(), { data: b } = Mv(), [S, j] = A.useState(!1); A.useEffect(() => { if (S || !b) return; const D = e4(b.items); if (!D) return; const K = $N(D.comment); K.name && r(K.name), K.contact && f(K.contact), j(!0) }, [S, b]); const w = Number(a.replace(/\D/g, "")) || 0, E = w > 0 && w < Th, { rate: R, commission: L, total: B } = WN(w, h), P = D => { const K = D.replace(/\D/g, ""); l(K ? Qs(Number(K)) : "") }, G = w > 0 && !E && !_; return { amount: a, name: i, contact: d, days: h, setName: r, setContact: f, setDays: g, onAmountChange: P, numAmount: w, belowMin: E, rate: R, commission: L, total: B, onSubmit: D => { if (D.preventDefault(), !G) return; const K = JN({ name: i, contact: d, days: h, amount: w, commission: L, total: B }); y({ rub_amount: w, comment: K }, { onSuccess: () => { p("success"), l(""), r(""), f(""), g(or[0].days) }, onError: () => p("error") }) }, isPending: _, canSubmit: G, notice: m, dismissNotice: () => p(null) } } const B9 = "_wrap_12wuz_1", O9 = "_header_12wuz_12", L9 = "_title_12wuz_16", M9 = "_subtitle_12wuz_21", z9 = "_body_12wuz_29", D9 = "_formCol_12wuz_35", U9 = "_hint_12wuz_41", H9 = "_infoCol_12wuz_48", q9 = "_infoTitle_12wuz_53", P9 = "_infoRow_12wuz_60", Q9 = "_infoLabel_12wuz_76", F9 = "_infoValue_12wuz_81", Y9 = "_note_12wuz_87", I9 = "_submitBtn_12wuz_94", tt = { wrap: B9, header: O9, title: L9, subtitle: M9, body: z9, formCol: D9, hint: U9, infoCol: H9, infoTitle: q9, infoRow: P9, infoLabel: Q9, infoValue: F9, note: Y9, submitBtn: I9 }; function G9() { const { amount: a, name: l, contact: i, days: r, setName: d, setContact: f, setDays: h, onAmountChange: g, numAmount: m, belowMin: p, rate: y, commission: _, total: b, onSubmit: S, isPending: j, canSubmit: w, notice: E, dismissNotice: R } = k9(); return o.jsxs("form", { className: tt.wrap, onSubmit: S, children: [o.jsxs("div", { className: tt.header, children: [o.jsx("h1", { className: tt.title, children: "Оставить заявку" }), o.jsx("p", { className: tt.subtitle, children: "Конвертация крупных объёмов по индивидуальному курсу. Оставьте заявку — менеджер свяжется с вами, подтвердит актуальный курс и сопроводит сделку." })] }), o.jsxs("div", { className: tt.body, children: [o.jsxs("div", { className: tt.formCol, children: [o.jsx(ke, { label: "Объём заявки, ₽", type: "text", value: a, onChange: g, placeholder: "от 500 000" }), p && o.jsxs("p", { className: tt.hint, children: ["Минимальный объём заявки — ", Qs(Th), " ₽"] }), o.jsx(Gh, { id: "term", label: "Срок ожидания операции", value: r, onChange: h, options: or.map(L => ({ value: L.days, label: `${Rh(L.days)} — комиссия ${(L.rate * 100).toFixed(3)} %` })) }), o.jsx(ke, { label: "Как к вам обращаться", type: "text", value: l, onChange: d, placeholder: "Имя" }), o.jsx(ke, { label: "Email или телефон для связи", type: "text", value: i, onChange: f, placeholder: "example@mail.ru / +7 900 000-00-00" })] }), o.jsxs("div", { className: tt.infoCol, children: [o.jsx("div", { className: tt.infoTitle, children: "УСЛОВИЯ" }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Минимальный объём" }), o.jsxs("span", { className: tt.infoValue, children: [Qs(Th), " ₽"] })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Срок ожидания" }), o.jsx("span", { className: tt.infoValue, children: Rh(r) })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Ставка комиссии" }), o.jsxs("span", { className: tt.infoValue, children: [(y * 100).toFixed(3), " %"] })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Сумма комиссии" }), o.jsx("span", { className: tt.infoValue, children: m > 0 ? `≈ ${Qs(_)} ₽` : "—" })] }), o.jsxs("div", { className: tt.infoRow, "data-accent": !0, children: [o.jsx("span", { className: tt.infoLabel, children: "Итого к оплате" }), o.jsx("span", { className: tt.infoValue, children: m > 0 ? `≈ ${Qs(b)} ₽` : "—" })] }), o.jsx("p", { className: tt.note, children: "Итоговая комиссия рассчитывается индивидуально и зависит от объёма, валюты и направления сделки." })] })] }), o.jsx("button", { type: "submit", className: tt.submitBtn, disabled: !w, children: j ? "Отправляем..." : "Оставить заявку" }), E && o.jsx($a, { status: E, message: E === "success" ? "Заявка отправлена" : "Не удалось отправить заявку", onClose: R, duration: 5e3 })] }) } const K9 = "_notice_a6bcd_1", X9 = "_title_a6bcd_11", V9 = "_text_a6bcd_16", oh = { notice: K9, title: X9, text: V9 }; function Z9() { const { data: a, isLoading: l } = yn(); return l ? o.jsx(zn, { fullscreen: !0, size: "lg", label: "Загрузка данных аккаунта" }) : !!a && a.account_type !== "individual" ? o.jsx(G9, {}) : o.jsxs("div", { className: oh.notice, children: [o.jsx("h1", { className: oh.title, children: "Покупка временно недоступна" }), o.jsx("p", { className: oh.text, children: "В настоящий момент покупка валюты невозможна. Мы работаем над восстановлением сервиса — попробуйте, пожалуйста, позже." })] }) } const W9 = "_page_1mk6w_1", J9 = "_main_1mk6w_8", $9 = "_glow_1mk6w_17", rh = { page: W9, main: J9, glow: $9 }; function eO() { const { data: a, isLoading: l } = qv(), i = a ? a.split(" ") : []; return o.jsxs("div", { className: rh.page, children: [o.jsx(nm, {}), o.jsxs("main", { className: rh.main, children: [o.jsx("div", { className: rh.glow }), !l && o.jsx(vy, { words: i })] })] }) } const tO = "https://app.kyc.elcsa.ru"; function nO() { return by(!0) } async function by(a) { const l = await nn(), i = await fetch(`${tO}/kyc/create`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": l }, body: JSON.stringify({}) }); if (i.status === 401 && a) try { return await ca(), by(!1) } catch { throw Nt.clear(), new Error("Unauthorized") } const r = await i.json(); if (!i.ok) throw r; return r } function aO() { const a = yt({ mutationFn: nO }); return { trigger: a.mutate, data: a.data, isLoading: a.isPending, isError: a.isError } } const sO = "_backdrop_1do7s_1", lO = "_modal_1do7s_12", iO = "_closeBtn_1do7s_22", oO = "_body_1do7s_40", rO = "_qrBlock_1do7s_47", cO = "_qrImage_1do7s_55", uO = "_linkBtn_1do7s_63", gl = { backdrop: sO, modal: lO, closeBtn: iO, body: oO, qrBlock: rO, qrImage: cO, linkBtn: uO }; function dO({ data: a, onClose: l }) { return o.jsx("div", { className: gl.backdrop, onClick: l, children: o.jsxs("div", { className: gl.modal, onClick: i => i.stopPropagation(), children: [o.jsx("button", { className: gl.closeBtn, onClick: l, type: "button", children: "×" }), o.jsx("div", { className: gl.body, children: o.jsxs("div", { className: gl.qrBlock, children: [o.jsx("img", { className: gl.qrImage, src: a.qr_code, alt: "QR-код для верификации" }), o.jsx("a", { className: gl.linkBtn, href: a.link, target: "_blank", rel: "noopener noreferrer", children: "Перейти к верификации" })] }) })] }) }) } const fO = "_card_omb8e_1", hO = "_logo_omb8e_13", mO = "_iconWrapper_omb8e_21", pO = "_description_omb8e_34", gO = "_buttonWrapper_omb8e_42", vO = "_error_omb8e_47", ji = { card: fO, logo: hO, iconWrapper: mO, description: pO, buttonWrapper: gO, error: vO }; function yO() { const { trigger: a, data: l, isLoading: i, isError: r } = aO(), d = vn(), f = Wt(), { data: h } = yn({ refetchInterval: l ? 5e3 : !1 }); A.useEffect(() => { h != null && h.kyc_verified && d(ae.SEED_PHRASE, { replace: !0 }) }, [h == null ? void 0 : h.kyc_verified, d]); const g = () => { f.invalidateQueries({ queryKey: ["me"] }) }; return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: ji.card, children: [o.jsx("div", { className: ji.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("div", { className: ji.iconWrapper, children: o.jsxs("svg", { width: "38", height: "38", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [o.jsx("path", { d: "M12 2L3 6v6c0 5.25 3.75 10.15 9 11.35C17.25 22.15 21 17.25 21 12V6l-9-4z", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), o.jsx("path", { d: "M9 12l2 2 4-4", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] }) }), o.jsx("p", { className: ji.description, children: "Для продолжения работы необходимо пройти KYC верификацию" }), o.jsx("div", { className: ji.buttonWrapper, children: o.jsx(Zn, { label: i ? "Загрузка..." : "Подтвердить личность", type: "button", onClick: () => a(), disabled: i }) }), r && o.jsx("p", { className: ji.error, children: "Произошла ошибка. Попробуй перезагрузить страницу и попробовать снова." })] }), l && o.jsx(dO, { data: l, onClose: g })] }) } const _O = "_page_6lnfw_1", bO = { page: _O }; function xO() { const { data: a, isLoading: l } = yn(); return l ? null : a != null && a.kyc_verified ? o.jsx(Qi, { to: ae.PROFILE, replace: !0 }) : o.jsx("div", { className: bO.page, children: o.jsx(yO, {}) }) } const AO = "_card_mzeuq_1", SO = "_logo_mzeuq_10", jO = "_title_mzeuq_20", wO = "_fields_mzeuq_29", EO = "_emailRow_mzeuq_35", NO = "_error_mzeuq_41", CO = "_submitWrapper_mzeuq_48", TO = "_footer_mzeuq_52", RO = "_back_mzeuq_58", Ia = { card: AO, logo: SO, title: jO, fields: wO, emailRow: EO, error: NO, submitWrapper: CO, footer: TO, back: RO }; function kO() { const [a, l] = A.useState(""), [i, r] = A.useState(!1), [d, f] = A.useState(!1), [h, g] = A.useState(""), [m, p] = A.useState(""), [y, _] = A.useState(""), [b, S] = A.useState(""), [j, w] = A.useState(!1), [E, R] = A.useState(null), L = vn(); async function B() { S(""), f(!0); try { await zN({ email: a }), r(!0), R({ status: "success", message: `Код отправлен на ${a}` }) } catch { R({ status: "error", message: "Не удалось отправить письмо. Проверьте email и попробуйте снова." }) } finally { f(!1) } } async function P(G) { if (G.preventDefault(), S(""), m !== y) { S("Пароли не совпадают"); return } w(!0); try { await UN({ email: a, code: h, new_password: m, confirm_password: y }), L(ae.LOGIN) } catch { S("Не удалось изменить пароль. Проверьте код и попробуйте снова.") } finally { w(!1) } } return o.jsxs(o.Fragment, { children: [o.jsxs("form", { className: Ia.card, onSubmit: P, children: [o.jsx("div", { className: Ia.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: Ia.title, children: "Восстановление пароля" }), o.jsxs("div", { className: Ia.fields, children: [o.jsxs("div", { className: Ia.emailRow, children: [o.jsx(ke, { label: "E-Mail", type: "email", value: a, onChange: l, placeholder: "example@mail.com", required: !0 }), o.jsx(Zn, { label: d ? "Отправка..." : "Получить код", disabled: d || !a, type: "button", onClick: B })] }), i && o.jsxs(o.Fragment, { children: [o.jsx(ke, { label: "Код с почты", type: "text", value: h, onChange: g, placeholder: "000 000", required: !0 }), o.jsx(ke, { label: "Новый пароль", type: "password", value: m, onChange: p, placeholder: "••••••••", required: !0 }), o.jsx(ke, { label: "Повторить пароль", type: "password", value: y, onChange: _, placeholder: "••••••••", required: !0 })] })] }), b && o.jsx("p", { className: Ia.error, children: b }), i && o.jsx("div", { className: Ia.submitWrapper, children: o.jsx(Zn, { label: j ? "Сохранение..." : "Изменить пароль", disabled: j }) }), o.jsx("div", { className: Ia.footer, children: o.jsx("a", { className: Ia.back, onClick: () => L(ae.LOGIN), children: "Вернуться ко входу" }) })] }), E && o.jsx($a, { status: E.status, message: E.message, onClose: () => R(null), duration: 5e3 })] }) } const BO = "_page_6lnfw_1", OO = { page: BO }; function LO() { return o.jsx("div", { className: OO.page, children: o.jsx(kO, {}) }) } const MO = "_main_kb81i_4", zO = "_container_kb81i_12", DO = "_title_kb81i_18", UO = "_subtitle_kb81i_26", HO = "_section_kb81i_34", qO = "_sectionTitle_kb81i_38", PO = "_subheading_kb81i_47", QO = "_text_kb81i_55", FO = "_example_kb81i_62", YO = "_warning_kb81i_72", IO = "_emphasis_kb81i_83", GO = "_list_kb81i_87", KO = "_definitions_kb81i_102", XO = "_definition_kb81i_102", VO = "_goals_kb81i_117", ZO = "_goal_kb81i_117", WO = "_infoBox_kb81i_2", JO = "_linkBlock_kb81i_166", $O = "_button_kb81i_174", qt = { main: MO, container: zO, title: DO, subtitle: UO, section: HO, sectionTitle: qO, subheading: PO, text: QO, example: FO, warning: YO, emphasis: IO, list: GO, definitions: KO, definition: XO, goals: VO, goal: ZO, infoBox: WO, linkBlock: JO, button: $O }; function A1(a) { return typeof a == "string" ? a : o.jsxs(o.Fragment, { children: [o.jsx("strong", { children: a.strong }), a.text ? ` ${a.text}` : null] }) } function eL({ block: a }) { switch (a.kind) { case "text": return o.jsx("p", { className: a.variant ? `${qt.text} ${qt[a.variant]}` : qt.text, children: a.text }); case "subheading": return o.jsx("h4", { className: qt.subheading, children: a.text }); case "list": return o.jsx("ul", { className: qt.list, children: a.items.map((l, i) => o.jsx("li", { children: A1(l) }, i)) }); case "definitions": return o.jsx("div", { className: qt.definitions, children: a.items.map((l, i) => o.jsxs("div", { className: qt.definition, children: [o.jsx("strong", { children: l.term }), " ", l.text] }, i)) }); case "goals": return o.jsx("div", { className: qt.goals, children: a.items.map((l, i) => o.jsxs("div", { className: qt.goal, children: [o.jsx("strong", { children: l.title }), o.jsx("ul", { children: l.items.map((r, d) => o.jsx("li", { children: r }, d)) })] }, i)) }); case "infoBox": return o.jsx("div", { className: qt.infoBox, children: a.lines.map((l, i) => o.jsx("p", { children: A1(l) }, i)) }); case "link": return o.jsx("div", { className: qt.linkBlock, children: o.jsx("a", { href: a.href, target: "_blank", rel: "noopener noreferrer", className: qt.button, children: a.text }) }) } } function xr({ doc: a }) { return o.jsx("main", { className: qt.main, children: o.jsxs("div", { className: qt.container, children: [o.jsx("h1", { className: qt.title, children: a.title }), a.subtitle && o.jsx("h2", { className: qt.subtitle, children: a.subtitle }), a.sections.map((l, i) => o.jsxs("section", { className: qt.section, children: [l.title && o.jsx("h3", { className: qt.sectionTitle, children: l.title }), l.blocks.map((r, d) => o.jsx(eL, { block: r }, d))] }, i))] }) }) } const tL = { title: "ПУБЛИЧНЫЙ ДОГОВОР ОФЕРТЫ", subtitle: "ООО ЭКСА", sections: [{ title: "Агентский договор", blocks: [{ kind: "text", text: "Настоящая оферта на заключение агентского договора (далее – Оферта, Договор) является публичным предложением Общества с ограниченной ответственностью «ЭКСА», заключить договор на условиях и в порядке, определенных настоящей Офертой." }, { kind: "text", text: "Акцепт оферты производится в соответствии с пунктом 2 статьи 437 Гражданского кодекса Российской Федерации и равносилен заключению агентского договора в письменной форме." }] }, { title: "Основные понятия и определения действующего договора", blocks: [{ kind: "definitions", items: [{ term: "Агент", text: "– юридическое лицо или индивидуальный предприниматель, зарегистрированный на территории Российской Федерации, в установленном действующим законодательством порядке." }, { term: "Принципал", text: "– сторона агентского договора, по поручению которой агент осуществляет юридические и иные действия от своего имени, но за счет принципала либо от имени и за счет принципала." }, { term: "Агентский договор", text: "– соглашение, по которому агент обязуется за вознаграждение совершать по поручению принципала юридические и иные действия от своего имени, но за счет принципала либо от имени и за счет принципала в соответствии с п. 1 ст. 1005 Гражданского Кодекса Российской Федерации." }, { term: "Личный кабинета Агента", text: "– ресурс, размещенный на сайте Принципала, предназначенный для взаимодействия Агента и Принципала." }, { term: "Отчетный период", text: "– период для взаиморасчетов с Агентом, равный одному календарному кварталу с даты активации любой из услуг, предоставляемой Принципалу." }, { term: "Отчет о сумме начислений (Отчет)", text: "– отчет, формируемый в Личном кабинете Агента на основании данных систем учета Принципала." }, { term: "Оферта (Договор)", text: "– настоящий документ, который отражает предложение и намерение ООО «ЭКСА» считать заключенным договор с лицом, которым будет принято предложение на условиях, изложенных ниже." }] }] }, { title: "1. Акцепт оферты и заключение агентского договора", blocks: [{ kind: "text", text: "Акцепт настоящей Оферты и заключение Агентского договора осуществляется Принципалом в процессе регистрации в Личном кабинете Принципала (на сайте Агента), при прочтении текста настоящей Оферты, путем проставления специальной отметки (галочки) напротив фразы «Я ознакомился с Офертой и принимаю ее условия» и нажатия кнопки «Подписать»." }, { kind: "text", text: "Особый порядок принятия условий Оферты путем проставления специальной отметки (галочки) определяется интерфейсом Личного кабинета Принципала. Принципал не может зарегистрироваться в Личном кабинете и получить к нему доступ без подтверждения принятия условий Оферты." }, { kind: "text", text: "Принимая Оферту, Принципал подтверждает, что прочел и полностью согласен с документами, размещенными на сайте в разделе, предназначенном для Принципала, которые являются неотъемлемой частью настоящей Оферты (Договора) и обязательны для исполнения Сторонами." }] }, { title: "2. Общие положения", blocks: [{ kind: "text", text: "Публикуемые на сайте Агента документы (формы, требования, правила и т.п.), устанавливающие порядок и условия выполнения действий, предусмотренных настоящим Договором, являются неотъемлемой частью настоящего Договора и обязательны для исполнения Сторонами. Принципал обязан использовать формы документов, утвержденных Агентом, и не вправе вносить в них какие-либо изменения или дополнения." }, { kind: "text", text: "Агент обязуется уведомлять Принципала обо всех изменениях в документах, связанных с исполнением настоящего Договора, путем направления электронных сообщений (через Личный кабинет или на электронную почту Принципала) или размещением уведомлений об изменениях на сайте Агентов в разделе, предназначенном для размещения объявлений." }] }, { title: "3. Предмет договора", blocks: [{ kind: "text", text: "По настоящему Договору Принципал поручает, а Агент принимает на себя обязательство совершать от имени и за счет Принципала указанные действия, а Принципал обязуется выплатить Агенту вознаграждение за совершенные действия." }, { kind: "text", text: "По настоящему Договору Агент совершает следующие действия:" }, { kind: "list", items: ["Консультирование Принципала об услугах Агента, включая, помимо прочего, порядок активации и оказания услуг, работу в Личном кабинете Принципала и иные дополнительные услуги, оказываемые Агентом;", "Совершение сделок и иных юридических действий Агентом от своего имени, но за счёт Принципала."] }, { kind: "text", text: "Настоящий Договор действует на территории Российской Федерации и иного иностранного государства." }, { kind: "text", text: "Права и обязанности по сделкам, совершенным Агентом во исполнение настоящего Договора, возникают непосредственно у Принципала." }] }, { title: "4. Права и обязанности сторон", blocks: [{ kind: "text", text: "Агент обязуется совершать действия, составляющие предмет настоящего Договора, в соответствии с законными интересами Принципала, сообщать Принципалу по его требованию все сведения о ходе исполнения настоящего Договора, передавать Принципалу в течение 7 рабочих дней имущество, полученное по сделкам." }, { kind: "text", text: "Агент несет ответственность за сохранность документов и персональных данных, переданных ему Принципалом для исполнения настоящего Договора." }, { kind: "text", text: "Принципал обязан без промедления принять отчет Агента, все предоставленные им документы, обеспечить Агента документами и материалами, необходимыми для выполнения настоящего Договора, возместить Агенту понесенные расходы и выплатить обусловленное Договором агентское вознаграждение." }] }, { title: "5. Агентское вознаграждение и порядок оплаты", blocks: [{ kind: "text", text: "Сумма вознаграждения Агента по настоящему Договору составляет:" }, { kind: "list", items: ["8% от 5 000 до 30 000 рублей", "6% от 30 000 до 100 000 рублей", "4% от 100 000 до 600 000 рублей"] }, { kind: "text", text: "Вознаграждение выплачивается Агенту с момента подписания настоящего Договора об исполнении поручения Агентом от своего имени, но за счет Принципала." }, { kind: "text", text: "Принципал возмещает следующие расходы Агента в сумме не более 30 000 рублей на оплату банковских услуг и иных комиссий." }] }, { title: "6. Ответственность сторон", blocks: [{ kind: "text", text: "В случае нарушения Агентом сроков, установленных Договором для передачи Принципалу полученного имущества, Принципал вправе предъявить требование об уплате неустойки в размере 0,1% от непереданной суммы за каждый день просрочки." }, { kind: "text", text: "В случае нарушения Принципалом сроков уплаты вознаграждения или возмещения расходов, Агент вправе предъявить требование об уплате неустойки в размере 0,1% от не уплаченной в срок суммы за каждый день просрочки." }] }, { title: "7. Форс-мажор", blocks: [{ kind: "text", text: "Стороны освобождаются от ответственности за частичное или полное неисполнение обязательств по настоящему Договору, если это неисполнение явилось следствием возникших после заключения настоящего Договора обстоятельств непреодолимой силы." }, { kind: "text", text: "При наступлении форс-мажорных обстоятельств каждая Сторона должна без промедления известить о них в письменном виде другую Сторону с указанием характера обстоятельств и их влияния на исполнение обязательств." }] }, { title: "8. Конфиденциальность", blocks: [{ kind: "text", text: "Стороны принимают все необходимые меры для того, чтобы их сотрудники, агенты, правопреемники без предварительного согласия другой Стороны не информировали третьих лиц о конфиденциальной информации и персональных данных Сторон настоящего Договора." }] }, { title: "9. Изменение и прекращение договора", blocks: [{ kind: "text", text: "Настоящий договор вступает в силу с момента его подписания и действует до момента исполнения сторонами своих обязательств по настоящему договору." }, { kind: "text", text: "Настоящий Договор может быть изменен или прекращен по письменному соглашению Сторон, а также в других случаях, предусмотренных законодательством Российской Федерации." }, { kind: "text", text: "Принципал вправе в любое время отказаться от исполнения настоящего Договора путем направления письменного уведомления Агенту за 3 рабочих дня." }] }, { title: "10. Заключительные положения", blocks: [{ kind: "text", text: "Ни одна из сторон не вправе передавать свои права и обязанности по настоящему договору третьим лицам без согласия другой стороны." }, { kind: "text", text: "Сообщения Стороны могут направлять по факсу, электронной почте или другим способом связи при условии, что он позволяет достоверно установить, от кого исходило сообщение и кому оно адресовано." }, { kind: "text", text: "Споры, вытекающие из настоящего Договора, разрешаются в досудебном порядке. При неурегулировании возникших разногласий спор разрешается в Арбитражном суде г. Санкт–Петербурга и Ленинградской области с обязательным соблюдением претензионного порядка." }] }, { title: "Реквизиты сторон", blocks: [{ kind: "infoBox", lines: ["Общество с ограниченной ответственностью «ЭКСА»", "196246, г. Санкт-Петербург, Московский р-н, Московское шоссе, д.25к1 литера в, помещ. 3-Н", "ИНН / КПП: 9810001062 / 781001001", "ОГРН: 1257800060990", "ОКПО / ОКАТО / ОКТМО: 68342261 / 40284000000 / 40377000000", "Руководитель: Кленин Михаил Васильевич", "Электронная почта: company@bitforcefoundation.ru", 'Наименование банка: ФИЛИАЛ "САНКТ-ПЕТЕРБУРГСКИЙ" АО "АЛЬФА-БАНК"', "Корреспондентский счет: 30101810600000000786", "БИК: 044030786", "Расчетный счет: 40702810632250004861"] }] }] }; function nL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: tL }), o.jsx(Is, {})] }) } const aL = { title: "ПОЛИТИКА ОБРАБОТКИ ПЕРСОНАЛЬНЫХ ДАННЫХ", subtitle: "ООО «ЭКСА»", sections: [{ title: "1. Общие положения", blocks: [{ kind: "text", text: "Настоящая Политика обработки персональных данных разработана в соответствии с Федеральным законом от 27.07.2006 № 152-ФЗ «О персональных данных» и определяет порядок обработки персональных данных и меры по обеспечению безопасности персональных данных, предпринимаемые ООО «ЭКСА»." }, { kind: "text", text: "Оператор ставит своей важнейшей целью и условием осуществления своей деятельности соблюдение прав и свобод человека и гражданина при обработке его персональных данных, в том числе защиты права на неприкосновенность частной жизни, личную и семейную тайну." }, { kind: "text", text: "Настоящая Политика действует в отношении всех персональных данных, которые обрабатываются Оператором с использованием средств автоматизации и без использования таких средств." }, { kind: "subheading", text: "1.4. Основные понятия" }, { kind: "definitions", items: [{ term: "Автоматизированная обработка персональных данных", text: "— обработка персональных данных с помощью средств вычислительной техники." }, { term: "Обработка персональных данных", text: "— любое действие или совокупность действий, совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение, извлечение, использование, передачу, обезличивание, блокирование, удаление, уничтожение." }, { term: "Оператор", text: "— юридическое или физическое лицо, организующие и осуществляющие обработку персональных данных." }, { term: "Персональные данные", text: "— любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу." }, { term: "Пользователь", text: "— любой посетитель веб-сайта https://bitforce-foundation.ru." }] }] }, { title: "2. Сведения об операторе", blocks: [{ kind: "list", items: ["Полное наименование: Общество с ограниченной ответственностью «ЭКСА»", "Сокращенное наименование: ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н", "Электронная почта: company@bitforcefoundation.ru", "Веб-сайт: https://bitforce-foundation.ru"] }] }, { title: "3. Общие цели обработки персональных данных", blocks: [{ kind: "subheading", text: "3.1.1. Основная деятельность:" }, { kind: "list", items: ["Предоставление услуг по конвертации иного имущества", "Осуществление операций на криптовалютных рынках", "Предоставление услуг в области блокчейн технологий", "Обеспечение функционирования интернет-платформы и мобильных приложений"] }, { kind: "subheading", text: "3.1.2. Обеспечение безопасности:" }, { kind: "list", items: ["Предотвращение мошенничества и отмывания денежных средств", "Обеспечение безопасности платежных операций", "Выполнение требований по противодействию легализации доходов", "Идентификация и верификация клиентов"] }, { kind: "subheading", text: "3.1.3. Соблюдение законодательства:" }, { kind: "list", items: ["Исполнение требований российского и международного законодательства", "Взаимодействие с контролирующими и правоохранительными органами", "Ведение обязательной отчетности и документооборота", "Соблюдение налогового законодательства"] }] }, { title: "4. Цели сбора персональных данных", blocks: [{ kind: "goals", items: [{ title: "Регистрация и идентификация пользователей:", items: ["Создание учетной записи на веб-сайте", "Верификация личности в соответствии с требованиями законодательства", "Подтверждение права на осуществление операций"] }, { title: "Обработка платежей и финансовых операций:", items: ["Осуществление операций по конвертации криптовалют", "Проведение расчетов и переводов денежных средств", "Ведение учета и истории транзакций"] }, { title: "Коммуникация с клиентами:", items: ["Предоставление технической поддержки", "Уведомления о состоянии операций и счетов", "Информирование об изменениях в условиях предоставления услуг"] }] }] }, { title: "5. Правовые основания обработки персональных данных", blocks: [{ kind: "subheading", text: "5.1.1. Согласие субъекта персональных данных:" }, { kind: "list", items: ["Обработка персональных данных в маркетинговых целях", "Использование файлов cookie и метрик", "Персонализация сервисов и предложений"] }, { kind: "subheading", text: "5.1.2. Необходимость исполнения договора:" }, { kind: "list", items: ["Регистрация и ведение учетных записей пользователей", "Осуществление финансовых операций и переводов", "Предоставление доступа к платформе и сервисам", "Техническая поддержка и обслуживание клиентов"] }, { kind: "subheading", text: "5.1.3. Соблюдение правовой обязанности:" }, { kind: "list", items: ["Выполнение требований валютного законодательства", "Противодействие легализации доходов, полученных преступным путем", "Соблюдение требований по налоговому учету и отчетности"] }] }, { title: "6. Объем и категории обрабатываемых персональных данных", blocks: [{ kind: "subheading", text: "6.1.1. Пользователи веб-сайта и мобильного приложения:" }, { kind: "list", items: ["Зарегистрированные пользователи", "Посетители сайта без регистрации", "Потенциальные клиенты", "Бывшие клиенты"] }, { kind: "subheading", text: "6.2.1. Идентификационные данные:" }, { kind: "list", items: ["Фамилия, имя, отчество", "Дата рождения", "Гражданство"] }, { kind: "subheading", text: "6.2.3. Контактная информация:" }, { kind: "list", items: ["Номера телефонов (мобильный, домашний, рабочий)", "Адреса электронной почты"] }, { kind: "subheading", text: "6.2.4. Финансовая информация:" }, { kind: "list", items: ["Номера банковских счетов и карт", "Реквизиты кошельков криптовалют", "История операций и транзакций", "Данные о доходах и источниках средств"] }, { kind: "subheading", text: "6.2.5. Техническая информация:" }, { kind: "list", items: ["IP-адреса устройств", "Данные о браузере и операционной системе", "Файлы cookie и локальное хранилище", "Логи действий на сайте"] }] }, { title: "7. Порядок и условия обработки персональных данных", blocks: [{ kind: "subheading", text: "7.1. Принципы обработки персональных данных:" }, { kind: "list", items: ["Обработка осуществляется на законной и справедливой основе", "Обработка ограничивается достижением конкретных, заранее определенных целей", "Содержание и объем данных соответствуют заявленным целям", "Обрабатываемые персональные данные являются точными и актуальными"] }, { kind: "subheading", text: "7.4. Сроки обработки персональных данных:" }, { kind: "list", items: ["Персональные данные обрабатываются в течение времени, необходимого для достижения целей", "После достижения целей персональные данные подлежат уничтожению или обезличиванию", "Сроки хранения определяются требованиями законодательства"] }, { kind: "subheading", text: "7.5. Места обработки персональных данных:" }, { kind: "list", items: ["Основные серверы и хранилища данных расположены на территории Российской Федерации", "Резервные копии могут храниться в дата-центрах на территории РФ"] }] }, { title: "8. Актуализация, исправление, удаление и уничтожение персональных данных", blocks: [{ kind: "subheading", text: "8.2.2. Процедура исправления:" }, { kind: "list", items: ["Рассмотрение запроса в течение 30 дней", "Проверка обоснованности требования об исправлении", "Внесение изменений во все информационные системы", "Уведомление субъекта о проведенных исправлениях"] }, { kind: "subheading", text: "8.3.2. Процедура удаления:" }, { kind: "list", items: ["Проверка наличия законных оснований для продолжения обработки", "Удаление из всех информационных систем и баз данных", "Удаление резервных копий (кроме архивных)", "Уведомление субъекта о выполненном удалении"] }] }, { title: "9. Ответы на запросы субъектов персональных данных", blocks: [{ kind: "subheading", text: "9.1.1. Право на информацию:" }, { kind: "list", items: ["Подтверждение факта обработки персональных данных", "Правовые основания и цели обработки", "Применяемые способы обработки", "Наименование и местонахождение оператора", "Лица, имеющие доступ к персональным данным"] }, { kind: "subheading", text: "9.2.2. Сроки рассмотрения:" }, { kind: "list", items: ["Срок рассмотрения запроса составляет 30 дней с момента получения", "Срок может быть продлен на 30 дней при большом объеме информации", "О продлении срока субъект уведомляется в течение 30 дней"] }, { kind: "subheading", text: "9.4. Плата за предоставление информации:" }, { kind: "list", items: ["Первый запрос в течение года обрабатывается бесплатно", "За повторные запросы может взиматься плата в размере расходов", "Субъект уведомляется о размере платы до предоставления информации"] }] }, { title: "10. Обеспечение безопасности персональных данных", blocks: [{ kind: "subheading", text: "10.1. Правовые меры:" }, { kind: "list", items: ["Назначение ответственного за организацию обработки персональных данных", "Принятие локальных актов по вопросам обработки персональных данных", "Ознакомление работников с требованиями законодательства", "Применение мер ответственности за нарушение требований"] }, { kind: "subheading", text: "10.3. Технические меры:" }, { kind: "list", items: ["Предотвращение несанкционированного доступа к персональным данным", "Своевременное обнаружение фактов несанкционированного доступа", "Возможность незамедлительного восстановления персональных данных", "Постоянный контроль за обеспечением уровня защищенности"] }, { kind: "subheading", text: "10.4. Конкретные технические решения:" }, { kind: "list", items: ["Использование сертифицированных средств защиты информации", "Шифрование персональных данных при передаче и хранении", "Применение межсетевых экранов и систем обнаружения вторжений", "Резервное копирование и обеспечение отказоустойчивости", "Антивирусная защита и обновление программного обеспечения"] }] }, { title: "12. Заключительные положения", blocks: [{ kind: "subheading", text: "12.2. Жалобы и обращения:" }, { kind: "list", items: ["Субъекты персональных данных могут обратиться к Оператору по вопросам обработки", "Жалобы рассматриваются в установленном законом порядке", "При неурегулировании разногласий возможно обращение в Роскомнадзор или суд"] }, { kind: "subheading", text: "12.4. Контактная информация для обращений:" }, { kind: "infoBox", lines: ["Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н", "Электронная почта: company@bitforcefoundation.ru"] }] }] }; function sL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: aL }), o.jsx(Is, {})] }) } const lL = { title: "ПОЛИТИКА ИСПОЛЬЗОВАНИЯ ФАЙЛОВ COOKIE", sections: [{ title: "Общие положения и терминология", blocks: [{ kind: "text", text: "Настоящая Политика использования файлов cookie устанавливает порядок обработки файлов cookie и содержащихся в них персональных данных ООО «ЭКСА» при использовании пользователями интернет-ресурса https://bitforce-foundation.ru." }, { kind: "text", text: "Файлы cookie — это текстовые файлы небольшого размера, которые устанавливаются на пользовательское устройство при посещении интернет-ресурса или совершении на нем определенных действий. Файлы cookie остаются сохраненными на устройстве даже после покидания ресурса, что позволяет «узнавать» пользователя при последующих посещениях." }, { kind: "text", text: "К персональным данным относится не сам файл cookie, а его содержимое — уникальные идентификаторы, IP-адреса, информация о предпочтениях пользователя и другие данные, позволяющие прямо или косвенно идентифицировать физическое лицо." }] }, { title: "Оператор персональных данных", blocks: [{ kind: "text", text: "Оператором персональных данных, содержащихся в файлах cookie, является:" }, { kind: "infoBox", lines: ["ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское ш, д. 25 к. 1 литера В, помещ. 3-н"] }, { kind: "text", text: "Оператор определяет цели обработки персональных данных, их состав, а также действия с персональными данными, включая случаи использования сторонних файлов cookie." }] }, { title: "Категории файлов cookie и их назначение", blocks: [{ kind: "subheading", text: "1. Строго необходимые (технические) файлы cookie" }, { kind: "text", text: "Данные файлы обеспечивают работу интернет-ресурса и предоставление необходимого уровня сервиса: авторизацию, навигацию, отображение контента в соответствии с параметрами устройства, обеспечение безопасности." }, { kind: "text", text: "Обработка таких файлов cookie осуществляется на основании п. 5 ч. 1 ст. 6 ФЗ № 152 (заключение и исполнение договора). Согласие на использование строго необходимых файлов cookie не требуется." }, { kind: "text", variant: "example", text: "Примеры: файлы сессий (PHPSESSID), настройки безопасности, файлы аутентификации." }, { kind: "subheading", text: "2. Функциональные файлы cookie" }, { kind: "text", text: "Используются для запоминания пользовательских предпочтений и персонализации взаимодействия с сайтом: сохранение выбранного языка, региона, настроек отображения, размера шрифта." }, { kind: "text", text: "Обработка осуществляется на основании согласия субъекта персональных данных, поскольку данная обработка не является строго необходимой для функционирования сайта." }, { kind: "text", variant: "example", text: "Примеры: настройки языка интерфейса, предпочтения отображения, настройки доступности." }, { kind: "subheading", text: "3. Аналитические файлы cookie" }, { kind: "text", text: "Собирают информацию о взаимодействии пользователей с интернет-ресурсом для анализа его использования, выявления популярных разделов, обнаружения ошибок и улучшения пользовательского опыта. Могут содержать персональные данные, включая IP-адреса пользователей." }, { kind: "text", text: "Обработка осуществляется на основании согласия субъекта персональных данных." }, { kind: "subheading", text: "4. Маркетинговые файлы cookie" }, { kind: "text", text: "Используются для отслеживания пользователей в целях персонализированной рекламы, анализа эффективности рекламных кампаний, ретаргетинга." }, { kind: "text", text: "Обработка осуществляется исключительно на основании согласия субъекта персональных данных." }, { kind: "text", variant: "example", text: "Примеры: пиксели социальных сетей, рекламные идентификаторы, файлы ретаргетинга." }] }, { title: "Правовые основания обработки персональных данных", blocks: [{ kind: "text", text: "Обработка персональных данных, содержащихся в файлах cookie, осуществляется на следующих правовых основаниях:" }, { kind: "list", items: [{ strong: "Согласие субъекта персональных данных", text: "— для функциональных, аналитических и маркетинговых файлов cookie" }, { strong: "Заключение и исполнение договора", text: "— для строго необходимых файлов cookie, обеспечивающих работу интернет-ресурса" }, { strong: "Законные интересы оператора", text: "— в исключительных случаях, когда отсутствуют иные основания" }] }] }, { title: "Порядок получения согласия", blocks: [{ kind: "subheading", text: "Принципы получения согласия:" }, { kind: "list", items: ["Согласие должно быть получено до начала обработки персональных данных", "Информация об использовании файлов cookie размещается на первом уровне интернет-ресурса", "Предоставляется возможность выбора категорий файлов cookie", "Используются активные формулировки вместо пассивных"] }, { kind: "subheading", text: "Критерии действительного согласия:" }, { kind: "list", items: [{ strong: "Добровольность", text: "— согласие дается по свободной воле субъекта" }, { strong: "Конкретность", text: "— четко определены цели обработки" }, { strong: "Информированность", text: "— предоставлена полная информация об обработке" }, { strong: "Однозначность", text: "— согласие выражено в недвусмысленной форме" }] }] }, { title: "Сторонние файлы cookie", blocks: [{ kind: "subheading", text: "Использование сторонних сервисов:" }, { kind: "text", text: "Наш интернет-ресурс использует файлы cookie сторонних сервисов, включая:" }, { kind: "list", items: ["Яндекс.Метрика (ООО «ЯНДЕКС», Россия)", "Социальные сети и сервисы интеграции"] }, { kind: "subheading", text: "Обеспечение защиты:" }, { kind: "list", items: ["Получено согласие на передачу", "Применяются дополнительные меры защиты данных", "Контролируется соблюдение принципов обработки персональных данных получателями"] }] }, { title: "Сроки обработки и хранения", blocks: [{ kind: "subheading", text: "Категории по срокам хранения:" }, { kind: "list", items: ["Сеансовые cookie — удаляются автоматически при закрытии браузера", "Постоянные cookie — хранятся установленный период или до удаления пользователем"] }, { kind: "subheading", text: "Конкретные сроки:" }, { kind: "list", items: ["Необходимые файлы cookie — до 12 месяцев", "Функциональные файлы cookie — до 12 месяцев", "Аналитические файлы cookie — до 24 месяцев", "Маркетинговые файлы cookie — до 24 месяцев"] }, { kind: "text", text: "По истечении установленных сроков файлы cookie удаляются автоматически. Пользователь может удалить файлы cookie досрочно через настройки браузера или отозвать согласие на их обработку." }] }, { title: "Права субъектов персональных данных", blocks: [{ kind: "subheading", text: "Право на информацию:" }, { kind: "list", items: ["Получение информации о обработке персональных данных", "Сведения о правовых основаниях и целях обработки", "Информация о сроках обработки и составе данных"] }, { kind: "subheading", text: "Право на доступ:" }, { kind: "list", items: ["Получение подтверждения факта обработки", "Ознакомление с обрабатываемыми персональными данными", "Получение информации об источниках персональных данных"] }, { kind: "subheading", text: "Право на уточнение, блокирование, удаление:" }, { kind: "list", items: ["Требование уточнения неточных данных", "Блокирование недостоверных данных", "Удаление незаконно полученных данных"] }, { kind: "subheading", text: "Право на отзыв согласия:" }, { kind: "list", items: ["Отзыв согласия в любое время", "Прекращение обработки после отзыва согласия", "Сохранение права на обжалование действий оператора"] }] }, { title: "Способы управления файлами cookie", blocks: [{ kind: "subheading", text: "Управление через настройки сайта:" }, { kind: "list", items: ["Использование баннера согласия на файлы cookie", "Изменение настроек в любое время через интерфейс сайта", "Отзыв согласия на использование отдельных категорий файлов cookie"] }, { kind: "subheading", text: "Управление через браузер:" }, { kind: "text", text: "Большинство браузеров позволяют контролировать файлы cookie:" }, { kind: "list", items: ["Блокировка — запрет установки новых файлов cookie", "Удаление — очистка существующих файлов cookie", "Уведомления — получение предупреждений при установке файлов cookie", "Селективная настройка — разрешение файлов cookie только для определенных сайтов"] }, { kind: "subheading", text: "Инструкции для популярных браузеров:" }, { kind: "list", items: ["Google Chrome: Настройки → Конфиденциальность и безопасность → Файлы cookie", "Mozilla Firefox: Настройки → Приватность и Защита → Файлы cookie", "Safari: Настройки → Конфиденциальность → Файлы cookie", "Microsoft Edge: Настройки → Файлы cookie и разрешения сайтов"] }, { kind: "text", variant: "warning", text: "Блокировка необходимых файлов cookie может привести к ограничению функциональности интернет-ресурса." }] }, { title: "Меры безопасности", blocks: [{ kind: "text", text: "Оператор применяет правовые, организационные и технические меры для защиты персональных данных:" }, { kind: "subheading", text: "Правовые меры:" }, { kind: "list", items: ["Назначение ответственного за организацию обработки персональных данных", "Ознакомление сотрудников с требованиями законодательства", "Заключение соглашений о неразглашении персональных данных"] }, { kind: "subheading", text: "Организационные меры:" }, { kind: "list", items: ["Определение перечня лиц, допущенных к обработке персональных данных", "Установление правил доступа к персональным данным", "Контроль за соблюдением требований по защите персональных данных"] }, { kind: "subheading", text: "Технические меры:" }, { kind: "list", items: ["Использование средств защиты информации", "Применение криптографических средств защиты", "Обеспечение целостности и доступности персональных данных", "Регулярное обновление систем защиты информации"] }] }, { title: "Контактная информация и обращения", blocks: [{ kind: "text", text: "Для реализации прав субъекта персональных данных обращайтесь к нам:" }, { kind: "infoBox", lines: ["ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское ш, д. 25 к. 1 литера В, помещ. 3-н", "Email компании: company@bitforcefoundation.ru"] }, { kind: "subheading", text: "Порядок рассмотрения обращений:" }, { kind: "list", items: ["Срок рассмотрения обращений — до 30 дней с момента получения", "Обращения рассматриваются в письменной форме", "Ответ направляется способом, указанным в обращении", "При отказе в удовлетворении требований указываются мотивированные основания"] }] }] }; function iL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: lL }), o.jsx(Is, {})] }) } const oL = { title: "СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ", subtitle: "ООО «ЭКСА»", sections: [{ title: "Преамбула", blocks: [{ kind: "text", text: "Я, субъект персональных данных, действуя своей волей и в своем интересе, в соответствии с требованиями Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных», предоставляю ООО «ЭКСА» согласие на обработку моих персональных данных на условиях и для целей, определенных настоящим Согласием." }] }, { title: "1. Сведения об операторе", blocks: [{ kind: "infoBox", lines: ["Полное наименование: Общество с ограниченной ответственностью «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н", "Электронная почта: company@bitforcefoundation.ru", "Веб-сайт: https://bitforce-foundation.ru"] }] }, { title: "2. Правовые основания обработки", blocks: [{ kind: "text", text: "Настоящее согласие предоставляется на основании пункта 1 части 1 статьи 6 Федерального закона «О персональных данных» и является правовым основанием для обработки персональных данных Оператором." }, { kind: "text", text: "Согласие дается добровольно, своей волей и в своих интересах." }, { kind: "text", text: "Субъект персональных данных понимает последствия предоставления согласия, включая возможные риски, связанные с обработкой персональных данных." }] }, { title: "3. Цели обработки персональных данных", blocks: [{ kind: "subheading", text: "3.1. Основные цели:" }, { kind: "list", items: ["Регистрация и ведение учетной записи на веб-сайте и в мобильном приложении", "Идентификация и верификация личности в соответствии с требованиями законодательства", "Предоставление услуг по обмену криптовалют и электронных денежных средств", "Проведение финансовых операций, переводов и расчетов", "Ведение учета и истории операций"] }, { kind: "subheading", text: "3.2. Дополнительные цели:" }, { kind: "list", items: ["Обеспечение безопасности операций и предотвращение мошенничества", "Выполнение требований по противодействию легализации доходов", "Соблюдение требований валютного, налогового и иного применимого законодательства", "Предоставление технической поддержки и клиентского сервиса", "Рассылка уведомлений о состоянии операций и изменениях в условиях"] }, { kind: "subheading", text: "3.3. Маркетинговые цели (при дополнительном согласии):" }, { kind: "list", items: ["Направление информационных и рекламных материалов", "Проведение маркетинговых исследований и опросов", "Персонализация предложений и услуг", "Анализ предпочтений и поведения для улучшения сервисов"] }, { kind: "subheading", text: "3.4. Аналитические цели:" }, { kind: "list", items: ["Анализ использования веб-сайта и мобильного приложения", "Улучшение качества предоставляемых услуг", "Разработка новых продуктов и сервисов", "Создание статистических отчетов в обезличенном виде"] }] }, { title: "4. Перечень персональных данных", blocks: [{ kind: "subheading", text: "4.1. Идентификационные данные:" }, { kind: "list", items: ["Фамилия, имя, отчество", "Дата рождения", "Гражданство"] }, { kind: "subheading", text: "4.2. Документы, удостоверяющие личность:" }, { kind: "list", items: ["Серия и номер паспорта гражданина Российской Федерации", "Дата выдачи и код подразделения", "Адрес регистрации по месту жительства", "Цифровые копии (сканы) документов"] }, { kind: "subheading", text: "4.3. Контактная информация:" }, { kind: "list", items: ["Номера телефонов (мобильный, домашний, рабочий)", "Адреса электронной почты", "Почтовые адреса (фактического проживания, для корреспонденции)"] }, { kind: "subheading", text: "4.4. Финансовая информация:" }, { kind: "list", items: ["Номера банковских счетов и реквизиты банковских карт", "Реквизиты криптовалютных кошельков и адресов", "Информация о доходах и источниках происхождения денежных средств", "История финансовых операций и транзакций"] }, { kind: "subheading", text: "4.5. Техническая информация:" }, { kind: "list", items: ["IP-адреса устройств, с которых осуществляется доступ к сервисам", "Информация о браузере, операционной системе и устройстве", "Файлы cookie и данные локального хранилища", "Логи действий и история использования сервисов"] }, { kind: "subheading", text: "4.6. Дополнительная информация:" }, { kind: "list", items: ["Фотографии для процедур верификации", "Видеозаписи процедур видеоидентификации", "Биометрические данные (при использовании соответствующих технологий)", "Информация о семейном положении и профессиональной деятельности"] }] }, { title: "5. Перечень действий с персональными данными", blocks: [{ kind: "text", text: "Согласие распространяется на следующие действия (операции) с персональными данными:" }, { kind: "list", items: ["Сбор, запись и первичная обработка персональных данных", "Накопление и систематизация в базах данных", "Создание резервных копий и архивирование", "Извлечение, использование и анализ данных", "Уточнение, обновление и актуализация информации", "Передача данных третьим лицам", "Обезличивание и удаление данных", "Автоматизированная обработка и профилирование"] }] }, { title: "6. Лица, которым могут быть переданы персональные данные", blocks: [{ kind: "subheading", text: "6.1. Сотрудники Оператора:" }, { kind: "list", items: ["Уполномоченные сотрудники, непосредственно участвующие в обработке", "Сотрудники службы безопасности и комплаенса", "Сотрудники технической поддержки", "Руководящий состав в рамках их полномочий"] }, { kind: "subheading", text: "6.2. Государственные и муниципальные органы:" }, { kind: "list", items: ["Федеральная служба по финансовому мониторингу", "Федеральная налоговая служба", "Правоохранительные органы (при наличии законных требований)", "Суды и органы исполнения судебных решений"] }, { kind: "subheading", text: "6.3. Партнеры и контрагенты:" }, { kind: "list", items: ["Банки и платежные системы", "Операторы электронных денежных средств", "Поставщики технологических решений", "Аудиторские и консалтинговые организации"] }] }, { title: "7. Сроки обработки персональных данных", blocks: [{ kind: "subheading", text: "7.1. Общие принципы:" }, { kind: "text", text: "Персональные данные обрабатываются в течение времени, необходимого для достижения целей обработки. После достижения целей данные подлежат уничтожению или обезличиванию." }, { kind: "subheading", text: "7.2. Конкретные сроки обработки:" }, { kind: "list", items: [{ strong: "Данные активных клиентов:", text: "в течение всего периода отношений плюс 5 лет после прекращения" }, { strong: "Данные для идентификации:", text: "5 лет с момента прекращения отношений" }, { strong: "Финансовая информация:", text: "5 лет с даты совершения операции" }, { strong: "Маркетинговые данные:", text: "до отзыва согласия, но не более 3 лет" }, { strong: "Техническая информация:", text: "1 год для безопасности, 6 месяцев для логов" }] }] }, { title: "8. Права субъекта персональных данных", blocks: [{ kind: "subheading", text: "8.1. Право на информацию:" }, { kind: "list", items: ["Получение подтверждения факта обработки персональных данных", "Получение информации о целях и способах обработки", "Информация о сроках обработки и составе данных", "Сведения о лицах, которым передаются данные"] }, { kind: "subheading", text: "8.2. Право на доступ:" }, { kind: "list", items: ["Получение копий обрабатываемых персональных данных", "Ознакомление с историей обработки и изменений", "Получение информации об источниках персональных данных"] }, { kind: "subheading", text: "8.3. Право на исправление и удаление:" }, { kind: "list", items: ["Требование исправления неточных или неполных данных", "Требование удаления персональных данных при наличии оснований", "Удаление данных после отзыва согласия"] }, { kind: "subheading", text: "8.4. Право на отзыв согласия:" }, { kind: "list", items: ["Согласие может быть отозвано в любое время", "Отзыв оформляется в письменной форме", "После отзыва обработка прекращается в разумные сроки"] }, { kind: "subheading", text: "8.5. Право на обжалование:" }, { kind: "list", items: ["Обращение к Оператору с жалобами на действия по обработке данных", "Обращение в Роскомнадзор или его территориальные органы", "Обращение в суд для защиты нарушенных прав"] }, { kind: "subheading", text: "8.6. Порядок реализации прав:" }, { kind: "list", items: ["Обращения направляются на адрес: company@bitforcefoundation.ru", "Обращения рассматриваются в течение 30 дней", "При необходимости срок может быть продлен на 30 дней"] }] }, { title: "9. Заключительные положения", blocks: [{ kind: "subheading", text: "9.1. Действие согласия:" }, { kind: "list", items: ["Согласие действует с момента его предоставления", "Согласие действует до его отзыва или до достижения целей обработки", "При существенных изменениях целей требуется новое согласие"] }, { kind: "subheading", text: "9.2. Форма предоставления согласия:" }, { kind: "list", items: ["Согласие может быть предоставлено в письменной форме", "Согласие может быть предоставлено в электронной форме", "Согласие может выражаться путем совершения конклюдентных действий"] }, { kind: "subheading", text: "9.3. Последствия непредоставления согласия:" }, { kind: "list", items: ["Отказ в предоставлении согласия может повлечь невозможность регистрации", "Отказ может ограничить доступ к отдельным услугам", "Отказ в согласии на маркетинг не влияет на основные услуги", "Субъект вправе предоставить частичное согласие"] }, { kind: "subheading", text: "9.4. Контактная информация:" }, { kind: "infoBox", lines: ["Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н", "Электронная почта: company@bitforcefoundation.ru", "Ответственное лицо: Кленин Михаил Васильевич", "Официальный сайт: https://bitforce-foundation.ru"] }, { kind: "subheading", text: "9.5. Подтверждение понимания:" }, { kind: "text", variant: "emphasis", text: "Предоставляя настоящее согласие, я подтверждаю, что:" }, { kind: "list", items: ["Ознакомлен с содержанием согласия и понимаю его значение", "Понимаю цели и способы обработки моих персональных данных", "Знаю о своих правах и способах их реализации", "Согласие предоставляется добровольно и осознанно", "Имею возможность отозвать согласие в любое время"] }] }] }; function rL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: oL }), o.jsx(Is, {})] }) } const cL = { title: "Реестр операторов персональных данных", subtitle: "ООО «ЭКСА»", sections: [{ blocks: [{ kind: "text", text: "Информация об операторе персональных данных размещена в реестре операторов персональных данных Федеральной службы по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор)." }, { kind: "text", text: "Вы можете просмотреть информацию об операторе в реестре Роскомнадзора, перейдя по ссылке ниже:" }, { kind: "link", href: "https://pd.rkn.gov.ru/operators-registry/operators-list/?act=search&name_full=%D0%91%D0%B8%D1%82%D1%84%D0%BE%D1%80%D1%81&inn=9810001062®n=", text: "Открыть реестр Роскомнадзора" }, { kind: "text", text: "Реестр содержит информацию об операторах персональных данных, включая сведения о целях и методах обработки персональных данных, а также меры по обеспечению безопасности персональных данных." }] }, { title: "Информация об операторе", blocks: [{ kind: "infoBox", lines: [{ strong: "Наименование:", text: "ООО «ЭКСА»" }, { strong: "ИНН:", text: "9810001062" }, { strong: "ОГРН:", text: "1257800060990" }, { strong: "Юридический адрес:", text: "196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н" }, { strong: "Контактная информация:", text: "company@bitforcefoundation.ru" }] }] }, { title: "О Роскомнадзоре", blocks: [{ kind: "text", text: "Федеральная служба по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор) — это федеральный орган исполнительной власти, осуществляющий функции по контролю и надзору в области персональных данных." }, { kind: "text", text: "Роскомнадзор ведет реестр операторов персональных данных в соответствии с требованиями Федерального закона «О персональных данных». Реестр является открытой информационной системой и доступен всем заинтересованным лицам." }] }] }; function uL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: cL }), o.jsx(Is, {})] }) } const xy = { ETH: { symbol: "ETH", aprLabel: "APR", protocol: "Lido" }, SOL: { symbol: "SOL", aprLabel: "APY", protocol: "Нативный" } }, dL = [{ chain: "ETH", label: "ETH · Lido" }, { chain: "SOL", label: "SOL · нативный" }], fL = { active: { label: "Активна", variant: "active" }, activating: { label: "Активируется", variant: "muted" }, deactivating: { label: "Деактивация", variant: "muted" }, inactive: { label: "Завершена", variant: "ready" } }, hL = "_toggle_xc9o8_1", mL = "_tab_xc9o8_6", pL = "_active_xc9o8_18", gL = "_inactive_xc9o8_23", Kc = { toggle: hL, tab: mL, active: pL, inactive: gL }; function vL({ value: a, onChange: l }) { return o.jsx("div", { className: Kc.toggle, children: dL.map(({ chain: i, label: r }) => o.jsx("button", { className: `${Kc.tab} ${a === i ? Kc.active : Kc.inactive}`, onClick: () => l(i), children: r }, i)) }) } const Ay = "https://app.cryptowallet.elcsa.ru", Rl = { ETH: 18, SOL: 9 }; async function sm(a, l = !0) { const i = await nn(), r = Nt.get(), d = await fetch(`${Ay}${a}`, { credentials: "include", headers: { "X-CSRF-Token": i, ...r ? { Authorization: `Bearer ${r}` } : {} } }); if (d.status === 401 && l) try { return await ca(), sm(a, !1) } catch { throw Nt.clear(), new Error("Unauthorized") } const f = await d.json(); if (!d.ok) throw f; return f } async function Ys(a, l, i = !0, r = {}) { const d = await nn(), f = Nt.get(), h = await fetch(`${Ay}${a}`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": d, ...f ? { Authorization: `Bearer ${f}` } : {}, ...r }, body: JSON.stringify(l) }); if (h.status === 401 && i) try { return await ca(), Ys(a, l, !1, r) } catch { throw Nt.clear(), new Error("Unauthorized") } const g = await h.json(); if (!h.ok) throw g; return g } function bu() { return { "Idempotency-Key": crypto.randomUUID() } } async function yL(a, l) { const i = ra(l, Rl[a]); if (a === "ETH") { const h = (await Ys("/api/wallets/ETH/stake/quote", { amount: i })).data; return { chain: a, amountHuman: h.amountWeiHuman, feeHuman: h.appFeeWeiHuman, afterFeeHuman: h.stakeAmountWeiHuman, resultHuman: h.expectedStEthWeiHuman, aprPercent: h.aprPercent } } const d = (await Ys("/api/wallets/SOL/stake/quote", { amount: i })).data; return { chain: a, amountHuman: d.amountLamportsHuman, feeHuman: d.appFeeLamportsHuman, afterFeeHuman: d.stakeLamportsHuman, resultHuman: d.stakeLamportsHuman, aprPercent: d.estApyPercent, validator: d.validator } } async function _L(a, l) { const i = ra(l, Rl[a]); await Ys(`/api/wallets/${a}/stake`, { amount: i }, !0, bu()) } async function bL() { return (await sm("/api/wallets/ETH/stake/positions")).data } async function xL() { return (await sm("/api/wallets/SOL/stake/positions")).data } async function AL(a, l) { const i = ra(a, Rl.ETH); return (await Ys("/api/wallets/ETH/unstake", { amount: i, mode: l }, !0, bu())).data } async function SL(a) { return (await Ys("/api/wallets/SOL/unstake", { stakeAccount: a }, !0, bu())).data } async function jL(a) { await Ys("/api/wallets/ETH/unstake/claim", { requestId: a }, !0, bu()) } async function wL(a, l) { return (await Ys(`/api/wallets/${a}/op-cost`, { token: a, amountHuman: l })).data } function ar(a) { if (a && typeof a == "object" && "error" in a) { const l = a.error; if (typeof l == "string") return l } return a instanceof Error ? a.message === "Unauthorized" ? "Сессия истекла — перезагрузите страницу." : a.message : "Произошла ошибка. Попробуйте ещё раз." } function EL(a, l) { if (a.chain === "ETH") { const r = BigInt(ra(a.stEthBalanceWeiHuman, Rl.ETH)), d = BigInt(ra(l, Rl.ETH)); return { ...a, stEthBalanceWeiHuman: rr((r + d).toString(), Rl.ETH), optimistic: !0 } } const i = { stakeAccount: "pending", lamportsHuman: l, state: "activating", validator: a.validator, optimistic: !0 }; return { ...a, positions: [i, ...a.positions] } } function NL(a, l) { const i = parseFloat(l); return Ct({ queryKey: ["staking", "quote", a, l], queryFn: () => yL(a, l), enabled: Number.isFinite(i) && i > 0, staleTime: 15e3, retry: !1 }) } function CL(a, l) { const i = parseFloat(l); return Ct({ queryKey: ["staking", "op-cost", a, l], queryFn: () => wL(a, l), enabled: Number.isFinite(i) && i > 0, staleTime: 15e3, retry: !1 }) } function TL(a) { return Ct({ queryKey: ["staking", "positions", a], queryFn: () => a === "ETH" ? bL() : xL(), staleTime: 3e4, retry: !1 }) } function RL() { const a = Wt(); return yt({ mutationFn: ({ chain: l, amountHuman: i }) => _L(l, i), onMutate: async ({ chain: l, amountHuman: i }) => { const r = ["staking", "positions", l]; await a.cancelQueries({ queryKey: r }); const d = a.getQueryData(r); return d && a.setQueryData(r, EL(d, i)), { key: r, previous: d } }, onError: (l, i, r) => { r != null && r.previous && a.setQueryData(r.key, r.previous) }, onSettled: (l, i, { chain: r }) => { a.invalidateQueries({ queryKey: ["wallet", "balance", r] }), setTimeout(() => { a.invalidateQueries({ queryKey: ["staking", "positions", r] }), a.invalidateQueries({ queryKey: ["wallet", "balance", r] }) }, 6e3) } }) } function kL() { const a = Wt(); return yt({ mutationFn: l => l.chain === "ETH" ? AL(l.amountHuman, l.mode) : SL(l.stakeAccount), onSuccess: (l, i) => { a.invalidateQueries({ queryKey: ["staking", "positions", i.chain] }), a.invalidateQueries({ queryKey: ["wallet", "balance", i.chain] }) } }) } function BL() { const a = Wt(); return yt({ mutationFn: l => jL(l), onSuccess: () => { a.invalidateQueries({ queryKey: ["staking", "positions", "ETH"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) } }) } const OL = "_panel_jl9ez_1", LL = "_row_jl9ez_13", ML = "_label_jl9ez_26", zL = "_value_jl9ez_31", DL = "_success_jl9ez_39", UL = "_highlight_jl9ez_43", HL = "_rowTotal_jl9ez_48", qL = "_valueLg_jl9ez_55", vl = { panel: OL, row: LL, label: ML, value: zL, success: DL, highlight: UL, rowTotal: HL, valueLg: qL }; function PL({ rows: a, loading: l }) { return o.jsx("div", { className: vl.panel, "data-loading": l ? "true" : void 0, children: a.map(({ label: i, value: r, accent: d, emphasis: f }) => o.jsxs("div", { className: `${vl.row} ${f ? vl.rowTotal : ""}`, children: [o.jsx("span", { className: vl.label, children: i }), o.jsx("span", { className: `${vl.value} ${f ? vl.valueLg : ""} ${d ? vl[d] : ""}`, children: r })] }, i)) }) } const QL = "_wrapper_1y6dk_1", FL = "_pillsOuter_1y6dk_7", YL = "_card_1y6dk_12", IL = "_top_1y6dk_19", GL = "_tag_1y6dk_27", KL = "_right_1y6dk_35", XL = "_apr_1y6dk_41", VL = "_pillsInner_1y6dk_52", ZL = "_pill_1y6dk_7", WL = "_mid_1y6dk_75", JL = "_input_1y6dk_83", $L = "_token_1y6dk_99", eM = "_bottom_1y6dk_109", tM = "_balance_1y6dk_116", nM = "_max_1y6dk_124", aM = "_hint_1y6dk_139", sM = "_stakeBtn_1y6dk_147", lM = "_stakeBtnDisabled_1y6dk_151", Dt = { wrapper: QL, pillsOuter: FL, card: YL, top: IL, tag: GL, right: KL, apr: XL, pillsInner: VL, pill: ZL, mid: WL, input: JL, token: $L, bottom: eM, balance: tM, max: nM, hint: aM, stakeBtn: sM, stakeBtnDisabled: lM }, iM = [25, 50, 100], wi = "—"; function S1(a) { return `≈ $${a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } function oM(a, l, i, r, d) { var L, B, P; const f = a.symbol === "ETH", h = `Годовая доходность (${a.aprLabel})`, g = (L = i == null ? void 0 : i.appCommission) == null ? void 0 : L.usd, m = g != null ? S1(g) : wi, p = (l == null ? void 0 : l.aprPercent) != null ? `${l.aprPercent}%` : wi, y = f ? "Вы получите" : "Делегируется валидатору", _ = l ? f ? `≈ ${nt(l.resultHuman, 8)} stETH` : `${nt(l.resultHuman, 8)} SOL` : wi, b = (P = (B = i == null ? void 0 : i.balance) == null ? void 0 : B.gas) == null ? void 0 : P.needReserve, S = b != null && parseFloat(String(b)) || 0, j = b != null ? `≈ ${nt(String(b), 8)} ${a.symbol}` : wi, w = Math.max(0, r - S), E = b != null && r > 0 ? `≈ ${nt(w.toString(), 8)} ${a.symbol}` : wi, R = d > 0 && r > 0 ? S1(r * d) : wi; return [{ label: "Сетевой сбор (газ)", value: j }, { label: "Сумма в стейкинг", value: E }, { label: "Комиссия сервиса (0.7%)", value: m }, { label: h, value: p, accent: "success" }, { label: "Итого к списанию", value: R }, { label: y, value: _, accent: "highlight", emphasis: !0 }] } function rM({ chain: a, amount: l, onAmountChange: i, onStake: r, isStaking: d }) { var re, ce; const f = xy[a], h = Rl[a], { data: g } = Yi(a), m = (g == null ? void 0 : g.native.formatted) ?? "0", p = parseFloat(m) || 0, y = ba(l, 400), { data: _, isError: b } = CL(a, y), S = ((ce = (re = _ == null ? void 0 : _.balance) == null ? void 0 : re.gas) == null ? void 0 : ce.needReserve) != null ? String(_.balance.gas.needReserve) : null; function j(ie) { if ((parseFloat(ie) || 0) <= 0) return "0"; if (S != null) { const pe = BigInt(ra(ie, h)), ve = BigInt(ra(S, h)), q = pe > ve ? pe - ve : 0n; return rr(q.toString(), h) } return b ? ie : "0" } const w = j(l), E = j(y), R = parseFloat(w) || 0, { data: L, isFetching: B } = NL(a, E), P = parseFloat(l) || 0, G = P > 0 && P <= p, V = G && S != null && R <= 0, D = G && R > 0 && !d, K = ie => { ie >= 100 ? i(m) : i((p * ie / 100).toString()) }, ee = o.jsx(o.Fragment, { children: iM.map(ie => o.jsxs("button", { className: Dt.pill, onClick: () => K(ie), "aria-label": `${ie}% от баланса`, children: [ie, "%"] }, ie)) }); return o.jsxs("div", { className: Dt.wrapper, children: [o.jsx("div", { className: Dt.pillsOuter, children: ee }), o.jsxs("div", { className: Dt.card, children: [o.jsxs("div", { className: Dt.top, children: [o.jsx("span", { className: Dt.tag, children: "Сумма к списанию" }), o.jsxs("div", { className: Dt.right, children: [o.jsxs("span", { className: Dt.apr, children: [f.aprLabel, " ", (L == null ? void 0 : L.aprPercent) != null ? `${L.aprPercent}%` : "—"] }), o.jsx("div", { className: Dt.pillsInner, children: ee })] })] }), o.jsxs("div", { className: Dt.mid, children: [o.jsx("input", { className: Dt.input, type: "text", inputMode: "decimal", value: l, onChange: ie => { const te = ie.target.value; (/^(\d+\.?\d*|\.?\d*)$/.test(te) || te === "") && i(te) }, placeholder: "0", "aria-label": `Сумма к списанию в ${f.symbol}` }), o.jsxs("div", { className: Dt.token, children: [o.jsx(kl, { letter: f.symbol[0], color: "var(--grad-center)", logo: _e[f.symbol], size: 28 }), o.jsx("span", { children: f.symbol })] })] }), o.jsx("div", { className: Dt.bottom, children: o.jsxs("span", { className: Dt.balance, children: ["Баланс: ", nt(m, 6), " ", f.symbol, o.jsx("button", { className: Dt.max, onClick: () => K(100), "aria-label": "Использовать весь баланс", children: "МАКС" })] }) }), o.jsx(PL, { rows: oM(f, L, _, P, (g == null ? void 0 : g.native.usdPrice) ?? 0), loading: B }), V && o.jsx("p", { className: Dt.hint, children: "Сумма меньше сетевого сбора (газ)." }), o.jsx("div", { className: `${Dt.stakeBtn} ${D ? "" : Dt.stakeBtnDisabled}`, children: o.jsx(Zn, { label: d ? "Отправка…" : "Застейкать", type: "button", onClick: () => r(w), disabled: !D }) })] })] }) } const cM = "_notice_y8uqt_1", uM = "_icon_y8uqt_14", dM = "_compact_y8uqt_29", ch = { notice: cM, icon: uM, compact: dM }; function Sy({ compact: a }) { return o.jsxs("div", { className: `${ch.notice} ${a ? ch.compact : ""}`, children: [o.jsx("span", { className: ch.icon, "aria-hidden": "true", children: "!" }), o.jsx("span", { children: "Вывод средств из стейкинга может занимать до 2 недель." })] }) } const fM = "_panel_156jb_1", hM = "_inner_156jb_8", mM = "_body_156jb_16", pM = "_head_156jb_45", gM = "_title_156jb_51", vM = "_total_156jb_59", yM = "_totalUnit_156jb_65", _M = "_subhead_156jb_70", bM = "_list_156jb_79", xM = "_pos_156jb_85", AM = "_pending_156jb_93", SM = "_reqCard_156jb_108", jM = "_posTop_156jb_112", wM = "_coin_156jb_120", EM = "_amount_156jb_129", NM = "_meta_156jb_136", CM = "_badge_156jb_143", TM = "_badgeActive_156jb_151", RM = "_badgeReady_156jb_156", kM = "_badgeMuted_156jb_161", BM = "_btn_156jb_166", OM = "_btnPrimary_156jb_189", LM = "_note_156jb_201", MM = "_empty_156jb_208", zM = "_emptyState_156jb_215", DM = "_emptyIcon_156jb_227", UM = "_emptyTitle_156jb_239", HM = "_emptyText_156jb_246", me = { panel: fM, inner: hM, body: mM, head: pM, title: gM, total: vM, totalUnit: yM, subhead: _M, list: bM, pos: xM, pending: AM, reqCard: SM, posTop: jM, coin: wM, amount: EM, meta: NM, badge: CM, badgeActive: TM, badgeReady: RM, badgeMuted: kM, btn: BM, btnPrimary: OM, note: LM, empty: MM, emptyState: zM, emptyIcon: DM, emptyTitle: UM, emptyText: HM }; function qM({ chain: a, onUnstakeEth: l, onUnstakeSol: i, onClaim: r, unstakePending: d, claimPending: f }) { var E; const { data: h, isLoading: g, isError: m, error: p } = TL(a), y = { active: me.badgeActive, ready: me.badgeReady, muted: me.badgeMuted }, _ = (h == null ? void 0 : h.chain) === "ETH" ? h.stEthBalanceWeiHuman : (h == null ? void 0 : h.chain) === "SOL" ? h.positions.reduce((R, L) => R + (parseFloat(L.lamportsHuman) || 0), 0).toString() : "0", b = a === "ETH" ? "stETH" : "SOL", S = (h == null ? void 0 : h.chain) === "ETH" && (parseFloat(h.stEthBalanceWeiHuman) || 0) < 1e-11 && h.withdrawalRequests.length === 0, j = (h == null ? void 0 : h.chain) === "SOL" && h.positions.length === 0, w = S || j; return o.jsx("div", { className: me.panel, children: o.jsxs("div", { className: me.inner, children: [o.jsxs("div", { className: me.head, children: [o.jsx("span", { className: me.title, children: "Мои позиции" }), o.jsxs("div", { className: me.total, children: [nt(m ? "0" : _, 6), " ", o.jsx("span", { className: me.totalUnit, children: b })] })] }), o.jsxs("div", { className: me.body, children: [!g && !m && !w && o.jsx(Sy, { compact: !0 }), g && o.jsx(zn, { label: "Загрузка позиций" }), m && o.jsx("div", { className: me.empty, children: ar(p) }), !g && !m && (w || (h == null ? void 0 : h.chain) === "ETH" && (parseFloat(h.stEthBalanceWeiHuman) || 0) < 1e-14) && o.jsxs("div", { className: me.emptyState, children: [o.jsx("span", { className: me.emptyIcon, "aria-hidden": !0, children: o.jsxs("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("path", { d: "M3 7.5 12 3l9 4.5-9 4.5z" }), o.jsx("path", { d: "M3 12.5 12 17l9-4.5" }), o.jsx("path", { d: "M3 16.5 12 21l9-4.5" })] }) }), o.jsx("p", { className: me.emptyTitle, children: "Активных позиций пока нет" }), o.jsx("p", { className: me.emptyText, children: "На данный момент у Вас нет активных позиций стейкинга." })] }), !m && (h == null ? void 0 : h.chain) === "ETH" && !w && o.jsxs(o.Fragment, { children: [(parseFloat(h.stEthBalanceWeiHuman) || 0) > 1e-14 && o.jsx("div", { className: me.list, children: o.jsxs("div", { className: `${me.pos} ${h.optimistic ? me.pending : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: [o.jsx(kl, { letter: "E", color: "var(--grad-center)", logo: _e.ETH, size: 24 }), "stETH"] }), o.jsxs("span", { className: `${me.badge} ${me.badgeActive}`, children: ["Активна", h.aprPercent != null ? ` · APR ${h.aprPercent}%` : ""] })] }), o.jsx("div", { className: me.amount, children: nt(h.stEthBalanceWeiHuman, 8) }), o.jsx("button", { className: me.btn, onClick: () => l(h.stEthBalanceWeiHuman), disabled: d, children: "Вывести" })] }) }), (parseFloat((E = h.withdrawalRequests[0]) == null ? void 0 : E.amountStEthWeiHuman) || 0) > 1e-14 && o.jsxs(o.Fragment, { children: [o.jsx("div", { className: me.subhead, children: "Заявки на вывод" }), o.jsx("div", { className: me.list, children: h.withdrawalRequests.map(R => { const L = R.isFinalized && !R.isClaimed; return o.jsxs("div", { className: `${me.pos} ${L ? me.reqCard : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: ["Заявка #", R.requestId] }), o.jsx("span", { className: `${me.badge} ${R.isClaimed ? me.badgeMuted : L ? me.badgeReady : me.badgeMuted}`, children: R.isClaimed ? "Выведено" : L ? "Готово к выводу" : "В очереди" })] }), o.jsxs("div", { className: me.amount, children: [nt(R.amountStEthWeiHuman, 8), " ETH"] }), L ? o.jsx("button", { className: `${me.btn} ${me.btnPrimary}`, onClick: () => r(R.requestId), disabled: f, children: "Забрать ETH" }) : R.isClaimed ? null : o.jsx("div", { className: me.note, children: "Ожидает финализации в Lido" })] }, R.requestId) }) })] })] }), !m && (h == null ? void 0 : h.chain) === "SOL" && !w && o.jsx("div", { className: me.list, children: h.positions.map(R => { const L = fL[R.state]; return o.jsxs("div", { className: `${me.pos} ${R.optimistic ? me.pending : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: [o.jsx(kl, { letter: "S", color: "var(--grad-center)", logo: _e.SOL, size: 24 }), "SOL"] }), o.jsx("span", { className: `${me.badge} ${y[L.variant]}`, children: L.label })] }), o.jsx("div", { className: me.amount, children: nt(R.lamportsHuman, 8) }), o.jsxs("div", { className: me.meta, children: ["Валидатор: ", R.validator, " · ", R.stakeAccount] }), R.state === "active" && o.jsx("button", { className: me.btn, onClick: () => i(R), disabled: d, children: "Вывести" }), R.state === "inactive" && o.jsx("button", { className: `${me.btn} ${me.btnPrimary}`, onClick: () => i(R), disabled: d, children: "Вывести средства" }), R.state === "deactivating" && o.jsx("div", { className: me.note, children: "Разблокируется через 1–2 эпохи" }), R.state === "activating" && o.jsx("div", { className: me.note, children: "Активируется…" })] }, R.stakeAccount) }) })] })] }) }) } const PM = "_overlay_17qoe_1", QM = "_card_17qoe_13", FM = "_header_17qoe_25", YM = "_title_17qoe_31", IM = "_closeBtn_17qoe_37", GM = "_token_17qoe_52", KM = "_tokenLabel_17qoe_62", XM = "_tokenAmount_17qoe_70", VM = "_modes_17qoe_77", ZM = "_mode_17qoe_77", WM = "_modeActive_17qoe_101", JM = "_modeTitle_17qoe_106", $M = "_modeDesc_17qoe_112", ez = "_solNote_17qoe_118", tz = "_confirmBtn_17qoe_125", kt = { overlay: PM, card: QM, header: FM, title: YM, closeBtn: IM, token: GM, tokenLabel: KM, tokenAmount: XM, modes: VM, mode: ZM, modeActive: WM, modeTitle: JM, modeDesc: $M, solNote: ez, confirmBtn: tz }; function j1({ chain: a, symbol: l, amount: i, solState: r, pending: d, onConfirm: f, onClose: h }) { const [g, m] = A.useState("swap"); A.useEffect(() => { function b(S) { S.key === "Escape" && h() } return document.addEventListener("keydown", b), () => document.removeEventListener("keydown", b) }, [h]); const p = a === "SOL" && r === "inactive", y = d ? "Отправка…" : a === "ETH" ? "Подтвердить вывод" : p ? "Вывести средства" : "Запустить деактивацию", _ = a === "SOL" || a === "ETH" && g === "queue"; return o.jsx("div", { className: kt.overlay, onClick: h, children: o.jsxs("div", { className: kt.card, onClick: b => b.stopPropagation(), children: [o.jsxs("div", { className: kt.header, children: [o.jsx("span", { className: kt.title, children: "Вывод из стейкинга" }), o.jsx("button", { className: kt.closeBtn, onClick: h, children: "×" })] }), o.jsxs("div", { className: kt.token, children: [o.jsx("span", { className: kt.tokenLabel, children: "Сумма" }), o.jsxs("span", { className: kt.tokenAmount, children: [i, " ", a === "ETH" ? "stETH" : l] })] }), a === "ETH" && o.jsxs("div", { className: kt.modes, children: [o.jsxs("button", { className: `${kt.mode} ${g === "swap" ? kt.modeActive : ""}`, onClick: () => m("swap"), children: [o.jsx("span", { className: kt.modeTitle, children: "Мгновенно" }), o.jsx("span", { className: kt.modeDesc, children: "Своп stETH → ETH через Curve" })] }), o.jsxs("button", { className: `${kt.mode} ${g === "queue" ? kt.modeActive : ""}`, onClick: () => m("queue"), children: [o.jsx("span", { className: kt.modeTitle, children: "Очередь" }), o.jsx("span", { className: kt.modeDesc, children: "Заявка в Lido Withdrawal Queue" })] })] }), a === "SOL" && !p && o.jsx("p", { className: kt.solNote, children: "Средства разблокируются через 1–2 эпохи. После завершения вернитесь и подтвердите вывод." }), _ && o.jsx(Sy, {}), o.jsx("button", { className: kt.confirmBtn, onClick: () => f(a === "ETH" ? g : void 0), disabled: d, children: y })] }) }) } const nz = "_widget_wxtkp_1", az = "_grid_wxtkp_7", w1 = { widget: nz, grid: az }; function sz() { const [a, l] = A.useState("ETH"), [i, r] = A.useState(""), [d, f] = A.useState(null), [h, g] = A.useState(null), m = RL(), p = kL(), y = BL(); function _(w) { l(w), r("") } function b(w) { m.mutate({ chain: a, amountHuman: w }, { onSuccess: () => { g({ status: "success", message: `Стейкинг ${nt(w, 6)} ${xy[a].symbol} выполнен` }), r("") }, onError: E => g({ status: "error", message: ar(E) }) }) } function S(w) { if ((d == null ? void 0 : d.kind) === "eth") { const E = w ?? "swap"; p.mutate({ chain: "ETH", amountHuman: d.amount, mode: E }, { onSuccess: () => { f(null), g({ status: "success", message: E === "queue" ? "Заявка на вывод добавлена в очередь Lido" : "Вывод stETH → ETH выполнен" }) }, onError: R => g({ status: "error", message: ar(R) }) }) } else (d == null ? void 0 : d.kind) === "sol" && p.mutate({ chain: "SOL", stakeAccount: d.position.stakeAccount }, { onSuccess: E => { f(null); const R = "action" in E && E.action === "withdraw"; g({ status: "success", message: R ? "Средства выведены на кошелёк" : "Деактивация запущена — вывод через 1–2 эпохи" }) }, onError: E => g({ status: "error", message: ar(E) }) }) } function j(w) { y.mutate(w, { onSuccess: () => g({ status: "success", message: "ETH забран на кошелёк" }), onError: E => g({ status: "error", message: ar(E) }) }) } return o.jsxs("div", { className: w1.widget, children: [o.jsx(vL, { value: a, onChange: _ }), o.jsxs("div", { className: w1.grid, children: [o.jsx(rM, { chain: a, amount: i, onAmountChange: r, onStake: b, isStaking: m.isPending }), o.jsx(qM, { chain: a, onUnstakeEth: w => f({ kind: "eth", amount: w }), onUnstakeSol: w => f({ kind: "sol", position: w }), onClaim: j, unstakePending: p.isPending, claimPending: y.isPending })] }), (d == null ? void 0 : d.kind) === "eth" && o.jsx(j1, { chain: "ETH", symbol: "ETH", amount: d.amount, pending: p.isPending, onConfirm: S, onClose: () => f(null) }), (d == null ? void 0 : d.kind) === "sol" && o.jsx(j1, { chain: "SOL", symbol: "SOL", amount: d.position.lamportsHuman, solState: d.position.state, pending: p.isPending, onConfirm: S, onClose: () => f(null) }), h && o.jsx($a, { status: h.status, message: h.message, onClose: () => g(null), duration: 5e3 })] }) } const lz = "_page_1j4fk_1", iz = "_head_1j4fk_8", oz = "_title_1j4fk_12", rz = "_subtitle_1j4fk_19", Xc = { page: lz, head: iz, title: oz, subtitle: rz }; function cz() { return o.jsxs("div", { className: Xc.page, children: [o.jsxs("header", { className: Xc.head, children: [o.jsx("h1", { className: Xc.title, children: "Стейкинг" }), o.jsx("p", { className: Xc.subtitle, children: "Выберите сеть и укажите, сколько монет хотите застейкать. Ваши средства отправляются в стейкинг и начинают приносить доход (APR). Все ваши вклады видны в блоке «Мои позиции», откуда их можно вывести вместе с накопленной наградой. Учтите, что вывод средств занимает некоторое время. Комиссия сервиса — 0.7%." })] }), o.jsx(sz, {})] }) } const jy = "https://app.cryptowallet.elcsa.ru"; async function lm(a, l = !0) { const i = await nn(), r = Nt.get(), d = await fetch(`${jy}${a}`, { credentials: "include", headers: { "X-CSRF-Token": i, ...r ? { Authorization: `Bearer ${r}` } : {} } }); if (d.status === 401 && l) try { return await ca(), lm(a, !1) } catch { throw Nt.clear(), new Error("Unauthorized") } const f = await d.json(); if (!d.ok) throw f; return f } async function xu(a, l, i = !0, r = {}) { const d = await nn(), f = Nt.get(), h = await fetch(`${jy}${a}`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": d, ...f ? { Authorization: `Bearer ${f}` } : {}, ...r }, body: JSON.stringify(l) }); if (h.status === 401 && i) try { return await ca(), xu(a, l, !1, r) } catch { throw Nt.clear(), new Error("Unauthorized") } const g = await h.json(); if (!h.ok) throw g; return g } function wy() { return { "Idempotency-Key": crypto.randomUUID() } } async function uz() { return (await lm("/api/wallets/ETH/lp/pools")).data } function Ey(a) { const { pool: l, amount0Human: i, amount1Human: r, priceLower: d, priceUpper: f, slippageBps: h, useNativeEth: g } = a; return { pool: l.poolAddress, priceLower: d, priceUpper: f, amount0Desired: ra(i || "0", l.decimals0), amount1Desired: ra(r || "0", l.decimals1), ...h != null ? { slippageBps: h } : {}, ...g != null ? { useNativeEth: g } : {} } } async function dz(a) { return (await xu("/api/wallets/ETH/lp/quote", Ey(a))).data } async function fz(a) { return (await xu("/api/wallets/ETH/lp/add", Ey(a), !0, wy())).data } async function hz(a, l = 100) { return (await xu("/api/wallets/ETH/lp/remove", { tokenId: a, percent: l }, !0, wy())).data } async function mz() { return (await lm("/api/wallets/ETH/lp/positions")).data } function Vc(a) { if (a && typeof a == "object" && "error" in a) { const l = a.error; if (typeof l == "string") return l } return a instanceof Error ? a.message === "Unauthorized" ? "Сессия истекла — перезагрузите страницу." : a.message : "Произошла ошибка. Попробуйте ещё раз." } function pz() { return Ct({ queryKey: ["pools", "list"], queryFn: uz, staleTime: 3e4, retry: !1 }) } function gz() { return Ct({ queryKey: ["pools", "positions"], queryFn: mz, staleTime: 3e4, retry: !1 }) } function vz(a) { const l = a != null && a.priceLower > 0 && a.priceUpper > 0 && (parseFloat(a.amount0Human) > 0 || parseFloat(a.amount1Human) > 0); return Ct({ queryKey: ["pools", "quote", a == null ? void 0 : a.pool.poolAddress, a == null ? void 0 : a.priceLower, a == null ? void 0 : a.priceUpper, a == null ? void 0 : a.amount0Human, a == null ? void 0 : a.amount1Human, a == null ? void 0 : a.slippageBps, a == null ? void 0 : a.useNativeEth], queryFn: () => dz(a), enabled: l, staleTime: 15e3, retry: !1 }) } function yz() { const a = Wt(); return yt({ mutationFn: l => fz(l), onSettled: () => { setTimeout(() => { a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }), a.invalidateQueries({ queryKey: ["pools", "positions"] }) }, 1500), setTimeout(() => { a.invalidateQueries({ queryKey: ["pools", "positions"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) }, 6e3) } }) } function _z() { const a = Wt(); return yt({ mutationFn: ({ tokenId: l, percent: i }) => hz(l, i), onSuccess: () => { a.invalidateQueries({ queryKey: ["pools", "positions"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) } }) } const bz = { WETH: "ETH", WBTC: "BTC" }; function ut(a) { return bz[a] ?? a } function Au(a) { return `${a / 1e4}%` } const xz = "_card_1uvgu_1", Az = "_head_1uvgu_8", Sz = "_title_1uvgu_12", jz = "_scroll_1uvgu_20", wz = "_message_1uvgu_24", Ez = "_spinnerWrap_1uvgu_31", Nz = "_table_1uvgu_38", Cz = "_thLeft_1uvgu_55", Tz = "_sortable_1uvgu_59", Rz = "_arrow_1uvgu_69", kz = "_row_1uvgu_73", Bz = "_rowSelected_1uvgu_74", Oz = "_tdLeft_1uvgu_96", Lz = "_tdAction_1uvgu_100", Mz = "_mono_1uvgu_104", zz = "_apr_1uvgu_108", Dz = "_pairName_1uvgu_113", Uz = "_fee_1uvgu_118", Hz = "_btn_1uvgu_128", qz = "_btnSelected_1uvgu_129", rt = { card: xz, head: Az, title: Sz, scroll: jz, message: wz, spinnerWrap: Ez, table: Nz, thLeft: Cz, sortable: Tz, arrow: Rz, row: kz, rowSelected: Bz, tdLeft: Oz, tdAction: Lz, mono: Mz, apr: zz, pairName: Dz, fee: Uz, btn: Hz, btnSelected: qz }, Ny = "—"; function E1(a) { return a == null ? Ny : a >= 1e6 ? `$${(a / 1e6).toFixed(2)}M` : a >= 1e3 ? `$${(a / 1e3).toFixed(2)}K` : `$${a.toFixed(2)}` } function Pz(a) { return a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) } function Qz(a) { return a == null ? Ny : `${parseFloat(a.toFixed(3))}%` } function N1(a) { return `${ut(a.symbol0)}/${ut(a.symbol1)}` } function Fz(a, l, i, r) { if (i === "pair") { const g = N1(a).localeCompare(N1(l)); return r === "asc" ? g : -g } const d = a[i], f = l[i]; if (d == null && f == null) return 0; if (d == null) return 1; if (f == null) return -1; const h = d - f; return r === "asc" ? h : -h } function Yz({ pools: a, selected: l, onSelect: i, loading: r, error: d }) { const [f, h] = A.useState(null), [g, m] = A.useState(null); function p(S) { if (f !== S) { h(S), m("desc"); return } g === "desc" ? m("asc") : g === "asc" ? (h(null), m(null)) : m("desc") } const y = A.useMemo(() => !f || !g ? a : [...a].sort((S, j) => Fz(S, j, f, g)), [a, f, g]); function _(S) { return f !== S || !g ? "" : g === "desc" ? " ▼" : " ▲" } const b = [{ key: "pair", label: "Пул", align: "left" }, { key: "feeTier", label: "Комиссия", align: "right" }, { key: "currentPrice", label: "Цена", align: "right" }, { key: "tvlUSD", label: "TVL", align: "right" }, { key: "volumeUSD24h", label: "Объём 24ч", align: "right" }, { key: "aprPercent", label: "APR", align: "right" }]; return o.jsxs("div", { className: rt.card, children: [o.jsx("div", { className: rt.head, children: o.jsx("span", { className: rt.title, children: "Курируемые пулы" }) }), r && o.jsx("div", { className: rt.spinnerWrap, children: o.jsx(zn, { label: "Загрузка пулов" }) }), !r && d && o.jsx("div", { className: rt.message, children: d }), !r && !d && a.length === 0 && o.jsx("div", { className: rt.message, children: "Курируемых пулов пока нет." }), !r && !d && a.length > 0 && o.jsx("div", { className: rt.scroll, children: o.jsxs("table", { className: rt.table, children: [o.jsx("thead", { children: o.jsxs("tr", { children: [b.map(S => o.jsxs("th", { className: `${rt.sortable} ${S.align === "left" ? rt.thLeft : ""}`, onClick: () => p(S.key), "aria-sort": f === S.key ? g === "asc" ? "ascending" : "descending" : "none", children: [S.label, o.jsx("span", { className: rt.arrow, children: _(S.key) })] }, S.key)), o.jsx("th", { "aria-label": "Действие" })] }) }), o.jsx("tbody", { children: y.map(S => { const j = S.poolAddress === l; return o.jsxs("tr", { className: j ? rt.rowSelected : rt.row, onClick: () => i(S.poolAddress), children: [o.jsx("td", { className: rt.tdLeft, children: o.jsxs("span", { className: rt.pairName, children: [ut(S.symbol0), "/", ut(S.symbol1)] }) }), o.jsx("td", { children: o.jsx("span", { className: rt.fee, children: Au(S.feeTier) }) }), o.jsx("td", { className: rt.mono, children: Pz(S.currentPrice) }), o.jsx("td", { className: rt.mono, children: E1(S.tvlUSD) }), o.jsx("td", { className: rt.mono, children: E1(S.volumeUSD24h) }), o.jsx("td", { className: `${rt.mono} ${rt.apr}`, children: Qz(S.aprPercent) }), o.jsx("td", { className: rt.tdAction, children: o.jsx("button", { type: "button", className: j ? rt.btnSelected : rt.btn, onClick: w => { w.stopPropagation(), i(S.poolAddress) }, children: j ? "Выбран" : "Выбрать" }) })] }, S.poolAddress) }) })] }) })] }) } const Iz = "_card_9umyw_1", Gz = "_top_9umyw_8", Kz = "_pair_9umyw_16", Xz = "_fee_9umyw_25", Vz = "_tag_9umyw_34", Zz = "_amounts_9umyw_44", Wz = "_amountField_9umyw_51", Jz = "_balance_9umyw_57", $z = "_amountRow_9umyw_64", eD = "_amountInput_9umyw_75", tD = "_token_9umyw_91", nD = "_range_9umyw_101", aD = "_priceField_9umyw_108", sD = "_priceLabel_9umyw_118", lD = "_priceInput_9umyw_124", iD = "_quote_9umyw_140", oD = "_quoteRow_9umyw_147", rD = "_quoteLabel_9umyw_160", cD = "_quoteValue_9umyw_165", uD = "_feeValue_9umyw_173", dD = "_success_9umyw_178", fD = "_warning_9umyw_182", hD = "_submit_9umyw_190", mD = "_placeholder_9umyw_195", pD = "_placeholderTitle_9umyw_207", gD = "_placeholderText_9umyw_214", Ee = { card: Iz, top: Gz, pair: Kz, fee: Xz, tag: Vz, amounts: Zz, amountField: Wz, balance: Jz, amountRow: $z, amountInput: eD, token: tD, range: nD, priceField: aD, priceLabel: sD, priceInput: lD, quote: iD, quoteRow: oD, quoteLabel: rD, quoteValue: cD, feeValue: uD, success: dD, warning: fD, submit: hD, placeholder: mD, placeholderTitle: pD, placeholderText: gD }, Zc = "—", im = /^(\d+\.?\d*|\.?\d*)$/; function C1(a, l) { var i; return a ? ut(l) === a.chain ? a.native.formatted : ((i = a.tokens[l]) == null ? void 0 : i.formatted) ?? "0" : "0" } function T1({ symbol: a, value: l, onChange: i, balance: r }) { return o.jsxs("div", { className: Ee.amountField, children: [o.jsxs("div", { className: Ee.amountRow, children: [o.jsx("input", { className: Ee.amountInput, type: "text", inputMode: "decimal", value: l, onChange: d => { const f = d.target.value; (im.test(f) || f === "") && i(f) }, placeholder: "0", "aria-label": `Сумма ${a}` }), o.jsx("div", { className: Ee.token, children: o.jsx("span", { children: a }) })] }), o.jsxs("span", { className: Ee.balance, children: ["Баланс: ", nt(r, 6), " ", a] })] }) } function R1({ label: a, value: l, onChange: i }) { return o.jsxs("label", { className: Ee.priceField, children: [o.jsx("span", { className: Ee.priceLabel, children: a }), o.jsx("input", { className: Ee.priceInput, type: "text", inputMode: "decimal", value: l, onChange: r => { const d = r.target.value; (im.test(d) || d === "") && i(d) }, placeholder: "0" })] }) } function vD({ pool: a, quote: l, quoteFetching: i, pending: r, amount0: d, amount1: f, priceLower: h, priceUpper: g, slippage: m, onAmount0Change: p, onAmount1Change: y, onPriceLowerChange: _, onPriceUpperChange: b, onSlippageChange: S, onSubmit: j }) { const { data: w } = Yi("ETH"); if (!a) return o.jsx("div", { className: Ee.card, children: o.jsxs("div", { className: Ee.placeholder, children: [o.jsx("p", { className: Ee.placeholderTitle, children: "Выберите пул" }), o.jsx("p", { className: Ee.placeholderText, children: "Выберите пул в таблице выше, чтобы внести ликвидность." })] }) }); const E = l == null ? void 0 : l.balance, R = (E == null ? void 0 : E.sufficient) === !1, L = (l == null ? void 0 : l.aprPercent) != null ? `${l.aprPercent}%` : Zc, B = (l == null ? void 0 : l.appFeeTotalUsd) != null ? `≈ $${l.appFeeTotalUsd.toFixed(2)}` : Zc, P = l ? nt(l.amount0DesiredHuman, 8) : Zc, G = l ? nt(l.amount1DesiredHuman, 8) : Zc, V = E && E.token1.sufficient === !1 ? E.token1 : E == null ? void 0 : E.token0, D = !!l && !R && !r; return o.jsxs("div", { className: Ee.card, children: [o.jsxs("div", { className: Ee.top, children: [o.jsxs("span", { className: Ee.pair, children: [ut(a.symbol0), "/", ut(a.symbol1)] }), o.jsx("span", { className: Ee.fee, children: Au(a.feeTier) })] }), o.jsx("span", { className: Ee.tag, children: "Суммы взноса" }), o.jsxs("div", { className: Ee.amounts, children: [o.jsx(T1, { symbol: ut(a.symbol0), value: d, onChange: p, balance: C1(w, a.symbol0) }), o.jsx(T1, { symbol: ut(a.symbol1), value: f, onChange: y, balance: C1(w, a.symbol1) })] }), o.jsxs("span", { className: Ee.tag, children: ["Диапазон цен (", ut(a.symbol1), " за ", ut(a.symbol0), ")"] }), o.jsxs("div", { className: Ee.range, children: [o.jsx(R1, { label: "Мин.", value: h, onChange: _ }), o.jsx(R1, { label: "Макс.", value: g, onChange: b }), o.jsxs("label", { className: Ee.priceField, children: [o.jsx("span", { className: Ee.priceLabel, children: "Проскальзывание, %" }), o.jsx("input", { className: Ee.priceInput, type: "text", inputMode: "decimal", value: m, onChange: K => { const ee = K.target.value; (im.test(ee) || ee === "") && S(ee) }, placeholder: "1" })] })] }), o.jsxs("div", { className: Ee.quote, "data-loading": i ? "true" : void 0, children: [o.jsxs("div", { className: Ee.quoteRow, children: [o.jsxs("span", { className: Ee.quoteLabel, children: ["Взнос ", ut(a.symbol0)] }), o.jsx("span", { className: Ee.quoteValue, children: P })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsxs("span", { className: Ee.quoteLabel, children: ["Взнос ", ut(a.symbol1)] }), o.jsx("span", { className: Ee.quoteValue, children: G })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsx("span", { className: Ee.quoteLabel, children: "Комиссия сервиса (0.7%)" }), o.jsx("span", { className: `${Ee.quoteValue} ${Ee.feeValue}`, children: B })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsx("span", { className: Ee.quoteLabel, children: "Годовая доходность (APR)" }), o.jsx("span", { className: `${Ee.quoteValue} ${Ee.success}`, children: L })] })] }), R && o.jsxs("p", { className: Ee.warning, children: ["Недостаточно средств", V ? `: не хватает ${ut(V.symbol)}` : "", ". Пополните баланс."] }), o.jsx("div", { className: Ee.submit, children: o.jsx(Zn, { label: r ? "Отправка…" : "Внести в пул", type: "button", onClick: j, disabled: !D }) })] }) } const yD = "_panel_1yqb9_1", _D = "_inner_1yqb9_8", bD = "_body_1yqb9_15", xD = "_head_1yqb9_60", AD = "_title_1yqb9_66", SD = "_total_1yqb9_74", jD = "_totalUnit_1yqb9_80", wD = "_list_1yqb9_85", ED = "_message_1yqb9_91", ND = "_pos_1yqb9_98", CD = "_posTop_1yqb9_105", TD = "_coin_1yqb9_113", RD = "_fee_1yqb9_122", kD = "_badge_1yqb9_131", BD = "_badgeActive_1yqb9_139", OD = "_badgeWarn_1yqb9_144", LD = "_rows_1yqb9_149", MD = "_row_1yqb9_149", zD = "_label_1yqb9_163", DD = "_value_1yqb9_168", UD = "_success_1yqb9_176", HD = "_btn_1yqb9_180", qD = "_emptyState_1yqb9_203", PD = "_emptyTitle_1yqb9_215", QD = "_emptyText_1yqb9_222", He = { panel: yD, inner: _D, body: bD, head: xD, title: AD, total: SD, totalUnit: jD, list: wD, message: ED, pos: ND, posTop: CD, coin: TD, fee: RD, badge: kD, badgeActive: BD, badgeWarn: OD, rows: LD, row: MD, label: zD, value: DD, success: UD, btn: HD, emptyState: qD, emptyTitle: PD, emptyText: QD }; function FD({ positions: a, onRemove: l, removePending: i, isLoading: r, error: d }) { const f = a.length === 0; return o.jsx("div", { className: He.panel, children: o.jsxs("div", { className: He.inner, children: [o.jsxs("div", { className: He.head, children: [o.jsx("span", { className: He.title, children: "Мои позиции" }), o.jsxs("div", { className: He.total, children: [a.length, " ", o.jsx("span", { className: He.totalUnit, children: "NFT" })] })] }), o.jsxs("div", { className: He.body, children: [r && o.jsx(zn, { label: "Загрузка позиций" }), !r && d && o.jsx("div", { className: He.message, children: d }), !r && !d && f && o.jsxs("div", { className: He.emptyState, children: [o.jsx("p", { className: He.emptyTitle, children: "Активных позиций пока нет" }), o.jsx("p", { className: He.emptyText, children: "На данный момент у Вас нет позиций в пулах ликвидности." })] }), !r && !d && !f && o.jsx("div", { className: He.list, children: a.map(h => o.jsxs("div", { className: He.pos, children: [o.jsxs("div", { className: He.posTop, children: [o.jsxs("span", { className: He.coin, children: [ut(h.symbol0), "/", ut(h.symbol1), o.jsx("span", { className: He.fee, children: Au(h.feeTier) })] }), o.jsx("span", { className: `${He.badge} ${h.inRange ? He.badgeActive : He.badgeWarn}`, children: h.inRange ? "В диапазоне" : "Вне диапазона" })] }), o.jsxs("div", { className: He.rows, children: [o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: "Диапазон цен" }), o.jsxs("span", { className: He.value, children: [h.priceLower, " – ", h.priceUpper] })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: ut(h.symbol0) }), o.jsx("span", { className: He.value, children: nt(h.currentAmount0Human, 8) })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: ut(h.symbol1) }), o.jsx("span", { className: He.value, children: nt(h.currentAmount1Human, 8) })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: "Комиссии к выводу" }), o.jsxs("span", { className: `${He.value} ${He.success}`, children: [nt(h.feesOwed0Human, 8), " ", ut(h.symbol0), " · ", nt(h.feesOwed1Human, 8), " ", ut(h.symbol1)] })] })] }), o.jsx("button", { className: He.btn, onClick: () => l(h.tokenId), disabled: i, children: "Вывести" })] }, h.tokenId)) })] })] }) }) } const YD = "_overlay_mbhaz_1", ID = "_card_mbhaz_13", GD = "_header_mbhaz_25", KD = "_title_mbhaz_31", XD = "_closeBtn_mbhaz_37", VD = "_token_mbhaz_52", ZD = "_tokenLabel_mbhaz_62", WD = "_tokenAmount_mbhaz_70", JD = "_tokenMeta_mbhaz_77", $D = "_modes_mbhaz_83", eU = "_mode_mbhaz_83", tU = "_modeActive_mbhaz_107", nU = "_note_mbhaz_112", aU = "_confirmBtn_mbhaz_119", hn = { overlay: YD, card: ID, header: GD, title: KD, closeBtn: XD, token: VD, tokenLabel: ZD, tokenAmount: WD, tokenMeta: JD, modes: $D, mode: eU, modeActive: tU, note: nU, confirmBtn: aU }, sU = [25, 50, 100]; function lU({ position: a, pending: l, onConfirm: i, onClose: r }) { const [d, f] = A.useState(100); return A.useEffect(() => { function h(g) { g.key === "Escape" && r() } return document.addEventListener("keydown", h), () => document.removeEventListener("keydown", h) }, [r]), o.jsx("div", { className: hn.overlay, onClick: r, children: o.jsxs("div", { className: hn.card, onClick: h => h.stopPropagation(), children: [o.jsxs("div", { className: hn.header, children: [o.jsx("span", { className: hn.title, children: "Вывод ликвидности" }), o.jsx("button", { className: hn.closeBtn, onClick: r, children: "×" })] }), o.jsxs("div", { className: hn.token, children: [o.jsx("span", { className: hn.tokenLabel, children: "Позиция" }), o.jsxs("span", { className: hn.tokenAmount, children: [ut(a.symbol0), "/", ut(a.symbol1)] }), o.jsxs("span", { className: hn.tokenMeta, children: [Au(a.feeTier), " · #", a.tokenId] })] }), o.jsx("div", { className: hn.modes, children: sU.map(h => o.jsxs("button", { className: `${hn.mode} ${d === h ? hn.modeActive : ""}`, onClick: () => f(h), children: [h, "%"] }, h)) }), d === 100 && o.jsx("p", { className: hn.note, children: "При выводе 100% позиция (NFT) будет сожжена." }), o.jsx("button", { className: hn.confirmBtn, onClick: () => i(d), disabled: l, children: l ? "Отправка…" : "Подтвердить вывод" })] }) }) } const iU = "_widget_za8nj_1", oU = "_grid_za8nj_7", k1 = { widget: iU, grid: oU }, B1 = .05; function rU() { var W; const a = pz(), l = gz(), i = yz(), r = _z(), d = a.data ?? [], f = ((W = l.data) == null ? void 0 : W.positions) ?? [], [h, g] = A.useState(null), [m, p] = A.useState(""), [y, _] = A.useState(""), [b, S] = A.useState(""), [j, w] = A.useState(""), [E, R] = A.useState("1"), L = !1, [B, P] = A.useState(null), [G, V] = A.useState(null), D = d.find(ue => ue.poolAddress === h) ?? null; function K(ue) { g(ue); const be = d.find(T => T.poolAddress === ue); be && (S((be.currentPrice * (1 - B1)).toFixed(2)), w((be.currentPrice * (1 + B1)).toFixed(2))), p(""), _("") } A.useEffect(() => { !h && d.length > 0 && K(d[0].poolAddress) }, [d, h]); const ee = ba(m, 400), re = ba(y, 400), ce = ba(b, 400), ie = ba(j, 400), te = ba(E, 400), pe = A.useMemo(() => { if (!D) return null; const ue = parseFloat(te); return { pool: D, amount0Human: ee, amount1Human: re, priceLower: parseFloat(ce) || 0, priceUpper: parseFloat(ie) || 0, slippageBps: Number.isFinite(ue) ? Math.round(ue * 100) : void 0, useNativeEth: L } }, [D, ee, re, ce, ie, te, L]), ve = vz(pe); function q() { if (!D) return; const ue = parseFloat(E), be = { pool: D, amount0Human: m, amount1Human: y, priceLower: parseFloat(b) || 0, priceUpper: parseFloat(j) || 0, slippageBps: Number.isFinite(ue) ? Math.round(ue * 100) : void 0, useNativeEth: L }; V({ status: "info", message: "Внесение в пул может занять несколько минут…" }), i.mutate(be, { onSuccess: () => { V({ status: "success", message: `Депозит в пул ${ut(D.symbol0)}/${ut(D.symbol1)} выполнен` }), p(""), _("") }, onError: T => V({ status: "error", message: Vc(T) }) }) } function X(ue) { B && r.mutate({ tokenId: B.tokenId, percent: ue }, { onSuccess: () => { P(null), V({ status: "success", message: "Ликвидность выведена на кошелёк" }) }, onError: be => V({ status: "error", message: Vc(be) }) }) } return o.jsxs("div", { className: k1.widget, children: [o.jsx(Yz, { pools: d, selected: h, onSelect: K, loading: a.isLoading, error: a.isError ? Vc(a.error) : null }), o.jsxs("div", { className: k1.grid, children: [o.jsx(vD, { pool: D, quote: ve.data, quoteFetching: ve.isFetching, pending: i.isPending, amount0: m, amount1: y, priceLower: b, priceUpper: j, slippage: E, onAmount0Change: p, onAmount1Change: _, onPriceLowerChange: S, onPriceUpperChange: w, onSlippageChange: R, onSubmit: q }), o.jsx(FD, { positions: f, onRemove: ue => P(f.find(be => be.tokenId === ue) ?? null), removePending: r.isPending, isLoading: l.isLoading, error: l.isError ? Vc(l.error) : null })] }), B && o.jsx(lU, { position: B, pending: r.isPending, onConfirm: X, onClose: () => P(null) }), G && o.jsx($a, { status: G.status, message: G.message, onClose: () => V(null), duration: 5e3 })] }) } const cU = "_page_1j4fk_1", uU = "_head_1j4fk_8", dU = "_title_1j4fk_12", fU = "_subtitle_1j4fk_19", Wc = { page: cU, head: uU, title: dU, subtitle: fU }; function hU() { return o.jsxs("div", { className: Wc.page, children: [o.jsxs("header", { className: Wc.head, children: [o.jsx("h1", { className: Wc.title, children: "Пулы" }), o.jsx("p", { className: Wc.subtitle, children: "Выберите пул из списка, укажите, количество каждого токена, и задайте диапазон цен, в котором ваши деньги будут работать. Пока цена остаётся в этом диапазоне, вы зарабатываете на комиссиях с каждой сделки в пуле (это и есть APR). Внесённая позиция учитывается как NFT в блоке «Мои позиции», откуда её можно вывести вместе с накопленными комиссиями. Комиссия сервиса на депозит — 0.7%." })] }), o.jsx(rU, {})] }) } const mU = "_page_1f1vh_1", pU = "_rain_1f1vh_14", gU = "_drop_1f1vh_21", vU = "_content_1f1vh_49", yU = "_code_1f1vh_56", _U = "_digit_1f1vh_63", bU = "_coin_1f1vh_73", xU = "_title_1f1vh_90", AU = "_subtitle_1f1vh_97", SU = "_button_1f1vh_104", aa = { page: mU, rain: pU, drop: gU, content: vU, code: yU, digit: _U, coin: bU, title: xU, subtitle: AU, button: SU }, O1 = [{ letter: "₿", color: "#f7931a" }, { letter: "Ξ", color: "#627eea" }, { letter: "₮", color: "#26a17b" }, { letter: "◎", color: "#9945ff" }, { letter: "$", color: "#2775ca" }, { letter: "₽", color: "#4a6dff" }, { letter: "Ʉ", color: "#00d4ff" }], jU = [{ left: 6, size: 34, delay: 0, duration: 7.5 }, { left: 18, size: 26, delay: 2.1, duration: 9 }, { left: 29, size: 44, delay: 4.3, duration: 6.5 }, { left: 41, size: 22, delay: 1.2, duration: 10 }, { left: 54, size: 38, delay: 3.4, duration: 8 }, { left: 67, size: 28, delay: .6, duration: 9.5 }, { left: 78, size: 48, delay: 2.8, duration: 7 }, { left: 88, size: 24, delay: 5, duration: 8.5 }, { left: 95, size: 32, delay: 1.7, duration: 9.2 }]; function wU() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsxs("main", { className: aa.page, children: [o.jsx("div", { className: aa.rain, "aria-hidden": "true", children: jU.map((a, l) => { const i = O1[l % O1.length]; return o.jsx("span", { className: aa.drop, style: { left: `${a.left}%`, animationDelay: `${a.delay}s`, animationDuration: `${a.duration}s` }, children: o.jsx(kl, { letter: i.letter, color: i.color, size: a.size }) }, l) }) }), o.jsxs("div", { className: aa.content, children: [o.jsxs("div", { className: aa.code, "aria-hidden": "true", children: [o.jsx("span", { className: aa.digit, children: "4" }), o.jsx("span", { className: aa.coin, children: o.jsx(kl, { letter: "₿", color: "#f7931a", size: 140 }) }), o.jsx("span", { className: aa.digit, children: "4" })] }), o.jsx("h1", { className: aa.title, children: "Такой страницы не существует" }), o.jsx("p", { className: aa.subtitle, children: "Похоже, курс этого маршрута обнулился. Проверьте адрес или вернитесь на главную." }), o.jsx(gn, { to: ae.HOME, className: aa.button, children: "На главную" })] })] }), o.jsx(Is, {})] }) } const EU = "_page_uz94v_1", NU = "_main_uz94v_8", CU = "_center_uz94v_13", Jc = { page: EU, main: NU, center: CU }; function L1({ footer: a = !1, center: l = !1 }) { return o.jsxs("div", { className: Jc.page, children: [o.jsx(nm, {}), o.jsx("main", { className: l ? `${Jc.main} ${Jc.center}` : Jc.main, children: o.jsx(mu, {}) }), a && o.jsx(Is, {})] }) } function TU() { const { pathname: a } = Zt(); return A.useEffect(() => { window.scrollTo(0, 0) }, [a]), null } function RU() { const { isAuthenticated: a, isLoading: l } = Lv(), i = Zt(); return l ? o.jsx(zn, { overlay: !0, size: "lg", label: "Загрузка" }) : a ? o.jsx(mu, {}) : o.jsx(Qi, { to: ae.LOGIN, state: { from: i }, replace: !0 }) } function kU() { var d, f; const { isAuthenticated: a, isLoading: l } = Lv(), r = ((f = (d = Zt().state) == null ? void 0 : d.from) == null ? void 0 : f.pathname) ?? ae.WALLET; return l ? o.jsx(zn, { overlay: !0, size: "lg", label: "Загрузка" }) : a ? o.jsx(Qi, { to: r, replace: !0 }) : o.jsx(mu, {}) } function BU() { return o.jsxs(jA, { children: [o.jsx(TU, {}), o.jsxs(eA, { children: [o.jsx(Qe, { path: ae.HOME, element: o.jsx(CN, {}) }), o.jsx(Qe, { path: ae.PUBLICHNAYA_OFERTA, element: o.jsx(nL, {}) }), o.jsx(Qe, { path: ae.POLITIKA_PERSONALNYH_DANNYH, element: o.jsx(sL, {}) }), o.jsx(Qe, { path: ae.POLITIKA_COOKIE, element: o.jsx(iL, {}) }), o.jsx(Qe, { path: ae.SOGLASIE_PERSONALNYH_DANNYH, element: o.jsx(rL, {}) }), o.jsx(Qe, { path: ae.REESTR_PD_RKN, element: o.jsx(uL, {}) }), o.jsx(Qe, { path: ae.REGISTER_TEST, element: o.jsx(R9, {}) }), o.jsxs(Qe, { element: o.jsx(kU, {}), children: [o.jsx(Qe, { path: ae.LOGIN, element: o.jsx(BB, {}) }), o.jsx(Qe, { path: ae.REGISTER, element: o.jsx(r9, {}) }), o.jsx(Qe, { path: ae.RESTORE_PASSWORD, element: o.jsx(LO, {}) })] }), o.jsxs(Qe, { element: o.jsx(RU, {}), children: [o.jsx(Qe, { element: o.jsx(L1, { footer: !0, center: !0 }), children: o.jsx(Qe, { path: ae.CONVERTER, element: o.jsx(Z9, {}) }) }), o.jsxs(Qe, { element: o.jsx(L1, { footer: !0 }), children: [o.jsx(Qe, { path: ae.SWAP, element: o.jsx(C8, {}) }), o.jsx(Qe, { path: ae.BRIDGE, element: o.jsx(ck, {}) }), o.jsx(Qe, { path: ae.STAKING, element: o.jsx(cz, {}) }), o.jsx(Qe, { path: ae.POOLS, element: o.jsx(hU, {}) }), o.jsxs(Qe, { path: ae.PROFILE, element: o.jsx(N6, {}), children: [o.jsx(Qe, { index: !0, element: o.jsx(Qi, { to: "details", replace: !0 }) }), o.jsx(Qe, { path: "details", element: o.jsx(C6, {}) }), o.jsx(Qe, { path: "security", element: o.jsx(T6, {}) }), o.jsx(Qe, { path: "mnemonic", element: o.jsx(Z6, {}) }), o.jsx(Qe, { path: "transactions", element: o.jsx(pB, {}) })] })] }), o.jsx(Qe, { path: ae.TRANSACTIONS, element: o.jsx(Qi, { to: ae.PROFILE_TRANSACTIONS, replace: !0 }) }), o.jsx(Qe, { path: ae.WALLET, element: o.jsx(Wg, {}) }), o.jsx(Qe, { path: ae.WALLET_CHAIN, element: o.jsx(Wg, {}) }), o.jsx(Qe, { path: ae.SEED_PHRASE, element: o.jsx(eO, {}) }), o.jsx(Qe, { path: ae.KYC, element: o.jsx(xO, {}) })] }), o.jsx(Qe, { path: "*", element: o.jsx(wU, {}) })] })] }) } const OU = new Nj({ defaultOptions: { queries: { retry: !1 } } }); function LU({ children: a }) { return o.jsx(Cj, { client: OU, children: a }) } function MU() { return o.jsx(LU, { children: o.jsx(BU, {}) }) } ex.createRoot(document.getElementById("root")).render(o.jsx(A.StrictMode, { children: o.jsx(MU, {}) })); +`, Ck = 1, Tk = 3, Rk = 1, kk = (function (a) { uk(l, a); function l() { var i = a !== null && a.apply(this, arguments) || this; return i.cropperRef = A.createRef(), i.imageRef = A.createRef(), i.videoRef = A.createRef(), i.containerPosition = { x: 0, y: 0 }, i.containerRef = null, i.styleRef = null, i.containerRect = null, i.mediaSize = { width: 0, height: 0, naturalWidth: 0, naturalHeight: 0 }, i.dragStartPosition = { x: 0, y: 0 }, i.dragStartCrop = { x: 0, y: 0 }, i.gestureZoomStart = 0, i.gestureRotationStart = 0, i.isTouching = !1, i.lastPinchDistance = 0, i.lastPinchRotation = 0, i.rafDragTimeout = null, i.rafPinchTimeout = null, i.wheelTimer = null, i.currentDoc = typeof document < "u" ? document : null, i.currentWindow = typeof window < "u" ? window : null, i.resizeObserver = null, i.previousCropSize = null, i.isInitialized = !1, i.state = { cropSize: null, hasWheelJustStarted: !1, mediaObjectFit: void 0 }, i.initResizeObserver = function () { if (!(typeof window.ResizeObserver > "u" || !i.containerRef)) { var r = !0; i.resizeObserver = new window.ResizeObserver(function (d) { if (r) { r = !1; return } i.computeSizes() }), i.resizeObserver.observe(i.containerRef) } }, i.preventZoomSafari = function (r) { return r.preventDefault() }, i.cleanEvents = function () { i.currentDoc && (i.currentDoc.removeEventListener("mousemove", i.onMouseMove), i.currentDoc.removeEventListener("mouseup", i.onDragStopped), i.currentDoc.removeEventListener("touchmove", i.onTouchMove), i.currentDoc.removeEventListener("touchend", i.onDragStopped), i.currentDoc.removeEventListener("gesturechange", i.onGestureChange), i.currentDoc.removeEventListener("gestureend", i.onGestureEnd), i.currentDoc.removeEventListener("scroll", i.onScroll)) }, i.clearScrollEvent = function () { i.containerRef && i.containerRef.removeEventListener("wheel", i.onWheel), i.wheelTimer && clearTimeout(i.wheelTimer) }, i.onMediaLoad = function () { var r = i.computeSizes(); r && (i.previousCropSize = r, i.emitCropData(), i.setInitialCrop(r), i.isInitialized = !0), i.props.onMediaLoaded && i.props.onMediaLoaded(i.mediaSize) }, i.setInitialCrop = function (r) { if (i.props.initialCroppedAreaPercentages) { var d = Sk(i.props.initialCroppedAreaPercentages, i.mediaSize, i.props.rotation, r, i.props.minZoom, i.props.maxZoom), f = d.crop, h = d.zoom; i.props.onCropChange(f), i.props.onZoomChange && i.props.onZoomChange(h) } else if (i.props.initialCroppedAreaPixels) { var g = wk(i.props.initialCroppedAreaPixels, i.mediaSize, i.props.rotation, r, i.props.minZoom, i.props.maxZoom), f = g.crop, h = g.zoom; i.props.onCropChange(f), i.props.onZoomChange && i.props.onZoomChange(h) } }, i.computeSizes = function () { var r, d, f, h, g, m, p = i.imageRef.current || i.videoRef.current; if (p && i.containerRef) { i.containerRect = i.containerRef.getBoundingClientRect(), i.saveContainerPosition(); var y = i.containerRect.width / i.containerRect.height, _ = ((r = i.imageRef.current) === null || r === void 0 ? void 0 : r.naturalWidth) || ((d = i.videoRef.current) === null || d === void 0 ? void 0 : d.videoWidth) || 0, b = ((f = i.imageRef.current) === null || f === void 0 ? void 0 : f.naturalHeight) || ((h = i.videoRef.current) === null || h === void 0 ? void 0 : h.videoHeight) || 0, S = p.offsetWidth < _ || p.offsetHeight < b, j = _ / b, w = void 0; if (S) switch (i.state.mediaObjectFit) { default: case "contain": w = y > j ? { width: i.containerRect.height * j, height: i.containerRect.height } : { width: i.containerRect.width, height: i.containerRect.width / j }; break; case "horizontal-cover": w = { width: i.containerRect.width, height: i.containerRect.width / j }; break; case "vertical-cover": w = { width: i.containerRect.height * j, height: i.containerRect.height }; break } else w = { width: p.offsetWidth, height: p.offsetHeight }; i.mediaSize = Ht(Ht({}, w), { naturalWidth: _, naturalHeight: b }), i.props.setMediaSize && i.props.setMediaSize(i.mediaSize); var E = i.props.cropSize ? i.props.cropSize : yk(i.mediaSize.width, i.mediaSize.height, i.containerRect.width, i.containerRect.height, i.props.aspect, i.props.rotation); return (((g = i.state.cropSize) === null || g === void 0 ? void 0 : g.height) !== E.height || ((m = i.state.cropSize) === null || m === void 0 ? void 0 : m.width) !== E.width) && i.props.onCropSizeChange && i.props.onCropSizeChange(E), i.setState({ cropSize: E }, i.recomputeCropPosition), i.props.setCropSize && i.props.setCropSize(E), E } }, i.saveContainerPosition = function () { if (i.containerRef) { var r = i.containerRef.getBoundingClientRect(); i.containerPosition = { x: r.left, y: r.top } } }, i.onMouseDown = function (r) { i.currentDoc && (r.preventDefault(), i.currentDoc.addEventListener("mousemove", i.onMouseMove), i.currentDoc.addEventListener("mouseup", i.onDragStopped), i.saveContainerPosition(), i.onDragStart(l.getMousePoint(r))) }, i.onMouseMove = function (r) { return i.onDrag(l.getMousePoint(r)) }, i.onScroll = function (r) { i.currentDoc && (r.preventDefault(), i.saveContainerPosition()) }, i.onTouchStart = function (r) { i.currentDoc && (i.isTouching = !0, !(i.props.onTouchRequest && !i.props.onTouchRequest(r)) && (i.currentDoc.addEventListener("touchmove", i.onTouchMove, { passive: !1 }), i.currentDoc.addEventListener("touchend", i.onDragStopped), i.saveContainerPosition(), r.touches.length === 2 ? i.onPinchStart(r) : r.touches.length === 1 && i.onDragStart(l.getTouchPoint(r.touches[0])))) }, i.onTouchMove = function (r) { r.preventDefault(), r.touches.length === 2 ? i.onPinchMove(r) : r.touches.length === 1 && i.onDrag(l.getTouchPoint(r.touches[0])) }, i.onGestureStart = function (r) { i.currentDoc && (r.preventDefault(), i.currentDoc.addEventListener("gesturechange", i.onGestureChange), i.currentDoc.addEventListener("gestureend", i.onGestureEnd), i.gestureZoomStart = i.props.zoom, i.gestureRotationStart = i.props.rotation) }, i.onGestureChange = function (r) { if (r.preventDefault(), !i.isTouching) { var d = l.getMousePoint(r), f = i.gestureZoomStart - 1 + r.scale; if (i.setNewZoom(f, d, { shouldUpdatePosition: !0 }), i.props.onRotationChange) { var h = i.gestureRotationStart + r.rotation; i.props.onRotationChange(h) } } }, i.onGestureEnd = function (r) { i.cleanEvents() }, i.onDragStart = function (r) { var d, f, h = r.x, g = r.y; i.dragStartPosition = { x: h, y: g }, i.dragStartCrop = Ht({}, i.props.crop), (f = (d = i.props).onInteractionStart) === null || f === void 0 || f.call(d) }, i.onDrag = function (r) { var d = r.x, f = r.y; i.currentWindow && (i.rafDragTimeout && i.currentWindow.cancelAnimationFrame(i.rafDragTimeout), i.rafDragTimeout = i.currentWindow.requestAnimationFrame(function () { if (i.state.cropSize && !(d === void 0 || f === void 0)) { var h = d - i.dragStartPosition.x, g = f - i.dragStartPosition.y, m = { x: i.dragStartCrop.x + h, y: i.dragStartCrop.y + g }, p = i.props.restrictPosition ? $o(m, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : m; i.props.onCropChange(p) } })) }, i.onDragStopped = function () { var r, d; i.isTouching = !1, i.cleanEvents(), i.emitCropData(), (d = (r = i.props).onInteractionEnd) === null || d === void 0 || d.call(r) }, i.onWheel = function (r) { if (i.currentWindow && !(i.props.onWheelRequest && !i.props.onWheelRequest(r))) { r.preventDefault(); var d = l.getMousePoint(r), f = vk(r).pixelY, h = i.props.zoom - f * i.props.zoomSpeed / 200; i.setNewZoom(h, d, { shouldUpdatePosition: !0 }), i.state.hasWheelJustStarted || i.setState({ hasWheelJustStarted: !0 }, function () { var g, m; return (m = (g = i.props).onInteractionStart) === null || m === void 0 ? void 0 : m.call(g) }), i.wheelTimer && clearTimeout(i.wheelTimer), i.wheelTimer = i.currentWindow.setTimeout(function () { return i.setState({ hasWheelJustStarted: !1 }, function () { var g, m; return (m = (g = i.props).onInteractionEnd) === null || m === void 0 ? void 0 : m.call(g) }) }, 250) } }, i.getPointOnContainer = function (r, d) { var f = r.x, h = r.y; if (!i.containerRect) throw new Error("The Cropper is not mounted"); return { x: i.containerRect.width / 2 - (f - d.x), y: i.containerRect.height / 2 - (h - d.y) } }, i.getPointOnMedia = function (r) { var d = r.x, f = r.y, h = i.props, g = h.crop, m = h.zoom; return { x: (d + g.x) / m, y: (f + g.y) / m } }, i.setNewZoom = function (r, d, f) { var h = f === void 0 ? {} : f, g = h.shouldUpdatePosition, m = g === void 0 ? !0 : g; if (!(!i.state.cropSize || !i.props.onZoomChange)) { var p = _u(r, i.props.minZoom, i.props.maxZoom); if (m) { var y = i.getPointOnContainer(d, i.containerPosition), _ = i.getPointOnMedia(y), b = { x: _.x * p - y.x, y: _.y * p - y.y }, S = i.props.restrictPosition ? $o(b, i.mediaSize, i.state.cropSize, p, i.props.rotation) : b; i.props.onCropChange(S) } i.props.onZoomChange(p) } }, i.getCropData = function () { if (!i.state.cropSize) return null; var r = i.props.restrictPosition ? $o(i.props.crop, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : i.props.crop; return bk(r, i.mediaSize, i.state.cropSize, i.getAspect(), i.props.zoom, i.props.rotation, i.props.restrictPosition) }, i.emitCropData = function () { var r = i.getCropData(); if (r) { var d = r.croppedAreaPercentages, f = r.croppedAreaPixels; i.props.onCropComplete && i.props.onCropComplete(d, f), i.props.onCropAreaChange && i.props.onCropAreaChange(d, f) } }, i.emitCropAreaChange = function () { var r = i.getCropData(); if (r) { var d = r.croppedAreaPercentages, f = r.croppedAreaPixels; i.props.onCropAreaChange && i.props.onCropAreaChange(d, f) } }, i.recomputeCropPosition = function () { var r, d; if (i.state.cropSize) { var f = i.props.crop; if (i.isInitialized && (!((r = i.previousCropSize) === null || r === void 0) && r.width) && (!((d = i.previousCropSize) === null || d === void 0) && d.height)) { var h = Math.abs(i.previousCropSize.width - i.state.cropSize.width) > 1e-6 || Math.abs(i.previousCropSize.height - i.state.cropSize.height) > 1e-6; if (h) { var g = i.state.cropSize.width / i.previousCropSize.width, m = i.state.cropSize.height / i.previousCropSize.height; f = { x: i.props.crop.x * g, y: i.props.crop.y * m } } } var p = i.props.restrictPosition ? $o(f, i.mediaSize, i.state.cropSize, i.props.zoom, i.props.rotation) : f; i.previousCropSize = i.state.cropSize, i.props.onCropChange(p), i.emitCropData() } }, i.onKeyDown = function (r) { var d, f, h = i.props, g = h.crop, m = h.onCropChange, p = h.keyboardStep, y = h.zoom, _ = h.rotation, b = p; if (i.state.cropSize) { r.shiftKey && (b *= .2); var S = Ht({}, g); switch (r.key) { case "ArrowUp": S.y -= b, r.preventDefault(); break; case "ArrowDown": S.y += b, r.preventDefault(); break; case "ArrowLeft": S.x -= b, r.preventDefault(); break; case "ArrowRight": S.x += b, r.preventDefault(); break; default: return }i.props.restrictPosition && (S = $o(S, i.mediaSize, i.state.cropSize, y, _)), r.repeat || (f = (d = i.props).onInteractionStart) === null || f === void 0 || f.call(d), m(S) } }, i.onKeyUp = function (r) { var d, f; switch (r.key) { case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight": r.preventDefault(); break; default: return }i.emitCropData(), (f = (d = i.props).onInteractionEnd) === null || f === void 0 || f.call(d) }, i } return l.prototype.componentDidMount = function () { !this.currentDoc || !this.currentWindow || (this.containerRef && (this.containerRef.ownerDocument && (this.currentDoc = this.containerRef.ownerDocument), this.currentDoc.defaultView && (this.currentWindow = this.currentDoc.defaultView), this.initResizeObserver(), typeof window.ResizeObserver > "u" && this.currentWindow.addEventListener("resize", this.computeSizes), this.props.zoomWithScroll && this.containerRef.addEventListener("wheel", this.onWheel, { passive: !1 }), this.containerRef.addEventListener("gesturestart", this.onGestureStart)), this.currentDoc.addEventListener("scroll", this.onScroll), this.props.disableAutomaticStylesInjection || (this.styleRef = this.currentDoc.createElement("style"), this.styleRef.setAttribute("type", "text/css"), this.props.nonce && this.styleRef.setAttribute("nonce", this.props.nonce), this.styleRef.innerHTML = Nk, this.currentDoc.head.appendChild(this.styleRef)), this.imageRef.current && this.imageRef.current.complete && this.onMediaLoad(), this.props.setImageRef && this.props.setImageRef(this.imageRef), this.props.setVideoRef && this.props.setVideoRef(this.videoRef), this.props.setCropperRef && this.props.setCropperRef(this.cropperRef)) }, l.prototype.componentWillUnmount = function () { var i, r; !this.currentDoc || !this.currentWindow || (typeof window.ResizeObserver > "u" && this.currentWindow.removeEventListener("resize", this.computeSizes), (i = this.resizeObserver) === null || i === void 0 || i.disconnect(), this.containerRef && this.containerRef.removeEventListener("gesturestart", this.preventZoomSafari), this.styleRef && ((r = this.styleRef.parentNode) === null || r === void 0 || r.removeChild(this.styleRef)), this.cleanEvents(), this.props.zoomWithScroll && this.clearScrollEvent()) }, l.prototype.componentDidUpdate = function (i) { var r, d, f, h, g, m, p, y, _; i.rotation !== this.props.rotation ? (this.computeSizes(), this.recomputeCropPosition()) : i.aspect !== this.props.aspect ? this.computeSizes() : i.objectFit !== this.props.objectFit ? this.computeSizes() : i.zoom !== this.props.zoom ? this.recomputeCropPosition() : ((r = i.cropSize) === null || r === void 0 ? void 0 : r.height) !== ((d = this.props.cropSize) === null || d === void 0 ? void 0 : d.height) || ((f = i.cropSize) === null || f === void 0 ? void 0 : f.width) !== ((h = this.props.cropSize) === null || h === void 0 ? void 0 : h.width) ? this.computeSizes() : (((g = i.crop) === null || g === void 0 ? void 0 : g.x) !== ((m = this.props.crop) === null || m === void 0 ? void 0 : m.x) || ((p = i.crop) === null || p === void 0 ? void 0 : p.y) !== ((y = this.props.crop) === null || y === void 0 ? void 0 : y.y)) && this.emitCropAreaChange(), i.zoomWithScroll !== this.props.zoomWithScroll && this.containerRef && (this.props.zoomWithScroll ? this.containerRef.addEventListener("wheel", this.onWheel, { passive: !1 }) : this.clearScrollEvent()), i.video !== this.props.video && ((_ = this.videoRef.current) === null || _ === void 0 || _.load()); var b = this.getObjectFit(); b !== this.state.mediaObjectFit && this.setState({ mediaObjectFit: b }, this.computeSizes) }, l.prototype.getAspect = function () { var i = this.props, r = i.cropSize, d = i.aspect; return r ? r.width / r.height : d }, l.prototype.getObjectFit = function () { var i, r, d, f; if (this.props.objectFit === "cover") { var h = this.imageRef.current || this.videoRef.current; if (h && this.containerRef) { this.containerRect = this.containerRef.getBoundingClientRect(); var g = this.containerRect.width / this.containerRect.height, m = ((i = this.imageRef.current) === null || i === void 0 ? void 0 : i.naturalWidth) || ((r = this.videoRef.current) === null || r === void 0 ? void 0 : r.videoWidth) || 0, p = ((d = this.imageRef.current) === null || d === void 0 ? void 0 : d.naturalHeight) || ((f = this.videoRef.current) === null || f === void 0 ? void 0 : f.videoHeight) || 0, y = m / p; return y < g ? "horizontal-cover" : "vertical-cover" } return "horizontal-cover" } return this.props.objectFit }, l.prototype.onPinchStart = function (i) { var r = l.getTouchPoint(i.touches[0]), d = l.getTouchPoint(i.touches[1]); this.lastPinchDistance = d1(r, d), this.lastPinchRotation = f1(r, d), this.onDragStart(h1(r, d)) }, l.prototype.onPinchMove = function (i) { var r = this; if (!(!this.currentDoc || !this.currentWindow)) { var d = l.getTouchPoint(i.touches[0]), f = l.getTouchPoint(i.touches[1]), h = h1(d, f); this.onDrag(h), this.rafPinchTimeout && this.currentWindow.cancelAnimationFrame(this.rafPinchTimeout), this.rafPinchTimeout = this.currentWindow.requestAnimationFrame(function () { var g = d1(d, f), m = r.props.zoom * (g / r.lastPinchDistance); r.setNewZoom(m, h, { shouldUpdatePosition: !1 }), r.lastPinchDistance = g; var p = f1(d, f), y = r.props.rotation + (p - r.lastPinchRotation); r.props.onRotationChange && r.props.onRotationChange(y), r.lastPinchRotation = p }) } }, l.prototype.render = function () { var i = this, r, d = this.props, f = d.image, h = d.video, g = d.mediaProps, m = d.cropperProps, p = d.transform, y = d.crop, _ = y.x, b = y.y, S = d.rotation, j = d.zoom, w = d.cropShape, E = d.showGrid, R = d.roundCropAreaPixels, L = d.style, B = L.containerStyle, P = L.cropAreaStyle, G = L.mediaStyle, V = d.classes, D = V.containerClassName, K = V.cropAreaClassName, ee = V.mediaClassName, re = (r = this.state.mediaObjectFit) !== null && r !== void 0 ? r : this.getObjectFit(); return A.createElement("div", { onMouseDown: this.onMouseDown, onTouchStart: this.onTouchStart, ref: function (ie) { return i.containerRef = ie }, "data-testid": "container", style: B, className: Yc("reactEasyCrop_Container", D) }, f ? A.createElement("img", Ht({ alt: "", className: Yc("reactEasyCrop_Image", re === "contain" && "reactEasyCrop_Contain", re === "horizontal-cover" && "reactEasyCrop_Cover_Horizontal", re === "vertical-cover" && "reactEasyCrop_Cover_Vertical", ee) }, g, { src: f, ref: this.imageRef, style: Ht(Ht({}, G), { transform: p || "translate(".concat(_, "px, ").concat(b, "px) rotate(").concat(S, "deg) scale(").concat(j, ")") }), onLoad: this.onMediaLoad })) : h && A.createElement("video", Ht({ autoPlay: !0, playsInline: !0, loop: !0, muted: !0, className: Yc("reactEasyCrop_Video", re === "contain" && "reactEasyCrop_Contain", re === "horizontal-cover" && "reactEasyCrop_Cover_Horizontal", re === "vertical-cover" && "reactEasyCrop_Cover_Vertical", ee) }, g, { ref: this.videoRef, onLoadedMetadata: this.onMediaLoad, style: Ht(Ht({}, G), { transform: p || "translate(".concat(_, "px, ").concat(b, "px) rotate(").concat(S, "deg) scale(").concat(j, ")") }), controls: !1 }), (Array.isArray(h) ? h : [{ src: h }]).map(function (ce) { return A.createElement("source", Ht({ key: ce.src }, ce)) })), this.state.cropSize && A.createElement("div", Ht({ ref: this.cropperRef, style: Ht(Ht({}, P), { width: R ? Math.round(this.state.cropSize.width) : this.state.cropSize.width, height: R ? Math.round(this.state.cropSize.height) : this.state.cropSize.height }), tabIndex: 0, onKeyDown: this.onKeyDown, onKeyUp: this.onKeyUp, "data-testid": "cropper", className: Yc("reactEasyCrop_CropArea", w === "round" && "reactEasyCrop_CropAreaRound", E && "reactEasyCrop_CropAreaGrid", K) }, m))) }, l.defaultProps = { zoom: 1, rotation: 0, aspect: 4 / 3, maxZoom: Tk, minZoom: Ck, cropShape: "rect", objectFit: "contain", showGrid: !0, style: {}, classes: {}, mediaProps: {}, cropperProps: {}, zoomSpeed: 1, restrictPosition: !0, zoomWithScroll: !0, keyboardStep: Rk }, l.getMousePoint = function (i) { return { x: Number(i.clientX), y: Number(i.clientY) } }, l.getTouchPoint = function (i) { return { x: Number(i.clientX), y: Number(i.clientY) } }, l })(A.Component); function Bk(a) { return new Promise((l, i) => { const r = new Image; r.onload = () => l(r), r.onerror = () => i(new Error("Не удалось загрузить изображение")), r.src = a }) } async function Ok(a, l, i = 512) { const r = await Bk(a), d = document.createElement("canvas"); d.width = i, d.height = i; const f = d.getContext("2d"); if (!f) throw new Error("Canvas 2D context недоступен"); return f.drawImage(r, l.x, l.y, l.width, l.height, 0, 0, i, i), new Promise((h, g) => { d.toBlob(m => { m ? h(m) : g(new Error("Пустой Blob после обрезки")) }, "image/jpeg", .9) }) } const Lk = "_backdrop_1cfz6_1", Mk = "_card_1cfz6_12", zk = "_title_1cfz6_25", Dk = "_cropArea_1cfz6_31", Uk = "_controls_1cfz6_40", Hk = "_zoom_1cfz6_52", qk = "_actions_1cfz6_57", Pk = "_error_1cfz6_63", ks = { backdrop: Lk, card: Mk, title: zk, cropArea: Dk, controls: Uk, zoom: Hk, actions: qk, error: Pk }; function Qk({ imageSrc: a, isSaving: l, onCancel: i, onConfirm: r }) { const [d, f] = A.useState({ x: 0, y: 0 }), [h, g] = A.useState(1), [m, p] = A.useState(null), [y, _] = A.useState(null), b = A.useCallback((j, w) => { p(w) }, []); A.useEffect(() => { const j = w => { w.key === "Escape" && !l && i() }; return window.addEventListener("keydown", j), () => window.removeEventListener("keydown", j) }, [i, l]); const S = async () => { if (m) { _(null); try { const j = await Ok(a, m); await r(j) } catch { _("Не удалось обрезать изображение") } } }; return o.jsx("div", { className: ks.backdrop, onClick: l ? void 0 : i, children: o.jsxs("div", { className: ks.card, onClick: j => j.stopPropagation(), children: [o.jsx("h3", { className: ks.title, children: "Выберите область аватара" }), o.jsx("div", { className: ks.cropArea, children: o.jsx(kk, { image: a, crop: d, zoom: h, aspect: 1, cropShape: "round", showGrid: !1, onCropChange: f, onZoomChange: g, onCropComplete: b }) }), o.jsxs("div", { className: ks.controls, children: [o.jsx("label", { htmlFor: "avatar-zoom", children: "Масштаб" }), o.jsx("input", { id: "avatar-zoom", className: ks.zoom, type: "range", min: 1, max: 3, step: .01, value: h, onChange: j => g(Number(j.target.value)) })] }), y && o.jsx("span", { className: ks.error, children: y }), o.jsxs("div", { className: ks.actions, children: [o.jsx(Ln, { variant: "ghost", onClick: i, disabled: l, children: "Отмена" }), o.jsx(Ln, { variant: "primary", onClick: S, disabled: l || !m, children: l ? "Загрузка..." : "Сохранить" })] })] }) }) } const Fk = "_col_nam4n_1", Yk = "_avatar_nam4n_10", Ik = "_avatarImg_nam4n_31", Gk = "_error_nam4n_38", Kk = "_overlay_nam4n_44", Xk = "_addPhoto_nam4n_69", Si = { col: Fk, avatar: Yk, avatarImg: Ik, error: Gk, overlay: Kk, addPhoto: Xk }; function Vk(a) { return new Promise((l, i) => { const r = new FileReader; r.onload = () => { const d = r.result, f = d.indexOf(","); l(f >= 0 ? d.slice(f + 1) : d) }, r.onerror = () => i(r.error), r.readAsDataURL(a) }) } function Zk() { const { data: a } = yn(), { mutateAsync: l, isPending: i } = PN(), r = A.useRef(null), [d, f] = A.useState(null), [h, g] = A.useState(!1), [m, p] = A.useState(null), y = (a == null ? void 0 : a.avatar_link) ?? null, _ = y && !h; A.useEffect(() => { g(!1) }, [y]), A.useEffect(() => () => { m && URL.revokeObjectURL(m) }, [m]); const b = () => { var E; i || (E = r.current) == null || E.click() }, S = E => { var L; const R = (L = E.target.files) == null ? void 0 : L[0]; E.target.value = "", R && (f(null), p(URL.createObjectURL(R))) }, j = () => { m && URL.revokeObjectURL(m), p(null) }, w = async E => { try { const R = await Vk(E); await l({ photo_base64: R, decoded_bytes: String(E.size) }), j() } catch { f("Не удалось загрузить фото"), j() } }; return o.jsxs("div", { className: Si.col, children: [o.jsxs("div", { className: Si.avatar, onClick: b, children: [_ ? o.jsx("img", { src: y, alt: "avatar", className: Si.avatarImg, referrerPolicy: "no-referrer", onError: () => { console.warn("[avatar] failed to load", y), g(!0) } }) : o.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("circle", { cx: "12", cy: "8", r: "4" }), o.jsx("path", { d: "M4 20c0-4 4-7 8-7s8 3 8 7" })] }), o.jsx("div", { className: Si.overlay, children: o.jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "#fff", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("path", { d: "M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z" }), o.jsx("circle", { cx: "12", cy: "13", r: "4" })] }) })] }), o.jsx("input", { ref: r, type: "file", accept: "image/*", onChange: S, hidden: !0 }), o.jsx("div", { className: Si.addPhoto, children: o.jsx(Ln, { variant: "ghost", onClick: b, disabled: i, children: i ? "ЗАГРУЗКА..." : "ДОБАВИТЬ ФОТО" }) }), d && o.jsx("span", { className: Si.error, children: d }), m && o.jsx(Qk, { imageSrc: m, isSaving: i, onCancel: j, onConfirm: w })] }) } const Wk = "_card_17od5_1", Jk = "_title_17od5_8", $k = "_actions_17od5_17", lh = { card: Wk, title: Jk, actions: $k }; function Tl({ title: a, children: l, actions: i }) { return o.jsxs("div", { className: lh.card, children: [o.jsx("div", { className: lh.title, children: a }), l, i && o.jsx("div", { className: lh.actions, children: i })] }) } function e6(a) { return a == null ? "$—" : `$${a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } const t6 = "_profileTop_1107i_2", n6 = "_userInfo_1107i_6", a6 = "_userName_1107i_26", s6 = "_userBalance_1107i_33", Ic = { profileTop: t6, userInfo: n6, userName: a6, userBalance: s6 }; function l6() { const { data: a } = yn(), { data: l } = yu(), i = a ? qN(a) : ""; return o.jsxs("div", { className: Ic.profileTop, children: [o.jsx(Zk, {}), o.jsxs("div", { className: Ic.userInfo, children: [o.jsx("span", { className: Ic.userName, children: i }), o.jsx("span", { className: Ic.userBalance, children: e6(l == null ? void 0 : l.totalUsd) })] })] }) } const i6 = "_menu_nxjwi_1", o6 = "_summary_nxjwi_7", r6 = "_nav_nxjwi_11", c6 = "_item_nxjwi_17", u6 = "_itemActive_nxjwi_35", d6 = "_select_nxjwi_42", pl = { menu: i6, summary: o6, nav: r6, item: c6, itemActive: u6, select: d6 }, au = [{ to: ae.PROFILE_DETAILS, label: "Данные профиля" }, { to: ae.PROFILE_SECURITY, label: "Безопасность" }, { to: ae.PROFILE_TRANSACTIONS, label: "Транзакции" }, { to: ae.PROFILE_MNEMONIC, label: "Мнемоническая фраза" }], f6 = au.map(({ to: a, label: l }) => ({ value: a, label: l })); function h6() { var r; const a = vn(), { pathname: l } = Zt(), i = ((r = au.find(d => l.startsWith(d.to))) == null ? void 0 : r.to) ?? au[0].to; return o.jsxs("aside", { className: pl.menu, children: [o.jsx("div", { className: pl.summary, children: o.jsx(l6, {}) }), o.jsx("div", { className: pl.select, children: o.jsx(Gh, { value: i, options: f6, onChange: d => a(d), label: "Раздел профиля" }) }), o.jsx("nav", { className: pl.nav, children: au.map(({ to: d, label: f }) => o.jsx(Fi, { to: d, className: ({ isActive: h }) => h ? `${pl.item} ${pl.itemActive}` : pl.item, children: f }, d)) })] }) } function m6(a) { const l = QN(), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(null); A.useEffect(() => { a != null && (r(a), f(a)) }, [a]); function m(y) { r(y.replace(/[^\d+\s()-]/g, "")) } function p() { const y = i.trim(); y === d || l.isPending || l.mutate(y, { onSuccess: () => { f(y), g({ status: "success", message: "Номер телефона обновлён" }) }, onError: () => { g({ status: "error", message: "Не удалось обновить номер телефона" }) } }) } return { phone: i, onPhoneChange: m, onPhoneBlur: p, notification: h, dismissNotification: () => g(null) } } const p6 = "_grid2_1y7u3_1", g6 = "_grid1_1y7u3_7", Ci = { grid2: p6, grid1: g6 }; function v6({ data: a }) { const l = Ov(a), { phone: i, onPhoneChange: r, onPhoneBlur: d, notification: f, dismissNotification: h } = m6(a.phone); return o.jsxs(o.Fragment, { children: [o.jsx(Tl, { title: "Личные данные", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Полное ФИО", value: l, placeholder: "Например: Иванов Иван Иванович", readOnly: !0 }), o.jsx(ke, { label: "Адрес электронной почты", value: a.email ?? "", type: "email", icon: "check", placeholder: "example@mail.ru", readOnly: !0 }), o.jsx(ke, { label: "Серия и номер паспорта", value: a.passport_data ?? "", placeholder: "0000 000000", readOnly: !0 }), o.jsx(ke, { label: "Номер телефона", value: i, onChange: r, onBlur: d, type: "tel", placeholder: "+7 (999) 000-00-00" })] }) }), o.jsx(Tl, { title: "Верификация", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "ИНН", value: a.inn ?? "", readOnly: !0, icon: "lock", placeholder: "000000000000" }), o.jsx(ke, { label: "ID аккаунта", value: a.id ?? "", readOnly: !0, icon: "lock", placeholder: "ECSA-00000000" })] }) }), f && o.jsx($a, { status: f.status, message: f.message, onClose: h, duration: 5e3 })] }) } function y6({ data: a }) { const l = a.legal_entity; return l ? o.jsxs(o.Fragment, { children: [o.jsx(Tl, { title: "Данные организации", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Наименование", value: l.name ?? "", placeholder: "ООО «Ромашка»", readOnly: !0 }), o.jsx(ke, { label: "Краткое наименование", value: l.short_name ?? "", placeholder: "Ромашка", readOnly: !0 }), o.jsx(ke, { label: "ИНН", value: l.inn ?? "", readOnly: !0, icon: "lock", placeholder: "000000000000" }), o.jsx(ke, { label: "ОГРН", value: l.ogrn ?? "", placeholder: "1027700132195", readOnly: !0 }), o.jsx(ke, { label: "КПП", value: l.kpp ?? "", placeholder: "770801001", readOnly: !0 }), o.jsx(ke, { label: "Адрес электронной почты", value: a.email ?? "", type: "email", icon: "check", placeholder: "org@mail.ru", readOnly: !0 })] }) }), o.jsx(Tl, { title: "Адреса", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Юридический адрес", value: l.legal_address ?? "", placeholder: "г. Москва, ул. Тверская, д. 1", readOnly: !0 }), o.jsx(ke, { label: "Фактический адрес", value: l.actual_address ?? "", placeholder: "г. Москва, ул. Тверская, д. 1", readOnly: !0 })] }) }), o.jsx(Tl, { title: "Контакты и верификация", children: o.jsxs("div", { className: Ci.grid2, children: [o.jsx(ke, { label: "Контактное лицо", value: l.contact_person ?? "", placeholder: "Иванов Иван Иванович", readOnly: !0 }), o.jsx(ke, { label: "Контактный телефон", value: l.contact_phone ?? "", type: "tel", placeholder: "+7 (999) 000-00-00", readOnly: !0 }), o.jsx(ke, { label: "Статус", value: l.status ?? "", placeholder: "active", readOnly: !0 }), o.jsx(ke, { label: "ID аккаунта", value: a.id ?? "", readOnly: !0, icon: "lock", placeholder: "ECSA-00000000" })] }) })] }) : null } function _6() { const { data: a } = yn(); return a ? Bv(a) ? o.jsx(y6, { data: a }) : o.jsx(v6, { data: a }) : null } function b6() { const { data: a } = vu(); return o.jsx(Tl, { title: "Безопасность", children: o.jsx("div", { className: Ci.grid1, children: a == null ? void 0 : a.map(({ chain: l, address: i }) => o.jsx(ke, { label: `Адрес ${l}`, readOnly: !0, icon: "lock", value: i, placeholder: "—" }, l)) }) }) } const x6 = "_kycBanner_2th6o_1", A6 = { kycBanner: x6 }; function S6() { const { data: a } = yn(); return !a || a.kyc_verified ? null : o.jsx("div", { className: A6.kycBanner, children: "Для полного доступа к платформе необходимо пройти верификацию личности (KYC)" }) } const j6 = "_page_wlsc9_1", w6 = "_menu_wlsc9_12", E6 = "_content_wlsc9_16", ih = { page: j6, menu: w6, content: E6 }; function N6() { return o.jsxs("div", { className: ih.page, children: [o.jsx("div", { className: ih.menu, children: o.jsx(h6, {}) }), o.jsxs("main", { className: ih.content, children: [o.jsx(S6, {}), o.jsx(mu, {})] })] }) } function C6() { const { isLoading: a } = yn(); return a ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : o.jsx(_6, {}) } function T6() { const { isLoading: a } = yn(); return a ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : o.jsx(b6, {}) } const m1 = 52; function R6(a) { const [l, i] = A.useState(!1), [r, d] = A.useState(m1), [f, h] = A.useState(!1), g = A.useRef(null), m = A.useCallback(() => { g.current && clearInterval(g.current), d(m1), g.current = setInterval(() => { d(_ => _ <= 1 ? (clearInterval(g.current), i(!0), 0) : _ - 1) }, 1e3) }, []); A.useEffect(() => (m(), () => { g.current && clearInterval(g.current) }), [m]); const p = A.useCallback(() => { i(_ => _ ? (m(), !1) : (g.current && clearInterval(g.current), !0)) }, [m]), y = A.useCallback(() => { navigator.clipboard.writeText(a.join(" ")).then(() => { h(!0), setTimeout(() => h(!1), 1500) }) }, [a]); return { hidden: l, countdown: r, copied: f, handleHide: p, handleCopy: y } } const k6 = "_content_o6p8v_1", B6 = "_titleRow_o6p8v_6", O6 = "_title_o6p8v_6", L6 = "_titleButtons_o6p8v_19", M6 = "_btnFixed_o6p8v_26", z6 = "_subtitle_o6p8v_34", D6 = "_countdown_o6p8v_42", U6 = "_seedGrid_o6p8v_47", H6 = "_seedCard_o6p8v_54", q6 = "_seedNum_o6p8v_73", P6 = "_seedWord_o6p8v_80", Q6 = "_seedWordHidden_o6p8v_88", F6 = "_warning_o6p8v_93", Y6 = "_warningIcon_o6p8v_101", I6 = "_warningText_o6p8v_107", G6 = "_profileLinkRow_o6p8v_115", K6 = "_profileLink_o6p8v_115", zt = { content: k6, titleRow: B6, title: O6, titleButtons: L6, btnFixed: M6, subtitle: z6, countdown: D6, seedGrid: U6, seedCard: H6, seedNum: q6, seedWord: P6, seedWordHidden: Q6, warning: F6, warningIcon: Y6, warningText: I6, profileLinkRow: G6, profileLink: K6 }; function vy({ words: a, showProfileLink: l = !0 }) { const { hidden: i, countdown: r, copied: d, handleHide: f, handleCopy: h } = R6(a); return o.jsxs("div", { className: zt.content, children: [o.jsxs("div", { className: zt.titleRow, children: [o.jsx("h1", { className: zt.title, children: "СИД ФРАЗА" }), o.jsxs("div", { className: zt.titleButtons, children: [o.jsx("div", { className: zt.btnFixed, children: o.jsx(Ln, { variant: "outline", onClick: f, children: i ? "ПОКАЗАТЬ" : "СКРЫТЬ" }) }), o.jsx("div", { className: zt.btnFixed, children: o.jsx(Ln, { variant: "outline", onClick: h, children: d ? "СКОПИРОВАНО" : "КОПИРОВАТЬ" }) })] })] }), !i && o.jsxs("div", { className: zt.subtitle, children: ["АВТОМАТИЧЕСКОЕ СКРЫТИЕ ЧЕРЕЗ", " ", o.jsx("span", { className: zt.countdown, children: r }), "С"] }), o.jsx("div", { className: zt.seedGrid, children: a.map((g, m) => o.jsxs("div", { className: zt.seedCard, children: [o.jsxs("span", { className: zt.seedNum, children: [m + 1, "."] }), o.jsx("span", { className: `${zt.seedWord} ${i ? zt.seedWordHidden : ""}`, children: i ? "•••••" : g })] }, m)) }), o.jsxs("div", { className: zt.warning, children: [o.jsx("span", { className: zt.warningIcon, children: "⚠️" }), o.jsx("p", { className: zt.warningText, children: "Никогда не передавайте сид-фразу третьим лицам. Тот, кто знает фразу — владеет кошельком." })] }), l && o.jsx("div", { className: zt.profileLinkRow, children: o.jsx(gn, { to: ae.PROFILE, className: zt.profileLink, children: "Перейти в профиль" }) })] }) } const X6 = "_hint_1wz0k_1", V6 = { hint: X6 }; function Z6() { const [a, l] = A.useState(!1), { data: i, isLoading: r } = qv(a); if (!a) return o.jsx(Tl, { title: "Мнемоническая фраза", actions: o.jsx(Ln, { variant: "danger", onClick: () => l(!0), children: "Показать мнемонику" }), children: o.jsx("p", { className: V6.hint, children: "Сид-фраза из 12 слов для восстановления кошелька. Никогда не передавайте её третьим лицам." }) }); if (r) return o.jsx(zn, { fullscreen: !0, label: "Загрузка" }); const d = i ? i.split(" ") : []; return o.jsx(vy, { words: d, showProfileLink: !1 }) } function cr(a) { return a ? new Date(a).toLocaleString("ru-RU", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit" }) : "—" } function W6(a) { return a ? a.length <= 16 ? a : `${a.slice(0, 8)}…${a.slice(-6)}` : "—" } function am(a) { return Number(a).toLocaleString("ru-RU") } const J6 = { pending: "Ожидание", money_accepted: "Деньги получены", web3_processing: "Обработка в сети", web3_hash_error: "Ошибка хэша", web3_balance_problem: "Проблема с балансом", receipt_error: "Ошибка чека", completed: "Завершён", usdt_delivered: "USDT отправлен" }, $6 = "_badge_1d3cq_1", e7 = "_status_pending_1d3cq_10", t7 = "_status_completed_1d3cq_15", n7 = "_status_money_accepted_1d3cq_20", a7 = "_status_web3_processing_1d3cq_25", s7 = "_status_web3_hash_error_1d3cq_30", l7 = "_status_web3_balance_problem_1d3cq_35", i7 = "_status_receipt_error_1d3cq_40", o7 = "_status_usdt_delivered_1d3cq_45", p1 = { badge: $6, status_pending: e7, status_completed: t7, status_money_accepted: n7, status_web3_processing: a7, status_web3_hash_error: s7, status_web3_balance_problem: l7, status_receipt_error: i7, status_usdt_delivered: o7 }; function yy({ status: a }) { return o.jsx("span", { className: `${p1.badge} ${p1[`status_${a}`] ?? ""}`, children: J6[a] ?? a }) } const r7 = { created: "Создан", waiting_usdt: "Ожидание USDT", usdt_underpaid: "USDT недоплачен", usdt_received: "USDT получен", wallet_error: "Ошибка кошелька", payout_processing: "Выплата в обработке", payout_completed: "Выплата завершена", payout_failed: "Выплата не прошла", cancelled: "Отменён", expired: "Истёк" }, c7 = "_badge_lkcaw_1", u7 = "_status_usdt_received_lkcaw_11", d7 = "_status_payout_completed_lkcaw_12", f7 = "_status_created_lkcaw_18", h7 = "_status_waiting_usdt_lkcaw_23", m7 = "_status_payout_processing_lkcaw_24", p7 = "_status_usdt_underpaid_lkcaw_30", g7 = "_status_wallet_error_lkcaw_31", v7 = "_status_payout_failed_lkcaw_32", y7 = "_status_expired_lkcaw_33", _7 = "_status_cancelled_lkcaw_39", g1 = { badge: c7, status_usdt_received: u7, status_payout_completed: d7, status_created: f7, status_waiting_usdt: h7, status_payout_processing: m7, status_usdt_underpaid: p7, status_wallet_error: g7, status_payout_failed: v7, status_expired: y7, status_cancelled: _7 }; function _y({ status: a }) { return o.jsx("span", { className: `${g1.badge} ${g1[`status_${a}`] ?? ""}`, children: r7[a] ?? a }) } const b7 = "_button_1q7wx_1", x7 = { button: b7 }; function A7({ value: a }) { const [l, i] = A.useState(!1); function r() { navigator.clipboard.writeText(a).then(() => { i(!0), setTimeout(() => i(!1), 1500) }) } return o.jsx("button", { className: x7.button, onClick: r, type: "button", title: "Скопировать", children: l ? o.jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: o.jsx("polyline", { points: "20 6 9 17 4 12" }) }) : o.jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), o.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }) }) } const S7 = "_item_3k64v_1", j7 = "_summary_3k64v_8", w7 = "_summaryLeft_3k64v_25", E7 = "_opType_3k64v_34", N7 = "_summaryDate_3k64v_46", C7 = "_summaryRight_3k64v_53", T7 = "_amount_3k64v_60", R7 = "_totalAmount_3k64v_68", k7 = "_chevron_3k64v_76", B7 = "_chevronOpen_3k64v_82", O7 = "_bodyOuter_3k64v_86", L7 = "_bodyOuterOpen_3k64v_92", M7 = "_bodyInner_3k64v_96", z7 = "_body_3k64v_86", D7 = "_col_3k64v_108", U7 = "_colTitle_3k64v_113", H7 = "_infoRow_3k64v_122", q7 = "_infoRowTotal_3k64v_135", P7 = "_infoLabel_3k64v_140", Q7 = "_infoValue_3k64v_141", F7 = "_infoValueRow_3k64v_160", Y7 = "_infoLink_3k64v_166", xe = { item: S7, summary: j7, summaryLeft: w7, opType: E7, summaryDate: N7, summaryRight: C7, amount: T7, totalAmount: R7, chevron: k7, chevronOpen: B7, bodyOuter: O7, bodyOuterOpen: L7, bodyInner: M7, body: z7, col: D7, colTitle: U7, infoRow: H7, infoRowTotal: q7, infoLabel: P7, infoValue: Q7, infoValueRow: F7, infoLink: Y7 }; function I7({ op: a }) { const [l, i] = A.useState(!1); return (a.type === "withdrawal" || !a.payment) && !!a.withdrawal && a.withdrawal ? o.jsx(v1, { isOpen: l, onToggle: () => i(d => !d), summary: X7(a.withdrawal), children: V7(a.withdrawal) }) : a.payment ? o.jsx(v1, { isOpen: l, onToggle: () => i(d => !d), summary: G7(a.payment), children: K7(a.payment) }) : null } function v1({ isOpen: a, onToggle: l, summary: i, children: r }) { return o.jsxs("div", { className: xe.item, children: [o.jsxs("button", { className: xe.summary, onClick: l, type: "button", "aria-expanded": a, children: [i, o.jsx("svg", { className: `${xe.chevron} ${a ? xe.chevronOpen : ""}`, width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: o.jsx("polyline", { points: "6 9 12 15 18 9" }) })] }), o.jsx("div", { className: `${xe.bodyOuter} ${a ? xe.bodyOuterOpen : ""}`, children: o.jsx("div", { className: xe.bodyInner, children: o.jsx("div", { className: xe.body, children: r }) }) })] }) } function G7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("span", { className: xe.summaryLeft, children: [o.jsx("span", { className: xe.opType, children: "Платёж" }), o.jsx("span", { className: xe.summaryDate, children: cr(a.created_at) }), a.status && o.jsx(yy, { status: a.status })] }), o.jsx("span", { className: xe.summaryRight, children: a.itpay_paid_amount && o.jsxs("span", { className: xe.totalAmount, children: [am(a.itpay_paid_amount), " ₽"] }) })] }) } function K7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Платёж" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Статус" }), a.status ? o.jsx(yy, { status: a.status }) : o.jsx("span", { className: xe.infoValue, children: "—" })] }), o.jsx(sa, { label: "Оплачено", value: a.itpay_paid_amount || "—" }), o.jsx(sa, { label: "Истекает", value: cr(a.expired_date ?? "") })] }), o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Транзакция" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Хэш транзакции" }), o.jsxs("span", { className: xe.infoValueRow, children: [o.jsx("span", { className: xe.infoValue, title: a.web3_transaction_hash || void 0, children: W6(a.web3_transaction_hash ?? "") }), a.web3_transaction_hash && o.jsx(A7, { value: a.web3_transaction_hash })] })] }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Чек" }), a.receipt_cloudekassir_link ? o.jsx("a", { href: a.receipt_cloudekassir_link, target: "_blank", rel: "noopener noreferrer", className: xe.infoLink, children: "Открыть →" }) : o.jsx("span", { className: xe.infoValue, children: "—" })] })] })] }) } function X7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("span", { className: xe.summaryLeft, children: [o.jsx("span", { className: xe.opType, children: "Вывод СБП" }), o.jsx("span", { className: xe.summaryDate, children: cr(a.created_at ?? "") }), a.status && o.jsx(_y, { status: a.status })] }), o.jsxs("span", { className: xe.summaryRight, children: [a.usdt_amount && o.jsxs("span", { className: xe.amount, children: [a.usdt_amount, " USDT"] }), a.rub_amount && o.jsxs("span", { className: xe.totalAmount, children: [am(a.rub_amount), " ₽"] })] })] }) } function V7(a) { return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Вывод (СБП)" }), o.jsxs("div", { className: xe.infoRow, children: [o.jsx("span", { className: xe.infoLabel, children: "Статус" }), a.status ? o.jsx(_y, { status: a.status }) : o.jsx("span", { className: xe.infoValue, children: "—" })] }), o.jsx(sa, { label: "Банк", value: a.bank_name || "—" }), o.jsx(sa, { label: "Телефон", value: a.phone || "—" }), o.jsx(sa, { label: "Создан", value: cr(a.payout_created_at ?? a.created_at ?? "") }), o.jsx(sa, { label: "Завершён", value: cr(a.payout_completed_at ?? "") }), a.provider_error && o.jsx(sa, { label: "Ошибка", value: a.provider_error })] }), o.jsxs("div", { className: xe.col, children: [o.jsx("p", { className: xe.colTitle, children: "Суммы" }), o.jsx(sa, { label: "Сумма USDT", value: a.usdt_amount ? `${a.usdt_amount} USDT` : "—" }), o.jsx(sa, { label: "Курс обмена", value: a.usdt_exchange_rate ? `1 USDT = ${a.usdt_exchange_rate} ₽` : "—" }), o.jsx(sa, { label: "Сервисный сбор", value: a.service_fee_usdt ? `${a.service_fee_usdt} USDT` : "—" }), o.jsx(sa, { label: "Сумма к выводу", value: a.rub_amount ? `${am(a.rub_amount)} ₽` : "—", emphasised: !0 })] })] }) } function sa({ label: a, value: l, emphasised: i }) { return o.jsxs("div", { className: `${xe.infoRow} ${i ? xe.infoRowTotal : ""}`, children: [o.jsx("span", { className: xe.infoLabel, children: a }), o.jsx("span", { className: xe.infoValue, children: l })] }) } const Z7 = "_list_gxp0d_1", W7 = "_empty_gxp0d_9", J7 = "_statusError_gxp0d_23", $7 = "_loadMore_gxp0d_30", eB = "_loadMoreBtn_gxp0d_38", er = { list: Z7, empty: W7, statusError: J7, loadMore: $7, loadMoreBtn: eB }; function tB() { const { data: a, isLoading: l, isError: i, fetchNextPage: r, hasNextPage: d, isFetchingNextPage: f } = Jj(), h = (a == null ? void 0 : a.pages.flatMap(g => g.operations)) ?? []; return l ? o.jsx(zn, { fullscreen: !0, label: "Загрузка" }) : i ? o.jsx("p", { className: er.statusError, children: "Не удалось загрузить операции. Попробуйте обновить страницу." }) : h.length === 0 ? o.jsx("p", { className: er.empty, children: "У вас пока нет операций." }) : o.jsxs(o.Fragment, { children: [o.jsx("div", { className: er.list, children: h.map((g, m) => { var p, y; return o.jsx(I7, { op: g }, ((p = g.payment) == null ? void 0 : p.id) ?? ((y = g.withdrawal) == null ? void 0 : y.id) ?? m) }) }), d && o.jsx("div", { className: er.loadMore, children: o.jsx("button", { className: er.loadMoreBtn, onClick: () => r(), disabled: f, type: "button", children: f ? "Загрузка..." : "Загрузить ещё" }) })] }) } const nB = "_status_1yzxr_1", aB = "_statusError_1yzxr_8", sB = "_empty_1yzxr_15", lB = "_tableWrap_1yzxr_22", iB = "_table_1yzxr_22", oB = "_mono_1yzxr_53", rB = "_statusBadge_1yzxr_57", Ya = { status: nB, statusError: aB, empty: sB, tableWrap: lB, table: iB, mono: oB, statusBadge: rB }; function y1(a, l) { return a ? `${a} ${l}` : "—" } function cB(a) { if (!a) return "—"; const l = new Date(a); return Number.isNaN(l.getTime()) ? "—" : l.toLocaleString("ru-RU") } function uB() { const { data: a, isLoading: l, isError: i } = Mv(); return l ? o.jsx("p", { className: Ya.status, children: "Загрузка..." }) : i ? o.jsx("p", { className: Ya.statusError, children: "Не удалось загрузить заявки. Попробуйте обновить страницу." }) : !a || a.items.length === 0 ? o.jsx("p", { className: Ya.empty, children: "У вас пока нет заявок." }) : o.jsx("div", { className: Ya.tableWrap, children: o.jsxs("table", { className: Ya.table, children: [o.jsx("thead", { children: o.jsxs("tr", { children: [o.jsx("th", { children: "USDT" }), o.jsx("th", { children: "Сумма ₽" }), o.jsx("th", { children: "Курс" }), o.jsx("th", { children: "Статус" }), o.jsx("th", { children: "Создана" })] }) }), o.jsx("tbody", { children: a.items.map(r => o.jsxs("tr", { children: [o.jsx("td", { className: Ya.mono, children: y1(r.usdt_amount, "USDT") }), o.jsx("td", { className: Ya.mono, children: y1(r.rub_amount, "₽") }), o.jsx("td", { className: Ya.mono, children: r.exchange_rate ?? "—" }), o.jsx("td", { children: o.jsx("span", { className: Ya.statusBadge, children: r.status }) }), o.jsx("td", { children: cB(r.created_at) })] }, r.id)) })] }) }) } const dB = "_panel_11333_1", fB = "_tabs_11333_6", hB = "_tab_11333_6", Gc = { panel: dB, tabs: fB, tab: hB }; function mB() { const { data: a, isLoading: l } = yn(), [i, r] = A.useState("transactions"); if (l) return o.jsx(zn, { fullscreen: !0, label: "Загрузка" }); const d = !!a && a.account_type !== "individual", f = d ? i : "transactions"; return o.jsxs("div", { className: Gc.panel, children: [d && o.jsxs("div", { className: Gc.tabs, children: [o.jsx("button", { type: "button", className: Gc.tab, "data-active": f === "transactions" || void 0, onClick: () => r("transactions"), children: "Транзакции" }), o.jsx("button", { type: "button", className: Gc.tab, "data-active": f === "requests" || void 0, onClick: () => r("requests"), children: "Заявки" })] }), f === "transactions" ? o.jsx(tB, {}) : o.jsx(uB, {})] }) } function pB() { return o.jsx(mB, {}) } const gB = "_card_1erii_1", vB = "_logo_1erii_10", yB = "_title_1erii_20", _B = "_twoCol_1erii_29", bB = "_leftCol_1erii_36", xB = "_rightCol_1erii_42", AB = "_codeHint_1erii_48", SB = "_error_1erii_55", jB = "_submitWrapper_1erii_62", wB = "_footer_1erii_66", EB = "_forgot_1erii_73", NB = "_divider_1erii_88", Xn = { card: gB, logo: vB, title: yB, twoCol: _B, leftCol: bB, rightCol: xB, codeHint: AB, error: SB, submitWrapper: jB, footer: wB, forgot: EB, divider: NB }; function _1(a) { var i, r; const l = a; return ((r = (i = l == null ? void 0 : l.detail) == null ? void 0 : i[0]) == null ? void 0 : r.msg) ?? "Произошла ошибка" } function CB() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(!1), m = Wt(), p = vn(), y = yt({ mutationFn: kN, onSuccess: () => g(!0) }), _ = yt({ mutationFn: BN, onSuccess: async ({ access_token: w }) => { Jh(), m.clear(), w && Nt.set(w), await m.invalidateQueries({ queryKey: gu }), p(ae.PROFILE) } }), b = () => { a && y.mutate({ email: a }) }, S = w => { w.preventDefault(), _.mutate({ email: a, password: i, code: d }) }, j = (y.isError ? _1(y.error) : null) ?? (_.isError ? _1(_.error) : null); return { email: a, setEmail: l, password: i, setPassword: r, verificationCode: d, setVerificationCode: f, codeSent: h, isLoadingCode: y.isPending, isLoadingSubmit: _.isPending, error: j, handleRequestCode: b, handleSubmit: S } } function TB() { const { email: a, setEmail: l, password: i, setPassword: r, verificationCode: d, setVerificationCode: f, codeSent: h, isLoadingCode: g, isLoadingSubmit: m, error: p, handleRequestCode: y, handleSubmit: _ } = CB(), b = vn(); return o.jsxs("form", { className: Xn.card, onSubmit: _, children: [o.jsx("div", { className: Xn.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: Xn.title, children: "Войти в кошелёк ЭКСА" }), o.jsxs("div", { className: Xn.twoCol, children: [o.jsxs("div", { className: Xn.leftCol, children: [o.jsx(ke, { label: "Адрес электронной почты", type: "email", value: a, onChange: l, placeholder: "example@mail.ru", required: !0 }), o.jsx(ke, { label: "Пароль", type: "password", value: i, onChange: r, placeholder: "••••••••", required: !0 })] }), o.jsxs("div", { className: Xn.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", onClick: y, disabled: h || g, children: g ? "Отправка..." : h ? "Код отправлен" : "Получить код на email" }), o.jsx("span", { className: Xn.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: d, onChange: f, placeholder: "000 000", required: !0 })] })] }), p && o.jsx("p", { className: Xn.error, children: p }), o.jsx("div", { className: Xn.submitWrapper, children: o.jsx(Zn, { label: m ? "Вход..." : "Войти", disabled: m }) }), o.jsxs("div", { className: Xn.footer, children: [o.jsx("a", { className: Xn.forgot, onClick: () => b(ae.RESTORE_PASSWORD), children: "Забыли пароль?" }), o.jsx("div", { className: Xn.divider, children: o.jsx("span", { children: "или" }) }), o.jsx(Ln, { variant: "outline", type: "button", onClick: () => b(ae.REGISTER), children: "Создать новый кошелёк" })] })] }) } const RB = "_page_a6ygb_1", kB = { page: RB }; function BB() { return o.jsx("div", { className: kB.page, children: o.jsx(TB, {}) }) } function b1(a) { var i, r; const l = a; return ((r = (i = l == null ? void 0 : l.detail) == null ? void 0 : i[0]) == null ? void 0 : r.msg) ?? "Произошла ошибка" } function OB() { const a = vn(), l = Wt(), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(""), [m, p] = A.useState(""), [y, _] = A.useState(!1), [b, S] = A.useState(null), j = yt({ mutationFn: TN, onSuccess: () => _(!0) }), w = yt({ mutationFn: RN, onSuccess: async ({ access_token: B }) => { Jh(), l.clear(), B && Nt.set(B), await l.invalidateQueries({ queryKey: gu }), a(ae.WALLET) } }), E = () => { i && j.mutate({ email: i }) }, R = B => { if (B.preventDefault(), d !== h) { S("Пароли не совпадают"); return } S(null), w.mutate({ email: i, password: d, confirm_password: h, code: m }) }, L = b ?? (j.isError ? b1(j.error) : null) ?? (w.isError ? b1(w.error) : null); return { email: i, setEmail: r, password: d, setPassword: f, confirmPassword: h, setConfirmPassword: g, verificationCode: m, setVerificationCode: p, codeSent: y, isLoadingCode: j.isPending, isLoadingSubmit: w.isPending, error: L, handleRequestCode: E, handleSubmit: R } } const LB = "_card_4lgff_1", MB = "_logo_4lgff_10", zB = "_title_4lgff_20", DB = "_typeSelect_4lgff_29", UB = "_back_4lgff_39", HB = "_legalInfo_4lgff_55", qB = "_legalIntro_4lgff_61", PB = "_docsBlock_4lgff_67", QB = "_emailBlock_4lgff_68", FB = "_docsLabel_4lgff_74", YB = "_docsList_4lgff_80", IB = "_emailLink_4lgff_94", GB = "_legalDone_4lgff_105", KB = "_legalDoneTitle_4lgff_113", XB = "_legalDoneText_4lgff_119", VB = "_twoCol_4lgff_125", ZB = "_leftCol_4lgff_132", WB = "_rightCol_4lgff_138", JB = "_codeHint_4lgff_149", $B = "_error_4lgff_156", e9 = "_submitWrapper_4lgff_163", t9 = "_legal_4lgff_55", ct = { card: LB, logo: MB, title: zB, typeSelect: DB, back: UB, legalInfo: HB, legalIntro: qB, docsBlock: PB, emailBlock: QB, docsLabel: FB, docsList: YB, emailLink: IB, legalDone: GB, legalDoneTitle: KB, legalDoneText: XB, twoCol: VB, leftCol: ZB, rightCol: WB, codeHint: JB, error: $B, submitWrapper: e9, legal: t9 }; function n9() { const { email: a, setEmail: l, password: i, setPassword: r, confirmPassword: d, setConfirmPassword: f, verificationCode: h, setVerificationCode: g, codeSent: m, isLoadingCode: p, isLoadingSubmit: y, error: _, handleRequestCode: b, handleSubmit: S } = OB(); return o.jsxs("form", { onSubmit: S, children: [o.jsxs("div", { className: ct.twoCol, children: [o.jsxs("div", { className: ct.leftCol, children: [o.jsx(ke, { label: "Введите адрес электронной почты", type: "email", value: a, onChange: l, placeholder: "example@mail.ru", required: !0 }), o.jsx(ke, { label: "Придумайте пароль", type: "password", value: i, onChange: r, placeholder: "••••••••", required: !0 }), o.jsx(ke, { label: "Повторите пароль", type: "password", value: d, onChange: f, placeholder: "••••••••", required: !0 })] }), o.jsxs("div", { className: ct.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", onClick: b, disabled: m || p, children: p ? "Отправка..." : m ? "Код отправлен" : "Получить проверочный код" }), o.jsx("span", { className: ct.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: h, onChange: g, placeholder: "000 000", required: !0 })] })] }), _ && o.jsx("p", { className: ct.error, children: _ }), o.jsx("div", { className: ct.submitWrapper, children: o.jsx(Zn, { label: y ? "Создание..." : "Создать", disabled: y }) }), o.jsxs("p", { className: ct.legal, children: ["Нажимая «Создать», вы принимаете", o.jsx("br", {}), o.jsx("a", { href: "#", children: "Пользовательское соглашение" }), " и ", o.jsx("a", { href: "#", children: "Политику конфиденциальности" })] })] }) } const x1 = "company@elcsa.ru", a9 = ["Устав организации в действующей редакции", "Решение (протокол) о создании организации и о назначении руководителя", "Выписка по расчётному счёту из банка за последние шесть месяцев", "Выписка из Единого государственного реестра юридических лиц (ЕГРЮЛ)", "Идентификатор электронного документооборота (ЭДО)", "Реквизиты расчётного счёта: номер Р/С, БИК и наименование банка"]; function s9() { const [a, l] = A.useState(!1); return a ? o.jsxs("div", { className: ct.legalDone, children: [o.jsx("h2", { className: ct.legalDoneTitle, children: "Спасибо!" }), o.jsx("p", { className: ct.legalDoneText, children: "Мы получили уведомление об отправке документов. После проверки мы свяжемся с вами по указанному адресу электронной почты." })] }) : o.jsxs("div", { className: ct.legalInfo, children: [o.jsx("p", { className: ct.legalIntro, children: "Для регистрации юридического лица отправьте перечисленные ниже документы на нашу электронную почту. После проверки мы свяжемся с вами для завершения регистрации." }), o.jsxs("div", { className: ct.docsBlock, children: [o.jsx("span", { className: ct.docsLabel, children: "Необходимые документы" }), o.jsx("ul", { className: ct.docsList, children: a9.map(i => o.jsx("li", { children: i }, i)) })] }), o.jsxs("div", { className: ct.emailBlock, children: [o.jsx("span", { className: ct.docsLabel, children: "Адрес для отправки документов" }), o.jsx("a", { href: `mailto:${x1}`, className: ct.emailLink, children: x1 })] }), o.jsx("div", { className: ct.submitWrapper, children: o.jsx(Zn, { label: "Документы отправлены", type: "button", onClick: () => l(!0) }) })] }) } function l9() { const [a, l] = A.useState(null); return o.jsxs("div", { className: ct.card, children: [o.jsx("div", { className: ct.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: ct.title, children: "Создать кошелёк ЭКСА" }), a === null ? o.jsxs("div", { className: ct.typeSelect, children: [o.jsx(Ln, { variant: "primary", onClick: () => l("individual"), children: "Зарегистрироваться как физическое лицо" }), o.jsx(Ln, { variant: "outline", onClick: () => l("legal"), children: "Зарегистрироваться как юридическое лицо" })] }) : o.jsxs(o.Fragment, { children: [o.jsx("button", { type: "button", className: ct.back, onClick: () => l(null), children: "← Назад к выбору" }), a === "individual" ? o.jsx(n9, {}) : o.jsx(s9, {})] })] }) } const i9 = "_page_a6ygb_1", o9 = { page: i9 }; function r9() { return o.jsx("div", { className: o9.page, children: o.jsx(l9, {}) }) } const c9 = "_page_1bkwz_1", u9 = "_card_1bkwz_9", d9 = "_logo_1bkwz_18", f9 = "_title_1bkwz_28", h9 = "_typeSwitch_1bkwz_38", m9 = "_typeOption_1bkwz_49", p9 = "_typeOptionActive_1bkwz_66", g9 = "_twoCol_1bkwz_71", v9 = "_leftCol_1bkwz_78", y9 = "_rightCol_1bkwz_84", _9 = "_codeHint_1bkwz_90", b9 = "_backButton_1bkwz_98", x9 = "_documentsSubtitle_1bkwz_131", A9 = "_documentsList_1bkwz_137", S9 = "_documentItem_1bkwz_146", j9 = "_documentName_1bkwz_157", w9 = "_attachButton_1bkwz_163", E9 = "_fileInput_1bkwz_181", N9 = "_submitWrapper_1bkwz_192", C9 = "_legal_1bkwz_196", et = { page: c9, card: u9, logo: d9, title: f9, typeSwitch: h9, typeOption: m9, typeOptionActive: p9, twoCol: g9, leftCol: v9, rightCol: y9, codeHint: _9, backButton: b9, documentsSubtitle: x9, documentsList: A9, documentItem: S9, documentName: j9, attachButton: w9, fileInput: E9, submitWrapper: N9, legal: C9 }, T9 = ["Свидетельство о государственной регистрации (ОГРН)", "Свидетельство о постановке на учёт в налоговом органе (ИНН)", "Устав организации (действующая редакция)", "Решение/протокол о назначении руководителя", "Документ, подтверждающий полномочия лица, открывающего счёт", "Карточка с образцами подписей и оттиска печати"]; function R9() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(""), [m, p] = A.useState("individual"), [y, _] = A.useState("info"), b = m === "legal", S = w => { w.preventDefault(), _("documents") }, j = w => { w.preventDefault() }; return o.jsx("div", { className: et.page, children: y === "info" ? o.jsxs("form", { className: et.card, onSubmit: S, children: [o.jsx("div", { className: et.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: et.title, children: "Создать кошелёк ЭКСА" }), o.jsxs("div", { className: et.typeSwitch, role: "tablist", "aria-label": "Тип регистрации", children: [o.jsx("button", { type: "button", role: "tab", "aria-selected": !b, className: `${et.typeOption} ${b ? "" : et.typeOptionActive}`, onClick: () => p("individual"), children: "Физическое лицо" }), o.jsx("button", { type: "button", role: "tab", "aria-selected": b, className: `${et.typeOption} ${b ? et.typeOptionActive : ""}`, onClick: () => p("legal"), children: "Юридическое лицо" })] }), o.jsxs("div", { className: et.twoCol, children: [o.jsxs("div", { className: et.leftCol, children: [o.jsx(ke, { label: b ? "Введите корпоративный email" : "Введите адрес электронной почты", type: "email", value: a, onChange: l, placeholder: b ? "name@company.ru" : "example@mail.ru" }), o.jsx(ke, { label: "Придумайте пароль", type: "password", value: i, onChange: r, placeholder: "••••••••" }), o.jsx(ke, { label: "Повторите пароль", type: "password", value: d, onChange: f, placeholder: "••••••••" })] }), o.jsxs("div", { className: et.rightCol, children: [o.jsx(Ln, { variant: "ghost", type: "button", children: "Получить проверочный код" }), o.jsx("span", { className: et.codeHint, children: "Код не пришёл" }), o.jsx(ke, { label: "Ввести код", type: "text", value: h, onChange: g, placeholder: "000 000" })] })] }), o.jsx("div", { className: et.submitWrapper, children: o.jsx(Zn, { label: "Создать" }) }), o.jsxs("p", { className: et.legal, children: ["Нажимая «Создать», вы принимаете", o.jsx("br", {}), o.jsx("a", { href: "#", children: "Пользовательское соглашение" }), " и ", o.jsx("a", { href: "#", children: "Политику конфиденциальности" })] })] }) : o.jsxs("form", { className: et.card, onSubmit: j, children: [o.jsx("div", { className: et.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("button", { type: "button", className: et.backButton, onClick: () => _("info"), children: "← Назад к данным" }), o.jsx("h1", { className: et.title, children: "Прикрепите документы" }), o.jsx("p", { className: et.documentsSubtitle, children: "Для открытия счёта юридическому лицу прикрепите сканы или фотографии следующих документов:" }), o.jsx("ul", { className: et.documentsList, children: T9.map(w => o.jsxs("li", { className: et.documentItem, children: [o.jsx("span", { className: et.documentName, children: w }), o.jsxs("label", { className: et.attachButton, children: ["Прикрепить", o.jsx("input", { type: "file", className: et.fileInput, multiple: !0 })] })] }, w)) }), o.jsx("div", { className: et.submitWrapper, children: o.jsx(Zn, { label: "Создать аккаунт" }) })] }) }) } function k9() { const [a, l] = A.useState(""), [i, r] = A.useState(""), [d, f] = A.useState(""), [h, g] = A.useState(or[0].days), [m, p] = A.useState(null), { mutate: y, isPending: _ } = VN(), { data: b } = Mv(), [S, j] = A.useState(!1); A.useEffect(() => { if (S || !b) return; const D = e4(b.items); if (!D) return; const K = $N(D.comment); K.name && r(K.name), K.contact && f(K.contact), j(!0) }, [S, b]); const w = Number(a.replace(/\D/g, "")) || 0, E = w > 0 && w < Th, { rate: R, commission: L, total: B } = WN(w, h), P = D => { const K = D.replace(/\D/g, ""); l(K ? Qs(Number(K)) : "") }, G = w > 0 && !E && !_; return { amount: a, name: i, contact: d, days: h, setName: r, setContact: f, setDays: g, onAmountChange: P, numAmount: w, belowMin: E, rate: R, commission: L, total: B, onSubmit: D => { if (D.preventDefault(), !G) return; const K = JN({ name: i, contact: d, days: h, amount: w, commission: L, total: B }); y({ rub_amount: w, comment: K }, { onSuccess: () => { p("success"), l(""), r(""), f(""), g(or[0].days) }, onError: () => p("error") }) }, isPending: _, canSubmit: G, notice: m, dismissNotice: () => p(null) } } const B9 = "_wrap_12wuz_1", O9 = "_header_12wuz_12", L9 = "_title_12wuz_16", M9 = "_subtitle_12wuz_21", z9 = "_body_12wuz_29", D9 = "_formCol_12wuz_35", U9 = "_hint_12wuz_41", H9 = "_infoCol_12wuz_48", q9 = "_infoTitle_12wuz_53", P9 = "_infoRow_12wuz_60", Q9 = "_infoLabel_12wuz_76", F9 = "_infoValue_12wuz_81", Y9 = "_note_12wuz_87", I9 = "_submitBtn_12wuz_94", tt = { wrap: B9, header: O9, title: L9, subtitle: M9, body: z9, formCol: D9, hint: U9, infoCol: H9, infoTitle: q9, infoRow: P9, infoLabel: Q9, infoValue: F9, note: Y9, submitBtn: I9 }; function G9() { const { amount: a, name: l, contact: i, days: r, setName: d, setContact: f, setDays: h, onAmountChange: g, numAmount: m, belowMin: p, rate: y, commission: _, total: b, onSubmit: S, isPending: j, canSubmit: w, notice: E, dismissNotice: R } = k9(); return o.jsxs("form", { className: tt.wrap, onSubmit: S, children: [o.jsxs("div", { className: tt.header, children: [o.jsx("h1", { className: tt.title, children: "Оставить заявку" }), o.jsx("p", { className: tt.subtitle, children: "Конвертация крупных объёмов по индивидуальному курсу. Оставьте заявку — менеджер свяжется с вами, подтвердит актуальный курс и сопроводит сделку." })] }), o.jsxs("div", { className: tt.body, children: [o.jsxs("div", { className: tt.formCol, children: [o.jsx(ke, { label: "Объём заявки, ₽", type: "text", value: a, onChange: g, placeholder: "от 500 000" }), p && o.jsxs("p", { className: tt.hint, children: ["Минимальный объём заявки — ", Qs(Th), " ₽"] }), o.jsx(Gh, { id: "term", label: "Срок ожидания операции", value: r, onChange: h, options: or.map(L => ({ value: L.days, label: `${Rh(L.days)} — комиссия ${(L.rate * 100).toFixed(3)} %` })) }), o.jsx(ke, { label: "Как к вам обращаться", type: "text", value: l, onChange: d, placeholder: "Имя" }), o.jsx(ke, { label: "Email или телефон для связи", type: "text", value: i, onChange: f, placeholder: "example@mail.ru / +7 900 000-00-00" })] }), o.jsxs("div", { className: tt.infoCol, children: [o.jsx("div", { className: tt.infoTitle, children: "УСЛОВИЯ" }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Минимальный объём" }), o.jsxs("span", { className: tt.infoValue, children: [Qs(Th), " ₽"] })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Срок ожидания" }), o.jsx("span", { className: tt.infoValue, children: Rh(r) })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Ставка комиссии" }), o.jsxs("span", { className: tt.infoValue, children: [(y * 100).toFixed(3), " %"] })] }), o.jsxs("div", { className: tt.infoRow, children: [o.jsx("span", { className: tt.infoLabel, children: "Сумма комиссии" }), o.jsx("span", { className: tt.infoValue, children: m > 0 ? `≈ ${Qs(_)} ₽` : "—" })] }), o.jsxs("div", { className: tt.infoRow, "data-accent": !0, children: [o.jsx("span", { className: tt.infoLabel, children: "Итого к оплате" }), o.jsx("span", { className: tt.infoValue, children: m > 0 ? `≈ ${Qs(b)} ₽` : "—" })] }), o.jsx("p", { className: tt.note, children: "Итоговая комиссия рассчитывается индивидуально и зависит от объёма, валюты и направления сделки." })] })] }), o.jsx("button", { type: "submit", className: tt.submitBtn, disabled: !w, children: j ? "Отправляем..." : "Оставить заявку" }), E && o.jsx($a, { status: E, message: E === "success" ? "Заявка отправлена" : "Не удалось отправить заявку", onClose: R, duration: 5e3 })] }) } const K9 = "_notice_a6bcd_1", X9 = "_title_a6bcd_11", V9 = "_text_a6bcd_16", oh = { notice: K9, title: X9, text: V9 }; function Z9() { const { data: a, isLoading: l } = yn(); return l ? o.jsx(zn, { fullscreen: !0, size: "lg", label: "Загрузка данных аккаунта" }) : !!a && a.account_type !== "individual" ? o.jsx(G9, {}) : o.jsxs("div", { className: oh.notice, children: [o.jsx("h1", { className: oh.title, children: "Покупка временно недоступна" }), o.jsx("p", { className: oh.text, children: "В настоящий момент покупка валюты невозможна. Мы работаем над восстановлением сервиса — попробуйте, пожалуйста, позже." })] }) } const W9 = "_page_1mk6w_1", J9 = "_main_1mk6w_8", $9 = "_glow_1mk6w_17", rh = { page: W9, main: J9, glow: $9 }; function eO() { const { data: a, isLoading: l } = qv(), i = a ? a.split(" ") : []; return o.jsxs("div", { className: rh.page, children: [o.jsx(nm, {}), o.jsxs("main", { className: rh.main, children: [o.jsx("div", { className: rh.glow }), !l && o.jsx(vy, { words: i })] })] }) } const tO = "https://app.kyc.elcsa.ru"; function nO() { return by(!0) } async function by(a) { const l = await nn(), i = await fetch(`${tO}/kyc/create`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": l }, body: JSON.stringify({}) }); if (i.status === 401 && a) try { return await ca(), by(!1) } catch { throw Nt.clear(), new Error("Unauthorized") } const r = await i.json(); if (!i.ok) throw r; return r } function aO() { const a = yt({ mutationFn: nO }); return { trigger: a.mutate, data: a.data, isLoading: a.isPending, isError: a.isError } } const sO = "_backdrop_1do7s_1", lO = "_modal_1do7s_12", iO = "_closeBtn_1do7s_22", oO = "_body_1do7s_40", rO = "_qrBlock_1do7s_47", cO = "_qrImage_1do7s_55", uO = "_linkBtn_1do7s_63", gl = { backdrop: sO, modal: lO, closeBtn: iO, body: oO, qrBlock: rO, qrImage: cO, linkBtn: uO }; function dO({ data: a, onClose: l }) { return o.jsx("div", { className: gl.backdrop, onClick: l, children: o.jsxs("div", { className: gl.modal, onClick: i => i.stopPropagation(), children: [o.jsx("button", { className: gl.closeBtn, onClick: l, type: "button", children: "×" }), o.jsx("div", { className: gl.body, children: o.jsxs("div", { className: gl.qrBlock, children: [o.jsx("img", { className: gl.qrImage, src: a.qr_code, alt: "QR-код для верификации" }), o.jsx("a", { className: gl.linkBtn, href: a.link, target: "_blank", rel: "noopener noreferrer", children: "Перейти к верификации" })] }) })] }) }) } const fO = "_card_omb8e_1", hO = "_logo_omb8e_13", mO = "_iconWrapper_omb8e_21", pO = "_description_omb8e_34", gO = "_buttonWrapper_omb8e_42", vO = "_error_omb8e_47", ji = { card: fO, logo: hO, iconWrapper: mO, description: pO, buttonWrapper: gO, error: vO }; function yO() { const { trigger: a, data: l, isLoading: i, isError: r } = aO(), d = vn(), f = Wt(), { data: h } = yn({ refetchInterval: l ? 5e3 : !1 }); A.useEffect(() => { h != null && h.kyc_verified && d(ae.SEED_PHRASE, { replace: !0 }) }, [h == null ? void 0 : h.kyc_verified, d]); const g = () => { f.invalidateQueries({ queryKey: ["me"] }) }; return o.jsxs(o.Fragment, { children: [o.jsxs("div", { className: ji.card, children: [o.jsx("div", { className: ji.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("div", { className: ji.iconWrapper, children: o.jsxs("svg", { width: "38", height: "38", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [o.jsx("path", { d: "M12 2L3 6v6c0 5.25 3.75 10.15 9 11.35C17.25 22.15 21 17.25 21 12V6l-9-4z", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), o.jsx("path", { d: "M9 12l2 2 4-4", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] }) }), o.jsx("p", { className: ji.description, children: "Для продолжения работы необходимо пройти KYC верификацию" }), o.jsx("div", { className: ji.buttonWrapper, children: o.jsx(Zn, { label: i ? "Загрузка..." : "Подтвердить личность", type: "button", onClick: () => a(), disabled: i }) }), r && o.jsx("p", { className: ji.error, children: "Произошла ошибка. Попробуй перезагрузить страницу и попробовать снова." })] }), l && o.jsx(dO, { data: l, onClose: g })] }) } const _O = "_page_6lnfw_1", bO = { page: _O }; function xO() { const { data: a, isLoading: l } = yn(); return l ? null : a != null && a.kyc_verified ? o.jsx(Qi, { to: ae.PROFILE, replace: !0 }) : o.jsx("div", { className: bO.page, children: o.jsx(yO, {}) }) } const AO = "_card_mzeuq_1", SO = "_logo_mzeuq_10", jO = "_title_mzeuq_20", wO = "_fields_mzeuq_29", EO = "_emailRow_mzeuq_35", NO = "_error_mzeuq_41", CO = "_submitWrapper_mzeuq_48", TO = "_footer_mzeuq_52", RO = "_back_mzeuq_58", Ia = { card: AO, logo: SO, title: jO, fields: wO, emailRow: EO, error: NO, submitWrapper: CO, footer: TO, back: RO }; function kO() { const [a, l] = A.useState(""), [i, r] = A.useState(!1), [d, f] = A.useState(!1), [h, g] = A.useState(""), [m, p] = A.useState(""), [y, _] = A.useState(""), [b, S] = A.useState(""), [j, w] = A.useState(!1), [E, R] = A.useState(null), L = vn(); async function B() { S(""), f(!0); try { await zN({ email: a }), r(!0), R({ status: "success", message: `Код отправлен на ${a}` }) } catch { R({ status: "error", message: "Не удалось отправить письмо. Проверьте email и попробуйте снова." }) } finally { f(!1) } } async function P(G) { if (G.preventDefault(), S(""), m !== y) { S("Пароли не совпадают"); return } w(!0); try { await UN({ email: a, code: h, new_password: m, confirm_password: y }), L(ae.LOGIN) } catch { S("Не удалось изменить пароль. Проверьте код и попробуйте снова.") } finally { w(!1) } } return o.jsxs(o.Fragment, { children: [o.jsxs("form", { className: Ia.card, onSubmit: P, children: [o.jsx("div", { className: Ia.logo, children: o.jsx("img", { src: xa, alt: "ЭКСА" }) }), o.jsx("h1", { className: Ia.title, children: "Восстановление пароля" }), o.jsxs("div", { className: Ia.fields, children: [o.jsxs("div", { className: Ia.emailRow, children: [o.jsx(ke, { label: "E-Mail", type: "email", value: a, onChange: l, placeholder: "example@mail.com", required: !0 }), o.jsx(Zn, { label: d ? "Отправка..." : "Получить код", disabled: d || !a, type: "button", onClick: B })] }), i && o.jsxs(o.Fragment, { children: [o.jsx(ke, { label: "Код с почты", type: "text", value: h, onChange: g, placeholder: "000 000", required: !0 }), o.jsx(ke, { label: "Новый пароль", type: "password", value: m, onChange: p, placeholder: "••••••••", required: !0 }), o.jsx(ke, { label: "Повторить пароль", type: "password", value: y, onChange: _, placeholder: "••••••••", required: !0 })] })] }), b && o.jsx("p", { className: Ia.error, children: b }), i && o.jsx("div", { className: Ia.submitWrapper, children: o.jsx(Zn, { label: j ? "Сохранение..." : "Изменить пароль", disabled: j }) }), o.jsx("div", { className: Ia.footer, children: o.jsx("a", { className: Ia.back, onClick: () => L(ae.LOGIN), children: "Вернуться ко входу" }) })] }), E && o.jsx($a, { status: E.status, message: E.message, onClose: () => R(null), duration: 5e3 })] }) } const BO = "_page_6lnfw_1", OO = { page: BO }; function LO() { return o.jsx("div", { className: OO.page, children: o.jsx(kO, {}) }) } const MO = "_main_kb81i_4", zO = "_container_kb81i_12", DO = "_title_kb81i_18", UO = "_subtitle_kb81i_26", HO = "_section_kb81i_34", qO = "_sectionTitle_kb81i_38", PO = "_subheading_kb81i_47", QO = "_text_kb81i_55", FO = "_example_kb81i_62", YO = "_warning_kb81i_72", IO = "_emphasis_kb81i_83", GO = "_list_kb81i_87", KO = "_definitions_kb81i_102", XO = "_definition_kb81i_102", VO = "_goals_kb81i_117", ZO = "_goal_kb81i_117", WO = "_infoBox_kb81i_2", JO = "_linkBlock_kb81i_166", $O = "_button_kb81i_174", qt = { main: MO, container: zO, title: DO, subtitle: UO, section: HO, sectionTitle: qO, subheading: PO, text: QO, example: FO, warning: YO, emphasis: IO, list: GO, definitions: KO, definition: XO, goals: VO, goal: ZO, infoBox: WO, linkBlock: JO, button: $O }; function A1(a) { return typeof a == "string" ? a : o.jsxs(o.Fragment, { children: [o.jsx("strong", { children: a.strong }), a.text ? ` ${a.text}` : null] }) } function eL({ block: a }) { switch (a.kind) { case "text": return o.jsx("p", { className: a.variant ? `${qt.text} ${qt[a.variant]}` : qt.text, children: a.text }); case "subheading": return o.jsx("h4", { className: qt.subheading, children: a.text }); case "list": return o.jsx("ul", { className: qt.list, children: a.items.map((l, i) => o.jsx("li", { children: A1(l) }, i)) }); case "definitions": return o.jsx("div", { className: qt.definitions, children: a.items.map((l, i) => o.jsxs("div", { className: qt.definition, children: [o.jsx("strong", { children: l.term }), " ", l.text] }, i)) }); case "goals": return o.jsx("div", { className: qt.goals, children: a.items.map((l, i) => o.jsxs("div", { className: qt.goal, children: [o.jsx("strong", { children: l.title }), o.jsx("ul", { children: l.items.map((r, d) => o.jsx("li", { children: r }, d)) })] }, i)) }); case "infoBox": return o.jsx("div", { className: qt.infoBox, children: a.lines.map((l, i) => o.jsx("p", { children: A1(l) }, i)) }); case "link": return o.jsx("div", { className: qt.linkBlock, children: o.jsx("a", { href: a.href, target: "_blank", rel: "noopener noreferrer", className: qt.button, children: a.text }) }) } } function xr({ doc: a }) { return o.jsx("main", { className: qt.main, children: o.jsxs("div", { className: qt.container, children: [o.jsx("h1", { className: qt.title, children: a.title }), a.subtitle && o.jsx("h2", { className: qt.subtitle, children: a.subtitle }), a.sections.map((l, i) => o.jsxs("section", { className: qt.section, children: [l.title && o.jsx("h3", { className: qt.sectionTitle, children: l.title }), l.blocks.map((r, d) => o.jsx(eL, { block: r }, d))] }, i))] }) }) } const tL = { title: "ПУБЛИЧНЫЙ ДОГОВОР ОФЕРТЫ", subtitle: "ООО ЭКСА", sections: [{ title: "Агентский договор", blocks: [{ kind: "text", text: "Настоящая оферта на заключение агентского договора (далее – Оферта, Договор) является публичным предложением Общества с ограниченной ответственностью «ЭКСА», заключить договор на условиях и в порядке, определенных настоящей Офертой." }, { kind: "text", text: "Акцепт оферты производится в соответствии с пунктом 2 статьи 437 Гражданского кодекса Российской Федерации и равносилен заключению агентского договора в письменной форме." }] }, { title: "Основные понятия и определения действующего договора", blocks: [{ kind: "definitions", items: [{ term: "Агент", text: "– юридическое лицо или индивидуальный предприниматель, зарегистрированный на территории Российской Федерации, в установленном действующим законодательством порядке." }, { term: "Принципал", text: "– сторона агентского договора, по поручению которой агент осуществляет юридические и иные действия от своего имени, но за счет принципала либо от имени и за счет принципала." }, { term: "Агентский договор", text: "– соглашение, по которому агент обязуется за вознаграждение совершать по поручению принципала юридические и иные действия от своего имени, но за счет принципала либо от имени и за счет принципала в соответствии с п. 1 ст. 1005 Гражданского Кодекса Российской Федерации." }, { term: "Личный кабинета Агента", text: "– ресурс, размещенный на сайте Принципала, предназначенный для взаимодействия Агента и Принципала." }, { term: "Отчетный период", text: "– период для взаиморасчетов с Агентом, равный одному календарному кварталу с даты активации любой из услуг, предоставляемой Принципалу." }, { term: "Отчет о сумме начислений (Отчет)", text: "– отчет, формируемый в Личном кабинете Агента на основании данных систем учета Принципала." }, { term: "Оферта (Договор)", text: "– настоящий документ, который отражает предложение и намерение ООО «ЭКСА» считать заключенным договор с лицом, которым будет принято предложение на условиях, изложенных ниже." }] }] }, { title: "1. Акцепт оферты и заключение агентского договора", blocks: [{ kind: "text", text: "Акцепт настоящей Оферты и заключение Агентского договора осуществляется Принципалом в процессе регистрации в Личном кабинете Принципала (на сайте Агента), при прочтении текста настоящей Оферты, путем проставления специальной отметки (галочки) напротив фразы «Я ознакомился с Офертой и принимаю ее условия» и нажатия кнопки «Подписать»." }, { kind: "text", text: "Особый порядок принятия условий Оферты путем проставления специальной отметки (галочки) определяется интерфейсом Личного кабинета Принципала. Принципал не может зарегистрироваться в Личном кабинете и получить к нему доступ без подтверждения принятия условий Оферты." }, { kind: "text", text: "Принимая Оферту, Принципал подтверждает, что прочел и полностью согласен с документами, размещенными на сайте в разделе, предназначенном для Принципала, которые являются неотъемлемой частью настоящей Оферты (Договора) и обязательны для исполнения Сторонами." }] }, { title: "2. Общие положения", blocks: [{ kind: "text", text: "Публикуемые на сайте Агента документы (формы, требования, правила и т.п.), устанавливающие порядок и условия выполнения действий, предусмотренных настоящим Договором, являются неотъемлемой частью настоящего Договора и обязательны для исполнения Сторонами. Принципал обязан использовать формы документов, утвержденных Агентом, и не вправе вносить в них какие-либо изменения или дополнения." }, { kind: "text", text: "Агент обязуется уведомлять Принципала обо всех изменениях в документах, связанных с исполнением настоящего Договора, путем направления электронных сообщений (через Личный кабинет или на электронную почту Принципала) или размещением уведомлений об изменениях на сайте Агентов в разделе, предназначенном для размещения объявлений." }] }, { title: "3. Предмет договора", blocks: [{ kind: "text", text: "По настоящему Договору Принципал поручает, а Агент принимает на себя обязательство совершать от имени и за счет Принципала указанные действия, а Принципал обязуется выплатить Агенту вознаграждение за совершенные действия." }, { kind: "text", text: "По настоящему Договору Агент совершает следующие действия:" }, { kind: "list", items: ["Консультирование Принципала об услугах Агента, включая, помимо прочего, порядок активации и оказания услуг, работу в Личном кабинете Принципала и иные дополнительные услуги, оказываемые Агентом;", "Совершение сделок и иных юридических действий Агентом от своего имени, но за счёт Принципала."] }, { kind: "text", text: "Настоящий Договор действует на территории Российской Федерации и иного иностранного государства." }, { kind: "text", text: "Права и обязанности по сделкам, совершенным Агентом во исполнение настоящего Договора, возникают непосредственно у Принципала." }] }, { title: "4. Права и обязанности сторон", blocks: [{ kind: "text", text: "Агент обязуется совершать действия, составляющие предмет настоящего Договора, в соответствии с законными интересами Принципала, сообщать Принципалу по его требованию все сведения о ходе исполнения настоящего Договора, передавать Принципалу в течение 7 рабочих дней имущество, полученное по сделкам." }, { kind: "text", text: "Агент несет ответственность за сохранность документов и персональных данных, переданных ему Принципалом для исполнения настоящего Договора." }, { kind: "text", text: "Принципал обязан без промедления принять отчет Агента, все предоставленные им документы, обеспечить Агента документами и материалами, необходимыми для выполнения настоящего Договора, возместить Агенту понесенные расходы и выплатить обусловленное Договором агентское вознаграждение." }] }, { title: "5. Агентское вознаграждение и порядок оплаты", blocks: [{ kind: "text", text: "Сумма вознаграждения Агента по настоящему Договору составляет:" }, { kind: "list", items: ["8% от 5 000 до 30 000 рублей", "6% от 30 000 до 100 000 рублей", "4% от 100 000 до 600 000 рублей"] }, { kind: "text", text: "Вознаграждение выплачивается Агенту с момента подписания настоящего Договора об исполнении поручения Агентом от своего имени, но за счет Принципала." }, { kind: "text", text: "Принципал возмещает следующие расходы Агента в сумме не более 30 000 рублей на оплату банковских услуг и иных комиссий." }] }, { title: "6. Ответственность сторон", blocks: [{ kind: "text", text: "В случае нарушения Агентом сроков, установленных Договором для передачи Принципалу полученного имущества, Принципал вправе предъявить требование об уплате неустойки в размере 0,1% от непереданной суммы за каждый день просрочки." }, { kind: "text", text: "В случае нарушения Принципалом сроков уплаты вознаграждения или возмещения расходов, Агент вправе предъявить требование об уплате неустойки в размере 0,1% от не уплаченной в срок суммы за каждый день просрочки." }] }, { title: "7. Форс-мажор", blocks: [{ kind: "text", text: "Стороны освобождаются от ответственности за частичное или полное неисполнение обязательств по настоящему Договору, если это неисполнение явилось следствием возникших после заключения настоящего Договора обстоятельств непреодолимой силы." }, { kind: "text", text: "При наступлении форс-мажорных обстоятельств каждая Сторона должна без промедления известить о них в письменном виде другую Сторону с указанием характера обстоятельств и их влияния на исполнение обязательств." }] }, { title: "8. Конфиденциальность", blocks: [{ kind: "text", text: "Стороны принимают все необходимые меры для того, чтобы их сотрудники, агенты, правопреемники без предварительного согласия другой Стороны не информировали третьих лиц о конфиденциальной информации и персональных данных Сторон настоящего Договора." }] }, { title: "9. Изменение и прекращение договора", blocks: [{ kind: "text", text: "Настоящий договор вступает в силу с момента его подписания и действует до момента исполнения сторонами своих обязательств по настоящему договору." }, { kind: "text", text: "Настоящий Договор может быть изменен или прекращен по письменному соглашению Сторон, а также в других случаях, предусмотренных законодательством Российской Федерации." }, { kind: "text", text: "Принципал вправе в любое время отказаться от исполнения настоящего Договора путем направления письменного уведомления Агенту за 3 рабочих дня." }] }, { title: "10. Заключительные положения", blocks: [{ kind: "text", text: "Ни одна из сторон не вправе передавать свои права и обязанности по настоящему договору третьим лицам без согласия другой стороны." }, { kind: "text", text: "Сообщения Стороны могут направлять по факсу, электронной почте или другим способом связи при условии, что он позволяет достоверно установить, от кого исходило сообщение и кому оно адресовано." }, { kind: "text", text: "Споры, вытекающие из настоящего Договора, разрешаются в досудебном порядке. При неурегулировании возникших разногласий спор разрешается в Арбитражном суде г. Санкт–Петербурга и Ленинградской области с обязательным соблюдением претензионного порядка." }] }, { title: "Реквизиты сторон", blocks: [{ kind: "infoBox", lines: ["Общество с ограниченной ответственностью «ЭКСА»", "196246, г. Санкт-Петербург, Московский р-н, Московское шоссе, д.25к1 литера в, помещ. 3-Н", "ИНН / КПП: 9810001062 / 781001001", "ОГРН: 1257800060990", "ОКПО / ОКАТО / ОКТМО: 68342261 / 40284000000 / 40377000000", "Руководитель: Кленин Михаил Васильевич", "Электронная почта: company@elcsa.ru", 'Наименование банка: ФИЛИАЛ "САНКТ-ПЕТЕРБУРГСКИЙ" АО "АЛЬФА-БАНК"', "Корреспондентский счет: 30101810600000000786", "БИК: 044030786", "Расчетный счет: 40702810632250004861"] }] }] }; function nL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: tL }), o.jsx(Is, {})] }) } const aL = { title: "ПОЛИТИКА ОБРАБОТКИ ПЕРСОНАЛЬНЫХ ДАННЫХ", subtitle: "ООО «ЭКСА»", sections: [{ title: "1. Общие положения", blocks: [{ kind: "text", text: "Настоящая Политика обработки персональных данных разработана в соответствии с Федеральным законом от 27.07.2006 № 152-ФЗ «О персональных данных» и определяет порядок обработки персональных данных и меры по обеспечению безопасности персональных данных, предпринимаемые ООО «ЭКСА»." }, { kind: "text", text: "Оператор ставит своей важнейшей целью и условием осуществления своей деятельности соблюдение прав и свобод человека и гражданина при обработке его персональных данных, в том числе защиты права на неприкосновенность частной жизни, личную и семейную тайну." }, { kind: "text", text: "Настоящая Политика действует в отношении всех персональных данных, которые обрабатываются Оператором с использованием средств автоматизации и без использования таких средств." }, { kind: "subheading", text: "1.4. Основные понятия" }, { kind: "definitions", items: [{ term: "Автоматизированная обработка персональных данных", text: "— обработка персональных данных с помощью средств вычислительной техники." }, { term: "Обработка персональных данных", text: "— любое действие или совокупность действий, совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение, извлечение, использование, передачу, обезличивание, блокирование, удаление, уничтожение." }, { term: "Оператор", text: "— юридическое или физическое лицо, организующие и осуществляющие обработку персональных данных." }, { term: "Персональные данные", text: "— любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу." }, { term: "Пользователь", text: "— любой посетитель веб-сайта https://bitforce-foundation.ru." }] }] }, { title: "2. Сведения об операторе", blocks: [{ kind: "list", items: ["Полное наименование: Общество с ограниченной ответственностью «ЭКСА»", "Сокращенное наименование: ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н", "Электронная почта: company@elcsa.ru", "Веб-сайт: https://bitforce-foundation.ru"] }] }, { title: "3. Общие цели обработки персональных данных", blocks: [{ kind: "subheading", text: "3.1.1. Основная деятельность:" }, { kind: "list", items: ["Предоставление услуг по конвертации иного имущества", "Осуществление операций на криптовалютных рынках", "Предоставление услуг в области блокчейн технологий", "Обеспечение функционирования интернет-платформы и мобильных приложений"] }, { kind: "subheading", text: "3.1.2. Обеспечение безопасности:" }, { kind: "list", items: ["Предотвращение мошенничества и отмывания денежных средств", "Обеспечение безопасности платежных операций", "Выполнение требований по противодействию легализации доходов", "Идентификация и верификация клиентов"] }, { kind: "subheading", text: "3.1.3. Соблюдение законодательства:" }, { kind: "list", items: ["Исполнение требований российского и международного законодательства", "Взаимодействие с контролирующими и правоохранительными органами", "Ведение обязательной отчетности и документооборота", "Соблюдение налогового законодательства"] }] }, { title: "4. Цели сбора персональных данных", blocks: [{ kind: "goals", items: [{ title: "Регистрация и идентификация пользователей:", items: ["Создание учетной записи на веб-сайте", "Верификация личности в соответствии с требованиями законодательства", "Подтверждение права на осуществление операций"] }, { title: "Обработка платежей и финансовых операций:", items: ["Осуществление операций по конвертации криптовалют", "Проведение расчетов и переводов денежных средств", "Ведение учета и истории транзакций"] }, { title: "Коммуникация с клиентами:", items: ["Предоставление технической поддержки", "Уведомления о состоянии операций и счетов", "Информирование об изменениях в условиях предоставления услуг"] }] }] }, { title: "5. Правовые основания обработки персональных данных", blocks: [{ kind: "subheading", text: "5.1.1. Согласие субъекта персональных данных:" }, { kind: "list", items: ["Обработка персональных данных в маркетинговых целях", "Использование файлов cookie и метрик", "Персонализация сервисов и предложений"] }, { kind: "subheading", text: "5.1.2. Необходимость исполнения договора:" }, { kind: "list", items: ["Регистрация и ведение учетных записей пользователей", "Осуществление финансовых операций и переводов", "Предоставление доступа к платформе и сервисам", "Техническая поддержка и обслуживание клиентов"] }, { kind: "subheading", text: "5.1.3. Соблюдение правовой обязанности:" }, { kind: "list", items: ["Выполнение требований валютного законодательства", "Противодействие легализации доходов, полученных преступным путем", "Соблюдение требований по налоговому учету и отчетности"] }] }, { title: "6. Объем и категории обрабатываемых персональных данных", blocks: [{ kind: "subheading", text: "6.1.1. Пользователи веб-сайта и мобильного приложения:" }, { kind: "list", items: ["Зарегистрированные пользователи", "Посетители сайта без регистрации", "Потенциальные клиенты", "Бывшие клиенты"] }, { kind: "subheading", text: "6.2.1. Идентификационные данные:" }, { kind: "list", items: ["Фамилия, имя, отчество", "Дата рождения", "Гражданство"] }, { kind: "subheading", text: "6.2.3. Контактная информация:" }, { kind: "list", items: ["Номера телефонов (мобильный, домашний, рабочий)", "Адреса электронной почты"] }, { kind: "subheading", text: "6.2.4. Финансовая информация:" }, { kind: "list", items: ["Номера банковских счетов и карт", "Реквизиты кошельков криптовалют", "История операций и транзакций", "Данные о доходах и источниках средств"] }, { kind: "subheading", text: "6.2.5. Техническая информация:" }, { kind: "list", items: ["IP-адреса устройств", "Данные о браузере и операционной системе", "Файлы cookie и локальное хранилище", "Логи действий на сайте"] }] }, { title: "7. Порядок и условия обработки персональных данных", blocks: [{ kind: "subheading", text: "7.1. Принципы обработки персональных данных:" }, { kind: "list", items: ["Обработка осуществляется на законной и справедливой основе", "Обработка ограничивается достижением конкретных, заранее определенных целей", "Содержание и объем данных соответствуют заявленным целям", "Обрабатываемые персональные данные являются точными и актуальными"] }, { kind: "subheading", text: "7.4. Сроки обработки персональных данных:" }, { kind: "list", items: ["Персональные данные обрабатываются в течение времени, необходимого для достижения целей", "После достижения целей персональные данные подлежат уничтожению или обезличиванию", "Сроки хранения определяются требованиями законодательства"] }, { kind: "subheading", text: "7.5. Места обработки персональных данных:" }, { kind: "list", items: ["Основные серверы и хранилища данных расположены на территории Российской Федерации", "Резервные копии могут храниться в дата-центрах на территории РФ"] }] }, { title: "8. Актуализация, исправление, удаление и уничтожение персональных данных", blocks: [{ kind: "subheading", text: "8.2.2. Процедура исправления:" }, { kind: "list", items: ["Рассмотрение запроса в течение 30 дней", "Проверка обоснованности требования об исправлении", "Внесение изменений во все информационные системы", "Уведомление субъекта о проведенных исправлениях"] }, { kind: "subheading", text: "8.3.2. Процедура удаления:" }, { kind: "list", items: ["Проверка наличия законных оснований для продолжения обработки", "Удаление из всех информационных систем и баз данных", "Удаление резервных копий (кроме архивных)", "Уведомление субъекта о выполненном удалении"] }] }, { title: "9. Ответы на запросы субъектов персональных данных", blocks: [{ kind: "subheading", text: "9.1.1. Право на информацию:" }, { kind: "list", items: ["Подтверждение факта обработки персональных данных", "Правовые основания и цели обработки", "Применяемые способы обработки", "Наименование и местонахождение оператора", "Лица, имеющие доступ к персональным данным"] }, { kind: "subheading", text: "9.2.2. Сроки рассмотрения:" }, { kind: "list", items: ["Срок рассмотрения запроса составляет 30 дней с момента получения", "Срок может быть продлен на 30 дней при большом объеме информации", "О продлении срока субъект уведомляется в течение 30 дней"] }, { kind: "subheading", text: "9.4. Плата за предоставление информации:" }, { kind: "list", items: ["Первый запрос в течение года обрабатывается бесплатно", "За повторные запросы может взиматься плата в размере расходов", "Субъект уведомляется о размере платы до предоставления информации"] }] }, { title: "10. Обеспечение безопасности персональных данных", blocks: [{ kind: "subheading", text: "10.1. Правовые меры:" }, { kind: "list", items: ["Назначение ответственного за организацию обработки персональных данных", "Принятие локальных актов по вопросам обработки персональных данных", "Ознакомление работников с требованиями законодательства", "Применение мер ответственности за нарушение требований"] }, { kind: "subheading", text: "10.3. Технические меры:" }, { kind: "list", items: ["Предотвращение несанкционированного доступа к персональным данным", "Своевременное обнаружение фактов несанкционированного доступа", "Возможность незамедлительного восстановления персональных данных", "Постоянный контроль за обеспечением уровня защищенности"] }, { kind: "subheading", text: "10.4. Конкретные технические решения:" }, { kind: "list", items: ["Использование сертифицированных средств защиты информации", "Шифрование персональных данных при передаче и хранении", "Применение межсетевых экранов и систем обнаружения вторжений", "Резервное копирование и обеспечение отказоустойчивости", "Антивирусная защита и обновление программного обеспечения"] }] }, { title: "12. Заключительные положения", blocks: [{ kind: "subheading", text: "12.2. Жалобы и обращения:" }, { kind: "list", items: ["Субъекты персональных данных могут обратиться к Оператору по вопросам обработки", "Жалобы рассматриваются в установленном законом порядке", "При неурегулировании разногласий возможно обращение в Роскомнадзор или суд"] }, { kind: "subheading", text: "12.4. Контактная информация для обращений:" }, { kind: "infoBox", lines: ["Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н", "Электронная почта: company@elcsa.ru"] }] }] }; function sL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: aL }), o.jsx(Is, {})] }) } const lL = { title: "ПОЛИТИКА ИСПОЛЬЗОВАНИЯ ФАЙЛОВ COOKIE", sections: [{ title: "Общие положения и терминология", blocks: [{ kind: "text", text: "Настоящая Политика использования файлов cookie устанавливает порядок обработки файлов cookie и содержащихся в них персональных данных ООО «ЭКСА» при использовании пользователями интернет-ресурса https://bitforce-foundation.ru." }, { kind: "text", text: "Файлы cookie — это текстовые файлы небольшого размера, которые устанавливаются на пользовательское устройство при посещении интернет-ресурса или совершении на нем определенных действий. Файлы cookie остаются сохраненными на устройстве даже после покидания ресурса, что позволяет «узнавать» пользователя при последующих посещениях." }, { kind: "text", text: "К персональным данным относится не сам файл cookie, а его содержимое — уникальные идентификаторы, IP-адреса, информация о предпочтениях пользователя и другие данные, позволяющие прямо или косвенно идентифицировать физическое лицо." }] }, { title: "Оператор персональных данных", blocks: [{ kind: "text", text: "Оператором персональных данных, содержащихся в файлах cookie, является:" }, { kind: "infoBox", lines: ["ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское ш, д. 25 к. 1 литера В, помещ. 3-н"] }, { kind: "text", text: "Оператор определяет цели обработки персональных данных, их состав, а также действия с персональными данными, включая случаи использования сторонних файлов cookie." }] }, { title: "Категории файлов cookie и их назначение", blocks: [{ kind: "subheading", text: "1. Строго необходимые (технические) файлы cookie" }, { kind: "text", text: "Данные файлы обеспечивают работу интернет-ресурса и предоставление необходимого уровня сервиса: авторизацию, навигацию, отображение контента в соответствии с параметрами устройства, обеспечение безопасности." }, { kind: "text", text: "Обработка таких файлов cookie осуществляется на основании п. 5 ч. 1 ст. 6 ФЗ № 152 (заключение и исполнение договора). Согласие на использование строго необходимых файлов cookie не требуется." }, { kind: "text", variant: "example", text: "Примеры: файлы сессий (PHPSESSID), настройки безопасности, файлы аутентификации." }, { kind: "subheading", text: "2. Функциональные файлы cookie" }, { kind: "text", text: "Используются для запоминания пользовательских предпочтений и персонализации взаимодействия с сайтом: сохранение выбранного языка, региона, настроек отображения, размера шрифта." }, { kind: "text", text: "Обработка осуществляется на основании согласия субъекта персональных данных, поскольку данная обработка не является строго необходимой для функционирования сайта." }, { kind: "text", variant: "example", text: "Примеры: настройки языка интерфейса, предпочтения отображения, настройки доступности." }, { kind: "subheading", text: "3. Аналитические файлы cookie" }, { kind: "text", text: "Собирают информацию о взаимодействии пользователей с интернет-ресурсом для анализа его использования, выявления популярных разделов, обнаружения ошибок и улучшения пользовательского опыта. Могут содержать персональные данные, включая IP-адреса пользователей." }, { kind: "text", text: "Обработка осуществляется на основании согласия субъекта персональных данных." }, { kind: "subheading", text: "4. Маркетинговые файлы cookie" }, { kind: "text", text: "Используются для отслеживания пользователей в целях персонализированной рекламы, анализа эффективности рекламных кампаний, ретаргетинга." }, { kind: "text", text: "Обработка осуществляется исключительно на основании согласия субъекта персональных данных." }, { kind: "text", variant: "example", text: "Примеры: пиксели социальных сетей, рекламные идентификаторы, файлы ретаргетинга." }] }, { title: "Правовые основания обработки персональных данных", blocks: [{ kind: "text", text: "Обработка персональных данных, содержащихся в файлах cookie, осуществляется на следующих правовых основаниях:" }, { kind: "list", items: [{ strong: "Согласие субъекта персональных данных", text: "— для функциональных, аналитических и маркетинговых файлов cookie" }, { strong: "Заключение и исполнение договора", text: "— для строго необходимых файлов cookie, обеспечивающих работу интернет-ресурса" }, { strong: "Законные интересы оператора", text: "— в исключительных случаях, когда отсутствуют иные основания" }] }] }, { title: "Порядок получения согласия", blocks: [{ kind: "subheading", text: "Принципы получения согласия:" }, { kind: "list", items: ["Согласие должно быть получено до начала обработки персональных данных", "Информация об использовании файлов cookie размещается на первом уровне интернет-ресурса", "Предоставляется возможность выбора категорий файлов cookie", "Используются активные формулировки вместо пассивных"] }, { kind: "subheading", text: "Критерии действительного согласия:" }, { kind: "list", items: [{ strong: "Добровольность", text: "— согласие дается по свободной воле субъекта" }, { strong: "Конкретность", text: "— четко определены цели обработки" }, { strong: "Информированность", text: "— предоставлена полная информация об обработке" }, { strong: "Однозначность", text: "— согласие выражено в недвусмысленной форме" }] }] }, { title: "Сторонние файлы cookie", blocks: [{ kind: "subheading", text: "Использование сторонних сервисов:" }, { kind: "text", text: "Наш интернет-ресурс использует файлы cookie сторонних сервисов, включая:" }, { kind: "list", items: ["Яндекс.Метрика (ООО «ЯНДЕКС», Россия)", "Социальные сети и сервисы интеграции"] }, { kind: "subheading", text: "Обеспечение защиты:" }, { kind: "list", items: ["Получено согласие на передачу", "Применяются дополнительные меры защиты данных", "Контролируется соблюдение принципов обработки персональных данных получателями"] }] }, { title: "Сроки обработки и хранения", blocks: [{ kind: "subheading", text: "Категории по срокам хранения:" }, { kind: "list", items: ["Сеансовые cookie — удаляются автоматически при закрытии браузера", "Постоянные cookie — хранятся установленный период или до удаления пользователем"] }, { kind: "subheading", text: "Конкретные сроки:" }, { kind: "list", items: ["Необходимые файлы cookie — до 12 месяцев", "Функциональные файлы cookie — до 12 месяцев", "Аналитические файлы cookie — до 24 месяцев", "Маркетинговые файлы cookie — до 24 месяцев"] }, { kind: "text", text: "По истечении установленных сроков файлы cookie удаляются автоматически. Пользователь может удалить файлы cookie досрочно через настройки браузера или отозвать согласие на их обработку." }] }, { title: "Права субъектов персональных данных", blocks: [{ kind: "subheading", text: "Право на информацию:" }, { kind: "list", items: ["Получение информации о обработке персональных данных", "Сведения о правовых основаниях и целях обработки", "Информация о сроках обработки и составе данных"] }, { kind: "subheading", text: "Право на доступ:" }, { kind: "list", items: ["Получение подтверждения факта обработки", "Ознакомление с обрабатываемыми персональными данными", "Получение информации об источниках персональных данных"] }, { kind: "subheading", text: "Право на уточнение, блокирование, удаление:" }, { kind: "list", items: ["Требование уточнения неточных данных", "Блокирование недостоверных данных", "Удаление незаконно полученных данных"] }, { kind: "subheading", text: "Право на отзыв согласия:" }, { kind: "list", items: ["Отзыв согласия в любое время", "Прекращение обработки после отзыва согласия", "Сохранение права на обжалование действий оператора"] }] }, { title: "Способы управления файлами cookie", blocks: [{ kind: "subheading", text: "Управление через настройки сайта:" }, { kind: "list", items: ["Использование баннера согласия на файлы cookie", "Изменение настроек в любое время через интерфейс сайта", "Отзыв согласия на использование отдельных категорий файлов cookie"] }, { kind: "subheading", text: "Управление через браузер:" }, { kind: "text", text: "Большинство браузеров позволяют контролировать файлы cookie:" }, { kind: "list", items: ["Блокировка — запрет установки новых файлов cookie", "Удаление — очистка существующих файлов cookie", "Уведомления — получение предупреждений при установке файлов cookie", "Селективная настройка — разрешение файлов cookie только для определенных сайтов"] }, { kind: "subheading", text: "Инструкции для популярных браузеров:" }, { kind: "list", items: ["Google Chrome: Настройки → Конфиденциальность и безопасность → Файлы cookie", "Mozilla Firefox: Настройки → Приватность и Защита → Файлы cookie", "Safari: Настройки → Конфиденциальность → Файлы cookie", "Microsoft Edge: Настройки → Файлы cookie и разрешения сайтов"] }, { kind: "text", variant: "warning", text: "Блокировка необходимых файлов cookie может привести к ограничению функциональности интернет-ресурса." }] }, { title: "Меры безопасности", blocks: [{ kind: "text", text: "Оператор применяет правовые, организационные и технические меры для защиты персональных данных:" }, { kind: "subheading", text: "Правовые меры:" }, { kind: "list", items: ["Назначение ответственного за организацию обработки персональных данных", "Ознакомление сотрудников с требованиями законодательства", "Заключение соглашений о неразглашении персональных данных"] }, { kind: "subheading", text: "Организационные меры:" }, { kind: "list", items: ["Определение перечня лиц, допущенных к обработке персональных данных", "Установление правил доступа к персональным данным", "Контроль за соблюдением требований по защите персональных данных"] }, { kind: "subheading", text: "Технические меры:" }, { kind: "list", items: ["Использование средств защиты информации", "Применение криптографических средств защиты", "Обеспечение целостности и доступности персональных данных", "Регулярное обновление систем защиты информации"] }] }, { title: "Контактная информация и обращения", blocks: [{ kind: "text", text: "Для реализации прав субъекта персональных данных обращайтесь к нам:" }, { kind: "infoBox", lines: ["ООО «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское ш, д. 25 к. 1 литера В, помещ. 3-н", "Email компании: company@elcsa.ru"] }, { kind: "subheading", text: "Порядок рассмотрения обращений:" }, { kind: "list", items: ["Срок рассмотрения обращений — до 30 дней с момента получения", "Обращения рассматриваются в письменной форме", "Ответ направляется способом, указанным в обращении", "При отказе в удовлетворении требований указываются мотивированные основания"] }] }] }; function iL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: lL }), o.jsx(Is, {})] }) } const oL = { title: "СОГЛАСИЕ НА ОБРАБОТКУ ПЕРСОНАЛЬНЫХ ДАННЫХ", subtitle: "ООО «ЭКСА»", sections: [{ title: "Преамбула", blocks: [{ kind: "text", text: "Я, субъект персональных данных, действуя своей волей и в своем интересе, в соответствии с требованиями Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных», предоставляю ООО «ЭКСА» согласие на обработку моих персональных данных на условиях и для целей, определенных настоящим Согласием." }] }, { title: "1. Сведения об операторе", blocks: [{ kind: "infoBox", lines: ["Полное наименование: Общество с ограниченной ответственностью «ЭКСА»", "ИНН: 9810001062", "ОГРН: 1257800060990", "Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н", "Электронная почта: company@elcsa.ru", "Веб-сайт: https://bitforce-foundation.ru"] }] }, { title: "2. Правовые основания обработки", blocks: [{ kind: "text", text: "Настоящее согласие предоставляется на основании пункта 1 части 1 статьи 6 Федерального закона «О персональных данных» и является правовым основанием для обработки персональных данных Оператором." }, { kind: "text", text: "Согласие дается добровольно, своей волей и в своих интересах." }, { kind: "text", text: "Субъект персональных данных понимает последствия предоставления согласия, включая возможные риски, связанные с обработкой персональных данных." }] }, { title: "3. Цели обработки персональных данных", blocks: [{ kind: "subheading", text: "3.1. Основные цели:" }, { kind: "list", items: ["Регистрация и ведение учетной записи на веб-сайте и в мобильном приложении", "Идентификация и верификация личности в соответствии с требованиями законодательства", "Предоставление услуг по обмену криптовалют и электронных денежных средств", "Проведение финансовых операций, переводов и расчетов", "Ведение учета и истории операций"] }, { kind: "subheading", text: "3.2. Дополнительные цели:" }, { kind: "list", items: ["Обеспечение безопасности операций и предотвращение мошенничества", "Выполнение требований по противодействию легализации доходов", "Соблюдение требований валютного, налогового и иного применимого законодательства", "Предоставление технической поддержки и клиентского сервиса", "Рассылка уведомлений о состоянии операций и изменениях в условиях"] }, { kind: "subheading", text: "3.3. Маркетинговые цели (при дополнительном согласии):" }, { kind: "list", items: ["Направление информационных и рекламных материалов", "Проведение маркетинговых исследований и опросов", "Персонализация предложений и услуг", "Анализ предпочтений и поведения для улучшения сервисов"] }, { kind: "subheading", text: "3.4. Аналитические цели:" }, { kind: "list", items: ["Анализ использования веб-сайта и мобильного приложения", "Улучшение качества предоставляемых услуг", "Разработка новых продуктов и сервисов", "Создание статистических отчетов в обезличенном виде"] }] }, { title: "4. Перечень персональных данных", blocks: [{ kind: "subheading", text: "4.1. Идентификационные данные:" }, { kind: "list", items: ["Фамилия, имя, отчество", "Дата рождения", "Гражданство"] }, { kind: "subheading", text: "4.2. Документы, удостоверяющие личность:" }, { kind: "list", items: ["Серия и номер паспорта гражданина Российской Федерации", "Дата выдачи и код подразделения", "Адрес регистрации по месту жительства", "Цифровые копии (сканы) документов"] }, { kind: "subheading", text: "4.3. Контактная информация:" }, { kind: "list", items: ["Номера телефонов (мобильный, домашний, рабочий)", "Адреса электронной почты", "Почтовые адреса (фактического проживания, для корреспонденции)"] }, { kind: "subheading", text: "4.4. Финансовая информация:" }, { kind: "list", items: ["Номера банковских счетов и реквизиты банковских карт", "Реквизиты криптовалютных кошельков и адресов", "Информация о доходах и источниках происхождения денежных средств", "История финансовых операций и транзакций"] }, { kind: "subheading", text: "4.5. Техническая информация:" }, { kind: "list", items: ["IP-адреса устройств, с которых осуществляется доступ к сервисам", "Информация о браузере, операционной системе и устройстве", "Файлы cookie и данные локального хранилища", "Логи действий и история использования сервисов"] }, { kind: "subheading", text: "4.6. Дополнительная информация:" }, { kind: "list", items: ["Фотографии для процедур верификации", "Видеозаписи процедур видеоидентификации", "Биометрические данные (при использовании соответствующих технологий)", "Информация о семейном положении и профессиональной деятельности"] }] }, { title: "5. Перечень действий с персональными данными", blocks: [{ kind: "text", text: "Согласие распространяется на следующие действия (операции) с персональными данными:" }, { kind: "list", items: ["Сбор, запись и первичная обработка персональных данных", "Накопление и систематизация в базах данных", "Создание резервных копий и архивирование", "Извлечение, использование и анализ данных", "Уточнение, обновление и актуализация информации", "Передача данных третьим лицам", "Обезличивание и удаление данных", "Автоматизированная обработка и профилирование"] }] }, { title: "6. Лица, которым могут быть переданы персональные данные", blocks: [{ kind: "subheading", text: "6.1. Сотрудники Оператора:" }, { kind: "list", items: ["Уполномоченные сотрудники, непосредственно участвующие в обработке", "Сотрудники службы безопасности и комплаенса", "Сотрудники технической поддержки", "Руководящий состав в рамках их полномочий"] }, { kind: "subheading", text: "6.2. Государственные и муниципальные органы:" }, { kind: "list", items: ["Федеральная служба по финансовому мониторингу", "Федеральная налоговая служба", "Правоохранительные органы (при наличии законных требований)", "Суды и органы исполнения судебных решений"] }, { kind: "subheading", text: "6.3. Партнеры и контрагенты:" }, { kind: "list", items: ["Банки и платежные системы", "Операторы электронных денежных средств", "Поставщики технологических решений", "Аудиторские и консалтинговые организации"] }] }, { title: "7. Сроки обработки персональных данных", blocks: [{ kind: "subheading", text: "7.1. Общие принципы:" }, { kind: "text", text: "Персональные данные обрабатываются в течение времени, необходимого для достижения целей обработки. После достижения целей данные подлежат уничтожению или обезличиванию." }, { kind: "subheading", text: "7.2. Конкретные сроки обработки:" }, { kind: "list", items: [{ strong: "Данные активных клиентов:", text: "в течение всего периода отношений плюс 5 лет после прекращения" }, { strong: "Данные для идентификации:", text: "5 лет с момента прекращения отношений" }, { strong: "Финансовая информация:", text: "5 лет с даты совершения операции" }, { strong: "Маркетинговые данные:", text: "до отзыва согласия, но не более 3 лет" }, { strong: "Техническая информация:", text: "1 год для безопасности, 6 месяцев для логов" }] }] }, { title: "8. Права субъекта персональных данных", blocks: [{ kind: "subheading", text: "8.1. Право на информацию:" }, { kind: "list", items: ["Получение подтверждения факта обработки персональных данных", "Получение информации о целях и способах обработки", "Информация о сроках обработки и составе данных", "Сведения о лицах, которым передаются данные"] }, { kind: "subheading", text: "8.2. Право на доступ:" }, { kind: "list", items: ["Получение копий обрабатываемых персональных данных", "Ознакомление с историей обработки и изменений", "Получение информации об источниках персональных данных"] }, { kind: "subheading", text: "8.3. Право на исправление и удаление:" }, { kind: "list", items: ["Требование исправления неточных или неполных данных", "Требование удаления персональных данных при наличии оснований", "Удаление данных после отзыва согласия"] }, { kind: "subheading", text: "8.4. Право на отзыв согласия:" }, { kind: "list", items: ["Согласие может быть отозвано в любое время", "Отзыв оформляется в письменной форме", "После отзыва обработка прекращается в разумные сроки"] }, { kind: "subheading", text: "8.5. Право на обжалование:" }, { kind: "list", items: ["Обращение к Оператору с жалобами на действия по обработке данных", "Обращение в Роскомнадзор или его территориальные органы", "Обращение в суд для защиты нарушенных прав"] }, { kind: "subheading", text: "8.6. Порядок реализации прав:" }, { kind: "list", items: ["Обращения направляются на адрес: company@elcsa.ru", "Обращения рассматриваются в течение 30 дней", "При необходимости срок может быть продлен на 30 дней"] }] }, { title: "9. Заключительные положения", blocks: [{ kind: "subheading", text: "9.1. Действие согласия:" }, { kind: "list", items: ["Согласие действует с момента его предоставления", "Согласие действует до его отзыва или до достижения целей обработки", "При существенных изменениях целей требуется новое согласие"] }, { kind: "subheading", text: "9.2. Форма предоставления согласия:" }, { kind: "list", items: ["Согласие может быть предоставлено в письменной форме", "Согласие может быть предоставлено в электронной форме", "Согласие может выражаться путем совершения конклюдентных действий"] }, { kind: "subheading", text: "9.3. Последствия непредоставления согласия:" }, { kind: "list", items: ["Отказ в предоставлении согласия может повлечь невозможность регистрации", "Отказ может ограничить доступ к отдельным услугам", "Отказ в согласии на маркетинг не влияет на основные услуги", "Субъект вправе предоставить частичное согласие"] }, { kind: "subheading", text: "9.4. Контактная информация:" }, { kind: "infoBox", lines: ["Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н", "Электронная почта: company@elcsa.ru", "Ответственное лицо: Кленин Михаил Васильевич", "Официальный сайт: https://bitforce-foundation.ru"] }, { kind: "subheading", text: "9.5. Подтверждение понимания:" }, { kind: "text", variant: "emphasis", text: "Предоставляя настоящее согласие, я подтверждаю, что:" }, { kind: "list", items: ["Ознакомлен с содержанием согласия и понимаю его значение", "Понимаю цели и способы обработки моих персональных данных", "Знаю о своих правах и способах их реализации", "Согласие предоставляется добровольно и осознанно", "Имею возможность отозвать согласие в любое время"] }] }] }; function rL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: oL }), o.jsx(Is, {})] }) } const cL = { title: "Реестр операторов персональных данных", subtitle: "ООО «ЭКСА»", sections: [{ blocks: [{ kind: "text", text: "Информация об операторе персональных данных размещена в реестре операторов персональных данных Федеральной службы по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор)." }, { kind: "text", text: "Вы можете просмотреть информацию об операторе в реестре Роскомнадзора, перейдя по ссылке ниже:" }, { kind: "link", href: "https://pd.rkn.gov.ru/operators-registry/operators-list/?act=search&name_full=%D0%91%D0%B8%D1%82%D1%84%D0%BE%D1%80%D1%81&inn=9810001062®n=", text: "Открыть реестр Роскомнадзора" }, { kind: "text", text: "Реестр содержит информацию об операторах персональных данных, включая сведения о целях и методах обработки персональных данных, а также меры по обеспечению безопасности персональных данных." }] }, { title: "Информация об операторе", blocks: [{ kind: "infoBox", lines: [{ strong: "Наименование:", text: "ООО «ЭКСА»" }, { strong: "ИНН:", text: "9810001062" }, { strong: "ОГРН:", text: "1257800060990" }, { strong: "Юридический адрес:", text: "196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н" }, { strong: "Контактная информация:", text: "company@elcsa.ru" }] }] }, { title: "О Роскомнадзоре", blocks: [{ kind: "text", text: "Федеральная служба по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор) — это федеральный орган исполнительной власти, осуществляющий функции по контролю и надзору в области персональных данных." }, { kind: "text", text: "Роскомнадзор ведет реестр операторов персональных данных в соответствии с требованиями Федерального закона «О персональных данных». Реестр является открытой информационной системой и доступен всем заинтересованным лицам." }] }] }; function uL() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsx(xr, { doc: cL }), o.jsx(Is, {})] }) } const xy = { ETH: { symbol: "ETH", aprLabel: "APR", protocol: "Lido" }, SOL: { symbol: "SOL", aprLabel: "APY", protocol: "Нативный" } }, dL = [{ chain: "ETH", label: "ETH · Lido" }, { chain: "SOL", label: "SOL · нативный" }], fL = { active: { label: "Активна", variant: "active" }, activating: { label: "Активируется", variant: "muted" }, deactivating: { label: "Деактивация", variant: "muted" }, inactive: { label: "Завершена", variant: "ready" } }, hL = "_toggle_xc9o8_1", mL = "_tab_xc9o8_6", pL = "_active_xc9o8_18", gL = "_inactive_xc9o8_23", Kc = { toggle: hL, tab: mL, active: pL, inactive: gL }; function vL({ value: a, onChange: l }) { return o.jsx("div", { className: Kc.toggle, children: dL.map(({ chain: i, label: r }) => o.jsx("button", { className: `${Kc.tab} ${a === i ? Kc.active : Kc.inactive}`, onClick: () => l(i), children: r }, i)) }) } const Ay = "https://app.cryptowallet.elcsa.ru", Rl = { ETH: 18, SOL: 9 }; async function sm(a, l = !0) { const i = await nn(), r = Nt.get(), d = await fetch(`${Ay}${a}`, { credentials: "include", headers: { "X-CSRF-Token": i, ...r ? { Authorization: `Bearer ${r}` } : {} } }); if (d.status === 401 && l) try { return await ca(), sm(a, !1) } catch { throw Nt.clear(), new Error("Unauthorized") } const f = await d.json(); if (!d.ok) throw f; return f } async function Ys(a, l, i = !0, r = {}) { const d = await nn(), f = Nt.get(), h = await fetch(`${Ay}${a}`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": d, ...f ? { Authorization: `Bearer ${f}` } : {}, ...r }, body: JSON.stringify(l) }); if (h.status === 401 && i) try { return await ca(), Ys(a, l, !1, r) } catch { throw Nt.clear(), new Error("Unauthorized") } const g = await h.json(); if (!h.ok) throw g; return g } function bu() { return { "Idempotency-Key": crypto.randomUUID() } } async function yL(a, l) { const i = ra(l, Rl[a]); if (a === "ETH") { const h = (await Ys("/api/wallets/ETH/stake/quote", { amount: i })).data; return { chain: a, amountHuman: h.amountWeiHuman, feeHuman: h.appFeeWeiHuman, afterFeeHuman: h.stakeAmountWeiHuman, resultHuman: h.expectedStEthWeiHuman, aprPercent: h.aprPercent } } const d = (await Ys("/api/wallets/SOL/stake/quote", { amount: i })).data; return { chain: a, amountHuman: d.amountLamportsHuman, feeHuman: d.appFeeLamportsHuman, afterFeeHuman: d.stakeLamportsHuman, resultHuman: d.stakeLamportsHuman, aprPercent: d.estApyPercent, validator: d.validator } } async function _L(a, l) { const i = ra(l, Rl[a]); await Ys(`/api/wallets/${a}/stake`, { amount: i }, !0, bu()) } async function bL() { return (await sm("/api/wallets/ETH/stake/positions")).data } async function xL() { return (await sm("/api/wallets/SOL/stake/positions")).data } async function AL(a, l) { const i = ra(a, Rl.ETH); return (await Ys("/api/wallets/ETH/unstake", { amount: i, mode: l }, !0, bu())).data } async function SL(a) { return (await Ys("/api/wallets/SOL/unstake", { stakeAccount: a }, !0, bu())).data } async function jL(a) { await Ys("/api/wallets/ETH/unstake/claim", { requestId: a }, !0, bu()) } async function wL(a, l) { return (await Ys(`/api/wallets/${a}/op-cost`, { token: a, amountHuman: l })).data } function ar(a) { if (a && typeof a == "object" && "error" in a) { const l = a.error; if (typeof l == "string") return l } return a instanceof Error ? a.message === "Unauthorized" ? "Сессия истекла — перезагрузите страницу." : a.message : "Произошла ошибка. Попробуйте ещё раз." } function EL(a, l) { if (a.chain === "ETH") { const r = BigInt(ra(a.stEthBalanceWeiHuman, Rl.ETH)), d = BigInt(ra(l, Rl.ETH)); return { ...a, stEthBalanceWeiHuman: rr((r + d).toString(), Rl.ETH), optimistic: !0 } } const i = { stakeAccount: "pending", lamportsHuman: l, state: "activating", validator: a.validator, optimistic: !0 }; return { ...a, positions: [i, ...a.positions] } } function NL(a, l) { const i = parseFloat(l); return Ct({ queryKey: ["staking", "quote", a, l], queryFn: () => yL(a, l), enabled: Number.isFinite(i) && i > 0, staleTime: 15e3, retry: !1 }) } function CL(a, l) { const i = parseFloat(l); return Ct({ queryKey: ["staking", "op-cost", a, l], queryFn: () => wL(a, l), enabled: Number.isFinite(i) && i > 0, staleTime: 15e3, retry: !1 }) } function TL(a) { return Ct({ queryKey: ["staking", "positions", a], queryFn: () => a === "ETH" ? bL() : xL(), staleTime: 3e4, retry: !1 }) } function RL() { const a = Wt(); return yt({ mutationFn: ({ chain: l, amountHuman: i }) => _L(l, i), onMutate: async ({ chain: l, amountHuman: i }) => { const r = ["staking", "positions", l]; await a.cancelQueries({ queryKey: r }); const d = a.getQueryData(r); return d && a.setQueryData(r, EL(d, i)), { key: r, previous: d } }, onError: (l, i, r) => { r != null && r.previous && a.setQueryData(r.key, r.previous) }, onSettled: (l, i, { chain: r }) => { a.invalidateQueries({ queryKey: ["wallet", "balance", r] }), setTimeout(() => { a.invalidateQueries({ queryKey: ["staking", "positions", r] }), a.invalidateQueries({ queryKey: ["wallet", "balance", r] }) }, 6e3) } }) } function kL() { const a = Wt(); return yt({ mutationFn: l => l.chain === "ETH" ? AL(l.amountHuman, l.mode) : SL(l.stakeAccount), onSuccess: (l, i) => { a.invalidateQueries({ queryKey: ["staking", "positions", i.chain] }), a.invalidateQueries({ queryKey: ["wallet", "balance", i.chain] }) } }) } function BL() { const a = Wt(); return yt({ mutationFn: l => jL(l), onSuccess: () => { a.invalidateQueries({ queryKey: ["staking", "positions", "ETH"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) } }) } const OL = "_panel_jl9ez_1", LL = "_row_jl9ez_13", ML = "_label_jl9ez_26", zL = "_value_jl9ez_31", DL = "_success_jl9ez_39", UL = "_highlight_jl9ez_43", HL = "_rowTotal_jl9ez_48", qL = "_valueLg_jl9ez_55", vl = { panel: OL, row: LL, label: ML, value: zL, success: DL, highlight: UL, rowTotal: HL, valueLg: qL }; function PL({ rows: a, loading: l }) { return o.jsx("div", { className: vl.panel, "data-loading": l ? "true" : void 0, children: a.map(({ label: i, value: r, accent: d, emphasis: f }) => o.jsxs("div", { className: `${vl.row} ${f ? vl.rowTotal : ""}`, children: [o.jsx("span", { className: vl.label, children: i }), o.jsx("span", { className: `${vl.value} ${f ? vl.valueLg : ""} ${d ? vl[d] : ""}`, children: r })] }, i)) }) } const QL = "_wrapper_1y6dk_1", FL = "_pillsOuter_1y6dk_7", YL = "_card_1y6dk_12", IL = "_top_1y6dk_19", GL = "_tag_1y6dk_27", KL = "_right_1y6dk_35", XL = "_apr_1y6dk_41", VL = "_pillsInner_1y6dk_52", ZL = "_pill_1y6dk_7", WL = "_mid_1y6dk_75", JL = "_input_1y6dk_83", $L = "_token_1y6dk_99", eM = "_bottom_1y6dk_109", tM = "_balance_1y6dk_116", nM = "_max_1y6dk_124", aM = "_hint_1y6dk_139", sM = "_stakeBtn_1y6dk_147", lM = "_stakeBtnDisabled_1y6dk_151", Dt = { wrapper: QL, pillsOuter: FL, card: YL, top: IL, tag: GL, right: KL, apr: XL, pillsInner: VL, pill: ZL, mid: WL, input: JL, token: $L, bottom: eM, balance: tM, max: nM, hint: aM, stakeBtn: sM, stakeBtnDisabled: lM }, iM = [25, 50, 100], wi = "—"; function S1(a) { return `≈ $${a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } function oM(a, l, i, r, d) { var L, B, P; const f = a.symbol === "ETH", h = `Годовая доходность (${a.aprLabel})`, g = (L = i == null ? void 0 : i.appCommission) == null ? void 0 : L.usd, m = g != null ? S1(g) : wi, p = (l == null ? void 0 : l.aprPercent) != null ? `${l.aprPercent}%` : wi, y = f ? "Вы получите" : "Делегируется валидатору", _ = l ? f ? `≈ ${nt(l.resultHuman, 8)} stETH` : `${nt(l.resultHuman, 8)} SOL` : wi, b = (P = (B = i == null ? void 0 : i.balance) == null ? void 0 : B.gas) == null ? void 0 : P.needReserve, S = b != null && parseFloat(String(b)) || 0, j = b != null ? `≈ ${nt(String(b), 8)} ${a.symbol}` : wi, w = Math.max(0, r - S), E = b != null && r > 0 ? `≈ ${nt(w.toString(), 8)} ${a.symbol}` : wi, R = d > 0 && r > 0 ? S1(r * d) : wi; return [{ label: "Сетевой сбор (газ)", value: j }, { label: "Сумма в стейкинг", value: E }, { label: "Комиссия сервиса (0.7%)", value: m }, { label: h, value: p, accent: "success" }, { label: "Итого к списанию", value: R }, { label: y, value: _, accent: "highlight", emphasis: !0 }] } function rM({ chain: a, amount: l, onAmountChange: i, onStake: r, isStaking: d }) { var re, ce; const f = xy[a], h = Rl[a], { data: g } = Yi(a), m = (g == null ? void 0 : g.native.formatted) ?? "0", p = parseFloat(m) || 0, y = ba(l, 400), { data: _, isError: b } = CL(a, y), S = ((ce = (re = _ == null ? void 0 : _.balance) == null ? void 0 : re.gas) == null ? void 0 : ce.needReserve) != null ? String(_.balance.gas.needReserve) : null; function j(ie) { if ((parseFloat(ie) || 0) <= 0) return "0"; if (S != null) { const pe = BigInt(ra(ie, h)), ve = BigInt(ra(S, h)), q = pe > ve ? pe - ve : 0n; return rr(q.toString(), h) } return b ? ie : "0" } const w = j(l), E = j(y), R = parseFloat(w) || 0, { data: L, isFetching: B } = NL(a, E), P = parseFloat(l) || 0, G = P > 0 && P <= p, V = G && S != null && R <= 0, D = G && R > 0 && !d, K = ie => { ie >= 100 ? i(m) : i((p * ie / 100).toString()) }, ee = o.jsx(o.Fragment, { children: iM.map(ie => o.jsxs("button", { className: Dt.pill, onClick: () => K(ie), "aria-label": `${ie}% от баланса`, children: [ie, "%"] }, ie)) }); return o.jsxs("div", { className: Dt.wrapper, children: [o.jsx("div", { className: Dt.pillsOuter, children: ee }), o.jsxs("div", { className: Dt.card, children: [o.jsxs("div", { className: Dt.top, children: [o.jsx("span", { className: Dt.tag, children: "Сумма к списанию" }), o.jsxs("div", { className: Dt.right, children: [o.jsxs("span", { className: Dt.apr, children: [f.aprLabel, " ", (L == null ? void 0 : L.aprPercent) != null ? `${L.aprPercent}%` : "—"] }), o.jsx("div", { className: Dt.pillsInner, children: ee })] })] }), o.jsxs("div", { className: Dt.mid, children: [o.jsx("input", { className: Dt.input, type: "text", inputMode: "decimal", value: l, onChange: ie => { const te = ie.target.value; (/^(\d+\.?\d*|\.?\d*)$/.test(te) || te === "") && i(te) }, placeholder: "0", "aria-label": `Сумма к списанию в ${f.symbol}` }), o.jsxs("div", { className: Dt.token, children: [o.jsx(kl, { letter: f.symbol[0], color: "var(--grad-center)", logo: _e[f.symbol], size: 28 }), o.jsx("span", { children: f.symbol })] })] }), o.jsx("div", { className: Dt.bottom, children: o.jsxs("span", { className: Dt.balance, children: ["Баланс: ", nt(m, 6), " ", f.symbol, o.jsx("button", { className: Dt.max, onClick: () => K(100), "aria-label": "Использовать весь баланс", children: "МАКС" })] }) }), o.jsx(PL, { rows: oM(f, L, _, P, (g == null ? void 0 : g.native.usdPrice) ?? 0), loading: B }), V && o.jsx("p", { className: Dt.hint, children: "Сумма меньше сетевого сбора (газ)." }), o.jsx("div", { className: `${Dt.stakeBtn} ${D ? "" : Dt.stakeBtnDisabled}`, children: o.jsx(Zn, { label: d ? "Отправка…" : "Застейкать", type: "button", onClick: () => r(w), disabled: !D }) })] })] }) } const cM = "_notice_y8uqt_1", uM = "_icon_y8uqt_14", dM = "_compact_y8uqt_29", ch = { notice: cM, icon: uM, compact: dM }; function Sy({ compact: a }) { return o.jsxs("div", { className: `${ch.notice} ${a ? ch.compact : ""}`, children: [o.jsx("span", { className: ch.icon, "aria-hidden": "true", children: "!" }), o.jsx("span", { children: "Вывод средств из стейкинга может занимать до 2 недель." })] }) } const fM = "_panel_156jb_1", hM = "_inner_156jb_8", mM = "_body_156jb_16", pM = "_head_156jb_45", gM = "_title_156jb_51", vM = "_total_156jb_59", yM = "_totalUnit_156jb_65", _M = "_subhead_156jb_70", bM = "_list_156jb_79", xM = "_pos_156jb_85", AM = "_pending_156jb_93", SM = "_reqCard_156jb_108", jM = "_posTop_156jb_112", wM = "_coin_156jb_120", EM = "_amount_156jb_129", NM = "_meta_156jb_136", CM = "_badge_156jb_143", TM = "_badgeActive_156jb_151", RM = "_badgeReady_156jb_156", kM = "_badgeMuted_156jb_161", BM = "_btn_156jb_166", OM = "_btnPrimary_156jb_189", LM = "_note_156jb_201", MM = "_empty_156jb_208", zM = "_emptyState_156jb_215", DM = "_emptyIcon_156jb_227", UM = "_emptyTitle_156jb_239", HM = "_emptyText_156jb_246", me = { panel: fM, inner: hM, body: mM, head: pM, title: gM, total: vM, totalUnit: yM, subhead: _M, list: bM, pos: xM, pending: AM, reqCard: SM, posTop: jM, coin: wM, amount: EM, meta: NM, badge: CM, badgeActive: TM, badgeReady: RM, badgeMuted: kM, btn: BM, btnPrimary: OM, note: LM, empty: MM, emptyState: zM, emptyIcon: DM, emptyTitle: UM, emptyText: HM }; function qM({ chain: a, onUnstakeEth: l, onUnstakeSol: i, onClaim: r, unstakePending: d, claimPending: f }) { var E; const { data: h, isLoading: g, isError: m, error: p } = TL(a), y = { active: me.badgeActive, ready: me.badgeReady, muted: me.badgeMuted }, _ = (h == null ? void 0 : h.chain) === "ETH" ? h.stEthBalanceWeiHuman : (h == null ? void 0 : h.chain) === "SOL" ? h.positions.reduce((R, L) => R + (parseFloat(L.lamportsHuman) || 0), 0).toString() : "0", b = a === "ETH" ? "stETH" : "SOL", S = (h == null ? void 0 : h.chain) === "ETH" && (parseFloat(h.stEthBalanceWeiHuman) || 0) < 1e-11 && h.withdrawalRequests.length === 0, j = (h == null ? void 0 : h.chain) === "SOL" && h.positions.length === 0, w = S || j; return o.jsx("div", { className: me.panel, children: o.jsxs("div", { className: me.inner, children: [o.jsxs("div", { className: me.head, children: [o.jsx("span", { className: me.title, children: "Мои позиции" }), o.jsxs("div", { className: me.total, children: [nt(m ? "0" : _, 6), " ", o.jsx("span", { className: me.totalUnit, children: b })] })] }), o.jsxs("div", { className: me.body, children: [!g && !m && !w && o.jsx(Sy, { compact: !0 }), g && o.jsx(zn, { label: "Загрузка позиций" }), m && o.jsx("div", { className: me.empty, children: ar(p) }), !g && !m && (w || (h == null ? void 0 : h.chain) === "ETH" && (parseFloat(h.stEthBalanceWeiHuman) || 0) < 1e-14) && o.jsxs("div", { className: me.emptyState, children: [o.jsx("span", { className: me.emptyIcon, "aria-hidden": !0, children: o.jsxs("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", children: [o.jsx("path", { d: "M3 7.5 12 3l9 4.5-9 4.5z" }), o.jsx("path", { d: "M3 12.5 12 17l9-4.5" }), o.jsx("path", { d: "M3 16.5 12 21l9-4.5" })] }) }), o.jsx("p", { className: me.emptyTitle, children: "Активных позиций пока нет" }), o.jsx("p", { className: me.emptyText, children: "На данный момент у Вас нет активных позиций стейкинга." })] }), !m && (h == null ? void 0 : h.chain) === "ETH" && !w && o.jsxs(o.Fragment, { children: [(parseFloat(h.stEthBalanceWeiHuman) || 0) > 1e-14 && o.jsx("div", { className: me.list, children: o.jsxs("div", { className: `${me.pos} ${h.optimistic ? me.pending : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: [o.jsx(kl, { letter: "E", color: "var(--grad-center)", logo: _e.ETH, size: 24 }), "stETH"] }), o.jsxs("span", { className: `${me.badge} ${me.badgeActive}`, children: ["Активна", h.aprPercent != null ? ` · APR ${h.aprPercent}%` : ""] })] }), o.jsx("div", { className: me.amount, children: nt(h.stEthBalanceWeiHuman, 8) }), o.jsx("button", { className: me.btn, onClick: () => l(h.stEthBalanceWeiHuman), disabled: d, children: "Вывести" })] }) }), (parseFloat((E = h.withdrawalRequests[0]) == null ? void 0 : E.amountStEthWeiHuman) || 0) > 1e-14 && o.jsxs(o.Fragment, { children: [o.jsx("div", { className: me.subhead, children: "Заявки на вывод" }), o.jsx("div", { className: me.list, children: h.withdrawalRequests.map(R => { const L = R.isFinalized && !R.isClaimed; return o.jsxs("div", { className: `${me.pos} ${L ? me.reqCard : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: ["Заявка #", R.requestId] }), o.jsx("span", { className: `${me.badge} ${R.isClaimed ? me.badgeMuted : L ? me.badgeReady : me.badgeMuted}`, children: R.isClaimed ? "Выведено" : L ? "Готово к выводу" : "В очереди" })] }), o.jsxs("div", { className: me.amount, children: [nt(R.amountStEthWeiHuman, 8), " ETH"] }), L ? o.jsx("button", { className: `${me.btn} ${me.btnPrimary}`, onClick: () => r(R.requestId), disabled: f, children: "Забрать ETH" }) : R.isClaimed ? null : o.jsx("div", { className: me.note, children: "Ожидает финализации в Lido" })] }, R.requestId) }) })] })] }), !m && (h == null ? void 0 : h.chain) === "SOL" && !w && o.jsx("div", { className: me.list, children: h.positions.map(R => { const L = fL[R.state]; return o.jsxs("div", { className: `${me.pos} ${R.optimistic ? me.pending : ""}`, children: [o.jsxs("div", { className: me.posTop, children: [o.jsxs("span", { className: me.coin, children: [o.jsx(kl, { letter: "S", color: "var(--grad-center)", logo: _e.SOL, size: 24 }), "SOL"] }), o.jsx("span", { className: `${me.badge} ${y[L.variant]}`, children: L.label })] }), o.jsx("div", { className: me.amount, children: nt(R.lamportsHuman, 8) }), o.jsxs("div", { className: me.meta, children: ["Валидатор: ", R.validator, " · ", R.stakeAccount] }), R.state === "active" && o.jsx("button", { className: me.btn, onClick: () => i(R), disabled: d, children: "Вывести" }), R.state === "inactive" && o.jsx("button", { className: `${me.btn} ${me.btnPrimary}`, onClick: () => i(R), disabled: d, children: "Вывести средства" }), R.state === "deactivating" && o.jsx("div", { className: me.note, children: "Разблокируется через 1–2 эпохи" }), R.state === "activating" && o.jsx("div", { className: me.note, children: "Активируется…" })] }, R.stakeAccount) }) })] })] }) }) } const PM = "_overlay_17qoe_1", QM = "_card_17qoe_13", FM = "_header_17qoe_25", YM = "_title_17qoe_31", IM = "_closeBtn_17qoe_37", GM = "_token_17qoe_52", KM = "_tokenLabel_17qoe_62", XM = "_tokenAmount_17qoe_70", VM = "_modes_17qoe_77", ZM = "_mode_17qoe_77", WM = "_modeActive_17qoe_101", JM = "_modeTitle_17qoe_106", $M = "_modeDesc_17qoe_112", ez = "_solNote_17qoe_118", tz = "_confirmBtn_17qoe_125", kt = { overlay: PM, card: QM, header: FM, title: YM, closeBtn: IM, token: GM, tokenLabel: KM, tokenAmount: XM, modes: VM, mode: ZM, modeActive: WM, modeTitle: JM, modeDesc: $M, solNote: ez, confirmBtn: tz }; function j1({ chain: a, symbol: l, amount: i, solState: r, pending: d, onConfirm: f, onClose: h }) { const [g, m] = A.useState("swap"); A.useEffect(() => { function b(S) { S.key === "Escape" && h() } return document.addEventListener("keydown", b), () => document.removeEventListener("keydown", b) }, [h]); const p = a === "SOL" && r === "inactive", y = d ? "Отправка…" : a === "ETH" ? "Подтвердить вывод" : p ? "Вывести средства" : "Запустить деактивацию", _ = a === "SOL" || a === "ETH" && g === "queue"; return o.jsx("div", { className: kt.overlay, onClick: h, children: o.jsxs("div", { className: kt.card, onClick: b => b.stopPropagation(), children: [o.jsxs("div", { className: kt.header, children: [o.jsx("span", { className: kt.title, children: "Вывод из стейкинга" }), o.jsx("button", { className: kt.closeBtn, onClick: h, children: "×" })] }), o.jsxs("div", { className: kt.token, children: [o.jsx("span", { className: kt.tokenLabel, children: "Сумма" }), o.jsxs("span", { className: kt.tokenAmount, children: [i, " ", a === "ETH" ? "stETH" : l] })] }), a === "ETH" && o.jsxs("div", { className: kt.modes, children: [o.jsxs("button", { className: `${kt.mode} ${g === "swap" ? kt.modeActive : ""}`, onClick: () => m("swap"), children: [o.jsx("span", { className: kt.modeTitle, children: "Мгновенно" }), o.jsx("span", { className: kt.modeDesc, children: "Своп stETH → ETH через Curve" })] }), o.jsxs("button", { className: `${kt.mode} ${g === "queue" ? kt.modeActive : ""}`, onClick: () => m("queue"), children: [o.jsx("span", { className: kt.modeTitle, children: "Очередь" }), o.jsx("span", { className: kt.modeDesc, children: "Заявка в Lido Withdrawal Queue" })] })] }), a === "SOL" && !p && o.jsx("p", { className: kt.solNote, children: "Средства разблокируются через 1–2 эпохи. После завершения вернитесь и подтвердите вывод." }), _ && o.jsx(Sy, {}), o.jsx("button", { className: kt.confirmBtn, onClick: () => f(a === "ETH" ? g : void 0), disabled: d, children: y })] }) }) } const nz = "_widget_wxtkp_1", az = "_grid_wxtkp_7", w1 = { widget: nz, grid: az }; function sz() { const [a, l] = A.useState("ETH"), [i, r] = A.useState(""), [d, f] = A.useState(null), [h, g] = A.useState(null), m = RL(), p = kL(), y = BL(); function _(w) { l(w), r("") } function b(w) { m.mutate({ chain: a, amountHuman: w }, { onSuccess: () => { g({ status: "success", message: `Стейкинг ${nt(w, 6)} ${xy[a].symbol} выполнен` }), r("") }, onError: E => g({ status: "error", message: ar(E) }) }) } function S(w) { if ((d == null ? void 0 : d.kind) === "eth") { const E = w ?? "swap"; p.mutate({ chain: "ETH", amountHuman: d.amount, mode: E }, { onSuccess: () => { f(null), g({ status: "success", message: E === "queue" ? "Заявка на вывод добавлена в очередь Lido" : "Вывод stETH → ETH выполнен" }) }, onError: R => g({ status: "error", message: ar(R) }) }) } else (d == null ? void 0 : d.kind) === "sol" && p.mutate({ chain: "SOL", stakeAccount: d.position.stakeAccount }, { onSuccess: E => { f(null); const R = "action" in E && E.action === "withdraw"; g({ status: "success", message: R ? "Средства выведены на кошелёк" : "Деактивация запущена — вывод через 1–2 эпохи" }) }, onError: E => g({ status: "error", message: ar(E) }) }) } function j(w) { y.mutate(w, { onSuccess: () => g({ status: "success", message: "ETH забран на кошелёк" }), onError: E => g({ status: "error", message: ar(E) }) }) } return o.jsxs("div", { className: w1.widget, children: [o.jsx(vL, { value: a, onChange: _ }), o.jsxs("div", { className: w1.grid, children: [o.jsx(rM, { chain: a, amount: i, onAmountChange: r, onStake: b, isStaking: m.isPending }), o.jsx(qM, { chain: a, onUnstakeEth: w => f({ kind: "eth", amount: w }), onUnstakeSol: w => f({ kind: "sol", position: w }), onClaim: j, unstakePending: p.isPending, claimPending: y.isPending })] }), (d == null ? void 0 : d.kind) === "eth" && o.jsx(j1, { chain: "ETH", symbol: "ETH", amount: d.amount, pending: p.isPending, onConfirm: S, onClose: () => f(null) }), (d == null ? void 0 : d.kind) === "sol" && o.jsx(j1, { chain: "SOL", symbol: "SOL", amount: d.position.lamportsHuman, solState: d.position.state, pending: p.isPending, onConfirm: S, onClose: () => f(null) }), h && o.jsx($a, { status: h.status, message: h.message, onClose: () => g(null), duration: 5e3 })] }) } const lz = "_page_1j4fk_1", iz = "_head_1j4fk_8", oz = "_title_1j4fk_12", rz = "_subtitle_1j4fk_19", Xc = { page: lz, head: iz, title: oz, subtitle: rz }; function cz() { return o.jsxs("div", { className: Xc.page, children: [o.jsxs("header", { className: Xc.head, children: [o.jsx("h1", { className: Xc.title, children: "Стейкинг" }), o.jsx("p", { className: Xc.subtitle, children: "Выберите сеть и укажите, сколько монет хотите застейкать. Ваши средства отправляются в стейкинг и начинают приносить доход (APR). Все ваши вклады видны в блоке «Мои позиции», откуда их можно вывести вместе с накопленной наградой. Учтите, что вывод средств занимает некоторое время. Комиссия сервиса — 0.7%." })] }), o.jsx(sz, {})] }) } const jy = "https://app.cryptowallet.elcsa.ru"; async function lm(a, l = !0) { const i = await nn(), r = Nt.get(), d = await fetch(`${jy}${a}`, { credentials: "include", headers: { "X-CSRF-Token": i, ...r ? { Authorization: `Bearer ${r}` } : {} } }); if (d.status === 401 && l) try { return await ca(), lm(a, !1) } catch { throw Nt.clear(), new Error("Unauthorized") } const f = await d.json(); if (!d.ok) throw f; return f } async function xu(a, l, i = !0, r = {}) { const d = await nn(), f = Nt.get(), h = await fetch(`${jy}${a}`, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json", "X-CSRF-Token": d, ...f ? { Authorization: `Bearer ${f}` } : {}, ...r }, body: JSON.stringify(l) }); if (h.status === 401 && i) try { return await ca(), xu(a, l, !1, r) } catch { throw Nt.clear(), new Error("Unauthorized") } const g = await h.json(); if (!h.ok) throw g; return g } function wy() { return { "Idempotency-Key": crypto.randomUUID() } } async function uz() { return (await lm("/api/wallets/ETH/lp/pools")).data } function Ey(a) { const { pool: l, amount0Human: i, amount1Human: r, priceLower: d, priceUpper: f, slippageBps: h, useNativeEth: g } = a; return { pool: l.poolAddress, priceLower: d, priceUpper: f, amount0Desired: ra(i || "0", l.decimals0), amount1Desired: ra(r || "0", l.decimals1), ...h != null ? { slippageBps: h } : {}, ...g != null ? { useNativeEth: g } : {} } } async function dz(a) { return (await xu("/api/wallets/ETH/lp/quote", Ey(a))).data } async function fz(a) { return (await xu("/api/wallets/ETH/lp/add", Ey(a), !0, wy())).data } async function hz(a, l = 100) { return (await xu("/api/wallets/ETH/lp/remove", { tokenId: a, percent: l }, !0, wy())).data } async function mz() { return (await lm("/api/wallets/ETH/lp/positions")).data } function Vc(a) { if (a && typeof a == "object" && "error" in a) { const l = a.error; if (typeof l == "string") return l } return a instanceof Error ? a.message === "Unauthorized" ? "Сессия истекла — перезагрузите страницу." : a.message : "Произошла ошибка. Попробуйте ещё раз." } function pz() { return Ct({ queryKey: ["pools", "list"], queryFn: uz, staleTime: 3e4, retry: !1 }) } function gz() { return Ct({ queryKey: ["pools", "positions"], queryFn: mz, staleTime: 3e4, retry: !1 }) } function vz(a) { const l = a != null && a.priceLower > 0 && a.priceUpper > 0 && (parseFloat(a.amount0Human) > 0 || parseFloat(a.amount1Human) > 0); return Ct({ queryKey: ["pools", "quote", a == null ? void 0 : a.pool.poolAddress, a == null ? void 0 : a.priceLower, a == null ? void 0 : a.priceUpper, a == null ? void 0 : a.amount0Human, a == null ? void 0 : a.amount1Human, a == null ? void 0 : a.slippageBps, a == null ? void 0 : a.useNativeEth], queryFn: () => dz(a), enabled: l, staleTime: 15e3, retry: !1 }) } function yz() { const a = Wt(); return yt({ mutationFn: l => fz(l), onSettled: () => { setTimeout(() => { a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }), a.invalidateQueries({ queryKey: ["pools", "positions"] }) }, 1500), setTimeout(() => { a.invalidateQueries({ queryKey: ["pools", "positions"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) }, 6e3) } }) } function _z() { const a = Wt(); return yt({ mutationFn: ({ tokenId: l, percent: i }) => hz(l, i), onSuccess: () => { a.invalidateQueries({ queryKey: ["pools", "positions"] }), a.invalidateQueries({ queryKey: ["wallet", "balance", "ETH"] }) } }) } const bz = { WETH: "ETH", WBTC: "BTC" }; function ut(a) { return bz[a] ?? a } function Au(a) { return `${a / 1e4}%` } const xz = "_card_1uvgu_1", Az = "_head_1uvgu_8", Sz = "_title_1uvgu_12", jz = "_scroll_1uvgu_20", wz = "_message_1uvgu_24", Ez = "_spinnerWrap_1uvgu_31", Nz = "_table_1uvgu_38", Cz = "_thLeft_1uvgu_55", Tz = "_sortable_1uvgu_59", Rz = "_arrow_1uvgu_69", kz = "_row_1uvgu_73", Bz = "_rowSelected_1uvgu_74", Oz = "_tdLeft_1uvgu_96", Lz = "_tdAction_1uvgu_100", Mz = "_mono_1uvgu_104", zz = "_apr_1uvgu_108", Dz = "_pairName_1uvgu_113", Uz = "_fee_1uvgu_118", Hz = "_btn_1uvgu_128", qz = "_btnSelected_1uvgu_129", rt = { card: xz, head: Az, title: Sz, scroll: jz, message: wz, spinnerWrap: Ez, table: Nz, thLeft: Cz, sortable: Tz, arrow: Rz, row: kz, rowSelected: Bz, tdLeft: Oz, tdAction: Lz, mono: Mz, apr: zz, pairName: Dz, fee: Uz, btn: Hz, btnSelected: qz }, Ny = "—"; function E1(a) { return a == null ? Ny : a >= 1e6 ? `$${(a / 1e6).toFixed(2)}M` : a >= 1e3 ? `$${(a / 1e3).toFixed(2)}K` : `$${a.toFixed(2)}` } function Pz(a) { return a.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) } function Qz(a) { return a == null ? Ny : `${parseFloat(a.toFixed(3))}%` } function N1(a) { return `${ut(a.symbol0)}/${ut(a.symbol1)}` } function Fz(a, l, i, r) { if (i === "pair") { const g = N1(a).localeCompare(N1(l)); return r === "asc" ? g : -g } const d = a[i], f = l[i]; if (d == null && f == null) return 0; if (d == null) return 1; if (f == null) return -1; const h = d - f; return r === "asc" ? h : -h } function Yz({ pools: a, selected: l, onSelect: i, loading: r, error: d }) { const [f, h] = A.useState(null), [g, m] = A.useState(null); function p(S) { if (f !== S) { h(S), m("desc"); return } g === "desc" ? m("asc") : g === "asc" ? (h(null), m(null)) : m("desc") } const y = A.useMemo(() => !f || !g ? a : [...a].sort((S, j) => Fz(S, j, f, g)), [a, f, g]); function _(S) { return f !== S || !g ? "" : g === "desc" ? " ▼" : " ▲" } const b = [{ key: "pair", label: "Пул", align: "left" }, { key: "feeTier", label: "Комиссия", align: "right" }, { key: "currentPrice", label: "Цена", align: "right" }, { key: "tvlUSD", label: "TVL", align: "right" }, { key: "volumeUSD24h", label: "Объём 24ч", align: "right" }, { key: "aprPercent", label: "APR", align: "right" }]; return o.jsxs("div", { className: rt.card, children: [o.jsx("div", { className: rt.head, children: o.jsx("span", { className: rt.title, children: "Курируемые пулы" }) }), r && o.jsx("div", { className: rt.spinnerWrap, children: o.jsx(zn, { label: "Загрузка пулов" }) }), !r && d && o.jsx("div", { className: rt.message, children: d }), !r && !d && a.length === 0 && o.jsx("div", { className: rt.message, children: "Курируемых пулов пока нет." }), !r && !d && a.length > 0 && o.jsx("div", { className: rt.scroll, children: o.jsxs("table", { className: rt.table, children: [o.jsx("thead", { children: o.jsxs("tr", { children: [b.map(S => o.jsxs("th", { className: `${rt.sortable} ${S.align === "left" ? rt.thLeft : ""}`, onClick: () => p(S.key), "aria-sort": f === S.key ? g === "asc" ? "ascending" : "descending" : "none", children: [S.label, o.jsx("span", { className: rt.arrow, children: _(S.key) })] }, S.key)), o.jsx("th", { "aria-label": "Действие" })] }) }), o.jsx("tbody", { children: y.map(S => { const j = S.poolAddress === l; return o.jsxs("tr", { className: j ? rt.rowSelected : rt.row, onClick: () => i(S.poolAddress), children: [o.jsx("td", { className: rt.tdLeft, children: o.jsxs("span", { className: rt.pairName, children: [ut(S.symbol0), "/", ut(S.symbol1)] }) }), o.jsx("td", { children: o.jsx("span", { className: rt.fee, children: Au(S.feeTier) }) }), o.jsx("td", { className: rt.mono, children: Pz(S.currentPrice) }), o.jsx("td", { className: rt.mono, children: E1(S.tvlUSD) }), o.jsx("td", { className: rt.mono, children: E1(S.volumeUSD24h) }), o.jsx("td", { className: `${rt.mono} ${rt.apr}`, children: Qz(S.aprPercent) }), o.jsx("td", { className: rt.tdAction, children: o.jsx("button", { type: "button", className: j ? rt.btnSelected : rt.btn, onClick: w => { w.stopPropagation(), i(S.poolAddress) }, children: j ? "Выбран" : "Выбрать" }) })] }, S.poolAddress) }) })] }) })] }) } const Iz = "_card_9umyw_1", Gz = "_top_9umyw_8", Kz = "_pair_9umyw_16", Xz = "_fee_9umyw_25", Vz = "_tag_9umyw_34", Zz = "_amounts_9umyw_44", Wz = "_amountField_9umyw_51", Jz = "_balance_9umyw_57", $z = "_amountRow_9umyw_64", eD = "_amountInput_9umyw_75", tD = "_token_9umyw_91", nD = "_range_9umyw_101", aD = "_priceField_9umyw_108", sD = "_priceLabel_9umyw_118", lD = "_priceInput_9umyw_124", iD = "_quote_9umyw_140", oD = "_quoteRow_9umyw_147", rD = "_quoteLabel_9umyw_160", cD = "_quoteValue_9umyw_165", uD = "_feeValue_9umyw_173", dD = "_success_9umyw_178", fD = "_warning_9umyw_182", hD = "_submit_9umyw_190", mD = "_placeholder_9umyw_195", pD = "_placeholderTitle_9umyw_207", gD = "_placeholderText_9umyw_214", Ee = { card: Iz, top: Gz, pair: Kz, fee: Xz, tag: Vz, amounts: Zz, amountField: Wz, balance: Jz, amountRow: $z, amountInput: eD, token: tD, range: nD, priceField: aD, priceLabel: sD, priceInput: lD, quote: iD, quoteRow: oD, quoteLabel: rD, quoteValue: cD, feeValue: uD, success: dD, warning: fD, submit: hD, placeholder: mD, placeholderTitle: pD, placeholderText: gD }, Zc = "—", im = /^(\d+\.?\d*|\.?\d*)$/; function C1(a, l) { var i; return a ? ut(l) === a.chain ? a.native.formatted : ((i = a.tokens[l]) == null ? void 0 : i.formatted) ?? "0" : "0" } function T1({ symbol: a, value: l, onChange: i, balance: r }) { return o.jsxs("div", { className: Ee.amountField, children: [o.jsxs("div", { className: Ee.amountRow, children: [o.jsx("input", { className: Ee.amountInput, type: "text", inputMode: "decimal", value: l, onChange: d => { const f = d.target.value; (im.test(f) || f === "") && i(f) }, placeholder: "0", "aria-label": `Сумма ${a}` }), o.jsx("div", { className: Ee.token, children: o.jsx("span", { children: a }) })] }), o.jsxs("span", { className: Ee.balance, children: ["Баланс: ", nt(r, 6), " ", a] })] }) } function R1({ label: a, value: l, onChange: i }) { return o.jsxs("label", { className: Ee.priceField, children: [o.jsx("span", { className: Ee.priceLabel, children: a }), o.jsx("input", { className: Ee.priceInput, type: "text", inputMode: "decimal", value: l, onChange: r => { const d = r.target.value; (im.test(d) || d === "") && i(d) }, placeholder: "0" })] }) } function vD({ pool: a, quote: l, quoteFetching: i, pending: r, amount0: d, amount1: f, priceLower: h, priceUpper: g, slippage: m, onAmount0Change: p, onAmount1Change: y, onPriceLowerChange: _, onPriceUpperChange: b, onSlippageChange: S, onSubmit: j }) { const { data: w } = Yi("ETH"); if (!a) return o.jsx("div", { className: Ee.card, children: o.jsxs("div", { className: Ee.placeholder, children: [o.jsx("p", { className: Ee.placeholderTitle, children: "Выберите пул" }), o.jsx("p", { className: Ee.placeholderText, children: "Выберите пул в таблице выше, чтобы внести ликвидность." })] }) }); const E = l == null ? void 0 : l.balance, R = (E == null ? void 0 : E.sufficient) === !1, L = (l == null ? void 0 : l.aprPercent) != null ? `${l.aprPercent}%` : Zc, B = (l == null ? void 0 : l.appFeeTotalUsd) != null ? `≈ $${l.appFeeTotalUsd.toFixed(2)}` : Zc, P = l ? nt(l.amount0DesiredHuman, 8) : Zc, G = l ? nt(l.amount1DesiredHuman, 8) : Zc, V = E && E.token1.sufficient === !1 ? E.token1 : E == null ? void 0 : E.token0, D = !!l && !R && !r; return o.jsxs("div", { className: Ee.card, children: [o.jsxs("div", { className: Ee.top, children: [o.jsxs("span", { className: Ee.pair, children: [ut(a.symbol0), "/", ut(a.symbol1)] }), o.jsx("span", { className: Ee.fee, children: Au(a.feeTier) })] }), o.jsx("span", { className: Ee.tag, children: "Суммы взноса" }), o.jsxs("div", { className: Ee.amounts, children: [o.jsx(T1, { symbol: ut(a.symbol0), value: d, onChange: p, balance: C1(w, a.symbol0) }), o.jsx(T1, { symbol: ut(a.symbol1), value: f, onChange: y, balance: C1(w, a.symbol1) })] }), o.jsxs("span", { className: Ee.tag, children: ["Диапазон цен (", ut(a.symbol1), " за ", ut(a.symbol0), ")"] }), o.jsxs("div", { className: Ee.range, children: [o.jsx(R1, { label: "Мин.", value: h, onChange: _ }), o.jsx(R1, { label: "Макс.", value: g, onChange: b }), o.jsxs("label", { className: Ee.priceField, children: [o.jsx("span", { className: Ee.priceLabel, children: "Проскальзывание, %" }), o.jsx("input", { className: Ee.priceInput, type: "text", inputMode: "decimal", value: m, onChange: K => { const ee = K.target.value; (im.test(ee) || ee === "") && S(ee) }, placeholder: "1" })] })] }), o.jsxs("div", { className: Ee.quote, "data-loading": i ? "true" : void 0, children: [o.jsxs("div", { className: Ee.quoteRow, children: [o.jsxs("span", { className: Ee.quoteLabel, children: ["Взнос ", ut(a.symbol0)] }), o.jsx("span", { className: Ee.quoteValue, children: P })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsxs("span", { className: Ee.quoteLabel, children: ["Взнос ", ut(a.symbol1)] }), o.jsx("span", { className: Ee.quoteValue, children: G })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsx("span", { className: Ee.quoteLabel, children: "Комиссия сервиса (0.7%)" }), o.jsx("span", { className: `${Ee.quoteValue} ${Ee.feeValue}`, children: B })] }), o.jsxs("div", { className: Ee.quoteRow, children: [o.jsx("span", { className: Ee.quoteLabel, children: "Годовая доходность (APR)" }), o.jsx("span", { className: `${Ee.quoteValue} ${Ee.success}`, children: L })] })] }), R && o.jsxs("p", { className: Ee.warning, children: ["Недостаточно средств", V ? `: не хватает ${ut(V.symbol)}` : "", ". Пополните баланс."] }), o.jsx("div", { className: Ee.submit, children: o.jsx(Zn, { label: r ? "Отправка…" : "Внести в пул", type: "button", onClick: j, disabled: !D }) })] }) } const yD = "_panel_1yqb9_1", _D = "_inner_1yqb9_8", bD = "_body_1yqb9_15", xD = "_head_1yqb9_60", AD = "_title_1yqb9_66", SD = "_total_1yqb9_74", jD = "_totalUnit_1yqb9_80", wD = "_list_1yqb9_85", ED = "_message_1yqb9_91", ND = "_pos_1yqb9_98", CD = "_posTop_1yqb9_105", TD = "_coin_1yqb9_113", RD = "_fee_1yqb9_122", kD = "_badge_1yqb9_131", BD = "_badgeActive_1yqb9_139", OD = "_badgeWarn_1yqb9_144", LD = "_rows_1yqb9_149", MD = "_row_1yqb9_149", zD = "_label_1yqb9_163", DD = "_value_1yqb9_168", UD = "_success_1yqb9_176", HD = "_btn_1yqb9_180", qD = "_emptyState_1yqb9_203", PD = "_emptyTitle_1yqb9_215", QD = "_emptyText_1yqb9_222", He = { panel: yD, inner: _D, body: bD, head: xD, title: AD, total: SD, totalUnit: jD, list: wD, message: ED, pos: ND, posTop: CD, coin: TD, fee: RD, badge: kD, badgeActive: BD, badgeWarn: OD, rows: LD, row: MD, label: zD, value: DD, success: UD, btn: HD, emptyState: qD, emptyTitle: PD, emptyText: QD }; function FD({ positions: a, onRemove: l, removePending: i, isLoading: r, error: d }) { const f = a.length === 0; return o.jsx("div", { className: He.panel, children: o.jsxs("div", { className: He.inner, children: [o.jsxs("div", { className: He.head, children: [o.jsx("span", { className: He.title, children: "Мои позиции" }), o.jsxs("div", { className: He.total, children: [a.length, " ", o.jsx("span", { className: He.totalUnit, children: "NFT" })] })] }), o.jsxs("div", { className: He.body, children: [r && o.jsx(zn, { label: "Загрузка позиций" }), !r && d && o.jsx("div", { className: He.message, children: d }), !r && !d && f && o.jsxs("div", { className: He.emptyState, children: [o.jsx("p", { className: He.emptyTitle, children: "Активных позиций пока нет" }), o.jsx("p", { className: He.emptyText, children: "На данный момент у Вас нет позиций в пулах ликвидности." })] }), !r && !d && !f && o.jsx("div", { className: He.list, children: a.map(h => o.jsxs("div", { className: He.pos, children: [o.jsxs("div", { className: He.posTop, children: [o.jsxs("span", { className: He.coin, children: [ut(h.symbol0), "/", ut(h.symbol1), o.jsx("span", { className: He.fee, children: Au(h.feeTier) })] }), o.jsx("span", { className: `${He.badge} ${h.inRange ? He.badgeActive : He.badgeWarn}`, children: h.inRange ? "В диапазоне" : "Вне диапазона" })] }), o.jsxs("div", { className: He.rows, children: [o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: "Диапазон цен" }), o.jsxs("span", { className: He.value, children: [h.priceLower, " – ", h.priceUpper] })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: ut(h.symbol0) }), o.jsx("span", { className: He.value, children: nt(h.currentAmount0Human, 8) })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: ut(h.symbol1) }), o.jsx("span", { className: He.value, children: nt(h.currentAmount1Human, 8) })] }), o.jsxs("div", { className: He.row, children: [o.jsx("span", { className: He.label, children: "Комиссии к выводу" }), o.jsxs("span", { className: `${He.value} ${He.success}`, children: [nt(h.feesOwed0Human, 8), " ", ut(h.symbol0), " · ", nt(h.feesOwed1Human, 8), " ", ut(h.symbol1)] })] })] }), o.jsx("button", { className: He.btn, onClick: () => l(h.tokenId), disabled: i, children: "Вывести" })] }, h.tokenId)) })] })] }) }) } const YD = "_overlay_mbhaz_1", ID = "_card_mbhaz_13", GD = "_header_mbhaz_25", KD = "_title_mbhaz_31", XD = "_closeBtn_mbhaz_37", VD = "_token_mbhaz_52", ZD = "_tokenLabel_mbhaz_62", WD = "_tokenAmount_mbhaz_70", JD = "_tokenMeta_mbhaz_77", $D = "_modes_mbhaz_83", eU = "_mode_mbhaz_83", tU = "_modeActive_mbhaz_107", nU = "_note_mbhaz_112", aU = "_confirmBtn_mbhaz_119", hn = { overlay: YD, card: ID, header: GD, title: KD, closeBtn: XD, token: VD, tokenLabel: ZD, tokenAmount: WD, tokenMeta: JD, modes: $D, mode: eU, modeActive: tU, note: nU, confirmBtn: aU }, sU = [25, 50, 100]; function lU({ position: a, pending: l, onConfirm: i, onClose: r }) { const [d, f] = A.useState(100); return A.useEffect(() => { function h(g) { g.key === "Escape" && r() } return document.addEventListener("keydown", h), () => document.removeEventListener("keydown", h) }, [r]), o.jsx("div", { className: hn.overlay, onClick: r, children: o.jsxs("div", { className: hn.card, onClick: h => h.stopPropagation(), children: [o.jsxs("div", { className: hn.header, children: [o.jsx("span", { className: hn.title, children: "Вывод ликвидности" }), o.jsx("button", { className: hn.closeBtn, onClick: r, children: "×" })] }), o.jsxs("div", { className: hn.token, children: [o.jsx("span", { className: hn.tokenLabel, children: "Позиция" }), o.jsxs("span", { className: hn.tokenAmount, children: [ut(a.symbol0), "/", ut(a.symbol1)] }), o.jsxs("span", { className: hn.tokenMeta, children: [Au(a.feeTier), " · #", a.tokenId] })] }), o.jsx("div", { className: hn.modes, children: sU.map(h => o.jsxs("button", { className: `${hn.mode} ${d === h ? hn.modeActive : ""}`, onClick: () => f(h), children: [h, "%"] }, h)) }), d === 100 && o.jsx("p", { className: hn.note, children: "При выводе 100% позиция (NFT) будет сожжена." }), o.jsx("button", { className: hn.confirmBtn, onClick: () => i(d), disabled: l, children: l ? "Отправка…" : "Подтвердить вывод" })] }) }) } const iU = "_widget_za8nj_1", oU = "_grid_za8nj_7", k1 = { widget: iU, grid: oU }, B1 = .05; function rU() { var W; const a = pz(), l = gz(), i = yz(), r = _z(), d = a.data ?? [], f = ((W = l.data) == null ? void 0 : W.positions) ?? [], [h, g] = A.useState(null), [m, p] = A.useState(""), [y, _] = A.useState(""), [b, S] = A.useState(""), [j, w] = A.useState(""), [E, R] = A.useState("1"), L = !1, [B, P] = A.useState(null), [G, V] = A.useState(null), D = d.find(ue => ue.poolAddress === h) ?? null; function K(ue) { g(ue); const be = d.find(T => T.poolAddress === ue); be && (S((be.currentPrice * (1 - B1)).toFixed(2)), w((be.currentPrice * (1 + B1)).toFixed(2))), p(""), _("") } A.useEffect(() => { !h && d.length > 0 && K(d[0].poolAddress) }, [d, h]); const ee = ba(m, 400), re = ba(y, 400), ce = ba(b, 400), ie = ba(j, 400), te = ba(E, 400), pe = A.useMemo(() => { if (!D) return null; const ue = parseFloat(te); return { pool: D, amount0Human: ee, amount1Human: re, priceLower: parseFloat(ce) || 0, priceUpper: parseFloat(ie) || 0, slippageBps: Number.isFinite(ue) ? Math.round(ue * 100) : void 0, useNativeEth: L } }, [D, ee, re, ce, ie, te, L]), ve = vz(pe); function q() { if (!D) return; const ue = parseFloat(E), be = { pool: D, amount0Human: m, amount1Human: y, priceLower: parseFloat(b) || 0, priceUpper: parseFloat(j) || 0, slippageBps: Number.isFinite(ue) ? Math.round(ue * 100) : void 0, useNativeEth: L }; V({ status: "info", message: "Внесение в пул может занять несколько минут…" }), i.mutate(be, { onSuccess: () => { V({ status: "success", message: `Депозит в пул ${ut(D.symbol0)}/${ut(D.symbol1)} выполнен` }), p(""), _("") }, onError: T => V({ status: "error", message: Vc(T) }) }) } function X(ue) { B && r.mutate({ tokenId: B.tokenId, percent: ue }, { onSuccess: () => { P(null), V({ status: "success", message: "Ликвидность выведена на кошелёк" }) }, onError: be => V({ status: "error", message: Vc(be) }) }) } return o.jsxs("div", { className: k1.widget, children: [o.jsx(Yz, { pools: d, selected: h, onSelect: K, loading: a.isLoading, error: a.isError ? Vc(a.error) : null }), o.jsxs("div", { className: k1.grid, children: [o.jsx(vD, { pool: D, quote: ve.data, quoteFetching: ve.isFetching, pending: i.isPending, amount0: m, amount1: y, priceLower: b, priceUpper: j, slippage: E, onAmount0Change: p, onAmount1Change: _, onPriceLowerChange: S, onPriceUpperChange: w, onSlippageChange: R, onSubmit: q }), o.jsx(FD, { positions: f, onRemove: ue => P(f.find(be => be.tokenId === ue) ?? null), removePending: r.isPending, isLoading: l.isLoading, error: l.isError ? Vc(l.error) : null })] }), B && o.jsx(lU, { position: B, pending: r.isPending, onConfirm: X, onClose: () => P(null) }), G && o.jsx($a, { status: G.status, message: G.message, onClose: () => V(null), duration: 5e3 })] }) } const cU = "_page_1j4fk_1", uU = "_head_1j4fk_8", dU = "_title_1j4fk_12", fU = "_subtitle_1j4fk_19", Wc = { page: cU, head: uU, title: dU, subtitle: fU }; function hU() { return o.jsxs("div", { className: Wc.page, children: [o.jsxs("header", { className: Wc.head, children: [o.jsx("h1", { className: Wc.title, children: "Пулы" }), o.jsx("p", { className: Wc.subtitle, children: "Выберите пул из списка, укажите, количество каждого токена, и задайте диапазон цен, в котором ваши деньги будут работать. Пока цена остаётся в этом диапазоне, вы зарабатываете на комиссиях с каждой сделки в пуле (это и есть APR). Внесённая позиция учитывается как NFT в блоке «Мои позиции», откуда её можно вывести вместе с накопленными комиссиями. Комиссия сервиса на депозит — 0.7%." })] }), o.jsx(rU, {})] }) } const mU = "_page_1f1vh_1", pU = "_rain_1f1vh_14", gU = "_drop_1f1vh_21", vU = "_content_1f1vh_49", yU = "_code_1f1vh_56", _U = "_digit_1f1vh_63", bU = "_coin_1f1vh_73", xU = "_title_1f1vh_90", AU = "_subtitle_1f1vh_97", SU = "_button_1f1vh_104", aa = { page: mU, rain: pU, drop: gU, content: vU, code: yU, digit: _U, coin: bU, title: xU, subtitle: AU, button: SU }, O1 = [{ letter: "₿", color: "#f7931a" }, { letter: "Ξ", color: "#627eea" }, { letter: "₮", color: "#26a17b" }, { letter: "◎", color: "#9945ff" }, { letter: "$", color: "#2775ca" }, { letter: "₽", color: "#4a6dff" }, { letter: "Ʉ", color: "#00d4ff" }], jU = [{ left: 6, size: 34, delay: 0, duration: 7.5 }, { left: 18, size: 26, delay: 2.1, duration: 9 }, { left: 29, size: 44, delay: 4.3, duration: 6.5 }, { left: 41, size: 22, delay: 1.2, duration: 10 }, { left: 54, size: 38, delay: 3.4, duration: 8 }, { left: 67, size: 28, delay: .6, duration: 9.5 }, { left: 78, size: 48, delay: 2.8, duration: 7 }, { left: 88, size: 24, delay: 5, duration: 8.5 }, { left: 95, size: 32, delay: 1.7, duration: 9.2 }]; function wU() { return o.jsxs(o.Fragment, { children: [o.jsx(Ll, {}), o.jsxs("main", { className: aa.page, children: [o.jsx("div", { className: aa.rain, "aria-hidden": "true", children: jU.map((a, l) => { const i = O1[l % O1.length]; return o.jsx("span", { className: aa.drop, style: { left: `${a.left}%`, animationDelay: `${a.delay}s`, animationDuration: `${a.duration}s` }, children: o.jsx(kl, { letter: i.letter, color: i.color, size: a.size }) }, l) }) }), o.jsxs("div", { className: aa.content, children: [o.jsxs("div", { className: aa.code, "aria-hidden": "true", children: [o.jsx("span", { className: aa.digit, children: "4" }), o.jsx("span", { className: aa.coin, children: o.jsx(kl, { letter: "₿", color: "#f7931a", size: 140 }) }), o.jsx("span", { className: aa.digit, children: "4" })] }), o.jsx("h1", { className: aa.title, children: "Такой страницы не существует" }), o.jsx("p", { className: aa.subtitle, children: "Похоже, курс этого маршрута обнулился. Проверьте адрес или вернитесь на главную." }), o.jsx(gn, { to: ae.HOME, className: aa.button, children: "На главную" })] })] }), o.jsx(Is, {})] }) } const EU = "_page_uz94v_1", NU = "_main_uz94v_8", CU = "_center_uz94v_13", Jc = { page: EU, main: NU, center: CU }; function L1({ footer: a = !1, center: l = !1 }) { return o.jsxs("div", { className: Jc.page, children: [o.jsx(nm, {}), o.jsx("main", { className: l ? `${Jc.main} ${Jc.center}` : Jc.main, children: o.jsx(mu, {}) }), a && o.jsx(Is, {})] }) } function TU() { const { pathname: a } = Zt(); return A.useEffect(() => { window.scrollTo(0, 0) }, [a]), null } function RU() { const { isAuthenticated: a, isLoading: l } = Lv(), i = Zt(); return l ? o.jsx(zn, { overlay: !0, size: "lg", label: "Загрузка" }) : a ? o.jsx(mu, {}) : o.jsx(Qi, { to: ae.LOGIN, state: { from: i }, replace: !0 }) } function kU() { var d, f; const { isAuthenticated: a, isLoading: l } = Lv(), r = ((f = (d = Zt().state) == null ? void 0 : d.from) == null ? void 0 : f.pathname) ?? ae.WALLET; return l ? o.jsx(zn, { overlay: !0, size: "lg", label: "Загрузка" }) : a ? o.jsx(Qi, { to: r, replace: !0 }) : o.jsx(mu, {}) } function BU() { return o.jsxs(jA, { children: [o.jsx(TU, {}), o.jsxs(eA, { children: [o.jsx(Qe, { path: ae.HOME, element: o.jsx(CN, {}) }), o.jsx(Qe, { path: ae.PUBLICHNAYA_OFERTA, element: o.jsx(nL, {}) }), o.jsx(Qe, { path: ae.POLITIKA_PERSONALNYH_DANNYH, element: o.jsx(sL, {}) }), o.jsx(Qe, { path: ae.POLITIKA_COOKIE, element: o.jsx(iL, {}) }), o.jsx(Qe, { path: ae.SOGLASIE_PERSONALNYH_DANNYH, element: o.jsx(rL, {}) }), o.jsx(Qe, { path: ae.REESTR_PD_RKN, element: o.jsx(uL, {}) }), o.jsx(Qe, { path: ae.REGISTER_TEST, element: o.jsx(R9, {}) }), o.jsxs(Qe, { element: o.jsx(kU, {}), children: [o.jsx(Qe, { path: ae.LOGIN, element: o.jsx(BB, {}) }), o.jsx(Qe, { path: ae.REGISTER, element: o.jsx(r9, {}) }), o.jsx(Qe, { path: ae.RESTORE_PASSWORD, element: o.jsx(LO, {}) })] }), o.jsxs(Qe, { element: o.jsx(RU, {}), children: [o.jsx(Qe, { element: o.jsx(L1, { footer: !0, center: !0 }), children: o.jsx(Qe, { path: ae.CONVERTER, element: o.jsx(Z9, {}) }) }), o.jsxs(Qe, { element: o.jsx(L1, { footer: !0 }), children: [o.jsx(Qe, { path: ae.SWAP, element: o.jsx(C8, {}) }), o.jsx(Qe, { path: ae.BRIDGE, element: o.jsx(ck, {}) }), o.jsx(Qe, { path: ae.STAKING, element: o.jsx(cz, {}) }), o.jsx(Qe, { path: ae.POOLS, element: o.jsx(hU, {}) }), o.jsxs(Qe, { path: ae.PROFILE, element: o.jsx(N6, {}), children: [o.jsx(Qe, { index: !0, element: o.jsx(Qi, { to: "details", replace: !0 }) }), o.jsx(Qe, { path: "details", element: o.jsx(C6, {}) }), o.jsx(Qe, { path: "security", element: o.jsx(T6, {}) }), o.jsx(Qe, { path: "mnemonic", element: o.jsx(Z6, {}) }), o.jsx(Qe, { path: "transactions", element: o.jsx(pB, {}) })] })] }), o.jsx(Qe, { path: ae.TRANSACTIONS, element: o.jsx(Qi, { to: ae.PROFILE_TRANSACTIONS, replace: !0 }) }), o.jsx(Qe, { path: ae.WALLET, element: o.jsx(Wg, {}) }), o.jsx(Qe, { path: ae.WALLET_CHAIN, element: o.jsx(Wg, {}) }), o.jsx(Qe, { path: ae.SEED_PHRASE, element: o.jsx(eO, {}) }), o.jsx(Qe, { path: ae.KYC, element: o.jsx(xO, {}) })] }), o.jsx(Qe, { path: "*", element: o.jsx(wU, {}) })] })] }) } const OU = new Nj({ defaultOptions: { queries: { retry: !1 } } }); function LU({ children: a }) { return o.jsx(Cj, { client: OU, children: a }) } function MU() { return o.jsx(LU, { children: o.jsx(BU, {}) }) } ex.createRoot(document.getElementById("root")).render(o.jsx(A.StrictMode, { children: o.jsx(MU, {}) })); diff --git a/src/pages/politika-cookie/model/content.ts b/src/pages/politika-cookie/model/content.ts index a772821..3695c85 100644 --- a/src/pages/politika-cookie/model/content.ts +++ b/src/pages/politika-cookie/model/content.ts @@ -319,7 +319,7 @@ export const politikaCookieDoc: LegalDocData = { 'ИНН: 9810001062', 'ОГРН: 1257800060990', 'Юридический адрес: 196246, город Санкт-Петербург, Московское ш, д. 25 к. 1 литера В, помещ. 3-н', - 'Email компании: company@bitforcefoundation.ru', + 'Email компании: company@elcsa.ru', ], }, { kind: 'subheading', text: 'Порядок рассмотрения обращений:' }, diff --git a/src/pages/politika-personalnyh-dannyh/model/content.ts b/src/pages/politika-personalnyh-dannyh/model/content.ts index 41eef99..51ede9f 100644 --- a/src/pages/politika-personalnyh-dannyh/model/content.ts +++ b/src/pages/politika-personalnyh-dannyh/model/content.ts @@ -58,7 +58,7 @@ export const politikaPersonalnyhDannyhDoc: LegalDocData = { 'ИНН: 9810001062', 'ОГРН: 1257800060990', 'Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н', - 'Электронная почта: company@bitforcefoundation.ru', + 'Электронная почта: company@elcsa.ru', 'Веб-сайт: https://bitforce-foundation.ru', ], }, @@ -352,7 +352,7 @@ export const politikaPersonalnyhDannyhDoc: LegalDocData = { kind: 'infoBox', lines: [ 'Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н', - 'Электронная почта: company@bitforcefoundation.ru', + 'Электронная почта: company@elcsa.ru', ], }, ], diff --git a/src/pages/publichnaya-oferta/model/content.ts b/src/pages/publichnaya-oferta/model/content.ts index f4c842f..41e718c 100644 --- a/src/pages/publichnaya-oferta/model/content.ts +++ b/src/pages/publichnaya-oferta/model/content.ts @@ -227,7 +227,7 @@ export const publichnayaOfertaDoc: LegalDocData = { 'ОГРН: 1257800060990', 'ОКПО / ОКАТО / ОКТМО: 68342261 / 40284000000 / 40377000000', 'Руководитель: Кленин Михаил Васильевич', - 'Электронная почта: company@bitforcefoundation.ru', + 'Электронная почта: company@elcsa.ru', 'Наименование банка: ФИЛИАЛ "САНКТ-ПЕТЕРБУРГСКИЙ" АО "АЛЬФА-БАНК"', 'Корреспондентский счет: 30101810600000000786', 'БИК: 044030786', diff --git a/src/pages/reestr-pd-rkn/model/content.ts b/src/pages/reestr-pd-rkn/model/content.ts index 9a29679..d29717f 100644 --- a/src/pages/reestr-pd-rkn/model/content.ts +++ b/src/pages/reestr-pd-rkn/model/content.ts @@ -38,7 +38,7 @@ export const reestrDoc: LegalDocData = { strong: 'Юридический адрес:', text: '196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н', }, - { strong: 'Контактная информация:', text: 'company@bitforcefoundation.ru' }, + { strong: 'Контактная информация:', text: 'company@elcsa.ru' }, ], }, ], diff --git a/src/pages/soglasie-personalnyh-dannyh/model/content.ts b/src/pages/soglasie-personalnyh-dannyh/model/content.ts index e70f3bd..67bfa6c 100644 --- a/src/pages/soglasie-personalnyh-dannyh/model/content.ts +++ b/src/pages/soglasie-personalnyh-dannyh/model/content.ts @@ -23,7 +23,7 @@ export const soglasieDoc: LegalDocData = { 'ИНН: 9810001062', 'ОГРН: 1257800060990', 'Юридический адрес: 196246, город Санкт-Петербург, Московское шоссе, дом 25, корпус 1, литера В, помещение 3-н', - 'Электронная почта: company@bitforcefoundation.ru', + 'Электронная почта: company@elcsa.ru', 'Веб-сайт: https://bitforce-foundation.ru', ], }, @@ -280,7 +280,7 @@ export const soglasieDoc: LegalDocData = { { kind: 'list', items: [ - 'Обращения направляются на адрес: company@bitforcefoundation.ru', + 'Обращения направляются на адрес: company@elcsa.ru', 'Обращения рассматриваются в течение 30 дней', 'При необходимости срок может быть продлен на 30 дней', ], @@ -323,7 +323,7 @@ export const soglasieDoc: LegalDocData = { kind: 'infoBox', lines: [ 'Почтовый адрес: 196246, г. Санкт-Петербург, Московское ш., д. 25, к. 1, лит. В, пом. 3-н', - 'Электронная почта: company@bitforcefoundation.ru', + 'Электронная почта: company@elcsa.ru', 'Ответственное лицо: Кленин Михаил Васильевич', 'Официальный сайт: https://bitforce-foundation.ru', ],