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
| Status | Descrição |
|---|---|
PENDING_BURN | Ainda não iniciado |
BURNED | Burn confirmado na Arc |
PENDING_ATTESTATION | Aguardando attestation da Circle |
ATTESTED | Attestation obtida — pronto para mint |
PENDING_MINT | Mint em andamento na chain destino |
COMPLETE | Transferência concluída |
FAILED | Falhou — ver campo error |