Merge pull request #1817 from RoboSats/coordinators-rating

Coordinators ratings WIP
This commit is contained in:
KoalaSat
2025-03-26 16:57:09 +00:00
committed by GitHub
26 changed files with 222 additions and 78 deletions

View File

@ -1,4 +1,4 @@
import React, { useContext, useState } from 'react';
import React, { useContext, useEffect, useState } from 'react';
import { useTranslation, Trans } from 'react-i18next';
import {
Grid,
@ -15,19 +15,21 @@ import {
} from '@mui/material';
import currencies from '../../../../static/assets/currencies.json';
import TradeSummary from '../TradeSummary';
import { Favorite, RocketLaunch, ContentCopy, Refresh } from '@mui/icons-material';
import { Favorite, RocketLaunch, ContentCopy, Refresh, Info } from '@mui/icons-material';
import { LoadingButton } from '@mui/lab';
import { finalizeEvent, type Event } from 'nostr-tools';
import { type Order } from '../../../models';
import { systemClient } from '../../../services/System';
import {
FederationContext,
type UseFederationStoreType,
} from '../../../contexts/FederationContext';
import { type UseAppStoreType, AppContext } from '../../../contexts/AppContext';
import { GarageContext, type UseGarageStoreType } from '../../../contexts/GarageContext';
interface SuccessfulPromptProps {
order: Order;
ratePlatform: (rating: number) => void;
rateUserPlatform: (rating: number) => void;
onClickStartAgain: () => void;
onClickRenew: () => void;
loadingRenew: boolean;
@ -35,16 +37,48 @@ interface SuccessfulPromptProps {
export const SuccessfulPrompt = ({
order,
ratePlatform,
rateUserPlatform,
onClickStartAgain,
onClickRenew,
loadingRenew,
}: SuccessfulPromptProps): JSX.Element => {
const { t } = useTranslation();
const currencyCode: string = currencies[`${order.currency}`];
const { settings } = useContext<UseAppStoreType>(AppContext);
const { federation } = useContext<UseFederationStoreType>(FederationContext);
const { garage } = useContext<UseGarageStoreType>(GarageContext);
const [rating, setRating] = useState<number | undefined>(undefined);
const [hostRating, setHostRating] = useState<number>();
const rateHostPlatform = function (): void {
if (!hostRating) return;
const slot = garage.getSlot();
const coordinatorPubKey = federation.getCoordinator(order.shortAlias)?.nostrHexPubkey;
if (!slot?.nostrPubKey || !slot.nostrSecKey || !coordinatorPubKey || !order.id) return;
const eventTemplate: Event = {
kind: 31986,
created_at: Math.floor(Date.now() / 1000),
tags: [
['d', `${order.shortAlias}:${order.id}`],
['p', coordinatorPubKey],
['rating', String(hostRating / 5)],
],
content: '',
pubkey: slot.nostrPubKey,
id: '',
sig: '',
};
const signedEvent = finalizeEvent(eventTemplate, slot.nostrSecKey);
federation.roboPool.sendEvent(signedEvent);
};
useEffect(() => {
rateHostPlatform();
}, [hostRating]);
return (
<Grid
@ -57,8 +91,8 @@ export const SuccessfulPrompt = ({
>
<Grid item xs={12}>
<Typography variant='body2' align='center'>
{t('What do you think your order host "{{coordinator}}"?', {
coordinator: federation.getCoordinator(order.shortAlias)?.longAlias,
{t('Rate your peer {{peer_nick}}', {
peer_nick: order.is_maker ? order.taker_nick : order.maker_nick,
})}
</Typography>
</Grid>
@ -69,12 +103,36 @@ export const SuccessfulPrompt = ({
size='large'
onChange={(e) => {
const rate = e.target.value;
ratePlatform(rate);
setRating(rate);
rateUserPlatform(rate);
}}
/>
</Grid>
{rating === 5 ? (
<Grid item xs={12}>
<Typography variant='body2' align='center'>
{t('Rate your host {{coordinator}}', {
coordinator: federation.getCoordinator(order.shortAlias)?.longAlias,
})}{' '}
<Typography variant='button' align='center'>
{t('BETA')}
</Typography>
<Tooltip title={t('You need to enable nostr to rate your coordinator.')}>
<Info sx={{ width: 15 }} />
</Tooltip>
</Typography>
</Grid>
<Grid item>
<Rating
disabled={settings.connection !== 'nostr'}
name='size-large'
defaultValue={0}
size='large'
onChange={(e) => {
const rate = e.target.value;
setHostRating(rate);
}}
/>
</Grid>
{hostRating ? (
<Grid item xs={12}>
<div
style={{
@ -84,35 +142,44 @@ export const SuccessfulPrompt = ({
justifyContent: 'center',
}}
>
<Typography variant='body2' align='center'>
<b>{t('Thank you! RoboSats loves you too')}</b>
</Typography>
<Favorite color='error' />
</div>
<Typography variant='body2' align='center'>
{t(
'RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!',
{hostRating === 5 ? (
<>
<Typography variant='body2' align='center'>
<b>
{t('Thank you! {{shortAlias}} loves you too', {
shortAlias: federation.getCoordinator(order.shortAlias)?.longAlias,
})}
</b>
</Typography>
<Favorite color='error' />
</>
) : (
<Typography variant='body2' align='center'>
<b>{t('Thank you for using Robosats!')}</b>
</Typography>
)}
</Typography>
</Grid>
) : rating !== undefined ? (
<Grid>
<Typography variant='body2' align='center'>
<b>{t('Thank you for using Robosats!')}</b>
</Typography>
<Typography variant='body2' align='center'>
<Trans i18nKey='let_us_know_hot_to_improve'>
Let us know how the platform could improve (
<Link target='_blank' href='https://t.me/robosats'>
Telegram
</Link>
{' / '}
<Link target='_blank' href='https://github.com/RoboSats/robosats/issues'>
Github
</Link>
)
</Trans>
</Typography>
</div>
{hostRating === 5 ? (
<Typography variant='body2' align='center'>
{t(
'RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!',
)}
</Typography>
) : (
<Typography variant='body2' align='center'>
<Trans i18nKey='let_us_know_hot_to_improve'>
Let us know how the platform could improve (
<Link target='_blank' href='https://t.me/robosats'>
Telegram
</Link>
{' / '}
<Link target='_blank' href='https://github.com/RoboSats/robosats/issues'>
Github
</Link>
)
</Trans>
</Typography>
)}
</Grid>
) : (
<></>

View File

@ -1,7 +1,6 @@
import React, { useState, useEffect, useContext } from 'react';
import { Box, Divider, Grid } from '@mui/material';
import { getWebln, pn } from '../../utils';
import {
ConfirmCancelDialog,
ConfirmCollabCancelDialog,
@ -309,7 +308,7 @@ const TradeBox = ({ currentOrder, onStartAgain }: TradeBoxProps): JSX.Element =>
}
};
const ratePlatform = function (rating: number): void {
const rateUserPlatform = function (rating: number): void {
submitAction({ action: 'rate_platform', rating });
};
@ -617,7 +616,7 @@ const TradeBox = ({ currentOrder, onStartAgain }: TradeBoxProps): JSX.Element =>
return (
<SuccessfulPrompt
order={order}
ratePlatform={ratePlatform}
rateUserPlatform={rateUserPlatform}
onClickStartAgain={onStartAgain}
loadingRenew={loadingButtons.renewOrder}
onClickRenew={() => {
@ -641,7 +640,7 @@ const TradeBox = ({ currentOrder, onStartAgain }: TradeBoxProps): JSX.Element =>
return (
<SuccessfulPrompt
order={order}
ratePlatform={ratePlatform}
rateUserPlatform={rateUserPlatform}
onClickStartAgain={onStartAgain}
loadingRenew={loadingButtons.renewOrder}
onClickRenew={() => {
@ -680,7 +679,7 @@ const TradeBox = ({ currentOrder, onStartAgain }: TradeBoxProps): JSX.Element =>
return (
<SuccessfulPrompt
order={order}
ratePlatform={ratePlatform}
rateUserPlatform={rateUserPlatform}
onClickStartAgain={onStartAgain}
loadingRenew={loadingButtons.renewOrder}
onClickRenew={() => {

View File

@ -138,6 +138,7 @@ export class Coordinator {
this.testnet = value.testnet;
this.mainnetNodesPubkeys = value.mainnetNodesPubkeys;
this.testnetNodesPubkeys = value.testnetNodesPubkeys;
this.nostrHexPubkey = value.nostrHexPubkey;
this.url = '';
this.basePath = '';
@ -163,6 +164,7 @@ export class Coordinator {
public testnetNodesPubkeys: string[] | undefined;
public url: string;
public basePath: string;
public nostrHexPubkey: string;
// These properties are fetched from coordinator API
public book: Record<string, PublicOrder> = {};

View File

@ -10,6 +10,7 @@ class Robot {
public token?: string;
public pubKey?: string;
public encPrivKey?: string;
public nostrPubKey?: string;
public stealthInvoices: boolean = true;
public activeOrderId?: number;
public lastOrderId?: number;
@ -34,9 +35,11 @@ class Robot {
const tokenSHA256 = this.tokenSHA256 ?? '';
const encPrivKey = this.encPrivKey ?? '';
const pubKey = this.pubKey ?? '';
const nostrPubKey = this.nostrPubKey ?? '';
return {
tokenSHA256,
nostrPubKey,
keys: {
pubKey: pubKey.split('\n').join('\\'),
encPrivKey: encPrivKey.split('\n').join('\\'),

View File

@ -1,10 +1,13 @@
import { sha256 } from 'js-sha256';
import { sha256 as sha256Hash } from '@noble/hashes/sha256';
import { Robot, Order, type Federation } from '.';
import { roboidentitiesClient } from '../services/Roboidentities/Web';
import { hexToBase91, validateTokenEntropy } from '../utils';
import { getPublicKey } from 'nostr-tools';
export interface AuthHeaders {
tokenSHA256: string;
nostrPubKey: string;
keys: {
pubKey: string;
encPrivKey: string;
@ -33,6 +36,11 @@ class Slot {
const { hasEnoughEntropy, bitsEntropy, shannonEntropy } = validateTokenEntropy(token);
const tokenSHA256 = hexToBase91(sha256(token));
const nostrHash = sha256Hash(this.token);
this.nostrSecKey = new Uint8Array(nostrHash);
const nostrPubKey = getPublicKey(this.nostrSecKey);
this.nostrPubKey = nostrPubKey;
this.robots = shortAliases.reduce((acc: Record<string, Robot>, shortAlias: string) => {
acc[shortAlias] = new Robot({
...robotAttributes,
@ -41,6 +49,7 @@ class Slot {
bitsEntropy,
shannonEntropy,
tokenSHA256,
nostrPubKey,
});
this.updateSlotFromRobot(acc[shortAlias]);
return acc;
@ -57,6 +66,8 @@ class Slot {
activeOrder: Order | null = null;
lastOrder: Order | null = null;
copiedToken: boolean;
nostrSecKey?: Uint8Array;
nostrPubKey?: string;
onSlotUpdate: () => void;

View File

@ -130,6 +130,12 @@ class RoboPool {
this.sendMessage(JSON.stringify(requestPending));
this.sendMessage(JSON.stringify(requestSuccess));
};
sendEvent = (event: Event): void => {
const message = ['EVENT', event];
this.sendMessage(JSON.stringify(message));
};
}
export default RoboPool;

View File

@ -17,6 +17,7 @@ class ApiNativeClient implements ApiClient {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256}`,
Nostr: auth.nostrPubKey,
},
};
} else if (auth?.keys != null) {
@ -24,6 +25,7 @@ class ApiNativeClient implements ApiClient {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey}`,
Nostr: auth.nostrPubKey,
},
};
}

View File

@ -13,6 +13,7 @@ class ApiWebClient implements ApiClient {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256}`,
Nostr: auth.nostrPubKey,
},
};
} else if (auth?.keys != null) {
@ -20,6 +21,7 @@ class ApiWebClient implements ApiClient {
...headers,
...{
Authorization: `Token ${auth.tokenSHA256} | Public ${auth.keys.pubKey} | Private ${auth.keys.encPrivKey}`,
Nostr: auth.nostrPubKey,
},
};
}

View File

@ -3,6 +3,7 @@ import ApiNativeClient from './ApiNativeClient';
export interface Auth {
tokenSHA256: string;
nostrPubKey: string;
keys?: { pubKey: string; encPrivKey: string };
}

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats està intentant pagar la teva factura de Lightning. Recorda que els nodes Lightning han d'estar en línia per rebre pagaments.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renovar",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats millora amb més usuaris i liquiditat. Ensenya-li RoboSats a un amic bitcoiner!",
"Sending coins to": "Enviant monedes a",
"Start Again": "Començar de nou",
"Thank you for using Robosats!": "Gràcies per fer servir RoboSats!",
"Thank you! RoboSats loves you too": "Gràcies! RoboSats també t'estima",
"What do you think your order host \"{{coordinator}}\"?": "Què en penses del teu amfitrió \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "El teu TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Si us plau, espera a que el prenedor bloquegi la seva fiança. Si no ho fa a temps, l'ordre serà pública de nou.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats se snaží zaplatit tvůj lightning invoice. Nezapomeň, že lightning nody musí být online, aby mohl přijímat platby.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats bude lepší s větší likviditou a uživateli. Pověz svým přátelům o Robosats!",
"Sending coins to": "Sending coins to",
"Start Again": "Začít znovu",
"Thank you for using Robosats!": "Děkujeme, že používáš Robosats!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Tvé TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Vyčkej, až příjemce uzamkne kauci. Pokud příjemce neuzamkne kauci včas, nabídka se znovu zveřejní.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats versucht deine Lightning-Invoice zu bezahlen. Denk daran, dass deine Lightning-Node erreichbar sein muss, um die Zahlung zu erhalten.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats wird noch besser mit mehr Nutzern und Liquidität. Erzähl einem Bitcoin-Freund von uns!",
"Sending coins to": "Sending coins to",
"Start Again": "Nochmal",
"Thank you for using Robosats!": "Danke, dass du Robosats benutzt hast!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Your TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Bitte warte auf den Taker, um eine Kaution zu sperren. Wenn der Taker nicht rechtzeitig eine Kaution sperrt, wird die Order erneut veröffentlicht.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!",
"Sending coins to": "Sending coins to",
"Start Again": "Start Again",
"Thank you for using Robosats!": "Thank you for using Robosats!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Your TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats está intentando pagar tu factura de Lightning. Recuerda que los nodos Lightning deben estar en línea para recibir pagos.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renovar",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats mejora con más liquidez y usuarios. ¡Háblale a un amigo bitcoiner sobre RoboSats!",
"Sending coins to": "Sending coins to",
"Start Again": "Empezar de nuevo",
"Thank you for using Robosats!": "¡Gracias por usar RoboSats!",
"Thank you! RoboSats loves you too": "¡Gracias! RoboSats también te quiere",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Tu TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Por favor, espera a que el tomador bloquee su fianza. Si no lo hace a tiempo, la orden volverá a publicarse.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats zure Lightning faktura ordaintzen saiatzen ari da. Gogoratu lightning nodoak online egon behar direla ordainketak jaso ahal izateko.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats hobetu egiten da likidezia eta erabiltzaile gehiagorekin. Aipatu Robosats lagun bitcoiner bati!",
"Sending coins to": "Sending coins to",
"Start Again": "Berriz Hasi",
"Thank you for using Robosats!": "Mila esker Robosats erabiltzeagatik!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Zure TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Mesedez itxaron hartzaileak fidantza blokeatu harte. Hartzaileak fidantza garaiz blokeatzen ez badu, eskaera berriz publikatuko da.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats tente de payer votre facture lightning. Rappelez-vous que les nœuds lightning doivent être en ligne pour recevoir des paiements.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renouveler",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats s'améliore avec plus de liquidité et d'utilisateurs. Parlez de Robosats à un ami bitcoiner!",
"Sending coins to": "Envoi coins à",
"Start Again": "Recommencer",
"Thank you for using Robosats!": "Merci d'utiliser Robosats!",
"Thank you! RoboSats loves you too": "Merci ! RoboSats vous aime aussi",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Votre TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Veuillez attendre que le preneur verrouille une caution. Si le preneur ne verrouille pas la caution à temps, l'ordre sera rendue publique à nouveau",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats sta provando a pagare la tua fattura lightning. Ricorda che i nodi lightning devono essere online per ricevere pagamenti.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Rinnova",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats migliora se ha più liquidità ed utenti. Parla di Robosats ai tuoi amici bitcoiner!",
"Sending coins to": "Invio monete a",
"Start Again": "Ricomincia",
"Thank you for using Robosats!": "Grazie per aver usato Robosats!",
"Thank you! RoboSats loves you too": "Grazie! Anche RoboSats ti ama",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Il tuo TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Per favore, attendi che l'acquirente blocchi una cauzione. Se l'acquirente non blocca una cauzione in tempo, l'ordine verrà reso nuovamente pubblico.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSatsはあなたのライトニングインボイスを支払おうとしています。支払いを受け取るには、ライトニングードがオンラインである必要があることを忘れないでください。",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "更新する",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSatsはより多くの流動性とユーザーでより良くなります。ビットコイナーのお友達にRoboSatsについて話してください",
"Sending coins to": "コインを送信する先",
"Start Again": "最初からやり直す",
"Thank you for using Robosats!": "Robosatsをご利用いただきありがとうございます",
"Thank you! RoboSats loves you too": "ありがとうございます! RoboSatsもあなたを愛しています",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "あなたのTXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "テイカーが担保金をロックするまでお待ちください。タイムリミット内に担保金がロックされない場合、オーダーは再度公開されます。",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats próbuje zapłacić fakturę za błyskawicę. Pamiętaj, że węzły pioruna muszą być online, aby otrzymywać płatności.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats staje się lepszy dzięki większej płynności i użytkownikom. Powiedz znajomemu bitcoinerowi o Robosats!",
"Sending coins to": "Sending coins to",
"Start Again": "Zacznij jeszcze raz",
"Thank you for using Robosats!": "Dziękujemy za korzystanie z Robosatów!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Your TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Poczekaj, aż przyjmujący zablokuje obligację. Jeśli przyjmujący nie zablokuje obligacji na czas, zlecenie zostanie ponownie upublicznione.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats está tentando pagar sua lightning invoice. Lembre-se de que os nós lightning devem estar online para receber pagamentos.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats fica melhor com mais liquidez e usuários. Conte a um amigo bitcoiner sobre Robosats!",
"Sending coins to": "Enviando moedas para",
"Start Again": "Comece de novo",
"Thank you for using Robosats!": "Obrigado por usar Robosats!",
"Thank you! RoboSats loves you too": "Obriagdo! RoboSats também te ama",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Sua TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Por favor, espere que o tomador bloqueie uma fiança. Se o tomador não fechar um vínculo a tempo, a ordem será tornada pública novamente.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats пытается оплатить Ваш Lightning инвойс. Помните, что ноды Lightning должны быть подключены к сети, чтобы получать платежи.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats становится лучше с большей ликвидностью и пользователями. Расскажите другу-биткойнеру о Robosat!",
"Sending coins to": "Отправка монет на",
"Start Again": "Начать Снова",
"Thank you for using Robosats!": "Спасибо за использование Robosats!",
"Thank you! RoboSats loves you too": "Спасибо! RoboSats тоже Вас любит",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Ваш TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Пожалуйста, подождите, пока тейкер заблокирует залог. Если тейкер не заблокирует залог вовремя, ордер будет снова опубликован",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats försöker betala din lightning-faktura. Kom ihåg att lightning-noder måste vara online för att kunna mottaga betalningar.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats blir bättre med mer likviditet och fler användare. Berätta om RoboSats för en Bitcoiner-vän!",
"Sending coins to": "Sending coins to",
"Start Again": "Börja om",
"Thank you for using Robosats!": "Tack för att du använder RoboSats!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Ditt TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Var god vänta på att takern låser sin obligation. Om den inte gör det i tid kommer ordern att göras publik igen.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats inajaribu kulipa ankara yako ya umeme. Kumbuka kuwa nodi za umeme lazima ziwe mtandaoni ili kupokea malipo.",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats inaboreshwa na utoshelevu zaidi na watumiaji. Mwambie rafiki yako wa Bitcoin kuhusu RoboSats!",
"Sending coins to": "Inatuma sarafu kwa",
"Start Again": "Anza Tena",
"Thank you for using Robosats!": "Asante kwa kutumia Robosats!",
"Thank you! RoboSats loves you too": "Asante! RoboSats pia inakupenda",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "Kitambulisho chako cha TX",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "Tafadhali subiri mpokeaji aweke dhamana. Ikiwa mpokeaji hataweka dhamana kwa wakati, agizo litatangazwa tena kwa umma.",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats กำลังจ่ายเหรียญให้ lightning invoice ของท่าน lightning nodes จะต้องออนไลน์เพื่อรับเหรียญ",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "Renew",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats จะดีขึ้นเมื่อมีสภาพคล่องและผู้ใช้งานมากขึ้น ช่วยกันชวนเพื่อนของคุณมาใช้ Robosats!",
"Sending coins to": "Sending coins to",
"Start Again": "Start Again",
"Thank you for using Robosats!": "ขอบคุณที่ใช้งาน Robosats!",
"Thank you! RoboSats loves you too": "Thank you! RoboSats loves you too",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "TXID ของคุณ",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "โปรดรอคู่ค้าทำการกักกันเหรียญใน bond ถ้าเขากักกันเหรียญไม่ทันในเวลาที่กำหนด รายการจะถูกประำกาศใหม่",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats 正在尝试支付你的闪电发票。请注意,闪电节点必须在线才能接收付款。",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "延续",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats 会随着更多的流动性和更高的用户数量而变得更好。把 RoboSats 推荐给你的比特币朋友吧!",
"Sending coins to": "将比特币发送到",
"Start Again": "重新开始",
"Thank you for using Robosats!": "感谢你使用 Robosats",
"Thank you! RoboSats loves you too": "谢谢RoboSats 也爱你",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "你的 TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "请等待吃单方锁定保证金。如果吃单方没有及时锁定保证金,订单将再次公开。",

View File

@ -675,13 +675,16 @@
"#81": "Phrases in components/TradeBox/Prompts/SendingSats.tsx",
"RoboSats is trying to pay your lightning invoice. Remember that lightning nodes must be online in order to receive payments.": "RoboSats 正在嘗試支付你的閃電發票。請注意,閃電節點必須在線才能接收付款。",
"#82": "Phrases in components/TradeBox/Prompts/Successful.tsx",
"BETA": "BETA",
"Rate your host {{coordinator}}": "Rate your host {{coordinator}}",
"Rate your peer {{peer_nick}}": "Rate your peer {{peer_nick}}",
"Renew": "延續",
"RoboSats gets better with more liquidity and users. Tell a bitcoiner friend about Robosats!": "RoboSats 會隨著更多的流動性和更高的用戶数量而變得更好。把 RoboSats 推薦給你的比特幣朋友吧!",
"Sending coins to": "將比特幣發送到",
"Start Again": "重新開始",
"Thank you for using Robosats!": "感謝你使用 Robosats!",
"Thank you! RoboSats loves you too": "謝謝RoboSats 也愛你",
"What do you think your order host \"{{coordinator}}\"?": "What do you think your order host \"{{coordinator}}\"?",
"Thank you! {{shortAlias}} loves you too": "Thank you! {{shortAlias}} loves you too",
"You need to enable nostr to rate your coordinator.": "You need to enable nostr to rate your coordinator.",
"Your TXID": "你的 TXID",
"#83": "Phrases in components/TradeBox/Prompts/TakerFound.tsx",
"Please wait for the taker to lock a bond. If the taker does not lock a bond in time, the order will be made public again.": "請等待吃單方鎖定保證金。如果吃單方沒有及時鎖定保證金,訂單將再次公開。",