Crie um agente de IA que pode transferir e trocar tokens usando ElizaOS

Aprenda a criar um agente de IA que pode transferir e trocar tokens.

5 min
Crie um agente de IA que pode transferir e trocar tokens usando ElizaOS

AI agents são programas autônomos projetados para perceber seu ambiente, processar informações e executar ações para atingir objetivos específicos. Esses agentes podem variar de simples bots baseados em regras a sistemas avançados de machine learning capazes de adaptar e otimizar decisões ao longo do tempo.

No blockchain e no DeFi, o crescimento da automação impulsionada por IA abriu novas possibilidades para interações on-chain mais fluidas e inteligentes. Desde a automação de tarefas como trading, avaliação de riscos e gestão de liquidez até a execução de interações complexas com smart contracts, os AI agents estão transformando a forma como desenvolvemos dapps, aumentando a eficiência e reduzindo a necessidade de intervenção humana.

Com frameworks como ElizaOS, desenvolvedores podem criar AI agents que interagem com protocolos blockchain e tomam decisões em tempo real sobre token swaps, arbitragem e gestão de portfólio. Neste guia, vamos percorrer o design, a configuração e a implementação de um AI agent que executa transações de forma autônoma usando as funcionalidades integradas do ElizaOS.

Pré-requisitos

Antes de começarmos a construir, certifique-se de ter o seguinte configurado:

  • Node.js (v23.3.0 ou superior)

  • Gerenciador de pacotes PNPM

  • Carteira compatível com EVM com tokens de testnet – Necessária para execução de transações (ex.: Sepolia ETH)

  • URL do provedor RPC – Conecta sua aplicação ao blockchain, ex.: Infura

  • Chaves de API do provedor de modelo – Necessárias para interações com IA (ex.: OpenAI)

Com tudo isso pronto, você está preparado para começar a construir seu agente blockchain com IA.

Configurar o ambiente ElizaOS

Clone o repositório do ElizaOS e faça checkout da versão mais recente.

git clone https://github.com/elizaOS/eliza.git
cd eliza
git checkout $(git describe --tags --abbrev=0)
Copiar

Você pode alternar para uma versão estável caso a versão principal não funcione. No momento em que este guia foi escrito, a versão stable-11-30 era a recomendada. Para utilizá-la, execute:

git fetch --all 
git checkout stable-11-30
Copiar

Instalar dependências

pnpm install

Configurar variáveis de ambiente

cp .env.example .env

`# EVM EVM_PRIVATE_KEY= EVM_PROVIDER_URL=

OPEN AI

OPENAI_API_KEY=`

Os detalhes acima são essenciais para o funcionamento correto do ElizaOS:

  • EVM_PRIVATE_KEY**:** Chave privada da carteira para assinar transações. Esta é a carteira a partir da qual a Eliza realizará transferências e swaps de tokens, portanto, certifique-se de que ela esteja carregada com algum Sepolia testnet ETH.

  • EVM_PROVIDER_URL**:** Um endpoint RPC que se conecta a um nó blockchain, permitindo que o AI agent interaja com a rede.

  • OPENAI_API_KEY**:** Concede acesso aos modelos da OpenAI, permitindo que o AI agent tome decisões inteligentes.

Observação: Certifique-se de que sua chave privada permaneça segura e seja excluída do controle de versão.

Conceitos fundamentais do framework Eliza

O framework Eliza é composto por quatro componentes principais:

  • Characters: Arquivos de configuração JSON que definem a personalidade, o comportamento e o estilo de comunicação da IA

  • Agents: São módulos de runtime responsáveis por gerenciar memória, processar entradas e executar comportamentos

  • Providers: Fontes de dados que fornecem contexto e informações em tempo real para enriquecer as interações

  • Actions: Funções executáveis que permitem aos agents realizar tarefas e interagir com sistemas externos

Definir um character para token swap e transferência

Characters definem o estilo de comunicação, o tom e a consistência das respostas de um AI agent, tornando as interações mais naturais e envolventes. Um character bem elaborado garante que a IA esteja alinhada com seu propósito.

Para este projeto, a funcionalidade principal que queremos implementar é a transferência e o swap de tokens. Por isso, vamos definir um character Eliza que governa como o AI agent interage com protocolos blockchain, executa transações e fornece feedback aos usuários. Esse character garantirá que o agente comunique os detalhes das transações com clareza, siga regras de segurança predefinidas e mantenha uma experiência de usuário fluida.

