Interagindo com o Proxy Precompile¶
Introdução¶
A Proxy Precompile permite que as contas definam contas proxy por meio da API Ethereum. As contas proxy podem realizar ações limitadas em nome da conta com proxy, como governança, transferências de saldo, gerenciamento ou transações privilegiadas, entre outras.
Se um usuário quisesse fornecer a outro usuário acesso a um número limitado de ações em seu nome, tradicionalmente, o único método para fazê-lo seria compartilhar a chave privada dessa conta. No entanto, as redes EVM com tecnologia Tanssi incluem o módulo proxy, fornecendo uma camada adicional de segurança. Com proxies, muitas contas podem realizar ações para uma conta primária, e tais permissões podem ser revogadas a qualquer momento. Isto é melhor se, por exemplo, um usuário quiser manter sua carteira segura em armazenamento a frio, mas ainda quiser acessar partes da funcionalidade da carteira, como governança ou staking.
Nota
O Proxy Precompile só pode ser chamado de uma Externally Owned Account (EOA) ou pela Batch Precompile.
Para saber mais sobre contas proxy e como configurá-las para seus próprios propósitos sem o uso do Proxy Precompile, visite a página Proxy Accounts.
A Proxy Precompile está localizada no seguinte endereço:
0x0000000000000000000000000000000000000805
Note
O uso de precompiladas pode trazer consequências inesperadas. As precompiladas do Tanssi são derivadas das do Moonbeam; portanto, familiarize-se com as considerações de segurança das precompiladas do Moonbeam.
Pré-requisitos¶
Para acompanhar o conteúdo deste guia, você precisará:
- Acesso a uma rede EVM com tecnologia Tanssi executando runtime 700 ou superior
- Uma carteira compatível com EVM configurada para funcionar com sua rede. Você também pode conectar sua carteira à rede EVM de demonstração
- Uma conta com fundos suficientes para pagar as taxas e depósitos necessários
- Uma segunda conta que você controla para usar como proxy
A Interface Solidity do Proxy¶
Proxy.sol é uma interface que permite que desenvolvedores interajam com as funções da precompilação.
Proxy.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.3;
/// @author The Moonsong Labs Team
/// @title Pallet Proxy Interface
/// @title The interface through which solidity contracts will interact with the Proxy pallet
interface Proxy {
/// @dev Defines the proxy permission types.
/// The values start at `0` (most permissive) and are represented as `uint8`
enum ProxyType {
Any,
NonTransfer,
Governance,
Staking,
CancelProxy,
Balances,
AuthorMapping,
IdentityJudgement
}
/// @dev Register a proxy account for the sender that is able to make calls on its behalf
/// @custom:selector 74a34dd3
/// @param delegate The account that the caller would like to make a proxy
/// @param proxyType The permissions allowed for this proxy account
/// @param delay The announcement period required of the initial proxy, will generally be zero
function addProxy(
address delegate,
ProxyType proxyType,
uint32 delay
) external;
/// @dev Removes a proxy account from the sender
/// @custom:selector fef3f708
/// @param delegate The account that the caller would like to remove as a proxy
/// @param proxyType The permissions currently enabled for the removed proxy account
/// @param delay The announcement period required of the initial proxy, will generally be zero
function removeProxy(
address delegate,
ProxyType proxyType,
uint32 delay
) external;
/// @dev Unregister all proxy accounts for the sender
/// @custom:selector 14a5b5fa
function removeProxies() external;
/// @dev Dispatch the given subcall (`callTo`, `callData`) from an account that the sender
/// is authorised for through `addProxy`
/// @custom:selector 0d3cff86
/// @param real The account that the proxy will make a call on behalf of
/// @param callTo Recipient of the call to be made by the `real` account
/// @param callData Data of the call to be made by the `real` account
function proxy(
address real,
address callTo,
bytes memory callData
) external payable;
/// @dev Dispatch the given subcall (`callTo`, `callData`) from an account that the sender
/// is authorised for through `addProxy`
/// @custom:selector 685b9d2f
/// @param real The account that the proxy will make a call on behalf of
/// @param forceProxyType Specify the exact proxy type to be used and checked for this call
/// @param callTo Recipient of the call to be made by the `real` account
/// @param callData Data of the call to be made by the `real` account
function proxyForceType(
address real,
ProxyType forceProxyType,
address callTo,
bytes memory callData
) external payable;
/// @dev Checks if the caller has an account proxied with a given proxy type
/// @custom:selector e26d38ed
/// @param real The real account that maybe has a proxy
/// @param delegate The account that the caller has maybe proxied
/// @param proxyType The permissions allowed for the proxy
/// @param delay The announcement period required of the initial proxy, will generally be zero
/// @return exists True if a proxy exists, False otherwise
function isProxy(
address real,
address delegate,
ProxyType proxyType,
uint32 delay
) external view returns (bool exists);
}
A interface inclui as estruturas de dados necessárias, juntamente com as seguintes funções:
addProxy(delegate, proxyType, delay) — registra uma conta proxy para o remetente após um número especificado de blocos delay (geralmente zero). Falhará se um proxy para o chamador já existir
delegateaddress - o endereço do proxyproxyTypeProxyType - o tipo de delegação que define as funções específicas que o proxy terá permissão para executardelayuint32 - número de blocos a esperar até que o proxy seja habilitado
delegate- 0x3f0Aef9Bd799F1291b80376aD57530D353ab0217proxyType- "Any"delay- 0
removeProxy(delegate, proxyType, delay) — remove um proxy registrado para o remetente
delegateaddress - o endereço do proxy a ser removidoproxyTypeProxyType - o tipo de delegação a ser removidodelayuint32 - número de blocos a esperar até que a remoção entre em vigor
delegate- 0x3f0Aef9Bd799F1291b80376aD57530D353ab0217proxyType- "Any"delay- 0
removeProxies() — remove todas as contas proxy delegadas ao remetente
isProxy(real, delegate, proxyType, delay) — retorna true se o endereço delegado for um proxy do tipo proxyType, para o endereço real, com o delay especificado
realaddress - a conta que concede permissões ao proxydelegateaddress - o endereço do proxyproxyTypeProxyType - o tipo de delegaçãodelayuint32 - número de blocos a aguardar
delegate- 0xbB8919d5DDfc85F4D15820a9e58018f1cfB39a2FproxyType- "Any"delay- 0
O parâmetro proxyType é definido pela seguinte enumeração ProxyType, onde os valores começam em 0 com o tipo de proxy mais permissivo e são representados como valores uint8:
enum ProxyType {
Any,
NonTransfer,
Governance,
Staking,
CancelProxy,
Balances,
AuthorMapping,
IdentityJudgement
}
Tipos de Proxy¶
Há vários tipos de funções de proxy que podem ser delegadas a contas, representadas em Proxy.sol através da enumeração ProxyType. A lista a seguir inclui todos os proxies possíveis e o tipo de transações que eles podem fazer em nome da conta principal:
- Any — o proxy any permitirá que a conta proxy faça qualquer tipo de transação. Observe que as transferências de saldo só são permitidas para EOAs, não para contratos ou Precompiles
- NonTransfer — o proxy de não transferência permite que a conta proxy faça qualquer tipo de transação em que o
msg.valueseja verificado como zero - Governance - o proxy de governança permitirá que a conta proxy faça qualquer tipo de transação relacionada à governança
- CancelProxy - o proxy de cancelamento permitirá que a conta proxy rejeite e remova anúncios de proxy atrasados (da conta principal). Atualmente, esta não é uma ação suportada pelo Proxy Precompile
- Balances - o proxy de saldos permitirá que a conta proxy faça apenas transferências de saldo para EOAs
Nota
A interface Solidity contém mais tipos de proxy do que os listados acima. A lista anterior inclui apenas os tipos de proxy implementados no baseline EVM Template.
Interaja com a interface Solidity via Remix¶
Esta seção irá guiá-lo pelas etapas para criar um proxy, verificar sua criação e revogar os privilégios do proxy. Estes exemplos são baseados na Tanssi demo EVM Network e usam Metamask. Este guia pode ser adaptado para sua própria rede EVM com tecnologia Tanssi adicionando a URL RPC da sua rede para a carteira EVM de sua escolha.
Configuração do Remix¶
Você pode interagir com a precompilação do Proxy usando Remix. Para adicionar a precompilação ao Remix, você precisará:
- Obter uma cópia de
Proxy.sol - Cole o conteúdo do arquivo em um arquivo Remix chamado
Proxy.sol
Compile o Contrato¶
Em seguida, você precisará compilar a interface no Remix:
- Clique na guia Compilar, a segunda de cima
- Em seguida, para compilar a interface, clique em Compilar Proxy.sol
Quando a compilação estiver concluída, você verá uma marca de seleção verde ao lado da guia Compilar.
Acessar o Contrato¶
Em vez de implantar o contrato inteligente, você acessará a interface através de seu endereço:
- Clique na guia Deploy and Run diretamente abaixo da guia Compile no Remix
- Certifique-se de que Injected Provider - Metamask esteja selecionado no menu suspenso ENVIRONMENT. Você pode ser solicitado pelo MetaMask para conectar sua conta ao Remix, caso ainda não esteja conectado
- Certifique-se de que a conta primária seja exibida em ACCOUNT
- Certifique-se de que Proxy - Proxy.sol esteja selecionado no menu suspenso CONTRACT. Dado que é um contrato pré-compilado, não há etapa de implantação. Em vez disso, você fornecerá o endereço da precompilação no campo At Address
- Forneça o endereço da precompilação do Proxy (que é
0x0000000000000000000000000000000000000805neste exemplo) e clique em At Address - A precompilação do Proxy aparecerá na lista de Deployed Contracts

