chore: remove deprecated metamask and rainbow (#9299)

* Remove deprecated code related to rainbow

* Remove translations for rainbow specific features

* Remove english translations for metamask

* Remove translations for metamask

* Fix lint issues

* Fix prettier issues

* update yarn lock

* Generated yarn.lock with submodules

* Added auth submodule deps

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: alannnc <alannnc@gmail.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
This commit is contained in:
Ujwal Kumar 2023-06-06 16:48:44 +05:30 committed by GitHub
parent 8bc8a045b6
commit fbbc573f33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
69 changed files with 591 additions and 3255 deletions

View File

@ -106,12 +106,6 @@ LARK_OPEN_APP_ID=""
LARK_OPEN_APP_SECRET=""
LARK_OPEN_VERIFICATION_TOKEN=""
# - WEB3
# Used for the Web3 plugin
# @see https://github.com/calcom/cal.com/blob/main/packages/app-store/rainbow/README.md
ALCHEMY_API_KEY=""
INFURA_API_KEY=""
# - SALESFORCE
# Used for the Salesforce (Sales Cloud) app
SALESFORCE_CONSUMER_KEY=""

View File

@ -1,51 +0,0 @@
import dynamic from "next/dynamic";
import type { Dispatch } from "react";
import { useState, useEffect } from "react";
import type { JSONObject } from "superjson/dist/types";
export type Gate = undefined | "rainbow"; // Add more like ` | "geolocation" | "payment"`
export type GateState = {
rainbowToken?: string;
};
type GateProps = {
children: React.ReactNode;
gates: Gate[];
appData: JSONObject;
dispatch: Dispatch<Partial<GateState>>;
};
const RainbowGate = dynamic(() => import("@calcom/app-store/rainbow/components/RainbowKit"));
// To add a new Gate just add the gate logic to the switch statement
const Gates: React.FC<GateProps> = ({ children, gates, appData, dispatch }) => {
const [rainbowToken, setRainbowToken] = useState<string>();
useEffect(() => {
dispatch({ rainbowToken });
}, [rainbowToken, dispatch]);
let gateWrappers = <>{children}</>;
// Recursively wraps the `gateWrappers` with new gates allowing for multiple gates
for (const gate of gates) {
switch (gate) {
case "rainbow":
if (appData.blockchainId && appData.smartContractAddress && !rainbowToken) {
gateWrappers = (
<RainbowGate
setToken={setRainbowToken}
chainId={appData.blockchainId as number}
tokenAddress={appData.smartContractAddress as string}>
{gateWrappers}
</RainbowGate>
);
}
}
}
return gateWrappers;
};
export default Gates;

View File

@ -28,7 +28,6 @@ type AvailableTimesProps = {
bookingAttendees?: number | null;
slots?: Slot[];
isLoading: boolean;
ethSignature?: string;
duration: number;
};
@ -43,7 +42,6 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
onTimeFormatChange,
seatsPerTimeSlot,
bookingAttendees,
ethSignature,
duration,
}) => {
const reserveSlotMutation = trpc.viewer.public.slots.reserveSlot.useMutation();
@ -119,7 +117,6 @@ const AvailableTimes: FC<AvailableTimesProps> = ({
timeFormat,
/** Treat as recurring only when a count exist and it's not a rescheduling workflow */
count: recurringCount && !rescheduleUid ? recurringCount : undefined,
...(ethSignature ? { ethSignature } : {}),
},
};

View File

@ -80,7 +80,6 @@ export const SlotPicker = ({
seatsPerTimeSlot,
bookingAttendees,
weekStart = 0,
ethSignature,
}: {
eventType: Pick<
EventType & { metadata: z.infer<typeof EventTypeMetaDataSchema> },
@ -94,7 +93,6 @@ export const SlotPicker = ({
recurringEventCount?: number;
users: string[];
weekStart?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
ethSignature?: string;
}) => {
const [selectedDate, setSelectedDate] = useState<Dayjs>();
const [browsingDate, setBrowsingDate] = useState<Dayjs>();
@ -193,7 +191,6 @@ export const SlotPicker = ({
seatsPerTimeSlot={seatsPerTimeSlot}
bookingAttendees={bookingAttendees}
recurringCount={recurringEventCount}
ethSignature={ethSignature}
duration={parseInt(duration)}
/>
</>

View File

@ -1,10 +1,9 @@
import dynamic from "next/dynamic";
import { useRouter } from "next/router";
import { useEffect, useMemo, useReducer, useState } from "react";
import { useEffect, useMemo, useState } from "react";
import { z } from "zod";
import BookingPageTagManager from "@calcom/app-store/BookingPageTagManager";
import { getEventTypeAppData } from "@calcom/app-store/utils";
import dayjs from "@calcom/dayjs";
import {
useEmbedNonStylesConfig,
@ -27,8 +26,6 @@ import { CreditCard, User, RefreshCcw } from "@calcom/ui/components/icon";
import { timeZone as localStorageTimeZone } from "@lib/clock";
import type { Gate, GateState } from "@components/Gates";
import Gates from "@components/Gates";
import BookingDescription from "@components/booking/BookingDescription";
import { SlotPicker } from "@components/booking/SlotPicker";
@ -89,14 +86,6 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
setIs24hClockInLocalStorage(is24Hours);
};
const [gateState, gateDispatcher] = useReducer(
(state: GateState, newState: Partial<GateState>) => ({
...state,
...newState,
}),
{}
);
useEffect(() => {
setTimeZone(localStorageTimeZone() || dayjs.tz.guess());
}, []);
@ -124,20 +113,11 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
);
const paymentAppData = getPaymentAppData(eventType);
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
const rawSlug = profile.slug ? profile.slug.split("/") : [];
if (rawSlug.length > 1) rawSlug.pop(); //team events have team name as slug, but user events have [user]/[type] as slug.
const showEventTypeDetails = (isEmbed && !embedUiConfig.hideEventTypeDetails) || !isEmbed;
// Define conditional gates here
const gates = [
// Rainbow gate is only added if the event has both a `blockchainId` and a `smartContractAddress`
rainbowAppData && rainbowAppData.blockchainId && rainbowAppData.smartContractAddress
? ("rainbow" as Gate)
: undefined,
];
const { data: bookingAttendees } = trpc.viewer.bookings.getBookingAttendees.useQuery(
{
seatReferenceUid: rescheduleUid,
@ -148,7 +128,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
);
return (
<Gates gates={gates} appData={rainbowAppData} dispatch={gateDispatcher}>
<>
<HeadSeo
title={`${rescheduleUid ? t("reschedule") : ""} ${eventType.title} | ${profile.name}`}
description={`${rescheduleUid ? t("reschedule") : ""} ${eventType.title}`}
@ -296,7 +276,6 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
seatsPerTimeSlot={eventType.seatsPerTimeSlot || undefined}
bookingAttendees={bookingAttendees || undefined}
recurringEventCount={recurringEventCount}
ethSignature={gateState.rainbowToken}
/>
</div>
</div>
@ -306,7 +285,7 @@ const AvailabilityPage = ({ profile, eventType, ...restProps }: Props) => {
</main>
</div>
<Toaster position="bottom-right" />
</Gates>
</>
);
};

View File

@ -4,7 +4,7 @@ import { useSession } from "next-auth/react";
import dynamic from "next/dynamic";
import Head from "next/head";
import { useRouter } from "next/router";
import { useEffect, useMemo, useReducer, useState } from "react";
import { useEffect, useMemo, useState } from "react";
import { useForm, useFormContext } from "react-hook-form";
import { v4 as uuidv4 } from "uuid";
import { z } from "zod";
@ -12,7 +12,6 @@ import { z } from "zod";
import BookingPageTagManager from "@calcom/app-store/BookingPageTagManager";
import type { EventLocationType } from "@calcom/app-store/locations";
import { createPaymentLink } from "@calcom/app-store/stripepayment/lib/client";
import { getEventTypeAppData } from "@calcom/app-store/utils";
import type { LocationObject } from "@calcom/core/location";
import dayjs from "@calcom/dayjs";
import {
@ -51,8 +50,6 @@ import { AlertTriangle, Calendar, RefreshCw, User } from "@calcom/ui/components/
import { timeZone } from "@lib/clock";
import useRouterQuery from "@lib/hooks/useRouterQuery";
import type { Gate, GateState } from "@components/Gates";
import Gates from "@components/Gates";
import BookingDescription from "@components/booking/BookingDescription";
import type { BookPageProps } from "../../../pages/[user]/book";
@ -224,13 +221,6 @@ const BookingPage = ({
const { data: session } = useSession();
const isBackgroundTransparent = useIsBackgroundTransparent();
const telemetry = useTelemetry();
const [gateState, gateDispatcher] = useReducer(
(state: GateState, newState: Partial<GateState>) => ({
...state,
...newState,
}),
{}
);
const { timezone } = useTimePreferences();
@ -488,7 +478,6 @@ const BookingPage = ({
metadata,
hasHashedBookingLink,
hashedLink,
ethSignature: gateState.rainbowToken,
}));
recurringMutation.mutate(recurringBookings);
} else {
@ -506,25 +495,15 @@ const BookingPage = ({
metadata,
hasHashedBookingLink,
hashedLink,
ethSignature: gateState.rainbowToken,
seatReferenceUid: router.query.seatReferenceUid as string,
});
}
};
const showEventTypeDetails = (isEmbed && !embedUiConfig.hideEventTypeDetails) || !isEmbed;
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
// Define conditional gates here
const gates = [
// Rainbow gate is only added if the event has both a `blockchainId` and a `smartContractAddress`
rainbowAppData && rainbowAppData.blockchainId && rainbowAppData.smartContractAddress
? ("rainbow" as Gate)
: undefined,
];
return (
<Gates gates={gates} appData={rainbowAppData} dispatch={gateDispatcher}>
<>
<Head>
<title>
{rescheduleUid
@ -686,7 +665,7 @@ const BookingPage = ({
</div>
</main>
<Toaster position="bottom-right" />
</Gates>
</>
);
};

View File

@ -1,4 +0,0 @@
import ethRouter from "@calcom/app-store/rainbow/trpc/router";
import { createNextApiHandler } from "@calcom/trpc/server/createNextApiHandler";
export default createNextApiHandler(ethRouter);

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "تم إنشاء نوع الحدث {{eventTypeTitle}} بنجاح",
"event_type_updated_successfully": "تم تحديث نوع الحدث {{eventTypeTitle}} بنجاح",
"event_type_deleted_successfully": "تم حذف نوع الحدث بنجاح",
"web3_metamask_added": "تمت إضافة Metamask بنجاح",
"web3_metamask_disconnected": "تم فصل Metamask بنجاح",
"hours": "الساعات",
"your_email": "بريدك الإلكتروني",
"change_avatar": "تغيير الصورة الرمزية",
@ -872,7 +870,6 @@
"installed_one": "تم التثبيت",
"installed_other": "{{count}} مثبت",
"verify_wallet": "تأكيد المحفظة",
"connect_metamask": "توصيل Metamask",
"create_events_on": "إنشاء أحداث في",
"enterprise_license": "هذه هي ميزة للمؤسسات",
"enterprise_license_description": "لتمكين هذه الميزة، احصل على مفتاح نشر في وحدة التحكم {{consoleUrl}} وأضفه إلى وحدة التحكم الخاصة بك. nv باسم CALCOM_LICENSE_KEY. إذا كان لدى فريقك بالفعل ترخيص، يرجى الاتصال بـ {{supportMail}} للحصول على المساعدة.",
@ -1228,11 +1225,6 @@
"upload": "تحميل",
"add_profile_photo": "إضافة صورة الملف الشخصي",
"web3": "Web3",
"rainbow_token_gated": "يتم فتح هذا النوع من الأحداث برمز مميز.",
"rainbow_connect_wallet_gate": "قم بربط محفظتك إذا كنت تملك <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "لا تحتوي محفظتك المربوطة على ما يكفي من <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "قم بتوقيع طلب الرسالة على محفظتك.",
"rainbow_signature_error": "خطأ في طلب التوقيع من محفظتك.",
"token_address": "عنوان الرمز المميز",
"blockchain": "سلسلة الكتل",
"old_password": "كلمة مرور قديمة",
@ -1378,7 +1370,6 @@
"password_updated": "تم تحديث كلمة المرور!",
"pending_payment": "في انتظار الدفع",
"pending_invites": "دعوات معلقة",
"confirmation_page_rainbow": "قم بتعيين رمز مميز لفتح الحدث الخاص بك باستخدام الرموز أو NFTs على Ethereum وPolygon وغيرها.",
"not_on_cal": "غير موجود على {{appName}}",
"no_calendar_installed": "لا يوجد تقويم مثبت",
"no_calendar_installed_description": "لم تقم بربط أي من التقويمات الخاصة بك",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "Typ události {{eventTypeTitle}} byl úspěšně vytvořen",
"event_type_updated_successfully": "Typ události {{eventTypeTitle}} byl úspěšně aktualizován",
"event_type_deleted_successfully": "Typ události byl úspěšně smazán",
"web3_metamask_added": "Metamask úspěšně přidán",
"web3_metamask_disconnected": "Metamask úspěšně odpojen",
"hours": "Hodiny",
"your_email": "Váš e-mail",
"change_avatar": "Změnit avatar",
@ -872,7 +870,6 @@
"installed_one": "Nainstalováno",
"installed_other": "Nainstalováno: {{count}}",
"verify_wallet": "Ověřit peněženku",
"connect_metamask": "Připojit Metamask",
"create_events_on": "Vytvořit události v:",
"enterprise_license": "Jedná se o firemní funkci",
"enterprise_license_description": "Pokud chcete povolit tuto funkci, získejte klíč pro nasazení v konzoli {{consoleUrl}} a přidejte ho do souboru .env jako CALCOM_LICENSE_KEY. Pokud váš tým již licenci má, kontaktujte prosím {{supportMail}} a požádejte o pomoc.",
@ -1228,11 +1225,6 @@
"upload": "Nahrát",
"add_profile_photo": "Přidat profilovou fotku",
"web3": "Web3",
"rainbow_token_gated": "Tento typ události je uzamčený tokenem.",
"rainbow_connect_wallet_gate": "Propojte svoji peněženku, pokud vlastníte <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Vaše propojená peněženka neobsahuje dostatek <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Podepište zprávu s požadavkem ve své peněžence.",
"rainbow_signature_error": "Chyba při vyžádání podpisu z vaší peněženky.",
"token_address": "Adresa tokenu",
"blockchain": "Blockchain",
"old_password": "Staré heslo",
@ -1378,7 +1370,6 @@
"password_updated": "Heslo bylo úspěšně změněno!",
"pending_payment": "Čeká se na platbu",
"pending_invites": "Čekající pozvánky",
"confirmation_page_rainbow": "Zamkněte svoji událost pomocí tokenů nebo NFT na platformách Ethereum, Polygon a dalších.",
"not_on_cal": "Nenachází se na {{appName}}",
"no_calendar_installed": "Není nainstalován kalendář",
"no_calendar_installed_description": "Ještě jste nepropojili žádný ze svých kalendářů",

View File

@ -601,8 +601,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} begivenhedstype blev oprettet",
"event_type_updated_successfully": "{{eventTypeTitle}} begivenhedstype blev opdateret",
"event_type_deleted_successfully": "Begivenhedstypen blev slettet",
"web3_metamask_added": "Metamask tilføjet",
"web3_metamask_disconnected": "Metamask blev afbrudt",
"hours": "Timer",
"your_email": "Din E-Mail",
"change_avatar": "Skift Avatar",
@ -834,7 +832,6 @@
"installed_one": "Installeret",
"installed_other": "{{count}} installeret",
"verify_wallet": "Verificér Wallet",
"connect_metamask": "Forbind Metamask",
"create_events_on": "Opret begivenheder på",
"enterprise_license": "Dette er en virksomhedsfunktion",
"enterprise_license_description": "For at aktivere denne funktion, skal du gå til {{setupUrl}} for at indtaste en licensnøgle. Hvis en licensnøgle allerede er på plads, bedes du kontakte {{supportMail}} for hjælp.",
@ -1181,11 +1178,6 @@
"upload": "Upload",
"add_profile_photo": "Tilføj profilbillede",
"web3": "Web3",
"rainbow_token_gated": "Denne begivenhedstype er token gated.",
"rainbow_connect_wallet_gate": "Forbind din wallet, hvis du ejer <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Din tilsluttede wallet indeholder ikke nok <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Signér beskedanmodningen på din wallet.",
"rainbow_signature_error": "Fejl ved anmodning om signatur fra din wallet.",
"token_address": "Token Adresse",
"blockchain": "Blockchain",
"old_password": "Gammel adgangskode",
@ -1317,7 +1309,6 @@
"password_updated": "Adgangskode opdateret!",
"pending_payment": "Afventer betaling",
"pending_invites": "Afventende Invitationer",
"confirmation_page_rainbow": "Token gate din begivenhed med tokens eller NFTs på Ethereum, Polygon og flere.",
"not_on_cal": "Ikke på {{appName}}",
"no_calendar_installed": "Ingen kalender installeret",
"no_calendar_installed_description": "Du har endnu ikke tilsluttet nogen af dine kalendere",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} Ereignistyp erfolgreich erstellt",
"event_type_updated_successfully": "{{eventTypeTitle}} Ereignistyp erfolgreich aktualisiert",
"event_type_deleted_successfully": "Termintyp erfolgreich gelöscht",
"web3_metamask_added": "Metamask erfolgreich hinzugefügt",
"web3_metamask_disconnected": "Metamask erfolgreich getrennt",
"hours": "Stunden",
"your_email": "Ihre E-Mail-Adresse",
"change_avatar": "Profilbild ändern",
@ -872,7 +870,6 @@
"installed_one": "Installiert",
"installed_other": "{{count}} installiert",
"verify_wallet": "Wallet verifizieren",
"connect_metamask": "Metamask verbinden",
"create_events_on": "Erstelle Termine in:",
"enterprise_license": "Das ist eine Enterprise-Funktion",
"enterprise_license_description": "Um diese Funktion zu aktivieren, holen Sie sich einen Deployment-Schlüssel von der {{consoleUrl}}-Konsole und fügen Sie ihn als CALCOM_LICENSE_KEY zu Ihrer .env hinzu. Wenn Ihr Team bereits eine Lizenz hat, wenden Sie sich bitte an {{supportMail}} für Hilfe.",
@ -1228,11 +1225,6 @@
"upload": "Upload",
"add_profile_photo": "Profilbild hinzufügen",
"web3": "Web3",
"rainbow_token_gated": "Dieser Ereignistyp ist durch einen Token geschützt.",
"rainbow_connect_wallet_gate": "Verbinden Sie Ihre Wallet, falls Sie <1>{{name}}</1> (<3>{{symbol}}</3>) besitzen.",
"rainbow_insufficient_balance": "Ihre verbundene Wallet enthält nicht genug <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Unterschreiben Sie die Nachrichtenanfrage in Ihrem Wallet.",
"rainbow_signature_error": "Fehler beim Anfordern der Signatur von Ihrer Wallet.",
"token_address": "Adresse des Token",
"blockchain": "Blockchain",
"old_password": "Altes Passwort",
@ -1378,7 +1370,6 @@
"password_updated": "Passwort aktualisiert!",
"pending_payment": "Zahlung ausstehend",
"pending_invites": "Offene Einladungen",
"confirmation_page_rainbow": "Sperren Sie Ihr Ereignis hinter Tokens oder NFTs auf Ethereum, Polygon und mehr.",
"not_on_cal": "Nicht auf {{appName}}",
"no_calendar_installed": "Kein Kalender installiert",
"no_calendar_installed_description": "Sie haben noch keinen Ihrer Kalender verbunden",

View File

@ -634,8 +634,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} event type created successfully",
"event_type_updated_successfully": "{{eventTypeTitle}} event type updated successfully",
"event_type_deleted_successfully": "Event type deleted successfully",
"web3_metamask_added": "Metamask added successfully",
"web3_metamask_disconnected": "Metamask disconnected successfully",
"hours": "Hours",
"your_email": "Your Email",
"change_avatar": "Change Avatar",
@ -876,7 +874,6 @@
"installed_one": "Installed",
"installed_other": "{{count}} installed",
"verify_wallet": "Verify Wallet",
"connect_metamask": "Connect Metamask",
"create_events_on": "Create events on",
"enterprise_license": "This is an enterprise feature",
"enterprise_license_description": "To enable this feature, have an administrator go to {{setupUrl}} to enter a license key. If a license key is already in place, please contact {{supportMail}} for help.",
@ -1232,11 +1229,6 @@
"upload": "Upload",
"add_profile_photo": "Add profile photo",
"web3": "Web3",
"rainbow_token_gated": "This event type is token gated.",
"rainbow_connect_wallet_gate": "Connect your wallet if you own <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Your connected wallet doesn't contain enough <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Sign the message request on your wallet.",
"rainbow_signature_error": "Error requesting signature from your wallet.",
"token_address": "Token Address",
"blockchain": "Blockchain",
"old_password": "Old password",
@ -1382,7 +1374,6 @@
"password_updated": "Password updated!",
"pending_payment": "Pending payment",
"pending_invites": "Pending Invites",
"confirmation_page_rainbow": "Token gate your event with tokens or NFTs on Ethereum, Polygon, and more.",
"not_on_cal": "Not on {{appName}}",
"no_calendar_installed": "No calendar installed",
"no_calendar_installed_description": "You have not yet connected any of your calendars",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} tipo de evento creado con éxito",
"event_type_updated_successfully": "{{eventTypeTitle}} tipo de evento actualizado con éxito",
"event_type_deleted_successfully": "Tipo de evento eliminado con éxito",
"web3_metamask_added": "Metamask ha sido añadido exitosamente",
"web3_metamask_disconnected": "Metamask ha sido removido exitosamente",
"hours": "Horas",
"your_email": "Tu Email",
"change_avatar": "Cambiar Avatar",
@ -872,7 +870,6 @@
"installed_one": "Instalada",
"installed_other": "{{count}} instaladas",
"verify_wallet": "Verificar billetera",
"connect_metamask": "Conectar Metamask",
"create_events_on": "Crear eventos en",
"enterprise_license": "Esta es una función empresarial",
"enterprise_license_description": "Para habilitar esta función, obtenga una clave de despliegue en la consola {{consoleUrl}} y añádala a su .env como CALCOM_LICENSE_KEY. Si su equipo ya tiene una licencia, póngase en contacto con {{supportMail}} para obtener ayuda.",
@ -1228,11 +1225,6 @@
"upload": "Cargar",
"add_profile_photo": "Agregar foto de perfil",
"web3": "Web3",
"rainbow_token_gated": "Este tipo de evento tiene acceso cerrado por token.",
"rainbow_connect_wallet_gate": "Conecta tu billetera si posees <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Tu billetera conectada no contiene suficiente <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Firma la solicitud de mensaje en tu billetera.",
"rainbow_signature_error": "Error al solicitar la firma desde tu billetera.",
"token_address": "Dirección del token",
"blockchain": "Blockchain",
"old_password": "Contraseña anterior",
@ -1378,7 +1370,6 @@
"password_updated": "¡Contraseña actualizada!",
"pending_payment": "Pago pendiente",
"pending_invites": "Invitaciones pendientes",
"confirmation_page_rainbow": "Cierra el acceso a tu evento con tokens o NFTs en Ethereum, Polygon, etc.",
"not_on_cal": "No estás en {{appName}}",
"no_calendar_installed": "No hay ningún calendario instalado",
"no_calendar_installed_description": "Aún no has conectado ninguno de tus calendarios",

View File

@ -634,8 +634,6 @@
"event_type_created_successfully": "Type d'événement {{eventTypeTitle}} créé avec succès",
"event_type_updated_successfully": "Type d'événement {{eventTypeTitle}} mis à jour avec succès",
"event_type_deleted_successfully": "Type d'événement supprimé avec succès",
"web3_metamask_added": "MetaMask ajouté avec succès",
"web3_metamask_disconnected": "MetaMask déconnecté avec succès",
"hours": "heures",
"your_email": "Votre adresse e-mail",
"change_avatar": "Changer d'avatar",
@ -873,7 +871,6 @@
"installed_one": "Installée",
"installed_other": "{{count}} installation(s)",
"verify_wallet": "Vérifier le portefeuille",
"connect_metamask": "Connecter MetaMask",
"create_events_on": "Créer des événements dans :",
"enterprise_license": "Il s'agit d'une fonctionnalité d'entreprise",
"enterprise_license_description": "Pour activer cette fonctionnalité, demandez à un administrateur d'accéder à {{setupUrl}} pour saisir une clé de licence. Si une clé de licence est déjà en place, veuillez contacter {{supportMail}} pour obtenir de l'aide.",
@ -1229,11 +1226,6 @@
"upload": "Télécharger",
"add_profile_photo": "Ajouter une photo de profil",
"web3": "Web3",
"rainbow_token_gated": "Ce type d'événement est protégé par un token.",
"rainbow_connect_wallet_gate": "Connectez votre portefeuille si vous possédez <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Votre portefeuille connecté ne contient pas assez de <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Signez la demande de message sur votre portefeuille.",
"rainbow_signature_error": "Erreur lors de la demande de signature de votre portefeuille.",
"token_address": "Adresse du token",
"blockchain": "Blockchain",
"old_password": "Ancien mot de passe",
@ -1379,7 +1371,6 @@
"password_updated": "Mot de passe mis à jour !",
"pending_payment": "Paiement en attente",
"pending_invites": "Invitations en attente",
"confirmation_page_rainbow": "Le token protège votre événement avec des tokens ou des NFT sur Ethereum, Polygon et plus encore.",
"not_on_cal": "Pas sur {{appName}}",
"no_calendar_installed": "Aucun calendrier installé",
"no_calendar_installed_description": "Vous n'avez pas encore connecté vos calendriers.",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "יצירת האירוע מסוג {{eventTypeTitle}} בוצעה בהצלחה",
"event_type_updated_successfully": "עדכון האירוע מסוג {{eventTypeTitle}} בוצע בהצלחה",
"event_type_deleted_successfully": "מחיקת סוג האירוע בוצעה בהצלחה",
"web3_metamask_added": "הוספת ה-Metamask בוצעה בהצלחה",
"web3_metamask_disconnected": "ניתוק ה-Metamask בוצע בהצלחה",
"hours": "שעות",
"your_email": "הדוא\"ל שלך",
"change_avatar": "שינוי אווטאר",
@ -872,7 +870,6 @@
"installed_one": "מותקן",
"installed_other": "{{count}} התקנות",
"verify_wallet": "אימות הארנק",
"connect_metamask": "קישור Metamask",
"create_events_on": "ליצור אירועים ב-",
"enterprise_license": "תכונה זו זמינה רק במינוי Enterprise",
"enterprise_license_description": "כדי להפעיל את יכולת זו, בקש ממנהל לגשת אל הקישור {{setupUrl}} והקלדת הרישיון. אם כבר יש רישיון מוגדר, צור קשר עם {{supportMail}} לעזרה.",
@ -1228,11 +1225,6 @@
"upload": "העלאה",
"add_profile_photo": "הוספת תמונת פרופיל",
"web3": "Web3",
"rainbow_token_gated": "סוג אירוע זה מוגן באמצעות טוקן.",
"rainbow_connect_wallet_gate": "קשר/י את הארנק שלך אם בבעלותך <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "אין בארנק שלך מספיק <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "חתום/י על בקשת ההודעה בארנק.",
"rainbow_signature_error": "שגיאה בעת בקשת חתימה מהארנק.",
"token_address": "כתובת הטוקן",
"blockchain": "בלוקצ'יין",
"old_password": "סיסמה ישנה",
@ -1378,7 +1370,6 @@
"password_updated": "הסיסמה עודכנה!",
"pending_payment": "המתנה לתשלום",
"pending_invites": "הזמנות ממתינות",
"confirmation_page_rainbow": "הגן/י על האירוע שלך באמצעות טוקנים או אסימוני NFT במטבע Ethereum, Polygon ועוד.",
"not_on_cal": "לא ב-{{appName}}",
"no_calendar_installed": "לא מותקן לוח שנה",
"no_calendar_installed_description": "לא קישרת אף אחד מלוחות השנה שלך",

View File

@ -189,7 +189,6 @@
"remove": "Ektávolítás",
"add": "Hozzáadás",
"installed_one": "Telepített",
"connect_metamask": "Metamask csatlakoztatása",
"error_404": "404-es hiba",
"default": "Alapértelmezett",
"24_hour_short": "0-24",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} tipo di evento creato con successo",
"event_type_updated_successfully": "{{eventTypeTitle}} tipo di evento aggiornato con successo",
"event_type_deleted_successfully": "Tipo di evento eliminato con successo",
"web3_metamask_added": "Metamask aggiunto",
"web3_metamask_disconnected": "Metamask disconnesso",
"hours": "Ore",
"your_email": "La Tua Email",
"change_avatar": "Cambia Avatar",
@ -872,7 +870,6 @@
"installed_one": "Installata",
"installed_other": "{{count}} installate",
"verify_wallet": "Verifica Wallet",
"connect_metamask": "Connetti Metamask",
"create_events_on": "Crea eventi su:",
"enterprise_license": "Questa è una funzione Enterprise",
"enterprise_license_description": "Per abilitare questa funzione, ottenere una chiave di distribuzione presso la console {{consoleUrl}} e aggiungerla al proprio .env come CALCOM_LICENSE_KEY. Nel caso il team possieda già una licenza, contattare {{supportMail}} per assistenza.",
@ -1228,11 +1225,6 @@
"upload": "Carica",
"add_profile_photo": "Aggiungi foto del profilo",
"web3": "Web3",
"rainbow_token_gated": "Questo tipo di evento è protetto da token.",
"rainbow_connect_wallet_gate": "Collega il tuo portafoglio se possiedi <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Il portafoglio collegato non contiene abbastanza <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Firma la richiesta di messaggio sul tuo portafoglio.",
"rainbow_signature_error": "Errore durante la richiesta di firma al tuo portafoglio.",
"token_address": "Indirizzo token",
"blockchain": "Blockchain",
"old_password": "Vecchia password",
@ -1378,7 +1370,6 @@
"password_updated": "Password aggiornata!",
"pending_payment": "Pagamento in sospeso",
"pending_invites": "Inviti in sospeso",
"confirmation_page_rainbow": "Proteggi i tuoi eventi con token o NFT su Ethereum, Polygon e altri.",
"not_on_cal": "Non presente su {{appName}}",
"no_calendar_installed": "Nessun calendario installato",
"no_calendar_installed_description": "Non hai ancora collegato alcun calendario",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} イベント種別が正常に作成されました",
"event_type_updated_successfully": "{{eventTypeTitle}} イベント種別が正常に更新されました",
"event_type_deleted_successfully": "イベント種別が正常に削除されました",
"web3_metamask_added": "メタマスクが正常に追加されました",
"web3_metamask_disconnected": "メタマスクの接続が正常に解除されました",
"hours": "時間",
"your_email": "あなたのメールアドレス",
"change_avatar": "アバターを変更",
@ -872,7 +870,6 @@
"installed_one": "インストール済み",
"installed_other": "{{count}} 回インストールしました",
"verify_wallet": "ウォレットを確認する",
"connect_metamask": "メタマスクを接続する",
"create_events_on": "以下にイベントを作成する:",
"enterprise_license": "これは企業向けの機能です",
"enterprise_license_description": "この機能を有効にするには、{{consoleUrl}} コンソールでデプロイメントキーを入手して .env に CALCOM_LICENSE_KEY として追加してください。既にチームがライセンスを持っている場合は {{supportMail}} にお問い合わせください。",
@ -1228,11 +1225,6 @@
"upload": "アップロード",
"add_profile_photo": "プロフィール写真を追加",
"web3": "Web3",
"rainbow_token_gated": "このイベントの種類は、トークンの所有者にのみに解放されています。",
"rainbow_connect_wallet_gate": "<1>{{name}}</1><3>{{symbol}}</3>)を所有している場合には、ウォレットを接続してください。",
"rainbow_insufficient_balance": "接続されているウォレットには十分な <1>{{symbol}}</1> がありません。",
"rainbow_sign_message_request": "ウォレットのメッセージリクエストに署名をしてください。",
"rainbow_signature_error": "ウォレットからの署名のリクエスト中にエラーが発生しました。",
"token_address": "トークンアドレス",
"blockchain": "ブロックチェーン",
"old_password": "古いパスワード",
@ -1378,7 +1370,6 @@
"password_updated": "パスワードが更新されました!",
"pending_payment": "支払い待ち",
"pending_invites": "保留中の招待",
"confirmation_page_rainbow": "Ethereum や Polygon などのトークンや NFT を使用してイベントに参加しましょう。",
"not_on_cal": "{{appName}} にはいません",
"no_calendar_installed": "カレンダーがインストールされていません",
"no_calendar_installed_description": "まだどのカレンダーも接続していません",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} 이벤트 타입이 성공적으로 생성되었습니다.",
"event_type_updated_successfully": "{{eventTypeTitle}} 이벤트 타입이 성공적으로 업데이트되었습니다.",
"event_type_deleted_successfully": "이벤트 타입이 성공적으로 삭제되었습니다.",
"web3_metamask_added": "메타마스크가 성공적으로 추가되었습니다",
"web3_metamask_disconnected": "메타마스크가 성공적으로 연결 해제되었습니다",
"hours": "시간",
"your_email": "이메일 주소",
"change_avatar": "아바타 변경하기",
@ -872,7 +870,6 @@
"installed_one": "설치됨",
"installed_other": "{{count}}개 설치됨",
"verify_wallet": "지갑 인증",
"connect_metamask": "메타마스크 연결",
"create_events_on": "이벤트 생성일:",
"enterprise_license": "엔터프라이즈 기능입니다",
"enterprise_license_description": "이 기능을 활성화하려면 {{consoleUrl}} 콘솔에서 배포 키를 가져와 .env에 CALCOM_LICENSE_KEY로 추가하세요. 팀에 이미 라이선스가 있는 경우 {{supportMail}}에 문의하여 도움을 받으세요.",
@ -1228,11 +1225,6 @@
"upload": "업로드",
"add_profile_photo": "프로필 사진 추가",
"web3": "Web3",
"rainbow_token_gated": "이 이벤트 유형은 토큰 게이트식입니다.",
"rainbow_connect_wallet_gate": "<1>{{name}}</1> 소유 시 사용자 지갑을 연결합니다(<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "연결된 지갑에 <1>{{symbol}}</1>이(가) 부족합니다.",
"rainbow_sign_message_request": "지갑에서 메시지 요청에 서명합니다.",
"rainbow_signature_error": "지갑에서 서명을 요청하는 중 오류가 발생했습니다.",
"token_address": "토큰 주소",
"blockchain": "블록체인",
"old_password": "이전 비밀번호",
@ -1378,7 +1370,6 @@
"password_updated": "비밀번호가 업데이트되었습니다!",
"pending_payment": "진행 중인 결제",
"pending_invites": "보류 중인 초대",
"confirmation_page_rainbow": "이더리움, 폴리곤 등의 토큰 또는 NFT를 사용하여 이벤트를 토큰 게이트합니다.",
"not_on_cal": "{{appName}}에 없음",
"no_calendar_installed": "설치된 캘린더 없음",
"no_calendar_installed_description": "아직 연결된 캘린더가 없습니다",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} evenement met succes aangemaakt",
"event_type_updated_successfully": "Evenement is bijgewerkt",
"event_type_deleted_successfully": "Evenement is verwijderd",
"web3_metamask_added": "Metamasker toegevoegd",
"web3_metamask_disconnected": "Verbindig met metamasker verbroken",
"hours": "Uren",
"your_email": "Uw E-mailadres",
"change_avatar": "Wijzig avatar",
@ -872,7 +870,6 @@
"installed_one": "Geïnstalleerd",
"installed_other": "{{count}} keer geïnstalleerd",
"verify_wallet": "Wallet verifiëren",
"connect_metamask": "Metamasker verbinden",
"create_events_on": "Maak gebeurtenissen aan in de",
"enterprise_license": "Dit is een bedrijfsfunctie",
"enterprise_license_description": "Om deze functie in te schakelen, krijgt u een implementatiesleutel op de {{consoleUrl}}-console en voegt u deze toe aan uw .env als CALCOM_LICENSE_KEY. Als uw team al een licentie heeft, neem dan contact op met {{supportMail}} voor hulp.",
@ -1228,11 +1225,6 @@
"upload": "Uploaden",
"add_profile_photo": "Profielfoto toevoegen",
"web3": "Web3",
"rainbow_token_gated": "Dit type gebeurtenis vereist een token.",
"rainbow_connect_wallet_gate": "Koppel uw wallet als u in het bezit bent van <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Uw gekoppelde wallet bevat niet genoeg <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Onderteken het berichtverzoek in uw wallet.",
"rainbow_signature_error": "Fout bij het aanvragen van ondertekening in uw wallet.",
"token_address": "Tokenadres",
"blockchain": "Blockchain",
"old_password": "Oude wachtwoord",
@ -1378,7 +1370,6 @@
"password_updated": "Wachtwoord bijgewerkt!",
"pending_payment": "In afwachting van betaling",
"pending_invites": "Openstaande uitnodigingen",
"confirmation_page_rainbow": "Scherm uw gebeurtenis af met tokens of NFT's op Ethereum, Polygon en meer.",
"not_on_cal": "Niet op {{appName}}",
"no_calendar_installed": "Geen agenda geïnstalleerd",
"no_calendar_installed_description": "U heeft nog geen agenda's gekoppeld",