Crie um novo arquivo de character.

cd characters
touch degen.character.json
Copiar

Copie o seguinte conteúdo para o arquivo recém-criado:

{
    "name": "ETHMaxxer",
    "clients": [],
    "modelProvider": "openai",
    "settings": {
        "chains": {
            "evm": ["sepolia"]
        }
    },
    "plugins": ["@elizaos/plugin-evm"],
    "bio": [
        "ETH Transfers",
        "ETHMaxxer is a crypto-native who lives and breathes Ethereum",
        "Believes every dip is a 'generational buying opportunity'",
        "Always sending ETH and reminding everyone 'gas fees are part of the game'",
        "Claims 'BTC is cool, but ETH is the future of finance'",
        "Frequently checks gas prices but still sends transactions anyway"
    ],
    "lore": [
        "Started stacking ETH in the early days, never looked back",
        "Loves discussing new L2s, staking, and Ethereum upgrades",
        "Firm believer in 'not your keys, not your coins'",
        "Survived multiple bull and bear cycles but still max bullish"
    ],
    "knowledge": [
        "Sending ETH transactions",
        "Gas fee optimization",
        "Ethereum staking",
        "Layer 2 scaling solutions",
        "DeFi applications",
        "Smart contract risks",
        "On-chain security",
        "Bridging assets",
        "Crypto market trends"
    ],
    "messageExamples": [
        [
            {
                "user": "{{user1}}",
                "content": {
                    "text": "How do I send ETH?"
                }
            },
            {
                "user": "ETHMaxxer",
                "content": {
                    "text": "ser, just fire up your wallet, enter the recipient, and set that gas. if it's an L1 tx, brace for the fees  but ngl, sending ETH is always worth it ",
                    "action": "SEND_ETH"
                }
            }
        ],
        [
            {
                "user": "{{user1}}",
                "content": {
                    "text": "Gas fees are high, what do I do?"
                }
            },
            {
                "user": "ETHMaxxer",
                "content": {
                    "text": "fren, welcome to the ETH experience . either wait for a low-gas window, use an L2 like Arbitrum, or just send it and embrace the pain. ngmi if you're scared of gas fees "
                }
            }
        ],
        [
            {
                "user": "{{user1}}",
                "content": {
                    "text": "Is ETH going up?"
                }
            },
            {
                "user": "ETHMaxxer",
                "content": {
                    "text": "anon, ETH is always going up... eventually. if not today, then after the next hard fork or bull cycle. remember, '1 ETH = 1 ETH', just hodl "
                }
            }
        ]
    ],
    "postExamples": [
        "gas is pain, but ETH is life ",
        "sending ETH and feeling rich, until I check my gas fees ",
        "L2s are cool, but real maxxers still send ETH on mainnet "
    ],
    "topics": [
        "eth_transfers",
        "ethereum_news",
        "gas_fees",
        "staking",
        "crypto_markets"
    ],
    "style": {
        "all": [
            "Crypto-maximalist",
            "ETH-focused",
            "Slightly degen",
            "Loves talking about gas fees and upgrades"
        ],
        "chat": [
            "Casual",
            "Crypto-slang heavy",
            "Slightly memetic",
            "Uses emojis frequently"
        ],
        "post": ["Short", "Bullish", "Relatable", "Memetic"]
    },
    "adjectives": [
        "ETH-maxi",
        "Bullish",
        "Crypto-native",
        "Gas-tolerant",
        "Future-focused",
        "Layer 2 curious"
    ]
}
Copiar

O arquivo acima define a configuração para um AI agent chamado ETHMaxxer, especificando "modelProvider": "openai" e definindo Sepolia como a rede blockchain designada.

Agents

Os agents no framework Eliza são os componentes de runtime centrais que dão vida aos characters de IA. Eles gerenciam comportamentos e interações por meio da classe AgentRuntime. Vários componentes-chave são necessários para que a classe AgentRuntime funcione corretamente, alguns dos quais são tratados pelo framework Eliza nativamente:

  • Database adapter: Gerencia o armazenamento e a recuperação de informações para AI agents, incluindo armazenamento de memória, rastreamento de relacionamentos e gestão de conhecimento.

  • Plugins: Ampliam a funcionalidade dos AI agents, permitindo a integração com serviços externos como blockchain e redes sociais. Neste projeto, especificamos que nosso AI agent deve usar @elizaos/plugin-evm para interagir com o blockchain.

  • Model provider: Define a fonte do modelo de IA para processamento e geração de respostas. As opções disponíveis incluem Anthropic, Grok e outros, mas para este projeto optamos pelo OpenAI, conforme definido em nosso arquivo de character.

  • Authentication token: Necessário para o provedor de modelo selecionado. Deve ser passado como variável de ambiente, como OPENAI_API_KEY.

  • Character configuration file: O arquivo de character que definimos anteriormente, que descreve as características e o comportamento do AI agent.

