> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/blockchain/deploying-your-own-transactions-server.md).

# Desplegando tu servidor de transacciones

Proporciona a los usuarios transacciones sin coste

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

El servidor de transacciones se usa para ayudar con la UX de usar múltiples redes y evitar que cambien de proveedor de red sobre la marcha. Los usuarios pueden permanecer conectados a [Ethereum](https://ethereum.org/en/) y 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 costo hasta un cierto límite con algunas [restricciones](#restrictions). Este documento explica cómo puedes [desplegar este servidor](#running-the-server) para habilitar a tus usuarios a reenviar transacciones con las restricciones que necesites, si las hay.

## Restricciones

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

Las restricciones configurables que tiene el servidor son:

* Comprueba una cuota de máximo de transacciones por día. Consulta [la sección de colecciones](#collections) para más información.
* Comprueba contratos en lista blanca, así que si una transacción intenta interactuar con un contrato que no está reconocido fallará. Para hacer esto usa
  * los contratos y colecciones desplegados. Consulta [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. Consulta [la sección del valor mínimo de venta](#min-sale-value) para más información

## Configurando Gelato

[Gelato](https://www.gelato.network/relay) es un Multichain Relayer Protocol. Usamos su infraestructura para habilitar transacciones sin costo. Esto significa, en la práctica, que cuando vas a enviar una transacción, en su lugar firmas un mensaje y lo envías a Gelato. El servicio se encargará de enviar la transacción por ti y de devolverte una respuesta (hash de la transacción).

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

[Gelato](https://www.gelato.network/relay) funciona como una API para el servidor. [Para configurar](#configuring-the-server) lo primero que necesitarás es 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 a la que intentas apuntar. Para imitar la configuración de Decentraland:
  * Selecciona la `Mainnets` options
  * Establece un `nombre de app` apropiado
  * elige `Polygon` como la red para el `Smart Contract`
  * Activa el `Any Contract` opción de alternancia
* Copia la API KEY de la `API Key` sección

Por último, tendrás que financiar tu dapp recién creada. Puedes hacerlo conectando tu wallet en la [1Balance](https://app.gelato.network/1balance) sección de la barra lateral izquierda. Una vez conectada, te permitirá depositar tus [USDC](https://polygonscan.com/token/0x3c499c542cef5e3811e1192ce70d8cc03d5c3359) para financiar las transacciones que enviarán tus usuarios. Si necesitas obtener MATIC, consulta 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 app antes de ponerla en producción y estás usando Polygon, puedes hacerlo en `Polygon Amoy`, la testnet de Polygon.

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

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

## Descargando el servidor de transacciones

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

1. **Descargando el código**: Para descargar el código, primero tienes que hacer clic en el verde `Code` botón y luego cualquiera de las siguientes opciones:

* Haz clic en `Download ZIP`
* Copia la URL debajo del `Clonar` título y luego ejecuta `$ git clone THE_URL_HERE`

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

## Configurando el servidor

El servidor de transacciones 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 hacerlo:

* Copia el `archivo .env.defaults` y pégalo renombrado a `archivo .env`
* Abre la `archivo .env` Verás que algunas variables tienen un valor predeterminado, como `HTTP_SERVER_PORT=5000` (en qué puerto ejecutar el servidor)
* Puedes dejar la mayoría de 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 al [configurar Gelato](#configuring-gelato).

```
GELATO_API_KEY=<YOUR_GELATO_API_KEY>
```

### Transacciones

Cuando llega una nueva solicitud de transacción, comprobará la cantidad **que una dirección** ha enviado ese día. Si supera el valor establecido, la transacción fallará.

```
MAX_TRANSACTIONS_PER_DAY=10
```

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

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

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

### Contratos y colecciones

El servidor obtendrá la URL de las direcciones de contratos y las almacenará localmente, y consultará el subgraph. Cuando llegue una nueva solicitud de transacción, comprobará entonces si el contrato con el que interactúa la transacción pertenece 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 tiene la actual <https://contracts.decentraland.org/addresses.json> usa. La red utilizada se determina por COLLECTIONS\_CHAIN\_ID, y el intervalo con el que se vuelve a obtener la caché es COLLECTIONS\_FETCH\_INTERVAL\_MS

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

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

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

método de `async function checkData(transactionData: TransactionData): Promise<void> {` en `src/ports/transaction/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 reenviar. Si detecta una venta (compra en Marketplace, puja, 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 quitar el

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

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

## Ejecutando el servidor

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

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

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

Por supuesto, probablemente querrás desplegar esto en el servicio de tu preferencia, como [AWS](https://aws.amazon.com/) por ejemplo. Puedes usar el [Dockerfile](https://github.com/decentraland/transactions-server/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 prehechas para facilitarte la vida, puedes probar [decentraland-transactions](https://github.com/decentraland/decentraland-transactions). Se usa mediante [decentraland-dapps](https://github.com/decentraland/decentraland-dapps) en nuestras dapps como la [Marketplace](https://market.decentraland.org), con las utils [`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 ver un ejemplo.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/creator/content-creator-es/scenes-sdk7/blockchain/deploying-your-own-transactions-server.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
