This commit is contained in:
koalasat
2025-08-08 15:12:04 +02:00
parent cc5239b5fc
commit e12714ef75
35 changed files with 180 additions and 140 deletions

View File

@ -108,31 +108,17 @@ class WebAppInterface(private val context: MainActivity, private val webView: We
@JavascriptInterface
fun copyToClipboard(message: String) {
// Validate input
if (!isValidInput(message, 10000)) { // Allow longer text for clipboard
Log.e(TAG, "Invalid input for copyToClipboard")
Toast.makeText(context, "Invalid content for clipboard", Toast.LENGTH_SHORT).show()
return
}
try {
// Limit clipboard content size for security
val truncatedMessage = if (message.length > 10000) {
message.substring(0, 10000) + "... (content truncated for security)"
} else {
message
}
// Copy to clipboard
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager
val clip = android.content.ClipData.newPlainText("RoboSats Data", truncatedMessage)
val clip = android.content.ClipData.newPlainText("RoboSats Data", message)
clipboard.setPrimaryClip(clip)
// Show a toast notification
Toast.makeText(context, "Copied to clipboard", Toast.LENGTH_SHORT).show()
// Log the action (don't log the content for privacy)
Log.d(TAG, "Text copied to clipboard (${truncatedMessage.length} chars)")
Log.d(TAG, "Text copied to clipboard")
} catch (e: Exception) {
Log.e(TAG, "Error copying to clipboard", e)
Toast.makeText(context, "Failed to copy to clipboard", Toast.LENGTH_SHORT).show()

View File

@ -264,17 +264,15 @@ const RobotProfile = ({
<Grid item sx={{ width: '100%' }}>
<Grid container direction='row' justifyContent='space-between'>
<Typography variant='caption'>{t('Robot Garage')}</Typography>
{client !== 'mobile' && (
<Button
size='small'
color='primary'
onClick={() => {
garage.download();
}}
>
<Download style={{ width: '0.6em', height: '0.6em' }} />
</Button>
)}
<Button
size='small'
color='primary'
onClick={() => {
garage.download(client);
}}
>
<Download style={{ width: '0.6em', height: '0.6em' }} />
</Button>
</Grid>
<Select
error={!slot?.activeOrder?.id && Boolean(slot?.lastOrder?.id)}

View File

@ -1,9 +1,8 @@
import React, { useContext, useEffect, useState } from 'react';
import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { IconButton, LinearProgress, TextField, Tooltip } from '@mui/material';
import { ContentCopy } from '@mui/icons-material';
import { systemClient } from '../../services/System';
import { type UseGarageStoreType, GarageContext } from '../../contexts/GarageContext';
import { validateTokenEntropy } from '../../utils';
interface TokenInputProps {
@ -36,7 +35,6 @@ const TokenInput = ({
error,
}: TokenInputProps): React.JSX.Element => {
const { t } = useTranslation();
const { garage } = useContext<UseGarageStoreType>(GarageContext);
const [showCopied, setShowCopied] = useState<boolean>(false);
const [badToken, setBadToken] = useState<string>('');
@ -92,14 +90,13 @@ const TokenInput = ({
<Tooltip open={showCopied} title={t('Copied!')}>
<IconButton
autoFocus={autoFocusTarget === 'copyButton'}
color={garage.getSlot()?.copiedToken ? 'inherit' : 'primary'}
color='inherit'
onClick={() => {
systemClient.copyToClipboard(inputToken);
setShowCopied(true);
setTimeout(() => {
setShowCopied(false);
}, 1000);
garage.updateSlot({ copiedToken: true }, inputToken);
}}
>
<ContentCopy sx={{ width: '1em', height: '1em' }} />

View File

@ -9,6 +9,7 @@ import { UseAppStoreType, AppContext } from '../../../../contexts/AppContext';
import { useNavigate } from 'react-router-dom';
import { Grid } from '@mui/system';
import { GarageContext, UseGarageStoreType } from '../../../../contexts/GarageContext';
import { formatDistanceToNow } from 'date-fns';
interface Props {
event: Event;
@ -75,7 +76,7 @@ const NotificationCard: React.FC<Props> = ({ event, robotHashId, coordinator, se
enterNextDelay={2000}
title={
<>
{new Date(event.created_at).toLocaleString()}
{formatDistanceToNow(new Date(event.created_at * 1000), { addSuffix: true })}
<br />
{coordinator?.longAlias}
</>

View File

@ -95,8 +95,6 @@ const NotificationsDrawer = ({
const sound = audio[soundType];
void sound.play();
void sound.play();
void sound.play();
};
const loadNotifciationsNostr = (): void => {

View File

@ -119,7 +119,7 @@ const BookControl = ({
direction='row'
justifyContent='center'
spacing={0.8}
sx={{ height: '3.4em', padding: '0.2em', alignContent: 'center' }}
sx={{ padding: '0.2em', alignContent: 'center' }}
>
{width > large ? (
<Grid item sx={{ position: 'relative', top: '0.5em' }}>

View File

@ -1,4 +1,4 @@
import React, { useContext, useState } from 'react';
import React, { useContext, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
Dialog,
@ -26,7 +26,7 @@ import ForumIcon from '@mui/icons-material/Forum';
import { ExportIcon, NewTabIcon } from '../Icons';
import { UseAppStoreType, AppContext } from '../../contexts/AppContext';
import { GarageContext, UseGarageStoreType } from '../../contexts/GarageContext';
import { Order } from '../../models';
import { Order, Slot } from '../../models';
import { nip19 } from 'nostr-tools';
import { EncryptedChatMessage } from '../TradeBox/EncryptedChat';
@ -79,16 +79,23 @@ const AuditPGPDialog = ({
}: Props): React.JSX.Element => {
const { t } = useTranslation();
const { client } = useContext<UseAppStoreType>(AppContext);
const [tab, setTab] = useState<'nostr' | 'pgp'>('nostr');
const { garage } = useContext<UseGarageStoreType>(GarageContext);
const [tab, setTab] = useState<'nostr' | 'pgp'>('nostr');
const [slot, setSlot] = useState<Slot | null>();
// PGP
const [ownPubKey, setOwnPubKey] = useState<string>();
const [ownEncPrivKey, setOwnEncPrivKey] = useState<string>();
const [passphrase, setPassphrase] = useState<string>();
const slot = order
? garage.getSlotByOrder(order?.shortAlias ?? '', order?.id ?? 0)
: garage.getSlot();
const ownPubKey = slot?.getRobot()?.pubKey ?? '';
const ownEncPrivKey = slot?.getRobot()?.encPrivKey ?? '';
const passphrase = slot?.token ?? '';
useEffect(() => {
const slot = order
? garage.getSlotByOrder(order?.shortAlias ?? '', order?.id ?? 0)
: garage.getSlot();
setSlot(slot);
setOwnPubKey(slot?.getRobot()?.pubKey ?? '');
setOwnEncPrivKey(slot?.getRobot()?.encPrivKey ?? '');
setPassphrase(slot?.token ?? '');
}, [garage.currentSlot, order?.id]);
return (
<Dialog open={open} onClose={onClose}>
@ -177,7 +184,7 @@ const AuditPGPDialog = ({
return client === 'mobile'
? systemClient.copyToClipboard(JSON.stringify(object))
: saveAsJson(`pgp_keys_${order?.id ?? ''}.json`, object);
: saveAsJson(`pgp_keys_${order?.id ?? ''}.json`, object, client);
}}
>
<div style={{ width: 26, height: 18 }}>
@ -207,7 +214,7 @@ const AuditPGPDialog = ({
onClick={() => {
return client === 'mobile'
? systemClient.copyToClipboard(JSON.stringify(messages))
: saveAsJson(`pgp_messages_${order?.id ?? ''}.json`, messages);
: saveAsJson(`pgp_messages_${order?.id ?? ''}.json`, messages, client);
}}
>
<div style={{ width: 28, height: 20 }}>
@ -290,7 +297,7 @@ const AuditPGPDialog = ({
return client === 'mobile'
? systemClient.copyToClipboard(JSON.stringify(object))
: saveAsJson(`nostr_keys_${order?.id ?? ''}.json`, object);
: saveAsJson(`nostr_keys_${order?.id ?? ''}.json`, object, client);
}}
>
<div style={{ width: 26, height: 18 }}>
@ -320,7 +327,7 @@ const AuditPGPDialog = ({
onClick={() => {
return client === 'mobile'
? systemClient.copyToClipboard(JSON.stringify(messages))
: saveAsJson(`nostr_messages_${order?.id ?? ''}.json`, messages);
: saveAsJson(`nostr_messages_${order?.id ?? ''}.json`, messages, client);
}}
>
<div style={{ width: 28, height: 20 }}>

View File

@ -60,8 +60,8 @@ const SelectCoordinator: React.FC<SelectCoordinatorProps> = ({
>
{!coordinator?.loadingInfo
? coordinator?.info?.swap_enabled
? t('Supports on-chain swaps.')
: t('Does not support on-chain swaps.')
? t('On-chain swaps.')
: t('Not on-chain swaps.')
: t('Loading coordinator info...')}
</Alert>
</Grid>

View File

@ -27,7 +27,15 @@ import {
import Countdown, { type CountdownRenderProps, zeroPad } from 'react-countdown';
import RobotAvatar from '../../components/RobotAvatar';
import currencies from '../../../static/assets/currencies.json';
import { AccessTime, PriceChange, Payments, HourglassTop, Map, Warning } from '@mui/icons-material';
import {
AccessTime,
PriceChange,
Payments,
HourglassTop,
Map,
Warning,
Tag,
} from '@mui/icons-material';
import { fiatMethods, PaymentStringAsIcons, swapMethods } from '../../components/PaymentMethods';
import { FlagWithProps, SendReceiveIcon } from '../Icons';
import LinearDeterminate from './LinearDeterminate';
@ -188,7 +196,9 @@ const OrderDetails = ({
const rate = Number(order.max_amount ?? order.amount) / btc_now;
if (isBuyer) {
if (order.amount && order.amount > 0) {
if (order.invoice_amount) {
sats = pn(order.invoice_amount);
} else if (order.amount && order.amount > 0) {
sats = computeSats({
amount: order.amount,
fee: -tradeFee,
@ -218,7 +228,9 @@ const OrderDetails = ({
amount: sats,
});
} else {
if (order.amount && order.amount > 0) {
if (order.escrow_satoshis) {
sats = pn(order.escrow_satoshis);
} else if (order.amount && order.amount > 0) {
sats = computeSats({
amount: order.amount,
fee: tradeFee,
@ -282,7 +294,7 @@ const OrderDetails = ({
}}
>
<Grid container direction='row' justifyContent='center' alignItems='center'>
<Grid item sx={{ width: '64px' }}>
<Grid item sx={{ width: '20%' }}>
<RobotAvatar
shortAlias={coordinator.federated ? coordinator.shortAlias : undefined}
hashId={coordinator.federated ? undefined : coordinator.mainnet.onion}
@ -294,9 +306,15 @@ const OrderDetails = ({
}}
/>
</Grid>
<Grid item>
<Grid item sx={{ width: '50%' }}>
<ListItemText primary={coordinator.longAlias} secondary={t('Order host')} />
</Grid>
<ListItem style={{ width: '30%' }}>
<ListItemIcon>
<Tag />
</ListItemIcon>
<ListItemText primary={currentOrder?.id} secondary={t('ID')} />
</ListItem>
</Grid>
</ListItemButton>
<ListItem>
@ -313,8 +331,8 @@ const OrderDetails = ({
>
{!coordinator?.loadingInfo
? coordinator?.info?.swap_enabled
? t('Supports on-chain swaps.')
: t('Does not support on-chain swaps.')
? t('On-chain swaps.')
: t('Not on-chain swaps.')
: t('Loading coordinator info...')}
</Alert>
</Grid>

View File

@ -463,6 +463,11 @@ const icons = {
image:
'data:image/webp;base64,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',
},
paysend: {
title: 'paysend',
image:
'data:image/webp;base64,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',
},
};
const PaymentIcon: React.FC = (props) => {

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -90,6 +90,7 @@ export const fiatMethods: PaymentMethod[] = [
{ name: 'SBP', icon: 'sbp', reversible: false },
{ name: 'Qiwi', icon: 'qiwi', reversible: false },
{ name: 'Nomad', icon: 'nomad', reversible: false },
{ name: 'Paysend', icon: 'paysend', reversible: false },
];
export const swapMethods: PaymentMethod[] = [

View File

@ -1,4 +1,4 @@
import React, { useContext, useEffect, useState } from 'react';
import React, { useContext, useEffect, useState, ClipboardEvent } from 'react';
import { useTranslation } from 'react-i18next';
import {
Box,
@ -283,6 +283,28 @@ export const LightningPayoutForm = ({
return text;
};
const handlePasteProxy = (e: ClipboardEvent<HTMLDivElement>) => {
e.preventDefault();
const pastedData = e.clipboardData.getData('text');
setLightning({ ...lightning, lnproxyInvoice: pastedData ?? '' });
setTimeout(() => {
const input = document.getElementById('proxy-textfield') as HTMLInputElement;
input.setSelectionRange(0, 0);
}, 0);
};
const handlePasteInvoice = (e: ClipboardEvent<HTMLDivElement>) => {
e.preventDefault();
const pastedData = e.clipboardData.getData('text');
setLightning({ ...lightning, invoice: pastedData ?? '' });
setTimeout(() => {
const input = document.getElementById('invoice-textfield') as HTMLInputElement;
input.setSelectionRange(0, 0);
}, 0);
};
return (
<Grid container direction='column' justifyContent='flex-start' alignItems='center' spacing={1}>
<div style={{ height: '0.3em' }} />
@ -520,6 +542,7 @@ export const LightningPayoutForm = ({
<Grid item>
{lightning.useLnproxy ? (
<TextField
id='proxy-textfield'
fullWidth
disabled={!lightning.useLnproxy}
error={lightning.badLnproxy !== ''}
@ -532,11 +555,13 @@ export const LightningPayoutForm = ({
onChange={(e) => {
setLightning({ ...lightning, lnproxyInvoice: e.target.value ?? '' });
}}
onPaste={(e) => handlePasteProxy(e)}
/>
) : (
<></>
)}
<TextField
id='invoice-textfield'
fullWidth
sx={lightning.useLnproxy ? { borderRadius: 0 } : {}}
disabled={lightning.useLnproxy}
@ -551,6 +576,7 @@ export const LightningPayoutForm = ({
onChange={(e) => {
setLightning({ ...lightning, invoice: e.target.value ?? '' });
}}
onPaste={(e) => handlePasteInvoice(e, false)}
/>
</Grid>

View File

@ -20,7 +20,6 @@ import { type UseGarageStoreType, GarageContext } from '../../../contexts/Garage
import { MoreHoriz, Key, Handshake, Balance } from '@mui/icons-material';
import AuditPGPDialog from '../../Dialogs/AuditPGP';
import { ExportIcon } from '../../Icons';
import { systemClient } from '../../../services/System';
import { UseAppStoreType, AppContext } from '../../../contexts/AppContext';
interface ChatPromptProps {
@ -262,11 +261,9 @@ export const ChatPrompt = ({
<Grid item xs={1} style={{ width: '100%', marginTop: 20 }}>
<Button
fullWidth
onClick={() => {
return client === 'mobile'
? systemClient.copyToClipboard(JSON.stringify(createJsonFile()))
: saveAsJson(`complete_log_chat_${order.id}.json`, createJsonFile());
}}
onClick={() =>
saveAsJson(`complete_log_chat_${order.id}.json`, createJsonFile(), client)
}
variant='contained'
color='primary'
size='large'

View File

@ -34,7 +34,6 @@ import {
FlagWithProps,
} from '../Icons';
import { type TradeCoordinatorSummary, type TradeRobotSummary } from '../../models/Order.model';
import { systemClient } from '../../services/System';
import { type UseAppStoreType, AppContext } from '../../contexts/AppContext';
interface Props {
@ -80,11 +79,7 @@ const TradeSummary = ({
taker: takerSummary,
platform: platformSummary,
};
if (client !== 'mobile') {
saveAsJson(`order${orderId}-summary.json`, summary);
} else {
systemClient.copyToClipboard(JSON.stringify(summary));
}
saveAsJson(`order${orderId}-summary.json`, summary, client);
};
return (

View File

@ -36,8 +36,9 @@ class Garage {
};
// Storage
download = (): void => {
saveAsJson(`garage_slots_${new Date().toISOString()}.json`, this.slots);
download = (client: 'mobile' | 'web' | 'desktop' | string): void => {
const keys = Object.keys(this.slots);
saveAsJson(`garage_slots_${new Date().toISOString()}.json`, keys, client);
};
save = (): void => {
@ -101,19 +102,6 @@ class Garage {
}
};
updateSlot: (attributes: { copiedToken?: boolean }, token?: string) => Slot | null = (
attributes,
token,
) => {
const slot = this.getSlot(token);
if (attributes) {
if (attributes.copiedToken !== undefined) slot?.setCopiedToken(attributes.copiedToken);
this.save();
this.triggerHook('onSlotUpdate');
}
return slot;
};
setCurrentSlot: (currentSlot: string) => void = (currentSlot) => {
this.currentSlot = currentSlot;
this.save();

View File

@ -47,7 +47,6 @@ class Slot {
return acc;
}, {});
this.copiedToken = false;
this.onSlotUpdate();
}
@ -57,16 +56,11 @@ class Slot {
robots: Record<string, Robot>;
activeOrder: Order | null = null;
lastOrder: Order | null = null;
copiedToken: boolean;
nostrSecKey?: Uint8Array;
nostrPubKey?: string;
onSlotUpdate: () => void;
setCopiedToken = (copied: boolean): void => {
this.copiedToken = copied;
};
// Robots
getRobot = (shortAlias?: string): Robot | null => {
if (shortAlias) {

View File

@ -3,22 +3,34 @@
* @param {filename} data -- object to save
*/
const saveAsJson = (filename: string, dataObjToWrite: object): void => {
const blob = new Blob([JSON.stringify(dataObjToWrite, null, 2)], { type: 'text/json' });
const link = document.createElement('a');
import { systemClient } from '../services/System';
link.download = filename;
link.href = window.URL.createObjectURL(blob);
link.dataset.downloadurl = ['text/json', link.download, link.href].join(':');
const saveAsJson = (
filename: string,
dataObjToWrite: object,
client: 'mobile' | 'web' | 'desktop' | string,
): void => {
const jsonString = JSON.stringify(dataObjToWrite, null, 2);
const evt = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true,
});
if (client === 'mobile') {
systemClient.copyToClipboard(jsonString);
} else {
const blob = new Blob([jsonString], { type: 'text/json' });
const link = document.createElement('a');
link.dispatchEvent(evt);
link.remove();
link.download = filename;
link.href = window.URL.createObjectURL(blob);
link.dataset.downloadurl = ['text/json', link.download, link.href].join(':');
const evt = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true,
});
link.dispatchEvent(evt);
link.remove();
}
};
export default saveAsJson;

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Envies aprox. {{swapSats}} LN Sats (les taxes poden variar)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Disabled",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Creador",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain payouts enabled",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Prenedor",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "El proveïdor de la infraestructura LN i comunicacions. L'amfitrió serà l'encarregat de donar suport i resoldre disputes. LEs comissions de les transaccions són fixades per l'amfitrió. Assegureu-vos de seleccionar només els amfitrions en què confieu!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Dipositar",
"Expires in": "Expira en",
"F2F location": "Ubicació F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Si rebeu una transacció fiduciària, es pot revertir unilateralment fins a 80 dies després que s'hagi completat l'intercanvi.",
"Order Details": "Detalls",
"Order host": "Order host",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Odesíláte přibližně {{swapSats}} LN Sats (poplatky se mohou lišit)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Zakázáno",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Tvůrce",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain payouts enabled",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Příjemce",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Vklad",
"Expires in": "Vyprší za",
"F2F location": "Místo F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Pokud obdržíte fiat transakci, může být jednostranně zrušena až do 80 dnů po dokončení obchodu.",
"Order Details": "Detaily objednávky",
"Order host": "Hostitel objednávky",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Du sendest ungefähr {{swapSats}} LN Sats (Gebühren können variieren)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Deaktiviert",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Ersteller",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain-Auszahlungen aktiviert",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Nehmer",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Der Anbieter der Lightning- und Kommunikationsinfrastruktur. Der Host wird für die Bereitstellung von Support und die Lösung von Streitfällen verantwortlich sein. Die Handelsgebühren werden vom Host festgelegt. Stellen Sie sicher, dass Sie nur Hosts auswählen, denen Sie vertrauen!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Einzahlungstimer",
"Expires in": "Läuft ab in",
"F2F location": "F2F lokale",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Wenn Sie eine Fiat-Transaktion erhalten, kann diese bis zu 80 Tage nach Abschluss des Handels einseitig rückgängig gemacht werden.",
"Order Details": "Bestelldetails",
"Order host": "Bestellhost",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "You send approx {{swapSats}} LN Sats (fees might vary)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Disabled",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Maker",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain payouts enabled",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Taker",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Deposit",
"Expires in": "Expires in",
"F2F location": "F2F location",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.",
"Order Details": "Order Details",
"Order host": "Order host",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Envías aproximadamente {{swapSats}} LN Sats (las comisiones pueden variar)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Desactivado",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Creador",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Pagos onchain habilitados",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Tomador",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "El proveedor de la infraestructura de comunicación y lightning. El anfitrión estará a cargo de proporcionar soporte y resolver disputas. Las comisiones comerciales son establecidas por el anfitrión. ¡Asegúrate de seleccionar solo anfitriones de órdenes en los que confíes!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Depósito",
"Expires in": "Expira en",
"F2F location": "Ubicación cara a cara",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Si recibes una transacción fiat, se puede revertir unilateralmente hasta 80 días después de que se haya completado la transacción.",
"Order Details": "Detalles de la Orden",
"Order host": "Anfitrión de la Orden",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Gutxi gorabehera bidaltzen dituzu {{swapSats}} LN Sats (komisioak aldatu daitezke)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Desgaituta",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Egile",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain ordainketak gaituta",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Hartzaile",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Argiaren eta komunikazio azpiegituren hornitzailea. Ostalariak laguntza emateaz eta eztabaidak konpontzeaz arduratuko da. Truke kuotak ostalariak bideratzen ditu. Ziurtatu konfiantza duzun ostalari eskaerak aukeratzea!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Gordailu tenporizadorea",
"Expires in": "Iraungitze denbora",
"F2F location": "Aurre Aurre lokazioa",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Fiat transakzio bat jasotzen baduzu, merkataritza gauzatu eta 80 egun arte unilateralki itzul daiteke.",
"Order Details": "Eskaeraren Xehetasunak",
"Order host": "Eskaera ostalaria",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Vous envoyez environ {{swapSats}} LN Sats (les frais peuvent varier)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Désactivé",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Créateur",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Paiements onchain activés",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Preneur",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Le fournisseur de l'infrastructure lightning et de communication. L'hôte sera chargé de fournir un support et de résoudre les litiges. Les frais de transaction sont fixés par l'hôte. Assurez-vous de ne sélectionner que des hôtes de commande en qui vous avez confiance !",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Dépôt",
"Expires in": "Expire dans",
"F2F location": "Emplacement F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Si vous recevez une transaction fiduciaire, elle peut être unilatéralement annulée jusqu'à 80 jours après la conclusion de l'échange.",
"Order Details": "Détails de l'ordre",
"Order host": "Hôte de l'ordre",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Invii circa {{swapSats}} LN Sats (le commissioni possono variare)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Disabilitato",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Creatore",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Pagamento onchain abilitato",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Acquirente",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Il fornitore dell'infrastruttura lightning e comunicazione. L'host sarà responsabile del supporto e della risoluzione delle dispute. Le commissioni commerciali sono fissate dall'host. Assicurati di selezionare solo gli host degli ordini di cui ti fidi!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Deposito",
"Expires in": "Scade in",
"F2F location": "Posizione F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Se ricevi una transazione fiat, può essere annullata unilateralmente fino a 80 giorni dopo il completamento della transazione.",
"Order Details": "Dettagli Ordine",
"Order host": "Host dell'ordine",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "約{{swapSats}} ライトニングSatsを送信します手数料は異なる場合があります",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "無効",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "メーカー",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "オンチェーンでの支払いが有効",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "テイカー",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "ライトニングと通信インフラを提供します。ホストはサポートの提供と論争の解決を担当します。取引手数料はホストによって設定されます。信頼できる注文ホストのみを選択するようにしてください!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "デポジットタイマー",
"Expires in": "有効期限",
"F2F location": "対面の位置",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "フィアット取引を受け取った場合、取引完了後最大80日間一方的に戻すことができます。",
"Order Details": "注文の詳細",
"Order host": "注文ホスト",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Wysyłasz około {{swapSats}} LN Sats (opłaty mogą się różnić)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Wyłączone",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Twórca",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Wypłaty onchain włączone",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Nabywca",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Dostawca infrastruktury lightning i komunikacji. Host będzie odpowiedzialny za udzielanie wsparcia i rozwiązywanie sporów. Opłaty za handel są ustalane przez hosta. Upewnij się, że wybierasz tylko hostów zamówień, którym ufasz!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Depozyt",
"Expires in": "Wygasa za",
"F2F location": "Lokalizacja F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Jeśli otrzymasz transakcję fiat, może ona zostać jednostronnie cofnięta do 80 dni po zakończeniu transakcji.",
"Order Details": "Szczegóły zamówienia",
"Order host": "Host zamówienia",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Você envia aprox {{swapSats}} LN Sats (as taxas podem variar)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Desabilitado",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Criador",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Pagamentos onchain habilitados",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Tomador",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "O provedor da infraestrutura de comunicação e lightning. O hospedeiro será responsável por fornecer suporte e resolver disputas. As taxas de negociação são definidas pelo hospedeiro. Certifique-se de selecionar apenas hospedeiros de pedido em quem você confia!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Depósito",
"Expires in": "Expira em",
"F2F location": "Localização presencial",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Se você receber uma transação em moeda fiduciária, ela poderá ser revertida unilateralmente até 80 dias após a conclusão da negociação.",
"Order Details": "Detalhes da Ordem",
"Order host": "Hospedeiro da Ordem",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Вы отправляете примерно {{swapSats}} LN Сатоши (комиссия может различаться)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Отключено",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Мейкер",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain выплаты включены",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Тейкер",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Поставщик инфраструктуры lightning и коммуникации. Хост будет отвечать за предоставление поддержки и решение споров. Торговые комиссии устанавливаются хостом. Убедитесь, что вы выбираете только те хосты, которым доверяете!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "депозита",
"Expires in": "Истекает через",
"F2F location": "Локация F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Если вы получаете фиатную транзакцию, она может быть в одностороннем порядке отменена в течение 80 дней после завершения сделки.",
"Order Details": "Детали ордера",
"Order host": "Хост ордера",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Du skickar cirka {{swapSats}} LN Sats (avgifter kan variera)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Inaktiverad",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Tillverkare",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain-utbetalningar aktiverade",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Tar",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Leverantören av blixt- och kommunikationsinfrastrukturen. Värden kommer att ansvara för att tillhandahålla support och lösa tvister. Handelsavgifterna fastställs av värden. Se till att bara välja ordervärdar som du litar på!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Insättningstimer",
"Expires in": "Går ut om",
"F2F location": "F2F plats",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Om du tar emot en fiat-transaktion kan den ensidigt återbetalas upp till 80 dagar efter att affären har slutförts.",
"Order Details": "Orderdetaljer",
"Order host": "Ordervärd",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "Unatuma takribani {{swapSats}} LN Sats (ada inaweza kutofautiana)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "Imezimwa",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "Muumba",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Malipo ya mtandaoni yamewezeshwa",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "Mpokeaji",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "Mtoa huduma wa miundombinu ya umeme na mawasiliano. Mwenyeji atakuwa na jukumu la kutoa msaada na kutatua mizozo. Ada za biashara zimewekwa na mwenyeji. Hakikisha unachagua tu wenyeji wa agizo ambao unawaamini!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "Amana",
"Expires in": "Inamalizika ndani ya",
"F2F location": "Eneo la F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "Ikiwa unapokea muamala wa fiat, inaweza kubatilishwa kwa upande mmoja hadi siku 80 baada ya biashara kukamilika.",
"Order Details": "Maelezo ya Agizo",
"Order host": "Mwenyeji wa Agizo",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "คุณส่งประมาณ {{swapSats}} LN Sats (ค่าธรรมเนียมอาจแตกต่างกัน)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "ปิดการใช้งาน",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "ผู้สร้าง",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "เปิดใช้งานการจ่าย onchain",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "ผู้รับ",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "ผู้ขายต้องวางเหรียญที่จะขายภายใน",
"Expires in": "หมดอายุใน",
"F2F location": "ตำแหน่งที่ตั้ง F2F",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "หากคุณได้รับธุรกรรมเงินสด อาจถูกยกเลิกฝ่ายเดียวได้ภายใน 80 วันหลังจากการซื้อขายเสร็จสมบูรณ์",
"Order Details": "รายละเอียดคำสั่งซื้อ",
"Order host": "โฮสต์คำสั่งซื้อ",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "你将发送大约{{swapSats}}闪电聪(费用会造成差异)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "已禁用",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "挂单方",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "链上支付已启用",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "吃单方",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "提供闪电和通信基础设施。主机会负责提供支持和解决争议。交易费用由主机设置。请确保仅选择您信任的订单主机!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "定金截止时间",
"Expires in": "内到期",
"F2F location": "面对面位置",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "如果您收到一笔法定货币交易则可以在交易完成后最多80天内单方面撤销。",
"Order Details": "订单详情",
"Order host": "订单主机",

View File

@ -442,11 +442,11 @@
"You send approx {{swapSats}} LN Sats (fees might vary)": "您將發送大約{{swapSats}} 閃電聰(費用可能有所不同)",
"#46": "Phrases in components/MakerForm/SelectCoordinator.tsx",
"Disabled": "禁用的",
"Does not support on-chain swaps.": "Does not support on-chain swaps.",
"Loading coordinator info...": "Loading coordinator info...",
"Maker": "掛單方",
"Not on-chain swaps.": "Not on-chain swaps.",
"On-chain swaps.": "On-chain swaps.",
"Onchain payouts enabled": "Onchain payouts enabled",
"Supports on-chain swaps.": "Supports on-chain swaps.",
"Taker": "吃單方",
"The provider the lightning and communication infrastructure. The host will be in charge of providing support and solving disputes. The trade fees are set by the host. Make sure to only select order hosts that you trust!": "提供者提供閃電與通信架構。 主機將負責提供支持和解決爭議。 交易費用由主機設定。 务必遵循信任主機的原則选择订单主机!",
"#47": "Phrases in components/OrderDetails/TakeButton.tsx",
@ -469,6 +469,7 @@
"Deposit": "存款",
"Expires in": "到期於",
"F2F location": "見面地點",
"ID": "ID",
"If you receive a fiat transaction, it can be unilatery reverted up to 80 days after the trade has been completed.": "如果您收到一筆法定貨幣交易則可以在交易完成後最多80天內單方面撤銷。",
"Order Details": "訂單詳情",
"Order host": "訂單主機",