View File

@ -591,8 +591,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} hendelsestype opprettet",
"event_type_updated_successfully": "{{eventTypeTitle}} hendelsestype ble oppdatert",
"event_type_deleted_successfully": "Hendelsestypen ble slettet",
"web3_metamask_added": "Metamask ble lagt til",
"web3_metamask_disconnected": "Metamask'en ble koblet fra",
"hours": "Timer",
"your_email": "Din E-post",
"change_avatar": "Endre Avatar",
@ -819,7 +817,6 @@
"installed_one": "Installert",
"installed_other": "{{count}} er installert",
"verify_wallet": "Verifiser Lommebok",
"connect_metamask": "Koble til Metamask",
"create_events_on": "Opprett hendelser på",
"enterprise_license": "Dette er en bedriftsfunksjon",
"enterprise_license_description": "For å aktivere denne funksjonen, skaff deg en distribusjonsnøkkel på {{consoleUrl}}-konsollen og legg den til i .env som CALCOM_LICENSE_KEY. Hvis teamet ditt allerede har en lisens, vennligst kontakt {{supportMail}} for å få hjelp.",
@ -1160,11 +1157,6 @@
"upload": "Last opp",
"add_profile_photo": "Legg til profilbilde",
"web3": "Web3",
"rainbow_token_gated": "Denne hendelsestypen er token-gated.",
"rainbow_connect_wallet_gate": "Koble til lommeboken din hvis du eier <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Den tilkoblede lommeboken din inneholder ikke nok <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Signer meldingsforespørselen i lommeboken din.",
"rainbow_signature_error": "Feil ved forespørsel om signatur fra lommeboken.",
"token_address": "Token Adresse",
"blockchain": "Blockchain",
"old_password": "Gammelt passord",
@ -1291,7 +1283,6 @@
"password_reset_leading": "Hvis du ikke mottar en e-post snart, sjekk at e-postadressen du skrev inn er riktig, sjekk søppelpost-mappen eller ta kontakt med kundeservice hvis problemet vedvarer.",
"password_updated": "Passord oppdatert!",
"pending_payment": "Venter på betaling",
"confirmation_page_rainbow": "Token vokter hendelsen din med tokens eller NFT-er på Ethereum, Polygon og mer.",
"not_on_cal": "Ikke på {{appName}}",
"no_calendar_installed": "Ingen kalender installert",
"no_calendar_installed_description": "Du har ikke koblet til noen av kalenderne dine ennå",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "Utworzono {{eventTypeTitle}} typ wydarzenia pomyślnie",
"event_type_updated_successfully": "{{eventTypeTitle}} typ wydarzenia został pomyślnie zaktualizowany",
"event_type_deleted_successfully": "Typ wydarzenia usunięty pomyślnie",
"web3_metamask_added": "Metamask został pomyślnie dodany",
"web3_metamask_disconnected": "Metamask został pomyślnie rozłączony",
"hours": "Godziny",
"your_email": "Twój e-mail",
"change_avatar": "Zmień Awatar",
@ -872,7 +870,6 @@
"installed_one": "Zainstalowane",
"installed_other": "Zainstalowano {{count}}",
"verify_wallet": "Zweryfikuj portfel",
"connect_metamask": "Podłącz Metamask",
"create_events_on": "Utwórz wydarzenia w",
"enterprise_license": "To funkcja dla przedsiębiorstw",
"enterprise_license_description": "Aby włączyć tę funkcję, uzyskaj klucz wdrożenia na konsoli {{consoleUrl}} i dodaj go do swojego pliku .env jako CALCOM_LICENSE_KEY. Jeśli Twój zespół ma już licencję, napisz na adres {{supportMail}}, aby uzyskać pomoc.",
@ -1228,11 +1225,6 @@
"upload": "Prześlij",
"add_profile_photo": "Dodaj zdjęcie profilowe",
"web3": "Web3",
"rainbow_token_gated": "Ten typ wydarzenia jest dostępny tylko dla posiadaczy tokenów.",
"rainbow_connect_wallet_gate": "Połącz swój portfel, jeśli posiadasz <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Połączony portfel nie zawiera wystarczającej ilości <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Podpisz prośbę o wiadomość w Twoim portfelu.",
"rainbow_signature_error": "Podczas żądania podpisu z Twojego portfela wystąpił błąd.",
"token_address": "Adres tokena",
"blockchain": "Blockchain",
"old_password": "Stare hasło",
@ -1378,7 +1370,6 @@
"password_updated": "Hasło zostało zaktualizowane!",
"pending_payment": "Płatność w toku",
"pending_invites": "Oczekujące zaproszenia",
"confirmation_page_rainbow": "Udostępnij Twoje wydarzenie tylko posiadaczom tokenów lub NFT w blockchainach Ethereum, Polygon i innych.",
"not_on_cal": "Niedostępne na {{appName}}",
"no_calendar_installed": "Brak zainstalowanego kalendarza",
"no_calendar_installed_description": "Nie połączono jeszcze żadnego kalendarza.",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} evento criado com sucesso",
"event_type_updated_successfully": "Tipo de evento atualizado com sucesso",
"event_type_deleted_successfully": "Tipo de evento removido com sucesso",
"web3_metamask_added": "Metamask adicionado com êxito",
"web3_metamask_disconnected": "Metamask desconectado com êxito",
"hours": "Horas",
"your_email": "Seu Email",
"change_avatar": "Alterar Avatar",
@ -872,7 +870,6 @@
"installed_one": "Instalado",
"installed_other": "{{count}} instalado(s)",
"verify_wallet": "Verificar carteira",
"connect_metamask": "Conecte o Metamask",
"create_events_on": "Criar eventos em",
"enterprise_license": "Este não é um recurso corporativo",
"enterprise_license_description": "Para ativar este recurso, obtenha uma chave de desenvolvimento no console {{consoleUrl}} e adicione ao seu .env como CALCOM_LICENSE_KEY. Caso sua equipe já tenha uma licença, entre em contato com {{supportMail}} para obter ajuda.",
@ -1228,11 +1225,6 @@
"upload": "Enviar",
"add_profile_photo": "Adicionar foto do perfil",
"web3": "Web3",
"rainbow_token_gated": "Este tipo de evento é o token escolhido.",
"rainbow_connect_wallet_gate": "Conectar sua carteira se você tiver <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Sua carteira conectada não contém <1>{{symbol}}</1> suficiente.",
"rainbow_sign_message_request": "Assine a solicitação de mensagem na sua carteira.",
"rainbow_signature_error": "Erro ao solicitar a assinatura da sua carteira.",
"token_address": "Endereço do Token",
"blockchain": "Blockchain",
"old_password": "Senha antiga",
@ -1378,7 +1370,6 @@
"password_updated": "Senha atualizada!",
"pending_payment": "Pagamento pendente",
"pending_invites": "Convites pendentes",
"confirmation_page_rainbow": "Proteja seu evento com tokens ou NFTs no Ethereum, Polygon e muito mais.",
"not_on_cal": "Não está na {{appName}}",
"no_calendar_installed": "Nenhum calendário instalado",
"no_calendar_installed_description": "Você ainda não conectou nenhum de seus calendários",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "Tipo de evento {{eventTypeTitle}} criado com sucesso",
"event_type_updated_successfully": "Tipo de evento atualizado com sucesso",
"event_type_deleted_successfully": "Tipo de evento eliminado com sucesso",
"web3_metamask_added": "Metamask adicionada com sucesso",
"web3_metamask_disconnected": "Metamask desligada com sucesso",
"hours": "Horas",
"your_email": "Seu Email",
"change_avatar": "Alterar Avatar",
@ -872,7 +870,6 @@
"installed_one": "Instalado",
"installed_other": "{{count}} instaladas",
"verify_wallet": "Verificar carteira",
"connect_metamask": "Ligar Metamask",
"create_events_on": "Criar eventos em:",
"enterprise_license": "Esta é uma funcionalidade empresarial",
"enterprise_license_description": "Para ativar esta funcionalidade, obtenha uma chave de instalação na consola {{consoleUrl}} e adicione-a ao seu .env como CALCOM_LICENSE_KEY. Se a sua equipa já tem uma licença, entre em contacto com {{supportMail}} para obter ajuda.",
@ -1228,11 +1225,6 @@
"upload": "Carregar",
"add_profile_photo": "Adicionar imagem de perfil",
"web3": "Web3",
"rainbow_token_gated": "Este tipo de evento é protegido por token.",
"rainbow_connect_wallet_gate": "Associe a sua carteira se possuir <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "A sua carteira associada não contém <1>{{symbol}}</1> suficientes.",
"rainbow_sign_message_request": "Assine o pedido de mensagem na sua carteira.",
"rainbow_signature_error": "Erro ao solicitar a assinatura da sua carteira.",
"token_address": "Endereço do Token",
"blockchain": "Blockchain",
"old_password": "Palavra-passe antiga",
@ -1378,7 +1370,6 @@
"password_updated": "Palavra-passe atualizada!",
"pending_payment": "Pagamento pendente",
"pending_invites": "Convites pendentes",
"confirmation_page_rainbow": "Controle o acesso ao seu evento com tokens ou NFT na Ethereum, Polygon e muito mais.",
"not_on_cal": "Não existe em {{appName}}",
"no_calendar_installed": "Nenhum calendário instalado",
"no_calendar_installed_description": "Ainda não associou nenhum dos seus calendários",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} tip de eveniment creat cu succes",
"event_type_updated_successfully": "{{eventTypeTitle}} tip de eveniment actualizat cu succes",
"event_type_deleted_successfully": "Tipul de eveniment șters cu succes",
"web3_metamask_added": "Metamask adăugat cu succes",
"web3_metamask_disconnected": "Metamask deconectat cu succes",
"hours": "Ore",
"your_email": "E-mailul tău",
"change_avatar": "Schimbă avatarul",
@ -872,7 +870,6 @@
"installed_one": "Instalat",
"installed_other": "{{count}} instalată/instalate",
"verify_wallet": "Verificați portofelul",
"connect_metamask": "Conectați Metamask",
"create_events_on": "Creați evenimente în",
"enterprise_license": "Aceasta este o caracteristică de întreprindere",
"enterprise_license_description": "Pentru a activa această caracteristică, obține o cheie de implementare la consola {{consoleUrl}} și adaug-o la .env ca CALCOM_LICENSE_KEY. Dacă echipa ta are deja o licență, te rugăm să contactezi {{supportMail}} pentru ajutor.",
@ -1228,11 +1225,6 @@
"upload": "Încărcare",
"add_profile_photo": "Adăugați poză de profil",
"web3": "Web3",
"rainbow_token_gated": "Accesul la acest tip de eveniment este posibil cu tokenuri.",
"rainbow_connect_wallet_gate": "Conectați-vă portofelul dacă dețineți <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Portofelul dvs. conectat nu conține suficient <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Semnați solicitarea de mesaj în portofel.",
"rainbow_signature_error": "Eroare la solicitarea semnăturii din portofel.",
"token_address": "Adresă token",
"blockchain": "Blockchain",
"old_password": "Parola veche",
@ -1378,7 +1370,6 @@
"password_updated": "Parolă actualizată!",
"pending_payment": "Plată în așteptare",
"pending_invites": "Invitații în așteptare",
"confirmation_page_rainbow": "Restricționați accesul la evenimentul dvs. cu tokenuri sau NFT-uri pe Ethereum, Polygon și altele.",
"not_on_cal": "Nu este pe {{appName}}",
"no_calendar_installed": "Niciun calendar instalat",
"no_calendar_installed_description": "Încă nu v-ați conectat niciunul dintre calendare",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} тип мероприятия успешно создан",
"event_type_updated_successfully": "Тип события {{eventTypeTitle}} успешно обновлен",
"event_type_deleted_successfully": "Тип события успешно удален",
"web3_metamask_added": "Metamask успешно добавлен",
"web3_metamask_disconnected": "Metamask успешно отключен",
"hours": "Часы",
"your_email": "Ваш адрес электронной почты",
"change_avatar": "Изменить аватар",
@ -872,7 +870,6 @@
"installed_one": "Установлено",
"installed_other": "Установок: {{count}}",
"verify_wallet": "Подтвердить кошелек",
"connect_metamask": "Подключить Metamask",
"create_events_on": "Создавать события в календаре:",
"enterprise_license": "Это функция корпоративного тарифного плана",
"enterprise_license_description": "Чтобы включить эту функцию, получите ключ развертывания на консоли {{consoleUrl}} и добавьте его в .env как CALCOM_LICENSE_KEY. Если у вашей команды уже есть лицензия, пожалуйста, обратитесь за помощью в {{supportMail}}.",
@ -1228,11 +1225,6 @@
"upload": "Загрузить",
"add_profile_photo": "Добавить фото профиля",
"web3": "Web3",
"rainbow_token_gated": "Этот тип событий использует токены для контроля доступа.",
"rainbow_connect_wallet_gate": "Подключите кошелек, если у вас есть <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "В подключенном кошельке недостаточное количество <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Подпишите сообщение с запросом, используя свой кошелек.",
"rainbow_signature_error": "Ошибка при запросе подписи от вашего кошелька.",
"token_address": "Адрес токена",
"blockchain": "Блокчейн",
"old_password": "Старый пароль",
@ -1378,7 +1370,6 @@
"password_updated": "Пароль обновлен.",
"pending_payment": "Ожидает оплаты",
"pending_invites": "Приглашения, ожидающие ответа",
"confirmation_page_rainbow": "Используйте токены или NFT в Ethereum, Polygon и других сетях для ограничения доступа к мероприятиям.",
"not_on_cal": "Не является пользователем {{appName}}",
"no_calendar_installed": "Нет установленных календарей",
"no_calendar_installed_description": "Вы еще не подключили ни один календарь",

