0
0
LldHow-ToBeginner ยท 4 min read

How to Design an ATM Machine: System Design Guide

To design an ATM machine, create components like User Interface, Authentication, Transaction Processing, and Bank Server. Use a secure request flow where the user inputs data, the ATM verifies identity, processes transactions, and updates the bank database securely.
๐Ÿ“

Syntax

The ATM system design includes these main parts:

  • User Interface: Accepts user input like card and PIN.
  • Authentication Module: Verifies user identity with PIN and card data.
  • Transaction Processor: Handles requests like withdrawal, deposit, balance check.
  • Bank Server: Stores account data and processes transaction requests.
  • Security Layer: Encrypts communication and protects sensitive data.
javascript
class ATM {
    constructor(bankServer) {
        this.bankServer = bankServer;
    }

    insertCard(card) {
        this.card = card;
    }

    enterPIN(pin) {
        return this.bankServer.verifyPIN(this.card, pin);
    }

    requestTransaction(type, amount) {
        return this.bankServer.processTransaction(this.card, type, amount);
    }
}
๐Ÿ’ป

Example

This example shows a simple ATM flow: user inserts card, enters PIN, and requests withdrawal.

javascript
class BankServer {
    constructor() {
        this.accounts = {
            '1234-5678': { pin: '4321', balance: 1000 }
        };
    }

    verifyPIN(card, pin) {
        const account = this.accounts[card];
        return account && account.pin === pin;
    }

    processTransaction(card, type, amount) {
        const account = this.accounts[card];
        if (!account) return 'Account not found';
        if (type === 'withdraw') {
            if (account.balance >= amount) {
                account.balance -= amount;
                return `Withdrawn $${amount}. New balance: $${account.balance}`;
            } else {
                return 'Insufficient funds';
            }
        } else if (type === 'balance') {
            return `Balance: $${account.balance}`;
        }
        return 'Invalid transaction type';
    }
}

class ATM {
    constructor(bankServer) {
        this.bankServer = bankServer;
    }

    insertCard(card) {
        this.card = card;
        console.log('Card inserted:', card);
    }

    enterPIN(pin) {
        if (this.bankServer.verifyPIN(this.card, pin)) {
            console.log('PIN verified');
            return true;
        } else {
            console.log('Invalid PIN');
            return false;
        }
    }

    requestTransaction(type, amount) {
        const result = this.bankServer.processTransaction(this.card, type, amount);
        console.log(result);
        return result;
    }
}

const bankServer = new BankServer();
const atm = new ATM(bankServer);
atm.insertCard('1234-5678');
if (atm.enterPIN('4321')) {
    atm.requestTransaction('withdraw', 200);
    atm.requestTransaction('balance');
}
Output
Card inserted: 1234-5678 PIN verified Withdrawn $200. New balance: $800 Balance: $800
โš ๏ธ

Common Pitfalls

Common mistakes when designing ATM systems include:

  • Not securing communication between ATM and bank server, risking data leaks.
  • Skipping proper authentication checks, allowing unauthorized access.
  • Failing to handle concurrent transactions, causing incorrect balances.
  • Ignoring error handling for network failures or invalid inputs.

Always encrypt data, validate inputs, and design for concurrency and fault tolerance.

javascript
/* Wrong: No PIN verification */
class ATM {
    requestTransaction(type, amount) {
        return this.bankServer.processTransaction(this.card, type, amount);
    }
}

/* Right: Verify PIN before transactions */
class ATM {
    enterPIN(pin) {
        this.authenticated = this.bankServer.verifyPIN(this.card, pin);
    }

    requestTransaction(type, amount) {
        if (!this.authenticated) {
            return 'Access denied';
        }
        return this.bankServer.processTransaction(this.card, type, amount);
    }
}
๐Ÿ“Š

Quick Reference

Key points to remember when designing an ATM machine:

  • Separate concerns: UI, authentication, transaction processing, and data storage.
  • Use secure communication protocols (e.g., TLS) between ATM and bank server.
  • Implement strong authentication with card and PIN verification.
  • Handle concurrency to avoid race conditions on account balances.
  • Design for fault tolerance and clear error messages.
โœ…

Key Takeaways

Design ATM with clear modules: UI, authentication, transaction processing, and bank server.
Always verify user identity before processing transactions.
Secure communication and data encryption are essential.
Handle concurrent transactions carefully to maintain correct balances.
Include error handling for network and input failures.