0Pricing
Web3 & DApp Development Fundamentals · Aula

Permissões

Transferências delegadas

Permissões é uma aula grátis de Web3 & DApp Development Fundamentals no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Web3 & DApp Development Fundamentals, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Web3 & DApp Development Fundamentals inclui 4 aulas no total.

Partes desta aula ainda não foram traduzidas e aparecem em inglês.

Delegated Transfers

Allowances let a token owner authorize another account - the spender - to move tokens on their behalf. This is what enables decentralized exchanges and DeFi protocols to pull your tokens with permission.

The flow is: approve sets a limit, then transferFrom spends within it.

The Allowance Storage

Allowances live in a nested mapping: owner to spender to amount. It records how much each spender may move for each owner.

<code>mapping(address => mapping(address => uint256)) public allowance;</code>

Setting an Allowance

The owner calls approve to authorize a spender. This overwrites any previous allowance for that spender.

<code>function approve(address spender, uint256 amount) public returns (bool) {
    allowance[msg.sender][spender] = amount;
    emit Approval(msg.sender, spender, amount);
    return true;
}</code>

Reading an Allowance

Anyone can query the remaining allowance with the public mapping or the standard allowance(owner, spender) view function.

<code>// remaining = allowance[owner][spender];
function allowanceOf(address owner, address spender) public view returns (uint256) {
    return allowance[owner][spender];
}</code>

Implementing transferFrom

transferFrom lets an approved spender move tokens from the owner to a recipient. It must check both the owner's balance and the spender's allowance.

<code>function transferFrom(address from, address to, uint256 amount) public returns (bool) {
    require(balanceOf[from] >= amount, 'insufficient balance');
    require(allowance[from][msg.sender] >= amount, 'allowance exceeded');
    allowance[from][msg.sender] -= amount;
    balanceOf[from] -= amount;
    balanceOf[to] += amount;
    emit Transfer(from, to, amount);
    return true;
}</code>

Decrementing the Allowance

Notice that transferFrom reduces the allowance by the amount spent. This prevents a spender from reusing the same approval indefinitely.

<code>allowance[from][msg.sender] -= amount; // consumed</code>

Infinite Approval

Some protocols request the maximum uint256 allowance so users only approve once. Many implementations skip decrementing when the allowance is set to this max value, saving gas.

<code>uint256 constant MAX = type(uint256).max;
// if (allowance == MAX) skip decrement</code>

The Approve Race Condition

There is a known hazard: changing an allowance from one non-zero value to another can be front-run, letting a spender use both. The classic mitigation is to set the allowance to 0 first, then to the new value.

<code>// recommended pattern
token.approve(spender, 0);
token.approve(spender, newAmount);</code>

increaseAllowance and decreaseAllowance

To avoid the race condition, some tokens add helper functions that adjust the allowance relative to its current value rather than overwriting it.

<code>function increaseAllowance(address spender, uint256 added) public returns (bool) {
    allowance[msg.sender][spender] += added;
    emit Approval(msg.sender, spender, allowance[msg.sender][spender]);
    return true;
}</code>

Real-World Use: DEX

When you trade on a DEX you first approve the router contract. The router then calls transferFrom to pull your tokens into the swap. Without the allowance the trade cannot happen.

Security Reminder

An allowance is a standing permission. Granting an infinite allowance to a malicious or buggy contract can drain your tokens. Review and revoke unused approvals regularly.

<code>// revoke by approving zero
token.approve(spender, 0);</code>

Quick Check

Test your understanding of allowances.

Recap

You learned the allowance mechanism:

  • approve sets allowance[owner][spender]
  • transferFrom spends within the allowance and decrements it
  • The approve race condition is mitigated by setting to 0 first or using increase/decreaseAllowance
  • Allowances power DEXs and DeFi - revoke unused ones for safety

Perguntas Frequentes

A aula “Permissões” é grátis?

Sim — o texto completo de “Permissões” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Web3 & DApp Development Fundamentals, atualize para CoddyKit PRO. O curso de Web3 & DApp Development Fundamentals inclui 4 aulas no total.

O que vou aprender em “Permissões”?

Transferências delegadas Você pratica Web3 & DApp Development Fundamentals com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Web3 & DApp Development Fundamentals?

Nenhuma experiência prévia é necessária. Web3 & DApp Development Fundamentals no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Permissões”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Web3 & DApp Development Fundamentals?

Sim. Cada aula de Web3 & DApp Development Fundamentals inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O padrão ERC-20
  2. Implementação de um token
  3. Permissões
  4. Emissão e queima
← Voltar para Web3 & DApp Development Fundamentals