Verificar endereço

Enviar tokens para o endereço errado pode resultar em perda permanente de fundos. A verificação de endereço garante que você envie tokens apenas para endereços que possam recebê-los e acessá-los adequadamente.

Consulte Como funcionam os pagamentos na Solana para conceitos fundamentais de pagamento.

Compreendendo endereços Solana

As contas Solana têm dois tipos de endereços: on-curve e off-curve.

Endereços on-curve

Endereços padrão são as chaves públicas de pares de chaves Ed25519. Estes endereços:

  • Têm uma chave privada correspondente que pode assinar transações
  • São usados como endereços de carteira

Endereços off-curve (PDAs)

Program Derived Addresses são derivados deterministicamente de um ID de programa e seeds. Estes endereços:

  • Não têm uma chave privada correspondente
  • Só podem ser assinados pelo programa do qual o endereço foi derivado

Tipos de conta em pagamentos

Use o endereço para buscar uma conta da rede, verifique o proprietário do programa e o tipo de conta para determinar como lidar com o endereço.

Saber se um endereço é on-curve ou off-curve não indica qual tipo de conta é, qual programa a possui ou se existe uma conta nesse endereço. Você deve buscar a conta da rede para determinar esses detalhes.

Contas do System Program (carteiras)

Contas pertencentes ao System Program são carteiras padrão. Para enviar tokens SPL para uma carteira, você deriva e usa sua associated token account (ATA).

Após derivar o endereço ATA, verifique se a token account existe on-chain. Se a ATA não existir, você pode incluir uma instrução para criar a token account do destinatário na mesma transação da transferência. No entanto, isso requer pagar rent pela nova token account. Como o destinatário possui a ATA, o SOL pago pelo rent não pode ser recuperado pelo remetente.

Sem salvaguardas, subsidiar a criação de ATA pode ser explorado. Um utilizador malicioso poderia solicitar uma transferência, ter o seu ATA criado às suas custas, fechar o ATA para recuperar o SOL de rent e repetir.

Token accounts

Token accounts são propriedade do Token Program ou Token-2022 Program e armazenam saldos de tokens. Se o endereço que recebe é propriedade de um token program, deve verificar se a conta é uma token account (não uma mint account) e corresponde à mint account de token esperada antes de enviar.

Os Token Programs validam automaticamente que ambas as token accounts numa transferência contêm tokens da mesma mint. Se a validação falhar, a transação é rejeitada e nenhum fundo é perdido.

Mint accounts

Mint accounts rastreiam a oferta de tokens e metadados de um token específico. Mint accounts também são propriedade dos Token Programs mas não são destinatários válidos para transferências de tokens. Tentar enviar tokens para um endereço de mint resulta numa transação falhada, mas nenhum fundo é perdido.

Outras contas

Contas propriedade de outros programas requerem uma decisão de política. Algumas contas (por exemplo, carteiras multisig) podem ser proprietários válidos de token accounts, enquanto outras devem ser rejeitadas.

Fluxo de verificação

O diagrama seguinte mostra uma árvore de decisão de referência para validar um endereço:

Address Verification Flow

Obter conta

Use o endereço para obter os detalhes da conta da rede.

A conta não existe

Se não existir nenhuma conta neste endereço, verifique se o endereço está on-curve ou off-curve:

  • Fora da curva (PDA): Rejeite conservadoramente o endereço para evitar enviar para uma ATA que pode estar inacessível. Sem uma conta existente, você não pode determinar apenas pelo endereço qual programa derivou este PDA ou se o endereço é para uma ATA. Derivar uma ATA para este endereço para enviar tokens pode resultar em fundos bloqueados numa conta de token inacessível.

  • Na curva: Este é um endereço de carteira válido (chave pública) que ainda não foi financiado. Derive a ATA, verifique se ela existe e envie tokens para ela. Você deve tomar uma decisão de política sobre se deve financiar a criação da ATA se ela não existir.

A conta existe

Se uma conta existe, verifique qual programa a possui:

  • System Program: Esta é uma carteira padrão. Derive a ATA, verifique se ela existe e envie tokens para ela. Você deve tomar uma decisão de política sobre se deve financiar a criação da ATA se ela não existir.

  • Token Program / Token-2022: Verifique se a conta é uma conta de token (não uma mint account) e que ela detém o token (mint) que você pretende enviar. Se válida, envie tokens diretamente para este endereço. Se for uma mint account ou uma conta de token para um mint diferente, rejeite o endereço.

  • Outro programa: Isto requer uma decisão de política. Alguns programas como carteiras multisig podem ser proprietários aceitáveis de contas de token. Se a sua política permitir, derive a ATA e envie. Caso contrário, rejeite o endereço.

Demonstração

O exemplo seguinte mostra apenas a lógica de validação de endereço. Este é código de referência para fins ilustrativos.

A demonstração não mostra como derivar uma ATA ou construir uma transação para enviar tokens. Consulte a documentação de conta de token e transferência de token para exemplos de código.

A demonstração abaixo usa três resultados possíveis:

ResultadoSignificadoAção
IS_WALLETEndereço de carteira válidoDerivar e enviar para associated token account
IS_TOKEN_ACCOUNTToken account válidaEnviar tokens diretamente para este endereço
REJECTEndereço inválidoNão enviar
Demo
/**
* Validates an input address and classifies it as a wallet, token account, or invalid.
*
* @param inputAddress - The address to validate
* @param rpc - Optional RPC client (defaults to mainnet)
* @returns Classification result:
* - IS_WALLET: Valid wallet address
* - IS_TOKEN_ACCOUNT: Valid token account
* - REJECT: Invalid address for transfers
*/
export async function validateAddress(
inputAddress: Address,
rpc: Rpc<GetAccountInfoApi> = defaultRpc
): Promise<ValidationResult> {
const account = await fetchJsonParsedAccount(rpc, inputAddress);
// Log the account data for demo
console.log("\nAccount:", account);
// Account doesn't exist on-chain
if (!account.exists) {
// Off-curve = PDA that doesn't exist as an account
// Reject conservatively to avoid sending to an address that may be inaccessible.
if (isOffCurveAddress(inputAddress)) {
return { type: "REJECT", reason: "PDA doesn't exist as an account" };
}
// On-curve = valid keypair address, treat as unfunded wallet
return { type: "IS_WALLET" };
}
// Account exists, check program owner
const owner = account.programAddress;
// System Program = wallet
if (owner === SYSTEM_PROGRAM) {
return { type: "IS_WALLET" };
}
// Token Program or Token-2022, check if token account
if (owner === TOKEN_PROGRAM || owner === TOKEN_2022_PROGRAM) {
const accountType = (
account.data as { parsedAccountMeta?: { type?: string } }
).parsedAccountMeta?.type;
if (accountType === "account") {
return { type: "IS_TOKEN_ACCOUNT" };
}
// Reject if not a token account (mint account)
return {
type: "REJECT",
reason: "Not a token account"
};
}
// Unknown program owner
return { type: "REJECT", reason: "Unknown program owner" };
}
// =============================================================================
// Examples
// =============================================================================
Console
Click to execute the code.

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2026 Fundação Solana.
Todos os direitos reservados.
Conecte-se
  • Blog