Saltar al contenido principal
Versión: Siguiente

Integración

Uno de los puntos principales de interacción con la Anchor Platform es notificar a la plataforma sobre eventos relacionados con las transacciones.

En general, querrás proporcionar actualizaciones para los siguientes eventos.

  • Tu negocio requiere que el usuario envíe información KYC para procesar una transacción
  • Tu negocio actualizó los montos de entrada/salida/tasa para una transacción
  • Tu negocio está listo para recibir fondos del usuario
  • Tu negocio ha recibido fondos del usuario
  • Tu negocio ha enviado fondos al usuario
  • Tu negocio ha procesado un reembolso para la transacción del usuario
  • Tu negocio experimentó un error inesperado

Esto se hace realizando solicitudes JSON-RPC al endpoint de la API de la plataforma. Las solicitudes JSON-RPC te permiten actualizar el estado de la transacción. Para mover la transacción a un estado específico, es necesario realizar una solicitud JSON-RPC correspondiente y pasar los datos requeridos por el método RPC.

La API JSON-RPC de Anchor Platform está diseñada para notificar a la plataforma sobre cambios en el estado de la transacción. Dado que, la API se llamará cada vez que un usuario o el anchor realice alguna acción que avance el estado de la transacción en el flujo.

La comunicación de Anchor Platform sobre actualizaciones de transacciones, actualizaciones de clientes y creación de cotizaciones se maneja a través del servicio de eventos. Esta es una característica opcional que debe configurarse por separado de la integración SEP-6. Para más información, consulta Manejo de Eventos.

Puedes encontrar más información sobre el flujo y los estados de las transacciones en el documento del protocolo SEP-6.

Devoluciones

La Anchor Platform se basa en el servidor del negocio para proporcionar y almacenar información sobre los clientes y las cotizaciones.

Información del Cliente

La Anchor Platform no almacena información del cliente. En cambio, reenvía todas las solicitudes de clientes SEP-12 al servidor del negocio. El servidor del negocio es responsable de almacenar y gestionar esta información. Por lo tanto, tu servidor debe implementar las APIs de clientes para manejar actualizaciones KYC.

Cotizaciones y Tarifas

Para admitir el exchange de activos no equivalentes, Anchor Platform expone una API compatible con SEP-38 para proporcionar cotizaciones para el exchange. La API de cotizaciones se utiliza para proporcionar al usuario la cantidad esperada del activo que recibirá a cambio del activo que está enviando. La API de cotizaciones también se utiliza para proporcionar al usuario las tarifas esperadas para la transacción. Por lo tanto, tu servidor debe implementar la API de tarifas para proporcionar cotizaciones a Anchor Platform.

Asegurando API de la Plataforma

advertencia

Por defecto, los endpoints de la API de la plataforma, como GET /transactions y GET /transactions/:id, no están protegidos y son accesibles por cualquiera que tenga acceso al servidor, incluidas las billeteras.

información

Se recomienda mantener el servidor de la plataforma accesible solo desde la red privada. Sin embargo, puede que quieras añadir una capa adicional de protección al asegurar la API.

Usando API Key

Para habilitar la autenticación por clave de API, modifica tu archivo dev.env:

# dev.env
PLATFORM_API_AUTH_TYPE=api_key
# Will be used as API key
SECRET_PLATFORM_API_AUTH_SECRET="your API key that business server will use"

Una vez habilitado, todas las solicitudes deben incluir un encabezado válido X-Api-Key, configurado con la clave de API establecida.

Usando JWT

Para habilitar la autenticación JWT, modifica tu archivo dev.env:

# dev.env
PLATFORM_API_AUTH_TYPE=jwt
# Will be used to sign the JWT token
SECRET_PLATFORM_API_AUTH_SECRET="your secret that business server will use"

Anchor Platform utiliza el algoritmo HMAC SHA-256 (HS256) para firmar tokens JWT. Asegúrate de que SECRET_PLATFORM_API_AUTH_SECRET tenga al menos 32 caracteres para mayor seguridad.

