> ## Documentation Index
> Fetch the complete documentation index at: https://docs.astronpay.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Assinatura de transações

> Quando usar sign-transaction vs sign-and-send-transaction.

A Astron Pay hospeda uma wallet Solana **MPC (Multi-Party Computation)** gerenciada para cada merchant e cada receiver. Você pode solicitar assinaturas dessas wallets para construir fluxos on-chain customizados além dos payin/payout padrão.

## Dois modos

### `sign-transaction` (assinar apenas)

Recebe uma transação já serializada (base64), devolve a mesma transação com a assinatura adicionada. Você é responsável por transmitir à rede.

Use quando:

* Precisa montar a transação localmente (com seus próprios programs, instructions, etc).
* Quer controlar RPC, priority fees e timing do broadcast.
* Vai anexar assinaturas adicionais de outras carteiras.

### `sign-and-send-transaction` (assinar e transmitir)

A plataforma assina e transmite à rede Solana. Retorna o `hash` da transação on-chain.

Use quando:

* Só precisa de uma transação simples assinada e confirmada.
* Não quer manter infraestrutura de RPC/broadcast.

## Qual wallet usar

| Endpoint                        | Wallet                 |
| ------------------------------- | ---------------------- |
| `/merchant/wallet/sign-*`       | Wallet MPC do merchant |
| `/receivers/{id}/wallet/sign-*` | Wallet MPC do receiver |

## Construindo uma transação

Qualquer biblioteca Solana padrão serve (`@solana/web3.js`, `@solana/kit`, etc.). Exemplo com `@solana/web3.js`:

```ts theme={null}
import { Connection, Transaction, SystemProgram, PublicKey } from '@solana/web3.js';

const tx = new Transaction().add(
  SystemProgram.transfer({
    fromPubkey: new PublicKey(receiverWallet),
    toPubkey: new PublicKey(destWallet),
    lamports: 1_000_000,
  })
);
tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
tx.feePayer = new PublicKey(receiverWallet);

const serialized = tx.serialize({ requireAllSignatures: false }).toString('base64');

const res = await fetch(`https://api.astronpay.co/api/v1/receivers/${receiverId}/wallet/sign-and-send-transaction`, {
  method: 'POST',
  headers: {
    'x-api-key': apiKey,
    'x-api-secret': apiSecret,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ transaction: serialized }),
});
const { hash } = await res.json();
```

## Limites e segurança

* A plataforma valida instructions contra uma allowlist (ex.: transferências SPL). Instructions maliciosas são rejeitadas.
* O endpoint exige autenticação API Key do merchant que possui o receiver.