View File

@ -634,8 +634,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} tip događaja uspešno napravljen",
"event_type_updated_successfully": "{{eventTypeTitle}} tip događaja uspešno ažuriran",
"event_type_deleted_successfully": "Tip događaja uspešno obrisan",
"web3_metamask_added": "Metamask uspešno dodat",
"web3_metamask_disconnected": "Metamask uspešno diskonektovan",
"hours": "Sati",
"your_email": "Vaša E-pošta",
"change_avatar": "Promenite Avatara",
@ -876,7 +874,6 @@
"installed_one": "Instalirano",
"installed_other": "Instalirano {{count}} puta",
"verify_wallet": "Verifikuj Wallet",
"connect_metamask": "Poveži Metamask",
"create_events_on": "Kreiraj događaje na",
"enterprise_license": "Ovo je enterprise funkcija",
"enterprise_license_description": "Da biste omogućili ovu funkciju, nabavite ključ za primenu na {{consoleUrl}} konzoli i dodajte ga u svoj .env kao CALCOM_LICENCE_KEY. Ako vaš tim već ima licencu, obratite se na {{supportMail}} za pomoć.",
@ -1232,11 +1229,6 @@
"upload": "Otpremi",
"add_profile_photo": "Dodajte profilnu fotografiju",
"web3": "Web3",
"rainbow_token_gated": "Za ovaj tip događaja je potreban token.",
"rainbow_connect_wallet_gate": "Povežite svoj novčanik, ako ga imate <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Vaš povezani novčanik ne sadrži dovoljno <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Potpišite poruku sa zahtevom u vašem novčaniku.",
"rainbow_signature_error": "Greška prilikom zahteva potpisa iz vašeg novčanika.",
"token_address": "Adresa tokena",
"blockchain": "Lanac blokova",
"old_password": "Stara lozinka",
@ -1382,7 +1374,6 @@
"password_updated": "Lozinka je ažurirana!",
"pending_payment": "Čeka se na plaćanje",
"pending_invites": "Pozivi na čekanju",
"confirmation_page_rainbow": "Zaštitite vaš događaj tokenom ili NFT-om na Ethereum-u, Polygon-u, itd.",
"not_on_cal": "Nije na {{appName}}",
"no_calendar_installed": "Nije instaliran kalendar",
"no_calendar_installed_description": "Još niste povezali nijedan od svojih kalendara",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} har skapats",
"event_type_updated_successfully": "{{eventTypeTitle}} har uppdaterats",
"event_type_deleted_successfully": "Händelsetypen har raderats",
"web3_metamask_added": "Metamask tillagd",
"web3_metamask_disconnected": "Metamask bortkopplad",
"hours": "Timmar",
"your_email": "Din e-postadress",
"change_avatar": "Ändra avatar",
@ -872,7 +870,6 @@
"installed_one": "Installerad",
"installed_other": "{{count}} installerade",
"verify_wallet": "Verifiera plånbok",
"connect_metamask": "Anslut Metamask",
"create_events_on": "Skapa händelser i",
"enterprise_license": "Det här är en företagsfunktion",
"enterprise_license_description": "För att aktivera den här funktionen hämtar du en distributionsnyckel i konsolen {{consoleUrl}} och lägger till den i din .env som CALCOM_LICENSE_KEY. Om ditt team redan har en licens kan du kontakta {{supportMail}} för att få hjälp.",
@ -1228,11 +1225,6 @@
"upload": "Ladda upp",
"add_profile_photo": "Lägg till profilfoto",
"web3": "Web3",
"rainbow_token_gated": "Denna händelsetyp kräver token.",
"rainbow_connect_wallet_gate": "Anslut din plånbok om du äger <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Din anslutna plånbok innehåller inte tillräckligt med <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Signera meddelandebegäran på din plånbok.",
"rainbow_signature_error": "Fel vid begäran av signatur från din plånbok.",
"token_address": "Tokenadress",
"blockchain": "Blockkedja",
"old_password": "Gammalt lösenord",
@ -1378,7 +1370,6 @@
"password_updated": "Lösenord uppdaterat!",
"pending_payment": "Väntande betalning",
"pending_invites": "Väntande inbjudningar",
"confirmation_page_rainbow": "Tokenskydda din händelse med tokens eller NFT:er på Ethereum, Polygon med mera.",
"not_on_cal": "Inte på {{appName}}",
"no_calendar_installed": "Ingen kalender installerad",
"no_calendar_installed_description": "Du har ännu inte anslutit någon av dina kalendrar",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} etkinlik türü başarıyla oluşturuldu",
"event_type_updated_successfully": "{{eventTypeTitle}} etkinlik türü başarıyla güncellendi",
"event_type_deleted_successfully": "Etkinlik türü başarıyla silindi",
"web3_metamask_added": "Metamask başarıyla eklendi",
"web3_metamask_disconnected": "Metamask bağlantısı başarıyla kesildi",
"hours": "Saat",
"your_email": "E-postanız",
"change_avatar": "Avatarı değiştir",
@ -872,7 +870,6 @@
"installed_one": "Yüklendi",
"installed_other": "{{count}} yüklü",
"verify_wallet": "Cüzdanı Doğrula",
"connect_metamask": "MetaMask'i Bağla",
"create_events_on": "Şurada etkinlik oluşturun:",
"enterprise_license": "Bu bir kurumsal özelliktir",
"enterprise_license_description": "Bu özelliği etkinleştirmek için {{consoleUrl}} konsolundan bir dağıtım anahtarı alın ve bunu .env dosyanıza CALCOM_LICENSE_KEY olarak ekleyin. Ekibinizin zaten bir lisansı varsa yardım için lütfen {{supportMail}} adresinden iletişime geçin.",
@ -1228,11 +1225,6 @@
"upload": "Yükle",
"add_profile_photo": "Profil fotoğrafı ekleyin",
"web3": "Web3",
"rainbow_token_gated": "Bu etkinlik türü token korumalıdır.",
"rainbow_connect_wallet_gate": "<1>{{name}}</1> (<3>{{symbol}}</3>) sahibiyseniz cüzdanınızı bağlayın.",
"rainbow_insufficient_balance": "Bağlı cüzdanınızda yeterli <1>{{symbol}}</1> yok.",
"rainbow_sign_message_request": "Cüzdanınızdaki mesaj isteğini imzalayın.",
"rainbow_signature_error": "Cüzdanınızdan imza istenirken bir hata oluştu.",
"token_address": "Token Adresi",
"blockchain": "Blok zinciri",
"old_password": "Eski şifre",
@ -1378,7 +1370,6 @@
"password_updated": "Şifre güncellendi!",
"pending_payment": "Bekleyen ödeme",
"pending_invites": "Bekleyen Davetler",
"confirmation_page_rainbow": "Ethereum, Polygon ve diğer token'lar veya NFT ile etkinliğinize token kapısı ekleyin.",
"not_on_cal": "{{appName}}'da değil",
"no_calendar_installed": "Yüklü takvim yok",
"no_calendar_installed_description": "Henüz hiçbir takviminizi bağlamadınız",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "Тип заходу «{{eventTypeTitle}}» створено",
"event_type_updated_successfully": "Тип заходу «{{eventTypeTitle}}» оновлено",
"event_type_deleted_successfully": "Тип заходу видалено",
"web3_metamask_added": "Metamask додано",
"web3_metamask_disconnected": "Metamask від’єднано",
"hours": "Години",
"your_email": "Ваша ел. адреса",
"change_avatar": "Змінити аватар",
@ -872,7 +870,6 @@
"installed_one": "Установлено",
"installed_other": "Установлено {{count}}",
"verify_wallet": "Пройдіть перевірку гаманця",
"connect_metamask": "Підключіть Metamask",
"create_events_on": "Створюйте заходи в календарі",
"enterprise_license": "Це корпоративна функція",
"enterprise_license_description": "Щоб увімкнути цю функцію, отримайте ключ розгортання в консолі {{consoleUrl}} і додайте його у свій файл .env як CALCOM_LICENSE_KEY. Якщо у вашої команди вже є ліцензія, зверніться по допомогу за адресою {{supportMail}}.",
@ -1228,11 +1225,6 @@
"upload": "Передати",
"add_profile_photo": "Додати фото профілю",
"web3": "Web3",
"rainbow_token_gated": "Цей тип заходу доступний тільки для власників токенів.",
"rainbow_connect_wallet_gate": "Якщо у вас є <1>{{name}}</1> (<3>{{symbol}}</3>), підключіть свій гаманець.",
"rainbow_insufficient_balance": "У вашому підключеному гаманці бракує <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Підпишіть запит повідомлення у своєму гаманці.",
"rainbow_signature_error": "Не вдалося надіслати запит підпису з вашого гаманця.",
"token_address": "Адреса токена",
"blockchain": "Блокчейн",
"old_password": "Старий пароль",
@ -1378,7 +1370,6 @@
"password_updated": "Пароль оновлено!",
"pending_payment": "Очікується оплата",
"pending_invites": "Нерозглянуті запрошення",
"confirmation_page_rainbow": "Увімкніть доступ до свого заходу тільки для власників звичайних або невзаємозамінних токенів Ethereum, Polygon тощо.",
"not_on_cal": "Не на {{appName}}",
"no_calendar_installed": "Немає встановлених календарів",
"no_calendar_installed_description": "Ви ще не підключили свої календарі",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "Đã tạo thành công loại sự kiện {{eventTypeTitle}}",
"event_type_updated_successfully": "Đã cập nhật thành công loại sự kiện {{eventTypeTitle}}",
"event_type_deleted_successfully": "Đã xóa thành công loại sự kiện",
"web3_metamask_added": "Đã thêm thành công Metamask",
"web3_metamask_disconnected": "Đã ngắt kết nối thành công Metamask",
"hours": "Giờ",
"your_email": "Email của bạn",
"change_avatar": "Thay đổi hình đại diện",
@ -872,7 +870,6 @@
"installed_one": "Đã cài đặt",
"installed_other": "Đã cài đặt {{count}} lần",
"verify_wallet": "Xác minh Ví",
"connect_metamask": "Kết nối Metamask",
"create_events_on": "Tạo sự kiện trên",
"enterprise_license": "Đây là tính năng doanh nghiệp",
"enterprise_license_description": "Để bật tính năng này, nhận khoá triển khai tại console {{consoleUrl}} và thêm nó vào .env của bạn ở dạng CALCOM_LICENSE_KEY. Nếu nhóm của bạn đã có giấy phép, vui lòng liên hệ {{supportMail}} để được trợ giúp.",
@ -1228,11 +1225,6 @@
"upload": "Tải lên",
"add_profile_photo": "Thêm ảnh hồ sơ",
"web3": "Web3",
"rainbow_token_gated": "Loại sự kiện này yêu cầu token để truy cập.",
"rainbow_connect_wallet_gate": "Kết nối ví của bạn nếu bạn sở hữu <1>{{name}}</1> (<3>{{symbol}}</3>).",
"rainbow_insufficient_balance": "Ví được kết nối của bạn không chứa đủ <1>{{symbol}}</1>.",
"rainbow_sign_message_request": "Kí vào một yêu cầu tin nhắn trên ví của bạn.",
"rainbow_signature_error": "Lỗi khi gửi chữ kí từ ví của bạn.",
"token_address": "Địa chỉ token",
"blockchain": "Chuỗi khối",
"old_password": "Mật khẩu cũ",
@ -1378,7 +1370,6 @@
"password_updated": "Mật khẩu đã được cập nhật!",
"pending_payment": "Thanh toán đang chờ xử lí",
"pending_invites": "Lời mời đang chờ xử lý",
"confirmation_page_rainbow": "Yêu cầu token để truy cập sự kiện của bạn, với các token hoặc NFT trên Ethereum, Polygon, v.v.",
"not_on_cal": "Không phải trên {{appName}}",
"no_calendar_installed": "Chưa cài đặt lịch nào",
"no_calendar_installed_description": "Bạn chưa kết nối lịch nào của bạn",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "{{eventTypeTitle}} 活动类型创建成功",
"event_type_updated_successfully": "{{eventTypeTitle}} 活动类型更新成功",
"event_type_deleted_successfully": "活动类型删除成功",
"web3_metamask_added": "元掩码添加成功",
"web3_metamask_disconnected": "元掩码已成功断开连接",
"hours": "小时数",
"your_email": "您的邮箱",
"change_avatar": "修改头像",
@ -872,7 +870,6 @@
"installed_one": "已安装",
"installed_other": "已安装 {{count}} 次",
"verify_wallet": "验证钱包",
"connect_metamask": "连接元掩码",
"create_events_on": "活动创建于:",
"enterprise_license": "这是企业版功能",
"enterprise_license_description": "要启用此功能,请在 {{consoleUrl}} 控制台获取一个部署密钥,并将其添加到您的 .env 中作为 CALCOM_LICENSE_KEY。如果您的团队已经有许可证请联系 {{supportMail}} 获取帮助。",
@ -1228,11 +1225,6 @@
"upload": "上传",
"add_profile_photo": "添加个人资料照片",
"web3": "Web3",
"rainbow_token_gated": "此活动类型采用代币门控。",
"rainbow_connect_wallet_gate": "如果您拥有 <1>{{name}}</1> (<3>{{symbol}}</3>),请连接您的钱包。",
"rainbow_insufficient_balance": "您的已连接钱包未包含足够的 <1>{{symbol}}</1>。",
"rainbow_sign_message_request": "使用您的钱包签署消息请求。",
"rainbow_signature_error": "从您的钱包请求签名时出错。",
"token_address": "代币地址",
"blockchain": "区块链",
"old_password": "旧密码",
@ -1378,7 +1370,6 @@
"password_updated": "密码已更新!",
"pending_payment": "待付款",
"pending_invites": "待定邀请",
"confirmation_page_rainbow": "使用 Ethereum、Polygon 等平台的代币或 NFT 对您的活动进行代币门控。",
"not_on_cal": "不在 {{appName}} 上",
"no_calendar_installed": "未安装任何日历",
"no_calendar_installed_description": "您尚未连接任何日历",

