This flow helps you safely send tokens from one person to another and allow others to spend tokens on your behalf.
When you want to send tokens directly to a friend.
When you want to let a smart contract spend tokens for you.
When you want to set a spending limit for another user.
When you want to manage token transfers without sharing your private keys.
Syntax
Blockchain / Solidity
function transfer(address to, uint256 amount) returns (bool);
function approve(address spender, uint256 amount) returns (bool);
function transferFrom(address from, address to, uint256 amount) returns (bool);
transfer sends tokens directly to another address.
approve lets another address spend tokens from your balance.
Examples
Sends 100 tokens directly to address 0x1234...
Blockchain / Solidity
token.transfer(0x1234..., 100);
Allows address 0x5678... to spend up to 50 tokens from your balance.
Blockchain / Solidity
token.approve(0x5678..., 50);
Spends 30 tokens from 0x9abc... to 0xdef0... if approved.
Blockchain / Solidity
token.transferFrom(0x9abc..., 0xdef0..., 30);
Sample Program
This smart contract lets users transfer tokens, approve others to spend tokens, and transfer tokens on behalf of others if approved.
Blockchain / Solidity
pragma solidity ^0.8.0;
contract SimpleToken {
mapping(address => uint256) public balances;
mapping(address => mapping(address => uint256)) public allowances;
constructor() {
balances[msg.sender] = 1000;
}
function transfer(address to, uint256 amount) public returns (bool) {
require(balances[msg.sender] >= amount, "Not enough tokens");
balances[msg.sender] -= amount;
balances[to] += amount;
return true;
}
function approve(address spender, uint256 amount) public returns (bool) {
allowances[msg.sender][spender] = amount;
return true;
}
function transferFrom(address from, address to, uint256 amount) public returns (bool) {
require(balances[from] >= amount, "Not enough tokens");
require(allowances[from][msg.sender] >= amount, "Not approved for this amount");
balances[from] -= amount;
balances[to] += amount;
allowances[from][msg.sender] -= amount;
return true;
}
}
OutputSuccess
Important Notes
Always check balances before transferring tokens.
Approvals set spending limits, so be careful who you approve.
transferFrom requires prior approval to work.
Summary
transfer sends tokens directly to another address.
approve lets someone else spend tokens from your balance.
transferFrom moves tokens from one address to another using approval.
Practice
(1/5)
1. What is the main purpose of the approve function in a token contract?
easy
A. To allow another address to spend tokens on your behalf
B. To send tokens directly to another address
C. To check the balance of an address
D. To mint new tokens to an address
Solution
Step 1: Understand the role of approve
The approve function lets a token owner give permission to another address to spend tokens from their balance.
Step 2: Differentiate from other functions
transfer sends tokens directly, approve only sets allowance, so the spender can use transferFrom later.
Final Answer:
To allow another address to spend tokens on your behalf -> Option A
Quick Check:
approve = permission grant [OK]
Hint: Approve sets spending permission, transfer sends tokens [OK]
Common Mistakes:
Confusing approve with transfer
Thinking approve sends tokens immediately
Mixing approve with balance checking
2. Which of the following is the correct syntax to approve 100 tokens for spender address 0xABC... in Solidity?
easy
A. approve(100, 0xABC...);
B. approve(address spender, uint amount);
C. approve(0xABC..., 100);
D. approve(100);
Solution
Step 1: Recall approve function parameters
The approve function takes two parameters: the spender's address and the amount to approve.
Step 2: Match parameters order
The correct order is approve(address spender, uint amount), so calling approve(0xABC..., 100); is correct.
Final Answer:
approve(0xABC..., 100); -> Option C
Quick Check:
approve(spender, amount) syntax [OK]
Hint: approve(spender, amount) order matters [OK]
Common Mistakes:
Swapping parameters order
Using variable names instead of values
Calling approve with only one argument
3. Given the following Solidity code snippet, what will be the balance of recipient after execution?
B. transferFrom should be called by spender, not msg.sender
C. recipient address is missing
D. approve amount is less than transfer amount
Solution
Step 1: Check who calls transferFrom
transferFrom must be called by the spender who was approved, not the token owner (msg.sender here).
Step 2: Confirm approve and transferFrom roles
Owner calls approve, spender calls transferFrom to move tokens.
Final Answer:
transferFrom should be called by spender, not msg.sender -> Option B
Quick Check:
transferFrom caller = spender [OK]
Hint: transferFrom caller must be approved spender [OK]
Common Mistakes:
Calling transferFrom as token owner
Mixing approve and transferFrom order
Ignoring caller permissions
5. You want to allow a decentralized exchange (DEX) contract to spend exactly 200 tokens from your wallet, but only once. Which sequence of calls correctly implements this using the transfer and approve flow?
hard
A. Call approve(DEX, 200) once, then DEX calls transferFrom for 200 tokens
B. Call transfer(DEX, 200) directly, no approve needed
C. Call approve(DEX, 200) multiple times before each trade
D. Call transferFrom(DEX, yourAddress, 200) yourself
Solution
Step 1: Understand one-time spending permission
To let DEX spend tokens once, you approve exactly 200 tokens once.
Step 2: Let DEX transfer tokens
DEX uses transferFrom to move 200 tokens from your wallet to itself or others.
Final Answer:
Call approve(DEX, 200) once, then DEX calls transferFrom for 200 tokens -> Option A
Quick Check:
approve once, transferFrom once [OK]
Hint: Approve once, then let spender transferFrom once [OK]
Common Mistakes:
Transferring tokens directly without approval
Approving multiple times unnecessarily
Calling transferFrom as token owner
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.