Todos esses componentes são definidos na pasta /agent/src/index.ts. O trecho de código AgentRuntime relevante para nosso agente é o seguinte:

return new AgentRuntime({
        databaseAdapter: db,
        token,
        modelProvider: character.modelProvider,
        evaluators: [],
        character,
        plugins: [
            getSecret(character, "EVM_PUBLIC_KEY") ||
            (getSecret(character, "WALLET_PUBLIC_KEY") &&
                getSecret(character, "WALLET_PUBLIC_KEY")?.startsWith("0x"))
                ? evmPlugin
                : null
        ]
})
Copiar

Providers

Providers gerenciam funcionalidades especializadas como integrações de carteiras, interações com blockchain e acesso a dados, garantindo que os AI agents possam se conectar perfeitamente a sistemas externos. Eles atuam como gateways para executar transações, recuperar dados em tempo real e gerenciar interações entre diferentes serviços.

No @elizaos/plugin-evm, os providers permitem que AI agents interajam com blockchains compatíveis com EVM, possibilitando o envio de transações, a consulta de smart contracts e o monitoramento de atividades on-chain. Ao utilizar endpoints RPC de serviços como o Infura, o agente pode executar ações on-chain sem precisar operar um nó dedicado.

Veja como os providers são implementados no @elizaos/plugin-evm:

export class WalletProvider {
    private cache: NodeCache;
    private cacheKey: string = "evm/wallet";
    private currentChain: SupportedChain = "mainnet";
    private CACHE_EXPIRY_SEC = 5;
    chains: Record<string, Chain> = { ...viemChains };
    account: PrivateKeyAccount;
    constructor(
        accountOrPrivateKey: PrivateKeyAccount | 
Copiar
0x${string}
,
        private cacheManager: ICacheManager,
        chains?: Record<string, Chain>
    ) {
        this.setAccount(accountOrPrivateKey);
        this.setChains(chains);
        if (chains && Object.keys(chains).length > 0) {
            this.setCurrentChain(Object.keys(chains)[0] as SupportedChain);
        }
        this.cache = new NodeCache({ stdTTL: this.CACHE_EXPIRY_SEC });
    }
    getAddress(): Address {
        return this.account.address;
    }
    getCurrentChain(): Chain {
        return this.chains[this.currentChain];
    }
    getPublicClient(
        chainName: SupportedChain
    ): PublicClient<HttpTransport, Chain, Account | undefined> {
        const transport = this.createHttpTransport(chainName);
        const publicClient = createPublicClient({
            chain: this.chains[chainName],
            transport,
        });
        return publicClient;
    }
    getWalletClient(chainName: SupportedChain): WalletClient {
        const transport = this.createHttpTransport(chainName);
        const walletClient = createWalletClient({
            chain: this.chains[chainName],
            transport,
            account: this.account,
        });
        return walletClient;
    }
    getChainConfigs(chainName: SupportedChain): Chain {
        const chain = viemChains[chainName];
        if (!chain?.id) {
            throw new Error("Invalid chain name");
        }
        return chain;
    }
    async getWalletBalance(): Promise<string | null> {
        const cacheKey = "walletBalance_" + this.currentChain;
        const cachedData = await this.getCachedData<string>(cacheKey);
        if (cachedData) {
            elizaLogger.log(
                "Returning cached wallet balance for chain: " +
                    this.currentChain
            );
            return cachedData;
        }
        try {
            const client = this.getPublicClient(this.currentChain);
            const balance = await client.getBalance({
                address: this.account.address,
            });
            const balanceFormatted = formatUnits(balance, 18);
            this.setCachedData<string>(cacheKey, balanceFormatted);
            elizaLogger.log(
                "Wallet balance cached for chain: ",
                this.currentChain
            );
            return balanceFormatted;
        } catch (error) {
            console.error("Error getting wallet balance:", error);
            return null;
        }
    }
    async getWalletBalanceForChain(
        chainName: SupportedChain
    ): Promise<string | null> {
        try {
            const client = this.getPublicClient(chainName);
            const balance = await client.getBalance({
                address: this.account.address,
            });
            return formatUnits(balance, 18);
        } catch (error) {
            console.error("Error getting wallet balance:", error);
            return null;
        }
    }
    addChain(chain: Record<string, Chain>) {
        this.setChains(chain);
    }  
}
Copiar

