Módulos

CCTP Bridge

Bridge cross-chain de USDC via CCTP — burn, attestation, mint.

arc_devkit.bridge implementa o fluxo burn → attestation → mint do Cross-Chain Transfer Protocol (CCTP) V2 da Circle — o padrão público usado para mover USDC nativamente entre chains, sem wrapping. A Arc é o domain 26 do CCTP; endereços de TokenMessengerV2/MessageTransmitterV2/TokenMinterV2 já estão publicados tanto para mainnet quanto testnet (arc_devkit.networks).

⚠Ainda não validado contra uma transferência real

O CCTPBridge agora usa a assinatura V2 do depositForBurn e resolve endereços de contrato reais e publicados — mas isso ainda não foi testado contra um contrato CCTP real da Arc. Também existe um relato público não resolvido (em 18/09/2026) de que a API pública Iris da Circle não retorna attestations para o domain 26 da Arc Testnet (circlefin/evm-cctp-contracts#110) — verifique se a obtenção de attestation funciona antes de depender disso em produção. Por isso CCTP_ATTESTATION_API_URL não tem valor default.

Iniciando uma transferência

from decimal import Decimal
from arc_devkit.bridge import CCTPBridge
from arc_devkit.core.connection import get_web3

bridge = CCTPBridge(w3=get_web3(), network="testnet")  # ou "mainnet"

transfer = bridge.start_transfer(
    amount_usdc=Decimal("10.0"),
    recipient="0xDestinoNaOutraChain",
    destination_domain=0,       # domain CCTP da chain destino
    dest_chain_id=1,
    private_key="0xSuaChave",
)
print(transfer.status)   # BridgeStatus.BURNED ou FAILED

Acompanhando e retomando

from arc_devkit.bridge import load_transfer

transfer = load_transfer(transfer.id)

# Retoma a partir do último status conhecido (recuperação de erro)
transfer = bridge.resume(transfer, dest_w3=dest_w3, message_transmitter_address="0x...", private_key="0x...")

Os registros de transferência (BridgeTransfer) são persistidos em ~/.arc_devkit/bridge_transfers/<id>.json.

Guardrails

from arc_devkit.agents.guardrails import Guardrails

bridge = CCTPBridge(w3=get_web3(), network="testnet", guardrails=Guardrails.from_settings())

Aplica os mesmos checks de limite diário / whitelist / kill switch do PaymentAgent.

Monitorando conclusão

from arc_devkit.agents.monitor_agent import MonitorAgent

monitor = MonitorAgent(watched_address="0x...", watch_bridge_transfers=[transfer.id])
monitor.on_bridge_completed(lambda evt: print("Bridge completo!", evt))

CLI

arcdevkit bridge send 0xDest... 5.0 --dest-domain 0 --dest-chain-id 1
arcdevkit bridge status <transfer_id>
arcdevkit bridge resume <transfer_id> --dest-rpc https://... --message-transmitter 0x...

API REST

curl -X POST http://localhost:8000/bridge/transfer -d '{...}'
curl http://localhost:8000/bridge/status/<transfer_id>

Status possíveis

StatusDescrição
PENDING_BURNAinda não iniciado
BURNEDBurn confirmado na Arc
PENDING_ATTESTATIONAguardando attestation da Circle
ATTESTEDAttestation obtida — pronto para mint
PENDING_MINTMint em andamento na chain destino
COMPLETETransferência concluída
FAILEDFalhou — ver campo error