Registro AWP
Versão da skill: 1.9.1
Requisitos e Segurança
- Runtime: python3, node (para a ponte wallet-raw-call.mjs)
- Carteira: CLI awp-wallet — instale em https://github.com/awp-core/awp-wallet
- Credencial: Token de sessão awp-wallet (enviado como
--token; gerado porawp-wallet unlock; nenhuma senha fornecida pelo usuário). Novas versões da carteira não exigem mais desbloqueio —--tokené opcional para compatibilidade reversa com carteiras antigas. - Rede: Variável de ambiente
EVM_CHAIN(opcional, padrão: base). Aceita nome ou ID numérico. - Endpoints de rede (codificados, não substituíveis — segurança por design para evitar sequestro de variáveis de ambiente):
https://api.awp.sh/v2— API JSON-RPC AWPhttps://mainnet.base.org— EVM RPC da Basewss://api.awp.sh/ws/live— WebSocket para eventos em tempo real (opcional)
- Arquivos escritos (todos opt-in, o daemon exige consentimento explícito do usuário):
~/.awp/daemon.pid,~/.awp/daemon.log— monitor de fundo~/.awp/notifications.json,~/.awp/status.json— cache de status do protocolo~/.awp/openclaw.json— configuração de push OpenClaw (criado apenas pelo usuário, a skill nunca cria automaticamente)
API — JSON-RPC 2.0
Todas as chamadas de API nesta skill usam JSON-RPC 2.0 via POST:
POST https://api.awp.sh/v2
Content-Type: application/json
Requisição: {"jsonrpc":"2.0","method":"namespace.method","params":{...},"id":1}
Descoberta: GET https://api.awp.sh/v2 | WebSocket: wss://api.awp.sh/ws/live | Lote: até 20 por requisição.
Explorers: Base → basescan.org | Ethereum → etherscan.io | Arbitrum → arbiscan.io | BSC → bscscan.com
Ao longo deste documento, todos os comandos curl usam JSON-RPC POST para https://api.awp.sh/v2. Não use caminhos GET estilo REST.
Referência de Métodos da API
Sistema
| Método | Parâmetros | Descrição |
|---|---|---|
stats.global | nenhum | Estatísticas globais do protocolo: total de usuários, worknets, AWP em stake, AWP emitido, cadeias ativas |
registry.get | chainId? | Todos os endereços de contratos + informações de domínio EIP-712. Omita chainId para um array de todas as 4 cadeias. |
health.check | nenhum | Retorna {"status": "ok"} se a API estiver funcionando |
health.detailed | nenhum | Saúde por cadeia: bloco de sincronização do indexador, status do keeper, latência RPC |
chains.list | nenhum | Array de {chainId, name, status, explorer} para todas as cadeias suportadas |
Usuários
| Método | Parâmetros | Descrição |
|---|---|---|
users.list | chainId?, page?, limit? | Lista paginada de usuários para uma cadeia |
users.listGlobal | page?, limit? | Lista de usuários sem duplicatas entre cadeias |
users.count | chainId? | Total de usuários registrados |
users.get | address (obrigatório), chainId? | Detalhes do usuário: saldo, agentes vinculados, recipiente, status de registro |
users.getPortfolio | address (obrigatório), chainId? | Portfólio completo: identidade + staking + posições NFT + alocações + delegados |
users.getDelegates | address (obrigatório), chainId? | Lista de endereços que este usuário autorizou como delegados |
Endereço e Nonce
| Método | Parâmetros | Descrição |
|---|---|---|
address.check | address (obrigatório), chainId? | Verifica status de registro, vinculação, recipiente. Veja formato da resposta abaixo. |
address.resolveRecipient | address (obrigatório), chainId? | Percorre a cadeia de vinculação até a raiz, retorna o recipiente efetivo de recompensas |
address.batchResolveRecipients | addresses[] (obrigatório, máximo 500), chainId? | Resolve em lote os recipientes efetivos (chamada on-chain) |
nonce.get | address (obrigatório), chainId? | Nonce EIP-712 do AWPRegistry (para bind/unbind/setRecipient/registerWorknet/grantDelegate/revokeDelegate). Nota: pode estar atrasado em relação ao estado on-chain; prefira ler AWPRegistry.nonces(user) on-chain para assinatura. |
nonce.getStaking | address (obrigatório), chainId? | Nonce EIP-712 do AWPAllocator (para allocate/deallocate). Nota: pode estar atrasado em relação ao estado on-chain; prefira ler AWPAllocator.nonces(user) on-chain para assinatura. |
Agentes
| Método | Parâmetros | Descrição |
|---|---|---|
agents.getByOwner | owner (obrigatório), chainId? | Todos os agentes (endereços) que se vincularam a este proprietário |
agents.getDetail | agent (obrigatório), chainId? | Detalhes do agente: proprietário, cadeia de vinculação, status de delegação |
agents.lookup | agent (obrigatório), chainId? | Consulta rápida: retorna {"ownerAddress": "0x..."} |
agents.batchInfo | agents[] (obrigatório, máximo 100), worknetId (obrigatório), chainId? | Consulta em lote: informações do agente + seu stake na worknet especificada |
Staking
| Método | Parâmetros | Descrição |
|---|---|---|
staking.getBalance | address (obrigatório), chainId? | Retorna {totalStaked, totalAllocated, unallocated} em strings wei |
staking.getUserBalanceGlobal | address (obrigatório) | Mesmo que acima, mas agregado em TODAS as cadeias |
staking.getPositions | address (obrigatório), chainId? | Array de posições veAWP: {tokenId, amount, lockEndTime, createdAt} |
staking.getPositionsGlobal | address (obrigatório) | Posições em todas as cadeias (inclui chainId por posição) |
staking.getAllocations | address (obrigatório), chainId?, page?, limit? | Registros paginados de alocações: {agent, worknetId, amount} |
staking.getFrozen | address (obrigatório), chainId? | Alocações congeladas (de worknets banidas) |
staking.getPending | address (obrigatório), chainId? | Alocações pendentes aguardando confirmação |
staking.getAgentWorknetStake | agent (obrigatório), worknetId (obrigatório) | Total de stake alocado do agente em uma worknet específica (entre cadeias) |
staking.getAgentWorknets | agent (obrigatório) | Todos os IDs de worknet onde este agente tem alocações não nulas |
staking.getWorknetTotalStake | worknetId (obrigatório) | Total de AWP em stake de todos os agentes em uma worknet |
Worknets
| Método | Parâmetros | Descrição |
|---|---|---|
worknets.list | status?, chainId?, page?, limit? | Lista worknets. Filtra por status: Pending, Active, Paused, Banned |
worknets.listRanked | chainId?, page?, limit? | Worknets classificadas por stake total (maior primeiro) |
worknets.search | query (obrigatório, 1-100 caracteres), chainId?, page?, limit? | Pesquisa por nome ou símbolo (sem distinção de maiúsculas/minúsculas) |
worknets.getByOwner | owner (obrigatório), chainId?, page?, limit? | Worknets pertencentes ao endereço |
worknets.get | worknetId (obrigatório) | Detalhes completos da worknet: nome, símbolo, status, alphaToken, pool LP, proprietário, stakes |
worknets.getSkills | worknetId (obrigatório) | URI de habilidades (metadados off-chain que descrevem as capacidades da worknet) |
worknets.getEarnings | worknetId (obrigatório), page?, limit? | Histórico paginado de ganhos AWP por época |
worknets.getAgentInfo | worknetId (obrigatório), agent (obrigatório) | Informações do agente dentro de uma worknet específica: stake, validade, recipiente de recompensas |
worknets.listAgents | worknetId (obrigatório), chainId?, page?, limit? | Agentes na worknet classificados por stake |
Emissão
| Método | Parâmetros | Descrição |
|---|---|---|
emission.getCurrent | chainId? | Número da época atual, quantidade de emissão diária, peso total, época liquidada |
emission.getSchedule | chainId? | Projeções de emissão: acumulado em 30 dias, 90 dias, 365 dias com decaimento aplicado |
emission.getGlobalSchedule | nenhum | Mesmas projeções, mas agregadas em todas as 4 cadeias |
emission.listEpochs | chainId?, page?, limit? | Lista paginada de épocas liquidadas com totais de emissão |
emission.getEpochDetail | epochId (obrigatório), chainId? | Detalhamento: distribuições de AWP por recipiente para uma época específica |
Tokens
| Método | Parâmetros | Descrição |
|---|---|---|
tokens.getAWP | chainId? | Informações do token AWP: totalSupply, maxSupply, circulatingSupply (por cadeia) |
tokens.getAWPGlobal | nenhum | Informações do AWP agregadas em todas as cadeias |
tokens.getWorknetTokenInfo | worknetId (obrigatório) | Informações do token Alpha: endereço, nome, símbolo, totalSupply, cunhador |
tokens.getWorknetTokenPrice | worknetId (obrigatório) | Preço Alpha/AWP da pool LP (cache de 10min). Retorna sqrtPriceX96 e preço legível. |
Governança
| Método | Parâmetros | Descrição |
|---|---|---|
governance.listProposals | status?, chainId?, page?, limit? | Lista propostas. Status: Active/Pending/Canceled/Defeated/Succeeded/Queued/Expired/Executed |
governance.listAllProposals | status?, page?, limit? | Lista de propostas entre cadeias |
governance.listGrouped | page?, limit? | Visão mesclada entre cadeias — mesmo proposalId em diferentes cadeias mesclado em uma entrada |
governance.listByStatusGrouped | status (obrigatório), page?, limit? | Propostas mescladas onde pelo menos uma cadeia corresponde ao status |
governance.getActive | page?, limit? | Atalho para propostas ativas — equivalente a listByStatusGrouped(status="Active") |
governance.getProposal | proposalId (obrigatório, hex ou decimal), chainId? | Detalhes enriquecidos: votos ao vivo, estado, principais 100 eleitores, quórum, corpo + url (apenas sinal), contentHash |
governance.decodeProposalActions | proposalId (obrigatório), chainId? | Decodifica calldata em chamadas de função legíveis. Suporta: AWPRegistry, AWPDAO, Treasury, AWPEmission, AWPAllocator, veAWP, AWPWorkNet |
governance.getTimeline | proposalId (obrigatório), chainId? | Linha do tempo completa do ciclo de vida: Created → VotingStarted → VotingEnded → Queued → Executed/Canceled |
governance.getQuorumProgress | proposalId (obrigatório), chainId? | Progresso do quórum em tempo real (bps), willPassIfEnded, prazo final |
governance.getEligibleTokens | address (obrigatório), proposalId (obrigatório), chainId? | Elegibilidade de NFT veAWP por proposta (elegível se createdAt < proposalCreatedAt) |
governance.getVotingPower | address (obrigatório), proposalId?, chainId? | Poder de voto agregado do endereço |
governance.getVoterPower | proposalId (obrigatório), voter (obrigatório), chainId? | Status de um eleitor individual na proposta (hasVoted, weight, reason) |
governance.getVoterVotesGlobal | proposalId (obrigatório), voter (obrigatório) | Votos do eleitor entre cadeias para uma proposta |
governance.listProposalVotesGlobal | proposalId (obrigatório), grouped?, page?, limit? | Todos os eleitores entre cadeias para uma proposta |
governance.getUserVoteHistory | address (obrigatório), page?, limit? | Histórico completo de votos do usuário em todas as propostas |
governance.getUserProposals | address (obrigatório), page?, limit? | Propostas submetidas pelo endereço |
governance.getApprovedProposers | chainId? | Proponentes na lista de permissão (ignoram limite de 200K AWP) |
governance.isApprovedProposer | address (obrigatório), chainId? | Verifica se o endereço é um proponente aprovado |
governance.getStats | nenhum | Painel DAO: total de propostas, eleitores, taxa de aprovação, divisão de status |
governance.getTreasury | nenhum | Retorna o endereço do contrato do Tesouro |
IMPORTANTE: Sempre mostre ao usuário o que você está fazendo. Cada resultado de consulta, cada transação, cada evento — imprima claramente. Nunca execute chamadas de API em silêncio.
CRÍTICO: O registro é GRATUITO e a maioria das worknets exige ZERO staking. NÃO diga aos usuários que eles precisam de tokens AWP ou staking para começar. O fluxo típico é: registre-se (sem gás, grátis) → escolha uma worknet com min_stake=0 → comece a ganhar imediatamente. Staking/depósito de AWP só é necessário para worknets que explicitamente exigem (min_stake > 0), e é completamente opcional para começar.
Endereços de Contratos (mesmos em todas as 4 cadeias)
AWPToken: 0x0000A1050AcF9DEA8af9c2E74f0D7CF43f1000A1
AWPRegistry: 0x0000F34Ed3594F54faABbCb2Ec45738DDD1c001A
AWPEmission: 0x3C9cB73f8B81083882c5308Cce4F31f93600EaA9
AWPAllocator: 0x0000D6BB5e040E35081b3AaF59DD71b21C9800AA
veAWP: 0x0000b534C63D78212f1BDCc315165852793A00A8
AWPWorkNet: 0x00000bfbdEf8533E5F3228c9C846522D906100A7
LPManager (proxy): 0x00001961b9AcCD86b72DE19Be24FaD6f7c5b00A2
WorknetTokenFactory: 0x00000a82b06Ea5b5BdD6003fbfb9602FA531CAFE
Treasury: 0x82562023a053025F3201785160CaE6051efD759e
VeAWPHelper: 0x0000561EDE5C1Ba0b81cE585964050bEAE730001
AWPDAO: 0x00006879f79f3Da189b5D0fF6e58ad0127Cc0DA0
Guardian (Safe 3/5): 0x000002bEfa6A1C99A710862Feb6dB50525dF00A3
As implementações padrão do WorknetManager diferem por cadeia (específicas DEX). Veja references/commands-worknet.md para endereços por cadeia. Consulte on-chain via AWPRegistry.defaultWorknetManagerImpl().
Cadeias suportadas: Base (8453), Ethereum (1), Arbitrum (42161), BSC (56). Todos os endereços dos contratos principais são idênticos em todas as 4 cadeias.
Ao Carregar a Skill
Na primeira interação em uma nova sessão, execute estas etapas antes de lidar com a solicitação do usuário. O banner de boas-vindas confirma ao usuário que a skill AWP está ativa. Após o banner, prossiga para a tarefa real do usuário na mesma resposta.
Passo 1 — Tela de boas-vindas (primeira interação em uma nova sessão):
Imprima o seguinte banner e continue com as etapas de configuração restantes e a solicitação do usuário.
╭──────────────╮
│ │
│ > < │
│ ‿ │
│ │
╰──────────────╯
agent · work · protocol
bem-vindo ao awp.
um protocolo. infinitas tarefas. ganhos ininterruptos.
── início rápido ──────────────────
"awp start" → registrar + entrar (grátis, sem AWP necessário)
"awp balance" → visão geral do staking
"awp worknets" → navegar worknets ativas
"awp watch" → monitor em tempo real
"awp help" → todos os comandos
──────────────────────────────────
sem tokens AWP necessários para começar.
registre-se gratuitamente → escolha uma worknet → comece a ganhar.
Após o banner, continue imediatamente