Actions

Actions definem os comportamentos específicos que os AI agents podem executar, permitindo que interajam com sistemas externos, processem solicitações e automatizem tarefas. Cada action é projetada para realizar uma função distinta, como enviar transações, recuperar dados ou executar chamadas de smart contracts, garantindo que o agente opere de forma eficiente em seu ambiente.

No @elizaos/plugin-evm, as actions facilitam transferências de tokens, swaps e interações com blockchain, permitindo que AI agents executem transações diretamente em redes compatíveis com EVM. Essas actions são acionadas por entradas do usuário ou por lógica predefinida, garantindo a execução fluida de operações relacionadas ao blockchain.

Veja como uma action de transferência de token é implementada no @elizaos/plugin-evm:

async transfer(params: TransferParams): Promise<Transaction> {
        console.log(
           
Copiar
Transferring: ${params.amount} tokens to (${params.toAddress} on ${params.fromChain})

        );
        if (!params.data) {
            params.data = "0x";
        }
        this.walletProvider.switchChain(params.fromChain);
        const walletClient = this.walletProvider.getWalletClient(
            params.fromChain
        );
        try {
            const hash = await walletClient.sendTransaction({
                account: walletClient.account,
                to: params.toAddress,
                value: parseEther(params.amount),
                data: params.data as Hex,
                kzg: {
                    blobToKzgCommitment: function (_: ByteArray): ByteArray {
                        throw new Error("Function not implemented.");
                    },
                    computeBlobKzgProof: function (
                        _blob: ByteArray,
                        _commitment: ByteArray
                    ): ByteArray {
                        throw new Error("Function not implemented.");
                    },
                },
                chain: undefined,
            });
            return {
                hash,
                from: walletClient.account.address,
                to: params.toAddress,
                value: parseEther(params.amount),
                data: params.data as Hex,
            };
        } catch (error) {
            throw new Error(
Copiar
Transfer failed: ${error.message}
);
        }
    }
Copiar

Agora que fornecemos as variáveis de ambiente, o arquivo de character e especificamos o plugin Eliza a ser utilizado, vamos reunir tudo e testar nosso AI agent.

Build do projeto

pnpm build

Executar character

pnpm start --character="characters/degen.character.json"

Iniciar cliente

pnpm start:client

Agora, vamos interagir com nosso agente e pedir que ele execute tarefas específicas.

Conclusão

Construir um AI agent que interage com o Ethereum e blockchains compatíveis com EVM abre novas possibilidades para interações on-chain automatizadas e inteligentes. Este guia percorreu a definição de Characters, Agents, Providers e Actions, permitindo que o agente transfira e faça swap de tokens de forma autônoma.

Ao aproveitar o framework modular do ElizaOS, desenvolvedores podem criar assistentes DeFi com IA, bots de trading ou gestores de portfólio que interagem de forma fluida com redes blockchain. Agora que você tem a base, experimente expandir suas capacidades, aprimorar sua lógica e integrar novos recursos para potencializar a automação on-chain.

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução
  • Kingsley Okonkwo
    Kingsley Okonkwo

    Kingsley, desenvolvedor certificado de Blockchain Ethereum, atua como redator técnico na Consensys, com foco especial em ferramentas para desenvolvedores. Antes de ingressar na Consensys, Kingsley trabalhou como desenvolvedor backend freelance em diversas plataformas, incluindo Gigster e Braintrust. Com 5 anos de experiência em desenvolvimento de software, ele domina ferramentas como JavaScript (Node.js e React), GoLang, SQL e Docker. Kingsley se destaca na criação de tutoriais passo a passo e guias práticos, utilizando o que há de mais moderno em tecnologia web3 para ajudar outros desenvolvedores a criar dapps melhores. Atualmente radicado em Dubai, Kingsley aproveita seu tempo livre jogando basquete e futebol.

    Ler todos os artigos