Homework 3 – Decentralized KYC DApp
Truffle • Ganache • Console (MetaMask optional)

Deploy & Interact with a KYC Smart Contract

You will set up Truffle + Ganache, deploy KYC.sol, and interact through the Truffle console. Keep terminal screenshots as proof.

1. Set Up Your Development Environment

1.1 Install Node.js and npm

Download and install Node.js from nodejs.org. npm comes with Node.

1.2 Install Truffle and Ganache

npm install -g truffle
# Option A: Ganache GUI from trufflesuite.com/ganache
# Option B (CLI):
npm install -g ganache

2. Initialize a Truffle Project

mkdir my-project
cd my-project
truffle init

This creates contracts/, migrations/, test/, and config files.

3. Write Your KYC Smart Contract

3.1 Create contracts/KYC.sol (fixed/compilable)

The prompt version had minor typos (uinti, spacing). Use this corrected version to compile successfully.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract KYC {
    // Define Bank and Customer structs
    struct Bank {
        string name;
        address bankAddress;
    }

    struct Customer {
        string name;
        address customerAddress;
        bool isVerified;
    }

    // Mappings to store bank and customer data
    mapping(address => Bank) public banks;
    mapping(address => Customer) public customers;

    // Arrays to store the list of bank and customer addresses
    address[] public bankList;
    address[] public customerList;

    // Events
    event BankAdded(string name, address bankAddress);
    event CustomerAdded(string name, address customerAddress);
    event CustomerVerified(address customerAddress);

    // Function to add a new bank
    function addNewBank(string memory name, address bankAddress) public {
        require(bankAddress != address(0), "Invalid address");
        require(bytes(name).length > 0, "Bank name cannot be empty");
        banks[bankAddress] = Bank(name, bankAddress);
        bankList.push(bankAddress);
        emit BankAdded(name, bankAddress);
    }

    // Function to add a new customer
    function addNewCustomer(string memory name, address customerAddress) public {
        require(customerAddress != address(0), "Invalid address");
        require(bytes(name).length > 0, "Customer name cannot be empty");
        customers[customerAddress] = Customer(name, customerAddress, false);
        customerList.push(customerAddress);
        emit CustomerAdded(name, customerAddress);
    }

    // Function to verify a customer
    function verifyCustomer(address customerAddress) public {
        require(customerAddress != address(0), "Invalid address");
        require(customers[customerAddress].customerAddress != address(0), "Customer does not exist");
        customers[customerAddress].isVerified = true;
        emit CustomerVerified(customerAddress);
    }

    // Function to retrieve all banks
    function getBanks() public view returns (Bank[] memory) {
        Bank[] memory allBanks = new Bank[](bankList.length);
        for (uint i = 0; i < bankList.length; i++) {
            allBanks[i] = banks[bankList[i]];
        }
        return allBanks;
    }

    // Function to retrieve all customers
    function getCustomers() public view returns (Customer[] memory) {
        Customer[] memory allCustomers = new Customer[](customerList.length);
        for (uint i = 0; i < customerList.length; i++) {
            allCustomers[i] = customers[customerList[i]];
        }
        return allCustomers;
    }
}

3.2 Compile Your Contract

truffle compile

4. Migrate Your Smart Contract

4.1 Create Migration Script

// migrations/2_deploy_contracts.js
const KYC = artifacts.require("KYC");

module.exports = function (deployer) {
  deployer.deploy(KYC);
};

4.2 Run Migrations

Start Ganache (GUI quickstart or npx ganache). In another terminal:

truffle migrate --network development

5. Interact Using the Truffle Console

5.1 Start Ganache

Open Ganache and start a workspace (RPC usually http://127.0.0.1:7545).

5.2 Open Truffle Console

truffle console --network development

5.3 Run the Following in the Console

const KYC = artifacts.require("KYC");
const kyc = await KYC.deployed();
const accounts = await web3.eth.getAccounts();

// Add new banks
await kyc.addNewBank("Bank1", accounts[1]);
await kyc.addNewBank("Bank2", accounts[2]);

// Add new customers
await kyc.addNewCustomer("Customer1", accounts[3]);
await kyc.addNewCustomer("Customer2", accounts[4]);

// Verify a customer
await kyc.verifyCustomer(accounts[3]);

// Retrieve and log banks and customers
const banks = await kyc.getBanks();
console.log("Banks:", banks);

const customers = await kyc.getCustomers();
console.log("Customers:", customers);

Appendix 1 – Contract Explanation (from prompt)

This KYC (Know Your Customer) smart contract is designed to manage KYC processes on Ethereum. Highlights:

Key Components

  1. StructsBank (name, kyc count, address, permissions) and Customer (name, data, validating bank, kyc status).
  2. Mappingsbanks maps address→Bank; customersInfo maps username→Customer.

Functions

Note: The minimal KYC.sol used in this HW implements a simpler subset so you can practice deployment and function calls quickly.

Troubleshooting

Submission Checklist

Name your file: HW3_FirstnameLastname.pdf with screenshots in order.