diff --git a/apps/kyberswap-interface/.env b/apps/kyberswap-interface/.env index 3127fa437b..f4c4678d07 100644 --- a/apps/kyberswap-interface/.env +++ b/apps/kyberswap-interface/.env @@ -44,6 +44,7 @@ VITE_ZAP_API_URL=https://zap-api.kyberswap.com VITE_ZAP_EARN_URL=https://earn-service.kyberswap.com/api # VITE_ZAP_EARN_URL=https://pre-zap-earn-service.kyberengineering.io/api VITE_KYBER_AI_API_URL=https://kd-api.kyberswap.com/api +VITE_COPY_TRADING_API_URL=https://pre-copy-trade-api.kyberengineering.io/api/v1 VITE_AFFILIATE_SERVICE=https://affiliate-service.kyberswap.com/api VITE_SOLANA_RPC=https://solana-rpc.kyberswap.com diff --git a/apps/kyberswap-interface/index.html b/apps/kyberswap-interface/index.html index 89eaca41d7..9b47087e66 100644 --- a/apps/kyberswap-interface/index.html +++ b/apps/kyberswap-interface/index.html @@ -322,6 +322,12 @@ +
diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/agents.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/agents.svg new file mode 100644 index 0000000000..3c13dfd445 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/agents.svg @@ -0,0 +1,9 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_aum.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_aum.svg new file mode 100644 index 0000000000..6357c2f568 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_aum.svg @@ -0,0 +1,9 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_cash.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_cash.svg new file mode 100644 index 0000000000..f5e7ce254a --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_cash.svg @@ -0,0 +1,10 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_history.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_history.svg new file mode 100644 index 0000000000..87d70aa17e --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_history.svg @@ -0,0 +1,18 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_opens.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_opens.svg new file mode 100644 index 0000000000..6f65efb1e8 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_opens.svg @@ -0,0 +1,9 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_pnl.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_pnl.svg new file mode 100644 index 0000000000..e5abe124fd --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_pnl.svg @@ -0,0 +1,11 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/ic_winrate.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_winrate.svg new file mode 100644 index 0000000000..2000611f89 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/ic_winrate.svg @@ -0,0 +1,8 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/money.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/money.svg new file mode 100644 index 0000000000..c46c09c710 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/money.svg @@ -0,0 +1,6 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/position-close.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/position-close.svg new file mode 100644 index 0000000000..139d56c2ec --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/position-close.svg @@ -0,0 +1,10 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/position-open.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/position-open.svg new file mode 100644 index 0000000000..bd6ed7ac1e --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/position-open.svg @@ -0,0 +1,10 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/users.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/users.svg new file mode 100644 index 0000000000..1288e51912 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/users.svg @@ -0,0 +1,6 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/verified.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/verified.svg new file mode 100644 index 0000000000..d6b6f8f1ee --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/verified.svg @@ -0,0 +1,4 @@ + diff --git a/apps/kyberswap-interface/src/assets/images/copy-trading/volume.svg b/apps/kyberswap-interface/src/assets/images/copy-trading/volume.svg new file mode 100644 index 0000000000..8d4a217813 --- /dev/null +++ b/apps/kyberswap-interface/src/assets/images/copy-trading/volume.svg @@ -0,0 +1,14 @@ + diff --git a/apps/kyberswap-interface/src/components/CollapsiblePresetControl/index.tsx b/apps/kyberswap-interface/src/components/CollapsiblePresetControl/index.tsx new file mode 100644 index 0000000000..a171d9b318 --- /dev/null +++ b/apps/kyberswap-interface/src/components/CollapsiblePresetControl/index.tsx @@ -0,0 +1,210 @@ +import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react' +import { ChevronDown } from 'react-feather' + +import { Stack } from 'components/Stack' +import { cn } from 'utils/cn' + +export type CollapsiblePresetControlOption = { + label: ReactNode + value: number +} + +export type CollapsiblePresetControlProps = { + children?: ReactNode + className?: string + collapseButtonAriaLabel?: string + customInputAriaLabel?: string + customPlaceholder?: string + customPrefix?: ReactNode + customSuffix?: ReactNode + defaultExpanded?: boolean + defaultValue?: number + disabled?: boolean + expanded?: boolean + formatCustomInput?: (value: number) => string + formatValue: (value: number) => ReactNode + isValueAllowed?: (value: number) => boolean + label: ReactNode + maxFractionDigits?: number + maxIntegerDigits?: number + onChange?: (value: number) => void + onExpandedChange?: (expanded: boolean) => void + options: readonly CollapsiblePresetControlOption[] + value?: number + valueClassName?: string +} + +const defaultFormatCustomInput = (value: number) => String(value) + +const CollapsiblePresetControl = ({ + children, + className, + collapseButtonAriaLabel = 'Toggle preset options', + customInputAriaLabel = 'Custom value', + customPlaceholder = 'Custom', + customPrefix, + customSuffix, + defaultExpanded = false, + defaultValue, + disabled = false, + expanded, + formatCustomInput = defaultFormatCustomInput, + formatValue, + isValueAllowed = () => true, + label, + maxFractionDigits = 2, + maxIntegerDigits = 6, + onChange, + onExpandedChange, + options, + value, + valueClassName, +}: CollapsiblePresetControlProps) => { + const initialValue = defaultValue ?? options[0]?.value ?? 0 + const inputRef = useRef+ Your funds remain in your personal Smart Contract Wallet. Only proportional trades are executed. +
+{activeTab.description}
+{description}
} ++ Capital will deploy on the agent's next trade. No immediate swaps. Existing settings apply. +
++ You will follow new trades from this moment. Your P&L may differ from the agent's stats until open + positions close. +
+ ++ Withdraw the prepared maximum quote-token balance to the current owner. The amount and recipient are fixed by the + latest server evidence and cannot be edited. +
+