# Desplegando tu Transactions Server

El [transactions-server](https://github.com/decentraland/transactions-server/tree/1.8.0) es un servidor proxy que retransmite transacciones a [Gelato](https://www.gelato.network/relay). Recibe una transacción firmada del cliente que a su vez se envía a la red apropiada entre bastidores. Esto permite al propietario del servidor facilitar a sus usuarios transacciones sin coste

El servidor de transacciones se utiliza para ayudar con la experiencia de usuario al usar múltiples redes y para evitar que cambien de proveedor de red sobre la marcha. Los usuarios pueden seguir conectados a [Ethereum](https://ethereum.org/en/) e interactuar con [Polygon](https://polygon.technology/) [solo firmando transacciones](https://docs.decentraland.org/blockchain-integration/transactions-in-polygon/)

La DAO de Decentraland ha configurado un servidor usado por nuestras dapps, cubriendo el coste hasta cierto límite con algunas [restricciones](#restrictions). Este documento explica cómo puedes [desplegar este servidor](#running-the-server) para permitir que tus usuarios retransmitan transacciones con las restricciones que necesites, si las hay.

## Restricciones

Todas las restricciones son por transacción que el usuario intente enviar. Lo que, en la práctica, se traduce en una solicitud POST al servidor.

Las restricciones configurables que tiene el servidor son:

* Comprueba una cuota de transacciones máximas por día. Ver [la sección de colecciones](#collections) para más información.
* Comprueba contratos en la lista blanca, así que si una transacción intenta interactuar con un contrato que no está reconocido fallará. Para hacer esto utiliza
  * Los contratos desplegados y colecciones. Ver [la sección de contratos y colecciones](#contracts-and-collections) para más información
* El precio de las ventas, restringiéndolo si está por debajo de un umbral. Ver [sección de valor mínimo de venta](#min-sale-value) para más información

## Configuración de Gelato

[Gelato](https://www.gelato.network/relay) es un Protocolo Relayer Multichain. Usamos su infraestructura para permitir transacciones sin coste. Esto efectivamente significa que, cuando vas a enviar una transacción, en su lugar estás firmando un mensaje y enviándolo a Gelato. El servicio se encargará de enviar la transacción por ti y devolverte una respuesta (hash de la transacción).

Necesita un contrato para reenviar las transacciones, pero afortunadamente podemos reutilizar el que está siendo usado por Decentraland (ver más abajo)

[Gelato](https://www.gelato.network/relay) funciona como una API para el servidor. [Para configurar](#configuring-the-server) lo necesitarás primero una API KEY que [usaremos más adelante](#gelato). Para obtenerlas:

* [Regístrate](https://app.gelato.network/relay) en el servicio
* Crea una nueva dapp para la red que pretendes dirigir. Para imitar lo que configuró Decentraland:
  * Selecciona la `Mainnets` opciones
  * Establece un `Nombre de la app` apropiado para tu dApp
  * elige `Polygon` como la red para el `Smart Contract`
  * Habilita el `Any Contract` opción de alternar
* Copia la API KEY desde la `API Key` sección

Por último, necesitarás financiar tu dapp recién creada. Puedes hacer esto conectando tu wallet en la [1Balance](https://app.gelato.network/1balance) sección en la barra lateral izquierda. Una vez conectado, te permitirá depositar tu [USDC](https://polygonscan.com/token/0x3c499c542cef5e3811e1192ce70d8cc03d5c3359) para financiar las transacciones que enviarán tus usuarios. Si necesitas obtener MATIC, revisa este [artículo](https://docs.decentraland.org/blockchain-integration/transactions-in-polygon/#where-can-i-get-matic-to-pay-for-transaction-fees).

### Testnet

Si quieres probar tu aplicación antes de lanzarla y estás usando Polygon puedes hacerlo en `Polygon Amoy`, la testnet de Polygon.

Para hacerlo simplemente repite [el proceso](#configuring-gelato) pero eligiendo `Matic Testnet (Amoy)` en el campo de red.

Necesitarás financiar tu dapp, pero puedes hacerlo fácilmente obteniendo tokens Sepolia ETH desde el [faucet](https://sepoliafaucet.com/).

## Descargando el servidor de transacciones

Primero, necesitarás una copia del código de transactions-server de Decentraland. Puedes encontrarlo [en github](https://github.com/decentraland/transactions-server/tree/v1). A partir de ahí, tienes dos opciones:

1. **Descargando el código**: Para descargar el código, primero tienes que hacer clic en el botón verde `Code` y luego o bien

* Haz clic en `Download ZIP`
* Copia la URL bajo el `Clone` título y luego ejecuta `$ git clone THE_URL_HERE`

2. **Haciendo un fork del código**: Puedes hacer clic en el botón `fork` en la esquina superior derecha de la página. Una vez completado el proceso, podrás descargar tu código de la misma manera que en la primera opción. Necesitarás una cuenta de Github para esto; para más información sobre cómo forkear repositorios consulta [aquí](https://docs.github.com/en/enterprise-server@3.5/get-started/quickstart/fork-a-repo)

## Configurando el servidor

El servidor de transactions está escrito en [NodeJS](https://nodejs.org/en/) usando [Typescript](https://www.typescriptlang.org/). Antes de ejecutarlo necesitarás configurar algunas variables de entorno.

Para hacer esto:

* Copia el `.env.example` archivo y pégalo renombrado a `.env`
* Abre el `.env` archivo. Verás que algunas variables tienen un valor por defecto, como `HTTP_SERVER_PORT=5000` (en qué puerto ejecutar el servidor)
* Puedes dejar la mayoría de los valores tal como están, pero hay algunos valores importantes a considerar:
  * [Gelato](#gelato)
  * [Transacciones](#transactions)
  * [Contratos y colecciones](#contracts-and-collections)
  * [Valor mínimo de venta](#min-sale-value)

### Gelato

Usa la API KEY que obtuvimos cuando [configurando gelato](#configuring-gelato).

```
GELATO_API_KEY=p_qXAlcVwWyU__Fjbn_qwr0rTy14asDf_Z2XCVBnmZX_
```

### Transacciones

Cuando llega una nueva solicitud de transacción comprobará la cantidad **una dirección** ha enviado ese día. Si está por encima del valor establecido la transacción fallará.

```
MAX_TRANSACTIONS_PER_DAY=10
```

Para eliminar completamente esta comprobación, puedes ir al código y eliminar el

```ts
await checkQuota(components, transactionData)
```

método de `async function checkData(transactionData: TransactionData): Promise<void> {` en `src/ports/transactions/component.ts`

### Contratos y colecciones

El servidor recuperará la URL de Contract addresses y las almacenará localmente y consultará el subgraph. Cuando llegue una nueva solicitud de transacción comprobará si el contrato con el que interactúa la transacción pertenece ya sea a los contratos desplegados en la URL o a las colecciones desplegadas en el subgraph.

Si quieres proporcionar tus propios contratos cambia la URL y conserva la misma estructura que la actual <https://contracts.decentraland.org/addresses.json> tiene. La red utilizada se determina por COLLECTIONS\_CHAIN\_ID, y el intervalo con el que se vuelve a obtener la caché es COLLECTIONS\_CHAIN\_ID

Si tienes tus propias colecciones también puedes cambiar la URL del subgraph.

Para eliminar completamente estas comprobaciones, puedes ir al código y eliminar el

```ts
await checkContractAddress(components, transactionData)
```

método de `async function checkData(transactionData: TransactionData): Promise<void> {` en `src/ports/transactions/component.ts`

```
CONTRACT_ADDRESSES_URL=https://contracts.decentraland.org/addresses.json
COLLECTIONS_FETCH_INTERVAL_MS=3600000
COLLECTIONS_CHAIN_ID=80002

COLLECTIONS_SUBGRAPH_URL=https://subgraph.decentraland.org/decentraland/collections-matic-amoy
```

### Valor mínimo de venta

Cuando llega una nueva solicitud de transacción primero analizará los datos que intenta retransmitir. Si detecta una venta (compra en marketplace, oferta, etc.), comprobará el valor frente a MIN\_SALE\_VALUE\_IN\_WEI. Si es inferior, la transacción fallará.

```
MIN_SALE_VALUE_IN_WEI=1000000000000000000
```

Para comprobar los métodos de venta relevantes, puedes ver `src/ports/transaction/validation/checkSalePrice.ts` y para eliminar completamente esta comprobación, puedes ir al código y eliminar el

```ts
await checkSalePrice(components, transactionData)
```

método de `async function checkData(transactionData: TransactionData): Promise<void> {` en `src/ports/transactions/component.ts`

## Ejecutando el servidor

Ahora que toda la configuración está lista, lo que queda es ejecutar el servidor. Puedes seguir [su README](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/blockchain/deploying-your-own-transactions-server) pero en resumen, tendrás que:

* Tener [NodeJS](https://nodejs.org/en/) instalado
* Abre tu terminal preferida
* Ejecuta los siguientes comandos:

```bash
npm install
npm run migrate # solo la primera ejecución
npm run start
```

Por supuesto, probablemente querrás desplegar esto en el servicio de tu elección, como [AWS](https://aws.amazon.com/) por ejemplo. Puedes usar el [Dockerfile](https://github.com/decentraland/transactions-server/tree/v1/blob/master/Dockerfile) del Proyecto para hacerlo.

## Usando el servidor

Ahora que todo está configurado y en funcionamiento, es hora de usar realmente el servidor.

Para enviar realmente una transacción, necesitas hacer un POST a `/transactions`. El esquema requerido para la solicitud está definido por `transactionSchema` en `src/ports/transaction/types.ts`.

Si, en cambio, quieres usar nuestras bibliotecas preconstruidas para facilitarte la vida puedes probar [decentraland-transactions](https://github.com/decentraland/decentraland-transactions). Se usa a través de [decentraland-dapps](https://github.com/decentraland/decentraland-dapps) en nuestras dapps como el [Marketplace](https://market.decentraland.org), con las utilidades [`sendTransaction`](https://github.com/decentraland/decentraland-dapps/blob/master/src/modules/wallet/utils.ts#L104). Consulta [este código](https://github.com/decentraland/marketplace/blob/a2191515c6ae7ede54a685cc2dd9f9fafa35366b/webapp/src/modules/vendor/decentraland/OrderService.ts#L33) para un ejemplo.
