Mercado P2P en Nostr
Las ofertas y operaciones P2P de QvaPay publicadas en Nostr, firmadas por la plataforma, con el formato kind 35353.
QvaPay publica en Nostr las ofertas públicas de su mercado P2P y cada operación cerrada, firmadas con la clave de la plataforma. Usa el formato de eventos kind 35353 que propone el borrador NIP-XX: Peer-to-peer Order and Trade events for non-Bitcoin assets. La idea es tener un formato común: cualquier aplicación puede mostrar las ofertas de varias plataformas y calcular tasas y volumen a partir de operaciones reales, sabiendo quién publicó cada dato.
No hace falta cuenta ni API key. Los eventos se leen de cualquier relay de Nostr que los tenga.
Clave de QvaPay
La clave pública con la que firmamos se obtiene por NIP-05 con el identificador [email protected]:
curl "https://qvapay.com/.well-known/nostr.json?name=qvapay"{
"names": { "qvapay": "<clave pública en hex>", "_": "<clave pública en hex>" },
"relays": { "<clave pública en hex>": ["wss://relay.damus.io", "wss://nos.lol", "wss://relay.primal.net"] }
}Un evento con ["y", "qvapay"] solo es de QvaPay si lo firmó esa clave. El tag y es descriptivo y lo puede poner cualquiera.
Qué se publica
- Activo: el saldo de QvaPay,
["c", "qusd"],["layer", "internal"],["network", "mainnet"], sincontract. Es un saldo de nuestro libro, no un token on-chain. - Moneda y método: salen del medio de pago de la oferta. Solo se publican los medios de pago fiat:
| Medio de pago | f | pm |
|---|---|---|
| Transferencia CUP | CUP | bank transfer |
| Bolsa TM | CUP | bolsa tm |
| Saldo móvil ETECSA | CUP | etecsa mobile balance |
| CUP en efectivo | CUP | cash |
| MLC | MLC | bank transfer |
| CLASICA | USD | clasica card |
| TROPICAL | USD | tropical card |
| Zelle | USD | zelle |
| USD en efectivo | USD | cash |
| Banco USD | USD | bank transfer |
| PayPal, Cash App, Apple Cash, AirTM | USD | paypal, cash app, apple cash, airtm |
| TropiPay | EUR | tropipay |
| Banco EUR | EUR | bank transfer |
| EUR en efectivo | EUR | cash |
| Pix | BRL | pix |
| SberBank | RUB | sberbank |
MLC no tiene código ISO 4217: es el código que usa el mercado, y el borrador lo admite. Las ofertas entre QUSD y una criptomoneda no se publican porque no son fiat. Las ofertas privadas tampoco: son tratos pactados entre dos personas.
Ofertas (z = order)
Una por oferta, con d = uuid de la oferta. Cada cambio de estado se publica como una versión nueva con el mismo d.
{
"kind": 35353,
"tags": [
["d", "b3c1f0a2-7e44-4d1e-9a0b-2f6c8e1d5a77"],
["k", "sell"],
["c", "qusd"],
["layer", "internal"],
["network", "mainnet"],
["f", "CUP"],
["s", "pending"],
["amt", "10"],
["fa", "3700"],
["price", "370"],
["pm", "etecsa mobile balance"],
["source", "https://www.qvapay.com/p2p-pub/b3c1f0a2-7e44-4d1e-9a0b-2f6c8e1d5a77"],
["name", "username"],
["expires_at", "1794617065"],
["y", "qvapay"],
["z", "order"],
["expiration", "1795221865"]
],
"content": ""
}k: el lado de quien publica respecto al QUSD.sellvende QUSD y recibe el fiat;buycompra QUSD y paga el fiat.amten QUSD,faen la monedafyprice= fiat por QUSD. Siempre es un precio fijo, nuncapremium.name: el username de quien publica, nunca su nombre.source: la página pública de la oferta.- Las ofertas para VIP o con requisitos (operaciones, valoración, antigüedad) se publican igual. Los requisitos se ven en
source.
Estados
| Oferta en QvaPay | s |
|---|---|
| Abierta | pending |
| Pausada | canceled (vuelve a pending al reanudarse) |
| Tomada, pagada o en disputa | in-progress |
| Completada | success |
| Cancelada | canceled |
El borrador no tiene un estado de pausa. Una oferta pausada no se puede tomar, así que se publica canceled. Si la oferta se reanuda, vuelve a pending con el mismo d. Un agregador no debe tratar canceled como definitivo en una oferta de QvaPay.
Ofertas por rango. Mientras se pueden tomar llevan ["amt", "0"] y fa con dos valores: el mínimo y el máximo en fiat de lo que queda disponible. Cuando se cierran con partes ya tomadas, amt y fa llevan los totales ejecutados. Cada parte tomada se publica como una operación. Si todo lo disponible está reservado por órdenes en curso, la oferta sale in-progress y vuelve a pending si alguna parte se libera.
expires_at: una oferta de compra caduca a las 48 horas sin moverse. Las de venta no caducan solas, así que su fecha se adelanta de 48 en 48 horas mientras sigan abiertas. expiration (NIP-40) le pide al relay que borre la oferta 7 días después.
Operaciones (z = trade)
Una por ejecución: una oferta fija completada o una parte de una oferta por rango liberada. Se publican al cerrarse, con la hora exacta, y no se reemplazan nunca.
{
"kind": 35353,
"tags": [
["d", "5f9e2c41-0b8d-5a6e-b1c7-93d4e8a2f610"],
["a", "35353:<clave de QvaPay>:<uuid de la oferta>"],
["k", "sell"],
["c", "qusd"],
["layer", "internal"],
["network", "mainnet"],
["f", "CUP"],
["amt", "70.76"],
["fa", "79000"],
["executed_at", "1794504638"],
["pm", "bank transfer"],
["y", "qvapay"],
["z", "trade"]
],
"content": ""
}- No llevan nada de las partes: ni username, ni nombre, ni la página de la oferta.
- El precio ejecutado es
fa / amt. aenlaza con la oferta cuando la oferta también se publicó.des el uuid de la parte en las ofertas por rango, y un id derivado del uuid de la oferta en las fijas. Nunca coincide con eldde una oferta.
Ofertas de la tesorería de QvaPay
Algunas ofertas las publica la propia plataforma desde su cuenta de tesorería. Con ellas se atienden las extracciones de nuestros clientes y se publican a una tasa por debajo del mercado para ese pool de clientes. Llevan un tag adicional, en las ofertas y en sus operaciones:
["maker", "platform"]El borrador no define este tag. Es nuestro y lo propusimos en el PR. Sirve para que quien calcule una tasa de mercado pueda separar esas ofertas o dejarlas fuera.
Consultas de ejemplo
Ofertas abiertas de QvaPay contra CUP:
{ "kinds": [35353], "authors": ["<clave de QvaPay>"], "#z": ["order"], "#f": ["CUP"], "#s": ["pending"] }Operaciones de QvaPay contra CUP desde una fecha:
{ "kinds": [35353], "authors": ["<clave de QvaPay>"], "#z": ["trade"], "#f": ["CUP"], "since": 1794000000 }Los relays solo indexan tags de una letra, así que layer y network no sirven para filtrar. Agrupa siempre por c, layer, network, clave y f antes de sumar o promediar.
Los datos se publican cada minuto. Para la tasa promedio que usa QvaPay, que descarta las tasas fuera de rango y los montos menores de 1 USD, ver Promedios P2P.