Saltar al contenido principal
Versión: 3.0.0

Integración

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

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

  • Tu negocio está procesando la información KYC proporcionada por el usuario
  • 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 hacer una solicitud JSON-RPC correspondiente y pasar los datos requeridos por este método RPC.

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

La comunicación de la 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 función opcional que necesita ser configurada 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 de transacciones y estados en el documento del protocolo SEP-24

Callbacks

La Anchor Platform depende del servidor de negocios para proporcionar y almacenar información sobre las cotizaciones.

Cotizaciones y Tarifas

Para admitir el intercambio de activos no equivalentes, la Anchor Platform expone una API compatible con SEP-38 para proporcionar cotizaciones para el intercambio. 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 usa para proporcionar al usuario las tarifas esperadas para la transacción. Por lo tanto, tu servidor de negocios debe implementar la API de tarifas para proporcionar cotizaciones a la Anchor Platform.

Asegurando la 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 para cualquiera que tenga acceso al servidor, incluidas las aplicaciones de billeteras.

información

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

Usando API Key

Para habilitar la autenticación con 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 habilitada, todas las solicitudes deben incluir un encabezado X-Api-Key válido, establecido en la clave de API configurada.

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 alojada 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

    Una cadena que especifica la versión del protocolo JSON-RPC. DEBE ser exactamente "2.0"

  • métodocadena

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

  • paramsobjeto

    Un valor estructurado que contiene los valores de los parámetros, correspondientes a la llamada del método, que se utilizarán durante la invocación del método

  • idcadena

    Un identificador establecido por el cliente. El servidor responderá con el mismo valor en el objeto de Respuesta

  • consejo

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

    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 SE PROCESARÁN y SE APLICARÁN también.

    Respuesta JSON-RPC

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

  • ATRIBUTOTIPO DE DATO

    DESCRIPCIÓN

  • jsonrpccadena

    Una cadena que especifica la versión del protocolo JSON-RPC. Está establecido en "2,0"

  • resultadoobjeto

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

  • 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 en la que ocurrió un error

  • códigonúmero

    Un número que indica el tipo de error que ocurrió. Consulta la 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
    -32602Parámetro(s) del método no válido(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 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 a través de JSON-RPC

    El diagrama de flujo de depósito SEP-24 define la secuencia/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.

    diagrama de flujo de depósito sep24

    consejo

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

    Los estados en amarillo son opcionales y pueden ser omitidos.

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

    Listo para Recibir Fondos

    El primer paso del flujo de depósito después de iniciar el depósito en sí es recolectar KYC. Por lo general, se realiza en la aplicación web, pero también puede ser opcionalmente proporcionado por la aplicación de billetera, utilizando SEP-9. Una vez que se recolecta el KYC necesario, se debe hacer una solicitud JSON-RPC request_offchain_funds.

    // 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
    }
    }
    }
    ]
    • amount_in es la cantidad que el usuario debe enviar al negocio.
    • amount_out es la cantidad que el usuario recibirá.
    • fee_details es el monto total de tarifas cobradas por el negocio.
    • asset es parte del campo amount_x y está en formato SEP-38. En este ejemplo, está establecido en USD, asumiendo que el usuario hizo una transferencia bancaria al sistema usando USD.

    La información sobre los montos (entrada/salida/tarifa) es requerida si deseas mover la transacción del estado incompleto al estado pendiente_transferencia_usuario_inicio. Si el estado de la transacción cambia de pendiente_anchor a pendiente_transferencia_usuario_inicio, puedes omitir la definición de los montos.

    Para procesar esto, necesitas ejecutar:

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

    Cuando el proceso de KYC es largo (por ejemplo, verificación de ID), se recomienda primero establecer el estado de la transacción en pendiente_anchor utilizando la solicitud JSON-RPC notify_interactive_flow_completed. Esto indicará al usuario que el KYC se está procesando.

    Procesando Información KYC

    consejo

    Este paso es opcional. La mayoría de los negocios no lo utilizan. Puedes omitirlo y pasar al siguiente paso.

    Usar este estado es recomendable cuando la verificación KYC puede necesitar ser realizada de manera asíncrona.

    Debes especificar los campos amount_x.

    // kyc-in-process.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_interactive_flow_completed",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Interactive flow completed.",
    "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
    }
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

    ./call-json-rpc.sh kyc-in-process.json

    Fondos Recibidos

    Si se recibieron fondos fuera de la cadena, querrás proporcionar una información de transacción 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 fondos
    • external_transaction_id es el ID de la transacción en la red externa

    Los campos de cantidad son opcionales. Si se omiten, se tomarán los valores de las solicitudes JSON-RPC anteriores.

    Para procesar esto, necesitas ejecutar:

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

    Esperando Fondos del Usuario

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

    // 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 procesar esto, necesitas ejecutar:

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

    Enviando Fondos en la Cadena

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

    // 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 is the transaction id on Stellar network of the transfer

    Para procesar esto, necesitas ejecutar:

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

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

    Enviando Pago a través del Servicio de Custodia

    La Anchor Platform ofrece la posibilidad de enviar un pago a través de servicios de custodia, como Fireblocks. Para hacer un pago a través del servicio de custodia, es necesario realizar 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 procesar esto, necesitas ejecutar:

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

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

    advertencia

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

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

    Confianza Pendiente

    Este estado debe ser establecido si un pago requiere una línea de confianza de activo que no fue configurada por el usuario. Hay dos maneras en las que la transacción puede ser movida al estado pendiente_confianza. La primera es el procesamiento de un pago a través del servicio de custodia en caso de que detecte que la línea de confianza no está configurada. La segunda es cuando el negocio en sí detecta que falta la línea de confianza y quiere notificar al usuario que debe ser configurada. Para mover la transacción al estado pendiente_confianza, es necesario hacer 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 procesar esto, necesitas ejecutar:

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

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

    Confianza Establecida

    Este estado debe ser establecido si el negocio ha detectado que la línea de confianza 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 línea de confianza fue o no fue configurada por el usuario

    Para procesar esto, necesitas ejecutar:

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

    Dependiendo del success flag, el estado de la transacción cambiará a pendiente_stellar si se estableció la línea de confianza, o a pendiente_anchor si no lo fue.

    Enviando Reembolso a través del Servicio de Custodia

    Hay una posibilidad de enviar fondos de vuelta al usuario (reembolso). Puedes reembolsar la suma total (reembolso completo) o hacer un conjunto de reembolsos parciales. Además, si el usuario envió más dinero del esperado, puedes reembolsar una parte de la suma de vuelta al usuario y enviar el resto como fondos en la cadena.

    // 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"
    },
    "amount_fee": {
    "amount": 1,
    "asset": "iso4217:USD"
    }
    }
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

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

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

    Reembolso Pendiente

    Es similar a Reembolso enviado, pero maneja un caso cuando un reembolso ha sido enviado a una red externa pero aún no está confirmado. El estado de la transacción se establece en pendiente_externo. Este es el estado que se establecerá cuando se esté esperando a que Bitcoin u otra red de criptomonedas externas complete una transacción, o cuando se esté esperando 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 procesar esto, necesitas ejecutar:

    ./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 intentar procesar la transacción nuevamente o iniciar un reembolso.

    Transacción Caducada

    Tu negocio puede querer manejar transacciones abandonadas haciendo caducar aquellas que han estado inactivas durante un cierto período. Para lograr esto, verifica el estado de la transacción utilizando 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 caducar la transacción o iniciar un reembolso automático, dependiendo del estado actual de la transacción. Por ejemplo, para caducar la transacción, el negocio debe cambiar el estado de la transacción a caducado:

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

    Para procesar esto, necesitas ejecutar:

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

    Este método JSON-RPC no se puede utilizar después de que el usuario haya realizado una transferencia.

    Transacción en Espera

    En casos raros, puedes querer pausar la transacción actual y solicitar más información del usuario (después de que se haya recibido la transferencia). Esto podría utilizarse para casos de cumplimiento.

    // transaction-hold.json
    [
    {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "notify_transaction_on_hold",
    "params": {
    "transaction_id": "<transaction_id>",
    "message": "Transaction is on hold. Please contact customer support to resolve the hold."
    }
    }
    ]

    Para procesar esto, necesitas ejecutar:

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

    Recuperación de Transacción

    El estado de la transacción puede cambiar de error/caducado a pendiente_anchor. Después de la recuperación, puedes reembolsar los activos recibidos o proceder con el procesamiento de la transacción. Para recuperar una transacción, es necesario hacer 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

    Actualizando transacciones de retirada de fondos a través de JSON-RPC

    Este diagrama define una secuencia/reglas de la transición del estado de la transacción para el flujo de retirada de fondos SEP-24.

    flujo de retirada sep24

    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.

    Una vez que el flujo de depósito ha terminado, implementar la retirada de fondos 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 siguiente paso es notificar al usuario que el anchor está listo para recibir fondos. Sin embargo, como tu servicio recibirá transacciones a través de la red Stellar, la actualización será diferente.

    // 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"
    }
    }
    ]
    • memo Valor del memo a adjuntar a la transacción
    • memo_type Tipo de memo que el anchor debería adjuntar a la transacción
    • destination_account Cuenta de destino

    Para procesar esto, necesitas ejecutar:

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

    Configurar memo, memo_type y destination_account es opcional.

    Si la integración con un custodio externo está habilitada, la Anchor Platform puede generar memo, memo_type y destination_address si se elige un correspondiente deposit_info_generator_type. Además, puedes proporcionar memo y memo_type a la solicitud como se muestra arriba. 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 cambia a pending_user_transfer_start, la Anchor Platform establece el memo y el memo_type automáticamente (solo si no se incluyen en la solicitud).

    nota

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

    Procesando información KYC

    Este paso es opcional y es similar a Procesando información KYC del flujo de depósito.

    Fondos recibidos

    Si se recibieron fondos on-chain, necesitas proporcionar cantidades 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.

    Cantidad actualizada

    Si se recibieron fondos on-chain, 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 con el amount_in actual. 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 las cantidades.

    Fondos off-chain 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

    Fondos off-chain disponibles

    Puedes mover el estado de la transacción a pending_user_transfer_complete si se enviaron fondos off-chain, 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 off-chain 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

    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.

    Enviando reembolso a través del 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 forma similar al flujo de depósito, puedes hacer un reembolso completo o una serie de reembolsos parciales. La transacción permanecerá en estado pending_anchor hasta que la suma de los reembolsos sea menor que amount_in. Si la suma de los 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.

    Transacción en espera

    Funciona de la misma manera que para el flujo de depósito. Para más detalles, consulta Transacción en espera 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

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

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

    Para actualizar los estados de las transacciones, el observador realiza las solicitudes JSON-RPC correspondientes a la plataforma. Debería utilizar 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 cuentas con un sistema que monitorea pagos, asegúrate de que la lógica del sistema igualarán la descripción a continuación:

    Primero, espera a que la transacción sea incluida 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 haya sido detectada y verificada, notifica al usuario que los fondos han sido recibidos utilizando 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.