Esta é a forma recomendada de executar o passo de depósito on-chain de uma payout quando seu merchant utiliza wallet gerenciada pela Astron Pay (criada via API ou no dashboard). Você nunca toca emDocumentation Index
Fetch the complete documentation index at: https://docs.astronpay.co/llms.txt
Use this file to discover all available pages before exploring further.
@solana/web3.js, não precisa de RPC Solana próprio, não precisa
ter SOL para gas, e fica imune aos modos comuns de falha silenciosa (blockhash
expirado, encoding ATA errado, falta de paymentReference).
Quando usar este fluxo. Use sempre que sua wallet de merchant for gerenciada
pela Astron Pay. Se você operar self-custody (chave privada do seu lado) e quiser
pagar o próprio gas, monte a tx localmente — a rota
build-transfer-tx ainda
ajuda: ela já devolve a tx pronta com paymentReference correto, basta você
trocar o feePayer por sua própria wallet e assinar com sua chave.Visão geral em 3 passos
- Criar a payout com
POST /payout— recebeorderId,depositAddress,paymentReference. - Pedir a tx pronta com
POST /payout/build-transfer-tx— recebe a transação serializada em base64, com blockhash recente, ATA do destinatário correto,paymentReferenceanexado, efeePayer = wallet do receiver da order(default). - Assinar e transmitir com
POST /merchant/wallet/sign-and-send-transaction— a Astron Pay assina pela wallet do receiver, substitui o pagamento de gas pelo sponsor da plataforma, e transmite. A resposta só retorna depois que a rede confirmou — sem hash fantasma.
Você não precisa especificar a wallet de origem
A wallet que paga o USDC é deduzida automaticamente da cadeiareceiverId → quoteId → orderId:
| # | Chamada | Body | Carrega receiverId? |
|---|---|---|---|
| 1 | POST /quote/payout | { receiverId, amountCrypto, targetToken } | ✅ direto |
| 2 | POST /payout | { quoteId, ... } | ✅ via quote |
| 3 | POST /payout/build-transfer-tx | { orderId } | ✅ via order |
| 4 | POST /merchant/wallet/sign-and-send-transaction | { transaction } | (a tx já vem pronta) |
fromAddress, receiverWalletAddress
ou similar. A Astron Pay resolve sempre para a wallet gerenciada do
receiver da order — montada na criação do receiver com
createPrivyWallet=true.
1. Criar a payout
Já documentado em Fluxo Payout. O importante para esta guia é guardar oid da order retornada — usaremos no passo 2.
2. Pedir a tx pronta
Parâmetros
UUID da payout retornada por
POST /payout. A order deve estar em status
AWAITING_DEPOSIT e pertencer ao merchant autenticado. Esse é o único
campo do body — a wallet de origem é deduzida do receiver da order.Erros
| Código | Status | Quando acontece | O que fazer |
|---|---|---|---|
NOT_FOUND | 404 | Order não existe ou pertence a outro merchant | Verificar orderId. Por design, a Astron Pay não distingue “não existe” de “é de outro merchant” — para não vazar existência. |
INVALID_ORDER_TYPE | 400 | Você passou um orderId de uma payin | Use uma order de payout. |
INVALID_ORDER_STATE | 409 | A order já avançou para DEPOSIT_RECEIVED/COMPLETED/FAILED/EXPIRED/REFUNDED | A order não aceita mais depósito. Crie uma nova se precisar. |
RECEIVER_WALLET_MISSING | 409 | O receiver da order não tem wallet gerenciada | Crie o receiver com createPrivyWallet=true em POST /receivers. |
RECEIVER_WALLET_NOT_FUNDED | 422 | A wallet do receiver existe mas não tem USDC (ATA não inicializada) | Mande USDC para a wallet do receiver (NÃO a do merchant). A mensagem do erro inclui o endereço exato. |
INSUFFICIENT_TOKEN_BALANCE | 422 | A wallet do receiver tem saldo, mas menor que o valor da order | Top up a wallet do receiver com a diferença e retente. |
UNSUPPORTED_TOKEN | 400 | Token de origem da order fora da lista suportada (USDC, USDT, SOL) | Refaça a payout especificando sourceToken: "USDC". |
VALIDATION_ERROR | 400 | orderId não é UUID, fromAddress não é base58 válido | Corrija o body da requisição. |
ORDER_INCONSISTENT | 500 | Defesa em profundidade: a row da order está corrompida (ex.: falta paymentReference) | Contate o suporte. |
O que está dentro do transaction
A tx serializada já tem tudo que a rede precisa:
- Instrução SPL Transfer transferindo
amountCrypto × 10^decimals(smallest unit) do ATA dofromAddresspara o ATA dodepositAddressno mint configurado (USDC→EPjFWdd5...). paymentReferenceanexado como conta extra non-signer, non-writable na instrução. É assim que a Astron Pay correlaciona o depósito on-chain com a sua order — se você montar a tx no seu lado e esquecer de incluir, o webhookorder.deposit_receivednunca dispara.- Caso a ATA da plataforma ainda não exista (caso muito raro), a tx começa com a
instrução
CreateAssociatedTokenAccount. Sem custo extra para você. feePayer = fromAddress. Necessário para a serialização Solana. Quando a tx for transmitida via/merchant/wallet/sign-and-send-transaction, o sponsor da Astron Pay substitui o pagamento real do SOL.recentBlockhashrecente (finalizedcommitment) — o mesmo valor que vem no campoblockhashda resposta.- Sem assinaturas — tx pronta para ser assinada.
3. Assinar e transmitir
Pegue otransaction da resposta e mande direto para
/merchant/wallet/sign-and-send-transaction:
Exemplo end-to-end (TypeScript)
Sem dependências Solana — sófetch.
Estratégia de retry
Use a estratégia abaixo como referência. Não retente um 4xx — eles indicam input inválido. Retente 502 e 5xx, sempre regerando a tx.Checklist
- Você cria a payout com
POST /payoute guardaid,depositAddress,paymentReference. - Você chama
POST /payout/build-transfer-txlogo antes de assinar (não cacheia a tx — blockhash expira em menos de 90 s). - Você manda o campo
transactionretornado sem alteração paraPOST /merchant/wallet/sign-and-send-transaction. - Você trata
502 TRANSACTION_NOT_BROADCASTEDcomo retry-safe (regerar a tx viabuild-transfer-tx). - Você assina o webhook
order.deposit_receivedpara saber quando a Astron Pay detectou o depósito on-chain (a correlação é feita pelopaymentReferenceque já está dentro da tx que enviamos a você).
Quando NÃO usar este fluxo
- Self-custody: você tem chave privada própria e quer assinar localmente.
Use
/payout/build-transfer-txpara gerar a tx, troque ofeePayerpor sua wallet, assine com sua chave, e transmita pelo seu RPC. Você paga o próprio gas (a Astron Pay só patrocina gas para wallets gerenciadas). - Transferências fora do contexto de payout: a rota
build-transfer-txserve apenas para o passo de depósito de uma payout existente. Para qualquer outra movimentação on-chain, monte a tx no seu lado e use/merchant/wallet/sign-and-send-transactiondiretamente.
