Transfer and approve flow in Blockchain / Solidity - Time & Space Complexity
When working with blockchain token transfers, it is important to understand how the time taken grows as more operations happen.
We want to know how the transfer and approval steps affect execution time as the number of users or transactions increases.
Analyze the time complexity of the following code snippet.
function approve(spender, amount) {
allowances[msg.sender][spender] = amount;
return true;
}
function transferFrom(sender, recipient, amount) {
require(allowances[sender][msg.sender] >= amount);
balances[sender] -= amount;
balances[recipient] += amount;
allowances[sender][msg.sender] -= amount;
return true;
}
This code allows a user to approve another to spend tokens and then transfer tokens on their behalf.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Direct access and update of mappings (hash tables) for balances and allowances.
- How many times: Each function runs a fixed number of steps without loops or recursion.
Each approve or transferFrom call does a fixed set of steps regardless of how many users or tokens exist.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 5 steps |
| 100 | About 5 steps |
| 1000 | About 5 steps |
Pattern observation: The number of operations stays the same no matter how many users or tokens there are.
Time Complexity: O(1)
This means the time to approve or transfer tokens does not grow with the number of users or tokens; it stays constant.
[X] Wrong: "Approving or transferring tokens takes longer as more users or tokens exist."
[OK] Correct: Each operation accesses only specific entries in mappings, so the steps do not increase with more users or tokens.
Understanding that blockchain token transfers and approvals run in constant time helps you explain efficiency in smart contracts clearly and confidently.
"What if the transferFrom function included a loop to check multiple recipients? How would the time complexity change?"
Practice
approve function in a token contract?Solution
Step 1: Understand the role of
Theapproveapprovefunction lets a token owner give permission to another address to spend tokens from their balance.Step 2: Differentiate from other functions
transfersends tokens directly,approveonly sets allowance, so the spender can usetransferFromlater.Final Answer:
To allow another address to spend tokens on your behalf -> Option AQuick Check:
approve= permission grant [OK]
- Confusing approve with transfer
- Thinking approve sends tokens immediately
- Mixing approve with balance checking
0xABC... in Solidity?Solution
Step 1: Recall
Theapprovefunction parametersapprovefunction takes two parameters: the spender's address and the amount to approve.Step 2: Match parameters order
The correct order isapprove(address spender, uint amount), so callingapprove(0xABC..., 100);is correct.Final Answer:
approve(0xABC..., 100); -> Option CQuick Check:
approve(spender, amount) syntax [OK]
- Swapping parameters order
- Using variable names instead of values
- Calling approve with only one argument
recipient after execution?address owner = msg.sender; address spender = 0x123...; uint amount = 50; // Owner approves spender approve(spender, amount); // Spender transfers tokens from owner to recipient transferFrom(owner, recipient, 30);
Solution
Step 1: Understand approve and transferFrom interaction
The owner approves spender to spend 50 tokens. Then spender transfers 30 tokens to recipient.Step 2: Calculate recipient balance after transferFrom
Since spender transfers 30 tokens, recipient's balance increases by 30 tokens.Final Answer:
30 tokens -> Option DQuick Check:
transferFrom moves approved amount [OK]
- Assuming full approved amount is transferred
- Confusing approve amount with transfer amount
- Ignoring transferFrom effect on recipient balance
approve(spender, 100); transferFrom(msg.sender, recipient, 50);
Solution
Step 1: Check who calls transferFrom
transferFrommust be called by the spender who was approved, not the token owner (msg.senderhere).Step 2: Confirm approve and transferFrom roles
Owner callsapprove, spender callstransferFromto move tokens.Final Answer:
transferFrom should be called by spender, not msg.sender -> Option BQuick Check:
transferFrom caller = spender [OK]
- Calling transferFrom as token owner
- Mixing approve and transferFrom order
- Ignoring caller permissions
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 usestransferFromto move 200 tokens from your wallet to itself or others.Final Answer:
Callapprove(DEX, 200)once, then DEX callstransferFromfor 200 tokens -> Option AQuick Check:
approve once, transferFrom once [OK]
- Transferring tokens directly without approval
- Approving multiple times unnecessarily
- Calling transferFrom as token owner
Ready to prove it?
Pass the test and this pattern moves unknown