View File

@ -630,8 +630,6 @@
"event_type_created_successfully": "成功新增活動類型 {{eventTypeTitle}}",
"event_type_updated_successfully": "成功更新活動類型 {{eventTypeTitle}}",
"event_type_deleted_successfully": "成功刪除活動類型",
"web3_metamask_added": "成功新增 Metamask",
"web3_metamask_disconnected": "成功中斷 Metamask",
"hours": "小時",
"your_email": "電子郵件",
"change_avatar": "更換大頭照",
@ -872,7 +870,6 @@
"installed_one": "已安裝",
"installed_other": "已安裝 {{count}} 個",
"verify_wallet": "驗證錢包",
"connect_metamask": "連接 Metamask",
"create_events_on": "建立活動時間:",
"enterprise_license": "此為企業版功能",
"enterprise_license_description": "若要啟用此功能,請在 {{consoleUrl}} 主控台取得部署金鑰,並在您的 .env 中新增為 CALCOM_LICENSE_KEY。如果您的團隊已經取得授權請聯絡 {{supportMail}} 取得協助。",
@ -1228,11 +1225,6 @@
"upload": "上傳",
"add_profile_photo": "新增個人資料相片",
"web3": "Web3",
"rainbow_token_gated": "此活動類型是以代幣管制。",
"rainbow_connect_wallet_gate": "如果您擁有 <1>{{name}}</1> (<3>{{symbol}}</3>),請連接您的錢包。",
"rainbow_insufficient_balance": "您的已連接錢包未包含足夠的 <1>{{symbol}}</1>。",
"rainbow_sign_message_request": "在您的錢包上簽署訊息請求。",
"rainbow_signature_error": "請求您的錢包簽章時發生錯誤。",
"token_address": "代幣地址",
"blockchain": "區塊鏈",
"old_password": "舊密碼",
@ -1378,7 +1370,6 @@
"password_updated": "密碼已更新!",
"pending_payment": "待付款",
"pending_invites": "待回應的邀請",
"confirmation_page_rainbow": "使用 Ethereum、Polygon 等的 Token 或 NFT 來以代幣管制您的活動。",
"not_on_cal": "不在 {{appName}} 上",
"no_calendar_installed": "未安裝行事曆",
"no_calendar_installed_description": "您尚未連接任何行事曆",