Una vez habilitado, todas las solicitudes deben incluir un encabezado Authorization válido con el formato Bearer <JWT token>.

Haciendo Solicitudes JSON-RPC

Antes de hacer solicitudes JSON-RPC, primero vamos a crear una plantilla para hacer una solicitud a la Anchor Platform.

# call-json-rpc.sh
#!/usr/bin/env bash

curl localhost:8085 \
-X POST \
-H 'Content-Type: application/json' \
--data "@$1"

Este pequeño script hará una solicitud JSON-RPC a la Anchor Platform que se encuentra en el puerto predeterminado (8085). Los datos de transacción JSON almacenados en el archivo proporcionado se utilizarán como cuerpo (las solicitudes deben ser un arreglo).

Solicitud JSON-RPC

El objeto Request debe contener los siguientes atributos:

  • ATRIBUTOTIPO DE DATO

    DESCRIPCIÓN

  • jsonrpccadena

    A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0"

  • métodocadena

    Una cadena que contiene el nombre del método a invocar. Lista de métodos disponibles que puedes ver en [JSON-RPC Methods][json-rpc-methods]

  • paramsobjeto

    A Structured value that holds the parameter values, corresponding to method call, to be used during the invocation of the method

  • idcadena

    Un identificador establecido por el cliente. The Server will reply with the same value in the Response object

  • consejo

    Es posible proporcionar múltiples actualizaciones en una sola solicitud JSON-RPC (colocando múltiples objetos de solicitud JSON-RPC). Cuando una actualización se realiza de esta manera, todas las actualizaciones se realizarán de forma secuencial.

    Lo más importante es que cada solicitud JSON-RPC no es atómica. Si una actualización falla, todas las actualizaciones anteriores se APLICARÁN y todas las actualizaciones posteriores también se PROCESARÁN y APLICARÁN.

    Respuesta JSON-RPC

    La respuesta se expresa como un único objeto JSON, con los siguientes atributos:

  • ATRIBUTOTIPO DE DATO

    DESCRIPCIÓN

  • jsonrpccadena

    Una cadena que especifica la versión del protocolo JSON-RPC. It's set to "2.0"

  • resultadoobjeto

    Un valor estructurado que contiene los detalles actualizados de la transacción

  • idcadena

    Un identificador enviado por el cliente

  • errorobjeto

    Un valor estructurado que contiene los detalles del error

    Mostrar atributos secundarios
  • idcadena

    Id único de la transacción por la que ocurrió un error

  • códigonúmero

    Un número que indica el tipo de error que ocurrió. Consulta una lista de códigos de error a continuación

  • mensajecadena

    Una cadena que proporciona una breve descripción del error

  • datoscadena

    Un valor primitivo o estructurado que contiene información adicional sobre el error

  • Códigos de Error

    Código de errorSignificado
    -32600El JSON enviado no es un objeto Request válido
    -32601El método no existe / no está disponible
    -32602Invalid method parameter(s)
    -32603Error interno de JSON-RPC
    consejo

    También haremos referencia a una variable $transaction_id. Esta es una identificación de la transacción que se está devolviendo desde la Anchor Platform en una solicitud de inicio de retirada de fondos o depósito. Puedes obtener el ID de la transacción conectando la billetera de prueba a tu instancia local de Anchor Platform.

    Actualizando la Transacción de Depósito (Exchange) a Través de JSON-RPC

    El diagrama de flujo de depósito SEP-6 define las secuencias/reglas de la transición del estado de la transacción y un conjunto de métodos JSON-RPC que deben ser llamados para cambiar ese estado. No puedes definir el estado que deseas establecer para una transacción específica en tus solicitudes. Cada método JSON-RPC define estructuras de datos que espera en la solicitud. Si la solicitud no contiene los atributos requeridos, la Anchor Platform devolverá un error y no cambiará el estado de la transacción.

    El flujo del depósito de exchange es el mismo que el flujo de depósito, excepto que los montos no necesitarán ser recalculados al solicitar fondos offchain, si el usuario ha proporcionado una cotización firme del anchor.

    Diagrama de flujo de depósito SEP-6

    consejo

    Los estados en verde son obligatorios y definen el camino más corto.

    Los estados en amarillo son opcionales y se pueden omitir.

    Los estados en rojo significan que la transacción está en un estado de error o ha caducado.

    Verificando Información KYC

    Aunque la Anchor Platform no requiere que un cliente tenga su información KYC recolectada antes de iniciar un depósito, tu negocio puede querer recolectar esta información antes de que el cliente realice una transferencia. Escuchando eventos de creación de transacciones, o sondeando el GET /transactions endpoint, puedes determinar si una transacción requiere que el cliente actualice su información. Los campos requeridos de SEP-9 pueden ser comunicados al usuario devolviendo un estado NEEDS_INFO con los campos requeridos en el atributo fields.

    Después de que el usuario haya enviado su información KYC, llama al método JSON-RPC notify_customer_info_updated nuevamente para actualizar el estado de la transacción. Además, llama a este método cada vez que el estado SEP-12 de un cliente cambie, como cuando la información del cliente está siendo validada y el estado cambia de NEEDS_INFO a PROCESSING. Esto asegura que cualquier cliente configurado con una URL de callback sea notificado del último estado del cliente, permitiendo que el cliente invite al usuario a actualizar su información.

    // notify-customer-info-updated.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_customer_info_updated",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Customer info updated",
    "customer_id": "45f8884d-d6e1-477f-a680-503179263359",
    "customer_type": "sep6-deposit" // or sep6-withdrawal
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh notify-customer-info-updated.json

    Listo para Recibir Fondos

    Después de que el usuario haya enviado su información KYC, el anchor puede notificar a la plataforma que está listo para recibir fondos. El anchor debe usar el RPC request_offchain_funds para proporcionar los montos finales al usuario. Para ello, realiza la siguiente solicitud JSON-RPC.

    // request-offchain-funds.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "request_offchain_funds",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Request offchain funds",
    "amount_in": {
    "amount": 10,
    "asset": "iso4217:USD"
    },
    "amount_out": {
    "amount": 9,
    "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
    },
    "fee_details": {
    "total": 1,
    "asset": "iso4217:USD"
    },
    "amount_expected": {
    "amount": 10
    },
    "instructions": {
    "organization.bank_number": {
    "value": "123456789",
    "description": "US Bank routing number"
    },
    "organization.bank_account_number": {
    "value": "123456789",
    "description": "US Bank account number"
    }
    }
    }
    }
    ]
    • amount_in es el monto que el usuario debe enviar al negocio.
    • amount_out es el monto que el usuario recibirá.
    • fee_details es el monto total de tarifas recaudadas por el negocio.
    • asset es parte del campo amount_x y está en un formato SEP-38. En este ejemplo, se establece en USD, asumiendo que el usuario hizo una transferencia bancaria al sistema usando USD.
    • instructions es el conjunto de campos estándar SEP-9 que el usuario debe usar para enviar fondos al negocio. En este ejemplo, el usuario debe enviar fondos a la cuenta bancaria con el número de ruta 123456789 y el número de cuenta 123456789.

    La información sobre los montos (entrada/salida/tasa) es requerida si deseas mover la transacción al estado pending_user_transfer_start.

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh request-offchain-funds.json
    advertencia

    Para depósitos de exchange con una cotización firme (la solicitud está asociada con un quote_id), no se deben proporcionar montos.

    Fondos Recibidos

    Si se recibieron fondos offchain, querrás proporcionar información transaccional actualizada.

    // offchain-funds-received.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_offchain_funds_received",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Offchain funds received",
    "funds_received_at": "2023-07-04T12:34:56Z",
    "external_transaction_id": "7...9",
    "amount_in": {
    "amount": 10
    },
    "amount_out": {
    "amount": 9
    },
    "fee_details": {
    "total": 1
    },
    "amount_expected": {
    "amount": 10
    }
    }
    }
    ]
    • funds_received_at es la fecha y hora de la recepción de los fondos.
    • external_transaction_id es el ID de la transacción en la red externa.

    Los campos de monto son opcionales. Si se omiten, se usarán los valores anteriores a esta solicitud.

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh offchain-funds-received.json

    Esperando Fondos del Usuario

    En el mundo real, el proceso de confirmación de transferencia puede llevar tiempo. En tales casos, las transacciones deben establecerse en un nuevo estado que indique que se ha recibido la confirmación de la transferencia, pero los fondos en sí aún no se han recibido.

    // offchain-funds-sent.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_offchain_funds_sent",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Offchain funds sent",
    "funds_received_at": "2023-07-04T12:34:56Z",
    "external_transaction_id": "7...9"
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh offchain-funds-sent.json

    Enviando Fondos Onchain

    A continuación, envía una transacción en la red Stellar para cumplir con el depósito del usuario. Después de que la transacción Stellar haya sido enviada, es necesario enviar la solicitud JSON-RPC notify_onchain_funds_sent para notificar al usuario que los fondos fueron enviados exitosamente.

    // onchain-funds-sent.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_onchain_funds_sent",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Onchain funds sent",
    "stellar_transaction_id": "7...9"
    }
    }
    ]
    • stellar_transaction_id es el id de transacción en la red Stellar de la transferencia.

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh onchain-funds-sent.json

    Después de esta solicitud JSON-RPC, la transacción se transferirá al estado completed.

    Enviando Pago a Través del Servicio de Custodia

    La Anchor Platform proporciona la posibilidad de enviar un pago a través de servicios de custodia, como Fireblocks. Para hacer un pago a través de un servicio de custodia, realiza la siguiente solicitud JSON-RPC.

    // do-stellar-payment.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "do_stellar_payment",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Custody payment started"
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh do-stellar-payment.json

    Después del procesamiento exitoso del pago en un servicio de custodia, la Anchor Platform hará automáticamente la solicitud JSON-RPC notify_onchain_funds_sent y el estado de la transacción cambiará a completed.

    advertencia

    Una cuenta de usuario puede no estar lista para recibir fondos. Puedes verificar que la cuenta ha establecido una trustline. De lo contrario, puedes establecer el estado de la transacción en pending_trust para indicar que el anchor está esperando que el usuario establezca la trustline.

    Si la integración de custodia está habilitada, la Anchor Platform realizará esta validación automáticamente por ti.

    Confianza Pendiente

    Este estado debe establecerse si un pago requiere una trustline de activo que no fue configurada por el usuario. Hay dos maneras en que la transacción puede moverse al estado pending_trust. La primera es el procesamiento de un pago a través de un servicio de custodia en caso de que detecte que la trustline no está configurada. La segunda es cuando el negocio mismo detecta que falta la trustline y quiere notificar al usuario que debe configurarse. Para mover la transacción al estado pending_trust, realiza la siguiente solicitud JSON-RPC.

    // request-trust.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "request_trust",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Asset trustine not configured"
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh request-trust.json
    información

    El pago a través del servicio de custodia verifica periódicamente si la trustline fue configurada. Si lo fue, enviará automáticamente un pago a un servicio de custodia y cambiará el estado de la transacción a pending_stellar.

    Set de Confianza

    Este estado debe establecerse si el negocio ha detectado que la trustline fue o no fue configurada por el usuario.

    // trust-set.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_trust_set",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Asset trustine set",
    "success": "true"
    }
    }
    ]
    • success flag que define si la trustline fue o no fue configurada por el usuario

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh trust-set.json
    información

    Dependiendo de la bandera success, el estado de la transacción cambiará a pending_stellar si se estableció la trustline, o a pending_anchor si no se estableció.

    Reembolso Enviado

    A veces, es necesario enviar fondos de regreso al usuario (reembolso). Puedes reembolsar la suma total (reembolso completo) o hacer un conjunto de reembolsos parciales de vuelta a la source_account usando el refund_memo y el refund_memo_type asociados con la transacción si están presentes. Además, si el usuario envió más dinero del esperado, puedes reembolsar parte de la suma de vuelta al usuario y enviar el resto como fondos onchain.

    // refund-sent.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_refund_sent",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Refund sent",
    "refund": {
    "id": "1c186184-09ee-486c-82a6-aa7a0ab1119c",
    "amount": {
    "amount": 10,
    "asset": "iso4217:USD"
    },
    "fee_details": {
    "total": 1,
    "asset": "iso4217:USD"
    }
    }
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh refund-sent.json
    información

    Si la suma de los reembolsos es menor que amount_in, el estado de la transacción se establecerá en pending_anchor. Solo si la suma de los reembolsos es igual a amount_in, se establecerá el estado de la transacción en refunded.

    Reembolso Pendiente

    Esto es similar a Reembolso Enviado, pero maneja el caso cuando un reembolso ha sido enviado a la red externa pero aún no ha sido confirmado. El estado de la transacción se establece en pending_external. Este es el estado que se establecerá cuando se espera la confirmación de la red de Bitcoin u otra red de criptomonedas externa para completar una transacción, o cuando se espera una transferencia bancaria.

    Error de Transacción

    Si encuentras un error irrecuperable al procesar la transacción, es necesario establecer el estado de la transacción en error. Puedes usar el campo de mensaje para describir los detalles del error.

    // transaction-error.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_transaction_error",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Error occurred"
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh transaction-error.json
    consejo

    Si un usuario ha realizado una transferencia, debes hacer una recuperación de transacción, y luego puedes volver a intentar procesar la transacción o iniciar un reembolso.

    Transacción Caducada

    Tu negocio puede querer manejar transacciones abandonadas al caducar aquellas que han permanecido inactivas por un cierto período. Para lograr esto, verifica el estado de la transacción usando el endpoint GET /transactions y ordena los resultados por la marca de tiempo user_action_required_by. Si la marca de tiempo ha pasado, ejecuta manualmente la lógica apropiada, como expirar la transacción o iniciar un reembolso automático, basado en el estado actual de la transacción.

    // transaction-expired.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_transaction_expired",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Transaction expired"
    }
    }
    ]

    Para ejecutar esto, necesitas correr:

    ./call-json-rpc.sh transaction-expired.json
    consejo

    Este método JSON-RPC no puede ser utilizado después de que el usuario ha realizado una transferencia.

    Recuperación de Transacción

    El estado de la transacción puede cambiar de error/expired a pending_anchor. Después de la recuperación, puedes reembolsar los activos recibidos o continuar con el procesamiento de la transacción. Para recuperar una transacción, haz la siguiente solicitud JSON-RPC.

    // transaction-recovery.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_transaction_recovery",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Transaction recovered"
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh transaction-recovery.json

    Actualizar la transacción de Retirada (Exchange) mediante JSON-RPC

    El diagrama de flujo de retirada SEP-6 define la secuencia/reglas de la transición del estado de la transacción. No puedes definir el estado que deseas establecer para una transacción específica en tus solicitudes. Cada método JSON-RPC define las estructuras de datos que espera en la solicitud. Si la solicitud no contiene los atributos requeridos, la Anchor Platform retornará un error y no cambiará el estado de la transacción.

    El flujo de intercambio de retiradas es el mismo que el flujo de retirada, excepto que los montos no necesitarán ser recalculados al solicitar fondos onchain, si el usuario ha proporcionado una cotización firme del anchor.

    diagrama de flujo de retirada sep6

    consejo

    Los estados en verde son obligatorios y definen la manera más corta.

    Los estados en amarillo son opcionales y pueden ser omitidos.

    Los estados en rojo significan que la transacción está en estado de error o ha caducado.

    Una vez que se complete el flujo de retirada, implementar la retirada es sencillo. Algunas partes del flujo son similares y pueden ser reutilizadas.

    El punto de partida tanto para la retirada como para el depósito es el mismo.

    Listo para recibir fondos

    De manera similar al depósito, el paso después de que se recopiló el KYC es notificar al usuario que el anchor está listo para recibir fondos. Sin embargo, como tu servicio estará recibiendo transacciones a través de la red Stellar, la solicitud RPC será diferente. El anchor debe usar el RPC request_onchain_funds para proporcionar los montos finales al usuario. Para hacerlo, haz la siguiente solicitud JSON-RPC.

    // request-onchain-funds.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "request_onchain_funds",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Request onchain funds",
    "amount_in": {
    "amount": 10,
    "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
    },
    "amount_out": {
    "amount": 9,
    "asset": "iso4217:USD"
    },
    "fee_details": {
    "total": 1,
    "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
    },
    "amount_expected": {
    "amount": 10
    },
    "destination_account": "GD...G",
    "memo": "12345",
    "memo_type": "id"
    }
    }
    ]
    • amount_in es el monto que el usuario debe enviar al negocio.
    • amount_out es el monto que el usuario recibirá.
    • fee_details es el monto total de las tarifas cobradas por el negocio.
    • asset es parte del campo amount_x y está en un formato SEP-38. En este ejemplo, está configurado en USD, asumiendo que el usuario hizo una transferencia bancaria al sistema usando USD.
    • memo es el memo que el usuario debe usar al enviar sus fondos onchain al anchor.
    • memo_type es el tipo de memo que el usuario debe usar al enviar sus fondos onchain al anchor.
    • destination_account es la cuenta a la que el usuario debe enviar los fondos.

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh request-onchain-funds.json
    advertencia

    Para retiradas de intercambio con una cotización firme (la solicitud está asociada con un quote_id), no se deben proporcionar montos.

    consejo

    Configurar memo, memo_type y destination_account es opcional.

    Si la integración con un custodio de terceros está habilitada, la Anchor Platform puede generar memo, memo_type y destination_address si se elige un tipo correspondiente deposit_info_generator_type. Además, puedes proporcionar memo y memo_type a la solicitud como se mostró anteriormente. Ten en cuenta que el memo debe ser único, esto es lo que ayuda a asociar las transacciones Stellar con las transacciones SEP.

    Si tu negocio gestiona los activos, la Anchor Platform puede generar memos para ti. Cuando el estado cambie a pending_user_transfer_start, la Anchor Platform establece automáticamente el memo y el memo_type (solo si no están incluidos en la solicitud).

    nota

    La cuenta de Stellar que se usará para recibir fondos debe estar configurada.

    Fondos recibidos

    Si se recibieron fondos onchain, necesitas proporcionar montos y cambiar el estado de la transacción a pending_anchor.

    // onchain-funds-received.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_onchain_funds_received",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Onchain funds received",
    "stellar_transaction_id": "7...9",
    "amount_in": {
    "amount": 10
    },
    "amount_out": {
    "amount": 9
    },
    "fee_details": {
    "total": 1
    }
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh onchain-funds-received.json
    consejo

    Este método será llamado automáticamente por el servidor de custodia si la integración de custodia está habilitada.

    Monto actualizado

    Si se recibieron fondos onchain, pero por alguna razón el amount_in difiere del especificado en el flujo interactivo (amount_expected), puedes actualizar amount_out y fee_details para que correspondan al amount_in real. El estado de la transacción en este caso no cambiará y será igual a pending_anchor.

    // amounts-updated.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_amounts_updated",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Amounts updated",
    "amount_out": {
    "amount": 9
    },
    "fee_details": {
    "total": 1
    }
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh amounts-updated.json
    nota

    Solo amount_out y fee_details pueden ser actualizados usando esta solicitud JSON-RPC, y no necesitas especificar los activos de los montos.

    Fondos offchain disponibles

    Puedes mover el estado de la transacción a pending_user_transfer_complete si los fondos offchain fueron enviados, y si está listo para que el usuario / receptor lo recoja.

    // offchain-funds-available.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_offchain_funds_available",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Offchain funds available",
    "external_transaction_id": "a...c"
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh offchain-funds-available.json

    Fondos offchain pendientes

    Otra opción es mover el estado de la transacción a pending_external. Este estado significa que el pago ha sido enviado a una red externa, pero aún no está confirmado.

    // offchain-funds-pending.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_offchain_funds_pending",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Offchain funds pending",
    "external_transaction_id": "a...c"
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh offchain-funds-pending.json

    Fondos offchain enviados

    Para completar la transacción y cambiar su estado a completed, necesitas hacer la solicitud JSON-RPC notify_offchain_funds_sent.

    // offchain-funds-sent.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_offchain_funds_sent",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Offchain funds sent",
    "funds_sent_at": "2023-07-04T12:34:56Z",
    "external_transaction_id": "a...c"
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh offchain-funds-sent.json

    Reembolso enviado

    La lógica de reembolso funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Reembolso Enviado del flujo de depósito.

    Enviar reembolso mediante el servicio de custodia

    La integración con un servicio de custodia te permite hacer un reembolso a través de un servicio de custodia, como Fireblocks.

    // do-stellar-refund.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "do_stellar_refund",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Do stellar refund",
    "refund": {
    "amount": {
    "amount": 9,
    "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
    },
    "amount_fee": {
    "amount": 1,
    "asset": "stellar:USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5"
    }
    }
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh do-stellar-refund.json
    nota

    De manera similar al flujo de depósito, puedes hacer un reembolso completo o un conjunto de reembolsos parciales. La transacción permanecerá en estado pending_anchor hasta que la suma de reembolsos sea menor que amount_in. Si la suma de reembolsos es igual a amount_in, la Anchor Platform cambiará automáticamente el estado de la transacción a refunded.

    Error de transacción

    Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Error de Transacción del flujo de depósito.

    Transacción caducada

    Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Transacción Caducada del flujo de depósito.

    Recuperación de transacción

    Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Recuperación de Transacción del flujo de depósito.

    Seguimiento de transacciones Stellar

    Usar el Payment Observer te permite delegar este paso a la Anchor Platform. Para habilitar el Payment Observer, usa el flag --stellar-observer en la sección de comandos del archivo compose.

    El Payment Observer rastreará todas las transacciones enviadas a la cuenta de distribución. Cuando se detecte la transacción con el memo esperado en la red, el estado cambiará automáticamente a pending_anchor y el evento será emitido (si se usa Kafka).

    Para actualizar los estados de las transacciones, el observer realiza las solicitudes JSON-RPC correspondientes a la plataforma. Debe usar la siguiente URL.

    # dev.env
    PLATFORM_API_BASE_URL=http://platform-server:8085
    advertencia

    El Payment Observer no validará los montos. Es tu responsabilidad verificar que el monto enviado por el usuario sea correcto.

    información

    Si ya tienes un sistema que monitorea pagos, asegúrate de que la lógica del sistema iguale la descripción a continuación:

    Primero, espera a que la transacción se incluya en el ledger (usando un SDK). Esta transacción debe tener el memo esperado y la dirección de destino (cuenta de distribución). Una vez que esta transacción ha sido detectada y verificada, notifica al usuario que los fondos han sido recibidos usando la solicitud JSON-RPC notify_onchain_funds_received.

    consejo

    El servicio de custodia de Fireblocks rastreará automáticamente las transacciones y notificará al usuario que los fondos han sido recibidos. Consulta la documentación del servicio de custodia de Fireblocks para más detalles.