Adicionar um Proxy¶
Você pode adicionar proxies para sua conta chamando as funções de precompilação. No exemplo a seguir, você adicionará um proxy autorizado a executar qualquer transação em seu nome:
- Expanda o contrato Proxy Precompile para ver as funções disponíveis
- Encontre a função addProxy e pressione o botão para expandir a seção
- Insira o endereço de sua segunda conta como delegate,
0como proxyType, o que significaany, e0como delay - Clique em transact
- O MetaMask aparecerá e você será solicitado a revisar os detalhes da transação. Clique em Confirmar para executar a transação
Nota
Ao construir a transação no Remix, o proxyType é representado como um uint8, em vez do enum ProxyType esperado. Em Solidity, os enums são compilados como uint8, então, quando você passa 0 para proxyType, você indica o primeiro elemento no enum ProxyType, que é o proxy any.
Verifique uma existência de Proxy¶
A função isProxy verifica se uma conta proxy existe. Após criar um proxy na etapa anterior, use os mesmos parâmetros para verificar se o proxy foi adicionado com sucesso:
- Expanda a função isProxy
- Insira sua conta principal como real, sua segunda conta (proxy) como delegate,
0como proxyType e0como delay - Clique em call
- As funções retornam se existe um proxy ou não. Neste exemplo, o proxy existe, portanto, a função retorna
true
Remover um Proxy¶
Você pode revogar uma permissão de proxy quando não for mais necessária. Após criar um proxy na Adicionar Proxy, etapa, ele pode ser removido seguindo estas etapas:
- Expanda a função removeProxy
- Insira a conta proxy como delegate,
0como proxyType e0como delay - Clique em transact
- O MetaMask aparecerá e você será solicitado a revisar os detalhes da transação. Clique em Confirmar para executar a transação
Depois que a transação for confirmada, se você repetir as etapas para verificar a existência de um proxy, o resultado deverá ser false.
E é isso! Você interagiu com sucesso com a precompilação do Proxy usando MetaMask e Remix!
| Criada: 9 de dezembro de 2025



