Logistics Performance Incentive

What it does:
Rewards logistics providers, carriers, or warehouse operators for meeting efficiency, timeliness, and reliability metrics using smart contracts.

Why it matters:
Encourages faster deliveries, reduces errors, promotes accountability, and ensures transparent, auditable incentive payments.

How it works:

  • Logistics providers register on-chain and are assigned KPIs or targets

  • Performance data (delivery times, accuracy, condition compliance) is logged via IoT or authorized participants

  • Smart contracts calculate incentives based on predefined rules

  • Rewards are automatically distributed as tokens or payments to qualifying providers

  • Historical performance is recorded for auditing and reputation scoring

  • Integrates with Supply Chain Traceability, Cold Chain Monitoring, and Inventory Management

  • Dashboards display performance metrics, rewards, and rankings

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

import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title LogisticsPerformanceIncentive
 * @author Nam
 * @notice Rewards logistics providers based on performance metrics tracked on-chain
 */
contract LogisticsPerformanceIncentive is Ownable {

    struct Provider {
        string name;
        bool registered;
        uint256 totalRewards;
    }

    struct PerformanceEvent {
        uint256 timestamp;
        string description;
        uint256 score; // e.g., 0-100
        address reporter;
    }

    mapping(address => Provider) public providers;
    mapping(address => PerformanceEvent[]) public performanceEvents;

    mapping(address => bool) public authorizedReporters;

    // -------------------- EVENTS --------------------

    event ProviderRegistered(address provider, string name);
    event PerformanceLogged(address provider, uint256 score, string description, address reporter);
    event RewardDistributed(address provider, uint256 amount);
    event ReporterApproved(address reporter);

    // -------------------- REPORTER MANAGEMENT --------------------

    function approveReporter(address _reporter) external onlyOwner {
        authorizedReporters[_reporter] = true;
        emit ReporterApproved(_reporter);
    }

    function revokeReporter(address _reporter) external onlyOwner {
        authorizedReporters[_reporter] = false;
    }

    modifier onlyReporter() {
        require(authorizedReporters[msg.sender], "Not an authorized reporter");
        _;
    }

    // -------------------- PROVIDER MANAGEMENT --------------------

    function registerProvider(address _provider, string calldata _name) external onlyOwner {
        require(!providers[_provider].registered, "Provider already registered");
        providers[_provider] = Provider({
            name: _name,
            registered: true,
            totalRewards: 0
        });

        emit ProviderRegistered(_provider, _name);
    }

    // -------------------- PERFORMANCE LOGGING --------------------

    function logPerformance(address _provider, uint256 _score, string calldata _description) external onlyReporter {
        require(providers[_provider].registered, "Provider not registered");

        performanceEvents[_provider].push(PerformanceEvent({
            timestamp: block.timestamp,
            description: _description,
            score: _score,
            reporter: msg.sender
        }));

        emit PerformanceLogged(_provider, _score, _description, msg.sender);
    }

    // -------------------- REWARD DISTRIBUTION --------------------

    function distributeReward(address _provider, uint256 _amount) external onlyOwner {
        require(providers[_provider].registered, "Provider not registered");
        providers[_provider].totalRewards += _amount;

        payable(_provider).transfer(_amount);
        emit RewardDistributed(_provider, _amount);
    }

    // -------------------- VIEW FUNCTIONS --------------------

    function getPerformanceEvents(address _provider) external view returns (PerformanceEvent[] memory) {
        return performanceEvents[_provider];
    }

    function getTotalRewards(address _provider) external view returns (uint256) {
        return providers[_provider].totalRewards;
    }

    // -------------------- FUNDING --------------------

    receive() external payable {}
}