View File

@ -36,11 +36,6 @@ export const getEventTypeAppData = <T extends EventTypeAppsList>(
currency: eventType.currency,
paymentOption: "ON_BOOKING",
},
rainbow: {
enabled: !!(eventType.metadata?.smartContractAddress && eventType.metadata?.blockchainId),
smartContractAddress: eventType.metadata?.smartContractAddress || "",
blockchainId: eventType.metadata?.blockchainId || 0,
},
giphy: {
enabled: !!eventType.metadata?.giphyThankYouPage,
thankYouPage: eventType.metadata?.giphyThankYouPage || "",

View File

@ -27,7 +27,6 @@ export const EventTypeAddonMap = {
metapixel: dynamic(() => import("./metapixel/components/EventTypeAppCardInterface")),
plausible: dynamic(() => import("./plausible/components/EventTypeAppCardInterface")),
qr_code: dynamic(() => import("./qr_code/components/EventTypeAppCardInterface")),
rainbow: dynamic(() => import("./rainbow/components/EventTypeAppCardInterface")),
stripepayment: dynamic(() => import("./stripepayment/components/EventTypeAppCardInterface")),
"booking-pages-tag": dynamic(() =>
import("./templates/booking-pages-tag/components/EventTypeAppCardInterface")

View File

@ -16,7 +16,6 @@ import { appKeysSchema as office365calendar_zod_ts } from "./office365calendar/z
import { appKeysSchema as office365video_zod_ts } from "./office365video/zod";
import { appKeysSchema as plausible_zod_ts } from "./plausible/zod";
import { appKeysSchema as qr_code_zod_ts } from "./qr_code/zod";
import { appKeysSchema as rainbow_zod_ts } from "./rainbow/zod";
import { appKeysSchema as routing_forms_zod_ts } from "./routing-forms/zod";
import { appKeysSchema as salesforce_zod_ts } from "./salesforce/zod";
import { appKeysSchema as stripepayment_zod_ts } from "./stripepayment/zod";
@ -46,7 +45,6 @@ export const appKeysSchemas = {
office365video: office365video_zod_ts,
plausible: plausible_zod_ts,
qr_code: qr_code_zod_ts,
rainbow: rainbow_zod_ts,
"routing-forms": routing_forms_zod_ts,
salesforce: salesforce_zod_ts,
stripe: stripepayment_zod_ts,

View File

@ -35,7 +35,6 @@ import ping_config_json from "./ping/config.json";
import pipedream_config_json from "./pipedream/config.json";
import plausible_config_json from "./plausible/config.json";
import qr_code_config_json from "./qr_code/config.json";
import rainbow_config_json from "./rainbow/config.json";
import raycast_config_json from "./raycast/config.json";
import riverside_config_json from "./riverside/config.json";
import routing_forms_config_json from "./routing-forms/config.json";
@ -101,7 +100,6 @@ export const appStoreMetadata = {
pipedream: pipedream_config_json,
plausible: plausible_config_json,
qr_code: qr_code_config_json,
rainbow: rainbow_config_json,
raycast: raycast_config_json,
riverside: riverside_config_json,
"routing-forms": routing_forms_config_json,

View File

@ -16,7 +16,6 @@ import { appDataSchema as office365calendar_zod_ts } from "./office365calendar/z
import { appDataSchema as office365video_zod_ts } from "./office365video/zod";
import { appDataSchema as plausible_zod_ts } from "./plausible/zod";
import { appDataSchema as qr_code_zod_ts } from "./qr_code/zod";
import { appDataSchema as rainbow_zod_ts } from "./rainbow/zod";
import { appDataSchema as routing_forms_zod_ts } from "./routing-forms/zod";
import { appDataSchema as salesforce_zod_ts } from "./salesforce/zod";
import { appDataSchema as stripepayment_zod_ts } from "./stripepayment/zod";
@ -46,7 +45,6 @@ export const appDataSchemas = {
office365video: office365video_zod_ts,
plausible: plausible_zod_ts,
qr_code: qr_code_zod_ts,
rainbow: rainbow_zod_ts,
"routing-forms": routing_forms_zod_ts,
salesforce: salesforce_zod_ts,
stripe: stripepayment_zod_ts,

View File

@ -35,7 +35,6 @@ export const apiHandlers = {
pipedream: import("./pipedream/api"),
plausible: import("./plausible/api"),
qr_code: import("./qr_code/api"),
rainbow: import("./rainbow/api"),
raycast: import("./raycast/api"),
riverside: import("./riverside/api"),
"routing-forms": import("./routing-forms/api"),

View File

@ -1,8 +0,0 @@
---
items:
- 1.jpg
- 2.jpg
- 3.jpg
---
Token gate bookings based on NFTs, DAO tokens, and ERC-20 tokens. Rainbow supports dozens of trusted Ethereum wallet apps to verify token ownership. Available blockchains are Ethereum mainnet, Arbitrum, Optimism, and Polygon mainnet.

View File

@ -1,12 +0,0 @@
# Rainbow App
> Intended for developer information
The web3 app uses [RainbowKit](https://www.rainbowkit.com/) to authenticate Ethereum users.
When deploying, the app requires either a `ALCHEMY_API_KEY` or `INFURA_API_KEY` (or both) which can be obtained by creating an Alchemy or Infura project respectively.
<img width="901" alt="Find your Alchemy API key" src="https://user-images.githubusercontent.com/8162609/187499278-e5f03c3f-b4a5-430a-9121-f30207802d4c.png">
<img width="932" alt="Find your Infura API key" src="https://user-images.githubusercontent.com/8162609/187499759-425b4fc4-621b-4753-b77f-257b5055408a.png">
Available blockchains are Ethereum mainnet, Arbitrum, Optimism, and Polygon mainnet.

View File

@ -1,16 +0,0 @@
import type { AppDeclarativeHandler } from "@calcom/types/AppHandler";
import { createDefaultInstallation } from "../../_utils/installation";
import appConfig from "../config.json";
const handler: AppDeclarativeHandler = {
appType: appConfig.type,
slug: appConfig.slug,
variant: appConfig.slug,
supportsMultipleInstalls: false,
handlerType: "add",
createCredential: ({ appType, user, slug }) =>
createDefaultInstallation({ appType, userId: user.id, slug, key: {} }),
};
export default handler;

View File

@ -1 +0,0 @@
export { default as add } from "./add";

View File

@ -1,35 +0,0 @@
import React, { useState } from "react";
import { useAppContextWithSchema } from "@calcom/app-store/EventTypeAppContext";
import AppCard from "@calcom/app-store/_components/AppCard";
import RainbowInstallForm from "@calcom/app-store/rainbow/components/RainbowInstallForm";
import type { EventTypeAppCardComponent } from "@calcom/app-store/types";
import type { appDataSchema } from "../zod";
const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ app }) {
const [getAppData, setAppData] = useAppContextWithSchema<typeof appDataSchema>();
const blockchainId = getAppData("blockchainId");
const smartContractAddress = getAppData("smartContractAddress");
const [showRainbowSection, setShowRainbowSection] = useState(getAppData("enabled"));
return (
<AppCard
setAppData={setAppData}
app={app}
switchOnClick={(e) => {
setShowRainbowSection(e);
}}
switchChecked={showRainbowSection}>
{showRainbowSection && (
<RainbowInstallForm
setAppData={setAppData}
blockchainId={blockchainId}
smartContractAddress={(smartContractAddress as string) || ""}
/>
)}
</AppCard>
);
};
export default EventTypeAppCard;

View File

@ -1,63 +0,0 @@
import type { z } from "zod";
import type { SetAppDataGeneric } from "@calcom/app-store/EventTypeAppContext";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { SUPPORTED_CHAINS_FOR_FORM } from "@calcom/rainbow/utils/ethereum";
import { Select } from "@calcom/ui";
import type { appDataSchema } from "../zod";
type RainbowInstallFormProps = {
setAppData: SetAppDataGeneric<typeof appDataSchema>;
} & Pick<z.infer<typeof appDataSchema>, "smartContractAddress" | "blockchainId">;
const RainbowInstallForm: React.FC<RainbowInstallFormProps> = ({
setAppData,
blockchainId,
smartContractAddress,
}) => {
const { t } = useLocale();
return (
<>
<div className="mt-5 block items-center sm:flex">
<div className="min-w-48 mb-4 sm:mb-0">
<label htmlFor="blockchainId" className="text-default flex text-sm font-medium">
{t("Blockchain")}
</label>
</div>
<Select
isSearchable={false}
className="block w-full min-w-0 flex-1 rounded-sm text-sm"
onChange={(e) => {
setAppData("blockchainId", (e && e.value) || 1);
}}
defaultValue={SUPPORTED_CHAINS_FOR_FORM.find((e) => e.value === blockchainId)}
options={SUPPORTED_CHAINS_FOR_FORM || [{ value: 1, label: "Ethereum" }]}
/>
</div>
<div className="mt-5 block items-center pb-4 sm:flex">
<div className="min-w-48 mb-4 sm:mb-0">
<label htmlFor="smartContractAddress" className="text-default flex text-sm font-medium">
{t("token_address")}
</label>
</div>
<div className="w-full">
<div className="relative mt-1 rounded-sm">
<input
type="text"
className="border-default block w-full rounded-sm text-sm"
placeholder={t("Example: 0x71c7656ec7ab88b098defb751b7401b5f6d8976f")}
defaultValue={(smartContractAddress || "") as string}
onChange={(e) => {
setAppData("smartContractAddress", e.target.value);
}}
/>
</div>
</div>
</div>
</>
);
};
export default RainbowInstallForm;

View File

@ -1,175 +0,0 @@
import {
ConnectButton,
darkTheme,
getDefaultWallets,
lightTheme,
RainbowKitProvider,
} from "@rainbow-me/rainbowkit";
import "@rainbow-me/rainbowkit/styles.css";
import { useTheme } from "next-themes";
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { Trans } from "react-i18next";
import { configureChains, createClient, useAccount, useSignMessage, WagmiConfig } from "wagmi";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import { trpc } from "@calcom/trpc/react";
import { showToast, SkeletonText } from "@calcom/ui";
import { AlertTriangle, Loader } from "@calcom/ui/components/icon";
import { ETH_MESSAGE, getProviders, SUPPORTED_CHAINS } from "../utils/ethereum";
const { chains, provider } = configureChains(SUPPORTED_CHAINS, getProviders());
const { connectors } = getDefaultWallets({
appName: "Cal.com",
chains,
});
const wagmiClient = createClient({
autoConnect: true,
connectors,
provider,
});
type RainbowGateProps = {
children: React.ReactNode;
setToken: (_: string) => void;
chainId: number;
tokenAddress: string;
};
const RainbowGate: React.FC<RainbowGateProps> = (props) => {
const { resolvedTheme: theme } = useTheme();
const [rainbowTheme, setRainbowTheme] = useState(theme === "dark" ? darkTheme() : lightTheme());
useEffect(() => {
theme === "dark" ? setRainbowTheme(darkTheme()) : setRainbowTheme(lightTheme());
}, [theme]);
return (
<WagmiConfig client={wagmiClient}>
<RainbowKitProvider chains={chains.filter((chain) => chain.id === props.chainId)} theme={rainbowTheme}>
<BalanceCheck {...props} />
</RainbowKitProvider>
</WagmiConfig>
);
};
// The word "token" is used for two differenct concepts here: `setToken` is the token for
// the Gate while `useToken` is a hook used to retrieve the Ethereum token.
const BalanceCheck: React.FC<RainbowGateProps> = ({ chainId, setToken, tokenAddress }) => {
const { t } = useLocale();
const { address } = useAccount();
const {
data: signedMessage,
isLoading: isSignatureLoading,
isError: isSignatureError,
signMessage,
} = useSignMessage({
message: ETH_MESSAGE,
});
const { data: contractData, isLoading: isContractLoading } = trpc.viewer.eth.contract.useQuery({
address: tokenAddress,
chainId,
});
const { data: balanceData, isLoading: isBalanceLoading } = trpc.viewer.eth.balance.useQuery(
{ address: address || "", tokenAddress, chainId },
{
enabled: !!address,
}
);
// The token may have already been set in the query params, so we can extract it here
const router = useRouter();
const { ethSignature, ...routerQuery } = router.query;
const isLoading = isContractLoading || isBalanceLoading;
// Any logic here will unlock the gate by setting the token to the user's wallet signature
useEffect(() => {
// If the `ethSignature` is found, remove it from the URL bar and propogate back up
if (ethSignature !== undefined) {
// Remove the `ethSignature` param but keep all others
router.replace({ query: { ...routerQuery } });
setToken(ethSignature as string);
}
if (balanceData && balanceData.data) {
if (balanceData.data.hasBalance) {
if (signedMessage) {
showToast("Wallet verified.", "success");
setToken(signedMessage);
} else if (router.isReady && !ethSignature) {
signMessage();
}
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [router.isReady, balanceData, setToken, signedMessage, signMessage]);
return (
<main className="mx-auto max-w-3xl py-24 px-4">
<div className="rounded-md border border-neutral-200 dark:border-neutral-700 dark:hover:border-neutral-600">
<div className="hover:border-brand-default dark:bg-darkgray-100 bg-default hover:bg-default flex min-h-[120px] grow flex-col border-b border-neutral-200 p-6 text-center first:rounded-t-md last:rounded-b-md last:border-b-0 dark:border-neutral-700 dark:hover:border-neutral-600 md:flex-row md:text-left">
<span className="mb-4 grow md:mb-0">
<h2 className="text-emphasis dark:text-inverted mb-2 grow font-semibold">Token Gate</h2>
{isLoading && (
<>
<SkeletonText className="mb-3 h-1 w-full" />
<SkeletonText className="h-1 w-full" />
</>
)}
{!isLoading && contractData && contractData.data && (
<>
<p className="dark:text-inverted text-gray-300">
<Trans i18nKey="rainbow_connect_wallet_gate" t={t}>
Connect your wallet if you own {contractData.data.name} ({contractData.data.symbol}) .
</Trans>
</p>
{balanceData && balanceData.data && (
<>
{!balanceData.data.hasBalance && (
<div className="mt-2 flex flex-row items-center">
<AlertTriangle className="h-5 w-5 text-red-600" />
<p className="ml-2 text-red-600">
<Trans i18nKey="rainbow_insufficient_balance" t={t}>
Your connected wallet doesn&apos;t contain enough {contractData.data.symbol}.
</Trans>
</p>
</div>
)}
{balanceData.data.hasBalance && isSignatureLoading && (
<div className="mt-2 flex flex-row items-center">
<Loader className="h-5 w-5 text-green-600" />
<p className="ml-2 text-green-600">{t("rainbow_sign_message_request")}</p>
</div>
)}
</>
)}
{isSignatureError && (
<div className="mt-2 flex flex-row items-center">
<AlertTriangle className="h-5 w-5 text-red-600" />
<p className="ml-2 text-red-600">
<Trans i18nKey="rainbow_signature_error" t={t}>
{t("rainbow_signature_error")}
</Trans>
</p>
</div>
)}
</>
)}
</span>
<span className="ml-10 min-w-[170px] self-center">
<ConnectButton chainStatus="icon" showBalance={false} />
</span>
</div>
</div>
</main>
);
};
export default RainbowGate;

View File

@ -1,15 +0,0 @@
{
"/*": "Don't modify slug - If required, do it using cli edit command",
"name": "Rainbow",
"slug": "rainbow",
"type": "rainbow_web3",
"logo": "icon.svg",
"url": "https://github.com/hexcowboy",
"variant": "web3",
"categories": ["web3"],
"extendsFeature": "EventType",
"publisher": "hexcowboy",
"email": "",
"description": "Web3 integration for token gating on Fungible Tokens, NFTs, and DAOs.",
"__createdUsingCli": true
}

View File

@ -1 +0,0 @@
export * as api from "./api";

View File

@ -1,17 +0,0 @@
{
"$schema": "https://json.schemastore.org/package.json",
"private": true,
"name": "@calcom/rainbow",
"version": "0.0.0",
"main": "./index.ts",
"description": "Web3 integration for token gating on Fungible Tokens, NFTs, and DAOs.",
"dependencies": {
"@calcom/lib": "*",
"@rainbow-me/rainbowkit": "^0.5.0",
"ethers": "^5.7.0",
"wagmi": "^0.6.4"
},
"devDependencies": {
"@calcom/types": "*"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

View File

@ -1,54 +0,0 @@
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="120" height="120" fill="url(#paint0_linear_62_329)"/>
<path d="M20 38H26C56.9279 38 82 63.0721 82 94V100H94C97.3137 100 100 97.3137 100 94C100 53.1309 66.8691 20 26 20C22.6863 20 20 22.6863 20 26V38Z" fill="url(#paint1_radial_62_329)"/>
<path d="M84 94H100C100 97.3137 97.3137 100 94 100H84V94Z" fill="url(#paint2_linear_62_329)"/>
<path d="M26 20L26 36H20L20 26C20 22.6863 22.6863 20 26 20Z" fill="url(#paint3_linear_62_329)"/>
<path d="M20 36H26C58.0325 36 84 61.9675 84 94V100H66V94C66 71.9086 48.0914 54 26 54H20V36Z" fill="url(#paint4_radial_62_329)"/>
<path d="M68 94H84V100H68V94Z" fill="url(#paint5_linear_62_329)"/>
<path d="M20 52L20 36L26 36L26 52H20Z" fill="url(#paint6_linear_62_329)"/>
<path d="M20 62C20 65.3137 22.6863 68 26 68C40.3594 68 52 79.6406 52 94C52 97.3137 54.6863 100 58 100H68V94C68 70.804 49.196 52 26 52H20V62Z" fill="url(#paint7_radial_62_329)"/>
<path d="M52 94H68V100H58C54.6863 100 52 97.3137 52 94Z" fill="url(#paint8_radial_62_329)"/>
<path d="M26 68C22.6863 68 20 65.3137 20 62L20 52L26 52L26 68Z" fill="url(#paint9_radial_62_329)"/>
<defs>
<linearGradient id="paint0_linear_62_329" x1="60" y1="0" x2="60" y2="120" gradientUnits="userSpaceOnUse">
<stop stop-color="#174299"/>
<stop offset="1" stop-color="#001E59"/>
</linearGradient>
<radialGradient id="paint1_radial_62_329" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(26 94) rotate(-90) scale(74)">
<stop offset="0.770277" stop-color="#FF4000"/>
<stop offset="1" stop-color="#8754C9"/>
</radialGradient>
<linearGradient id="paint2_linear_62_329" x1="83" y1="97" x2="100" y2="97" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF4000"/>
<stop offset="1" stop-color="#8754C9"/>
</linearGradient>
<linearGradient id="paint3_linear_62_329" x1="23" y1="20" x2="23" y2="37" gradientUnits="userSpaceOnUse">
<stop stop-color="#8754C9"/>
<stop offset="1" stop-color="#FF4000"/>
</linearGradient>
<radialGradient id="paint4_radial_62_329" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(26 94) rotate(-90) scale(58)">
<stop offset="0.723929" stop-color="#FFF700"/>
<stop offset="1" stop-color="#FF9901"/>
</radialGradient>
<linearGradient id="paint5_linear_62_329" x1="68" y1="97" x2="84" y2="97" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFF700"/>
<stop offset="1" stop-color="#FF9901"/>
</linearGradient>
<linearGradient id="paint6_linear_62_329" x1="23" y1="52" x2="23" y2="36" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFF700"/>
<stop offset="1" stop-color="#FF9901"/>
</linearGradient>
<radialGradient id="paint7_radial_62_329" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(26 94) rotate(-90) scale(42)">
<stop offset="0.59513" stop-color="#00AAFF"/>
<stop offset="1" stop-color="#01DA40"/>
</radialGradient>
<radialGradient id="paint8_radial_62_329" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(51 97) scale(17 45.3333)">
<stop stop-color="#00AAFF"/>
<stop offset="1" stop-color="#01DA40"/>
</radialGradient>
<radialGradient id="paint9_radial_62_329" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(23 69) rotate(-90) scale(17 322.37)">
<stop stop-color="#00AAFF"/>
<stop offset="1" stop-color="#01DA40"/>
</radialGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,25 +0,0 @@
import { checkBalance } from "../utils/ethereum";
import type { TBalanceInputSchema } from "./balance.schema";
interface BalanceHandlerOptions {
input: TBalanceInputSchema;
}
export const balanceHandler = async ({ input }: BalanceHandlerOptions) => {
const { address, tokenAddress, chainId } = input;
try {
const hasBalance = await checkBalance(address, tokenAddress, chainId);
return {
data: {
hasBalance,
},
};
} catch (e) {
return {
data: {
hasBalance: false,
},
};
}
};

View File

@ -1,19 +0,0 @@
import z from "zod";
export const ZBalanceInputSchema = z.object({
address: z.string(),
tokenAddress: z.string(),
chainId: z.number(),
});
export const ZBalanceOutputSchema = z.object({
data: z
.object({
hasBalance: z.boolean(),
})
.nullish(),
error: z.string().nullish(),
});
export type TBalanceOutputSchema = z.infer<typeof ZBalanceOutputSchema>;
export type TBalanceInputSchema = z.infer<typeof ZBalanceInputSchema>;

View File

@ -1,42 +0,0 @@
import { ethers } from "ethers";
import { configureChains, createClient } from "wagmi";
import abi from "../utils/abi.json";
import { getProviders, SUPPORTED_CHAINS } from "../utils/ethereum";
import type { TContractInputSchema } from "./contract.schema";
interface ContractHandlerOptions {
input: TContractInputSchema;
}
export const contractHandler = async ({ input }: ContractHandlerOptions) => {
const { address, chainId } = input;
const { provider } = configureChains(
SUPPORTED_CHAINS.filter((chain) => chain.id === chainId),
getProviders()
);
const client = createClient({
provider,
});
const contract = new ethers.Contract(address, abi, client.provider);
try {
const name = await contract.name();
const symbol = await contract.symbol();
return {
data: {
name,
symbol: `$${symbol}`,
},
};
} catch (e) {
return {
data: {
name: address,
symbol: "$UNKNOWN",
},
};
}
};

View File

@ -1,19 +0,0 @@
import z from "zod";
export const ZContractInputSchema = z.object({
address: z.string(),
chainId: z.number(),
});
export const ZContractOutputSchema = z.object({
data: z
.object({
name: z.string(),
symbol: z.string(),
})
.nullish(),
error: z.string().nullish(),
});
export type TContractInputSchema = z.infer<typeof ZContractInputSchema>;
export type TContractOutputSchema = z.infer<typeof ZContractOutputSchema>;

View File

@ -1,55 +0,0 @@
import publicProcedure from "@calcom/trpc/server/procedures/publicProcedure";
import { router } from "@calcom/trpc/server/trpc";
import { ZBalanceInputSchema, ZBalanceOutputSchema } from "./balance.schema";
import { ZContractInputSchema, ZContractOutputSchema } from "./contract.schema";
interface EthRouterHandlersCache {
contract?: typeof import("./contract.handler").contractHandler;
balance?: typeof import("./balance.handler").balanceHandler;
}
const UNSTABLE_HANDLER_CACHE: EthRouterHandlersCache = {};
const ethRouter = router({
// Fetch contract `name` and `symbol` or error
contract: publicProcedure
.input(ZContractInputSchema)
.output(ZContractOutputSchema)
.query(async ({ input }) => {
if (!UNSTABLE_HANDLER_CACHE.contract) {
UNSTABLE_HANDLER_CACHE.contract = await import("./contract.handler").then(
(mod) => mod.contractHandler
);
}
// Unreachable code but required for type safety
if (!UNSTABLE_HANDLER_CACHE.contract) {
throw new Error("Failed to load handler");
}
return UNSTABLE_HANDLER_CACHE.contract({
input,
});
}),
// Fetch user's `balance` of either ERC-20 or ERC-721 compliant token or error
balance: publicProcedure
.input(ZBalanceInputSchema)
.output(ZBalanceOutputSchema)
.query(async ({ input }) => {
if (!UNSTABLE_HANDLER_CACHE.balance) {
UNSTABLE_HANDLER_CACHE.balance = await import("./balance.handler").then((mod) => mod.balanceHandler);
}
// Unreachable code but required for type safety
if (!UNSTABLE_HANDLER_CACHE.balance) {
throw new Error("Failed to load handler");
}
return UNSTABLE_HANDLER_CACHE.balance({
input,
});
}),
});
export default ethRouter;

View File

@ -1,49 +0,0 @@
[
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]

View File

@ -1,116 +0,0 @@
import type { Prisma } from "@prisma/client";
import { utils, Contract } from "ethers";
import { chain, configureChains, createClient } from "wagmi";
import { alchemyProvider } from "wagmi/providers/alchemy";
import { infuraProvider } from "wagmi/providers/infura";
import { publicProvider } from "wagmi/providers/public";
import { HttpError } from "@calcom/lib/http-error";
import abi from "./abi.json";
export const ETH_MESSAGE = "Connect to Cal.com";
export const SUPPORTED_CHAINS = [chain.mainnet, chain.polygon, chain.optimism, chain.arbitrum];
export const SUPPORTED_CHAINS_FOR_FORM = SUPPORTED_CHAINS.map((chain) => {
return { value: chain.id, label: chain.name };
});
// Optionally grabs Alchemy, Infura, in addition to public providers
export const getProviders = () => {
let providers = []; // eslint-disable-line prefer-const
if (process.env.ALCHEMY_API_KEY) {
providers.push(alchemyProvider({ apiKey: process.env.ALCHEMY_API_KEY }));
}
if (process.env.INFURA_API_KEY) {
providers.push(infuraProvider({ apiKey: process.env.INFURA_API_KEY }));
}
// Public provider will always be available as fallback, but having at least
// on of either Infura or Alchemy providers is highly recommended
providers.push(publicProvider());
return providers;
};
type VerifyResult = {
hasBalance: boolean;
address: string;
};
// Checks balance for any contract that implements the abi (NFT, ERC20, etc)
export const checkBalance = async (
walletAddress: string,
tokenAddress: string,
chainId: number
): Promise<boolean> => {
const { provider } = configureChains(
SUPPORTED_CHAINS.filter((chain) => chain.id === chainId),
getProviders()
);
const client = createClient({
provider,
});
const contract = new Contract(tokenAddress, abi, client.provider);
const userAddress = utils.getAddress(walletAddress);
const balance = await contract.balanceOf(userAddress);
return !balance.isZero();
};
// Extracts wallet address from a signed message and checks balance
export const verifyEthSig = async (
sig: string,
tokenAddress: string,
chainId: number
): Promise<VerifyResult> => {
const address = utils.verifyMessage(ETH_MESSAGE, sig);
const hasBalance = await checkBalance(address, tokenAddress, chainId);
return {
address,
hasBalance,
};
};
type HandleEthSignatureInput = {
smartContractAddress?: string;
blockchainId?: number;
};
// Handler used in `/book/event` API
export const handleEthSignature = async (
_metadata: Prisma.JsonValue,
ethSignature?: string
): Promise<string | undefined> => {
if (!_metadata) {
return;
}
const metadata = _metadata as HandleEthSignatureInput;
if (metadata) {
if (metadata.blockchainId && metadata.smartContractAddress) {
if (!ethSignature) {
throw new HttpError({ statusCode: 400, message: "Ethereum signature required." });
}
const { address, hasBalance } = await verifyEthSig(
ethSignature,
metadata.smartContractAddress as string,
metadata.blockchainId as number
);
if (!hasBalance) {
throw new HttpError({ statusCode: 400, message: "The wallet doesn't contain enough tokens." });
} else {
return address;
}
}
}
return undefined;
};

View File

@ -1,12 +0,0 @@
import { z } from "zod";
import { eventTypeAppCardZod } from "../eventTypeAppCardZod";
export const appDataSchema = eventTypeAppCardZod.merge(
z.object({
smartContractAddress: z.string().optional(),
blockchainId: z.number().optional(),
})
);
export const appKeysSchema = z.object({});

View File

@ -13,7 +13,6 @@ import { metadata as GoogleMeetMetadata } from "@calcom/app-store/googlevideo/_m
import type { LocationObject } from "@calcom/app-store/locations";
import { getLocationValueForDB } from "@calcom/app-store/locations";
import { MeetLocationType } from "@calcom/app-store/locations";
import { handleEthSignature } from "@calcom/app-store/rainbow/utils/ethereum";
import type { EventTypeAppsList } from "@calcom/app-store/utils";
import { getAppFromSlug, getEventTypeAppData } from "@calcom/app-store/utils";
import { cancelScheduledJobs, scheduleTrigger } from "@calcom/app-store/zapier/lib/nodeScheduler";
@ -817,12 +816,6 @@ async function handler(
users = [...availableUsers.filter((user) => user.isFixed), ...luckyUsers];
}
const rainbowAppData = getEventTypeAppData(eventType, "rainbow") || {};
// @TODO: use the returned address somewhere in booking creation?
// const address: string | undefined = await ...
await handleEthSignature(rainbowAppData, reqBody.ethSignature);
const [organizerUser] = users;
const tOrganizer = await getTranslation(organizerUser?.locale ?? "en", "common");
// use host default

View File

@ -257,7 +257,6 @@ export default async function getEventTypeById({
)?.default_currency || "usd",
},
giphy: getEventTypeAppData(eventTypeWithParsedMetadata, "giphy", true),
rainbow: getEventTypeAppData(eventTypeWithParsedMetadata, "rainbow", true),
};
// TODO: How to extract metadata schema from _EventTypeModel to be able to parse it?

View File

@ -42,12 +42,6 @@
"slug": "campfire",
"type": "campfire_video"
},
{
"dirName": "rainbow",
"categories": ["web3"],
"slug": "rainbow",
"type": "rainbow_web3"
},
{
"dirName": "raycast",
"categories": ["other"],

View File

@ -174,7 +174,6 @@ export const bookingCreateBodySchema = z.object({
metadata: z.record(z.string()),
hasHashedBookingLink: z.boolean().optional(),
hashedLink: z.string().nullish(),
ethSignature: z.string().optional(),
seatReferenceUid: z.string().optional(),
});

View File

@ -24,7 +24,6 @@ const ENDPOINTS = [
"availability",
"bookings",
"deploymentSetup",
"eth",
"eventTypes",
"features",
"insights",

View File

@ -1,4 +1,3 @@
import ethRouter from "@calcom/app-store/rainbow/trpc/router";
import app_RoutingForms from "@calcom/app-store/routing-forms/trpc-router";
import { userAdminRouter } from "@calcom/features/ee/users/server/trpc-router";
import { featureFlagRouter } from "@calcom/features/flags/server/router";
@ -43,7 +42,6 @@ export const viewerRouter = mergeRouters(
// NOTE: Add all app related routes in the bottom till the problem described in @calcom/app-store/trpc-routers.ts is solved.
// After that there would just one merge call here for all the apps.
appRoutingForms: app_RoutingForms,
eth: ethRouter,
features: featureFlagRouter,
appsRouter,
users: userAdminRouter,

View File

@ -174,7 +174,6 @@
},
"globalDependencies": ["yarn.lock"],
"globalEnv": [
"ALCHEMY_API_KEY",
"ANALYZE",
"API_KEY_PREFIX",
"APP_USER_NAME",
@ -202,7 +201,6 @@
"HEROKU_APP_NAME",
"HUBSPOT_CLIENT_ID",
"HUBSPOT_CLIENT_SECRET",
"INFURA_API_KEY",
"INTEGRATION_TEST_MODE",
"IP_BANLIST",
"LARK_OPEN_APP_ID",

2732
yarn.lock

File diff suppressed because it is too large Load Diff