Autonomous Vehicle Payment System
What it does:
Automates payments for autonomous vehicles (rides, tolls, charging) based on usage, distance, or service agreements using smart contracts.
Why it matters:
Eliminates intermediaries, ensures timely and transparent payments, reduces disputes, and enables programmable mobility services.
How it works:
-
Vehicles or mobility services register with metadata, pricing, and service terms
-
Users initiate payments per ride, per km, or per service usage
-
Smart contract automatically releases payments to vehicle owners, charging stations, or service providers
-
Supports subscription-based rides, tolls, or charging plans
-
Integrates with AI Agent Payment Contract, Tokenized Wallets, or Play-to-Earn Reward Engine for mobility incentives
-
Dashboards display trip history, usage costs, and payment confirmations
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title AutonomousVehiclePayment
* @author Nam
* @notice Automates payments for autonomous vehicle services on-chain
*/
contract AutonomousVehiclePayment is Ownable {
struct Vehicle {
string name;
address payable owner;
uint256 pricePerKm; // in wei
bool active;
}
mapping(uint256 => Vehicle) public vehicles;
uint256 public vehicleCount;
// -------------------- EVENTS --------------------
event VehicleRegistered(uint256 indexed vehicleId, string name, address owner, uint256 pricePerKm);
event VehicleDeactivated(uint256 indexed vehicleId);
event PaymentMade(uint256 indexed vehicleId, address user, uint256 distance, uint256 amount);
// -------------------- VEHICLE MANAGEMENT --------------------
function registerVehicle(string calldata _name, uint256 _pricePerKm) external {
require(_pricePerKm > 0, "Price must be >0");
vehicleCount += 1;
vehicles[vehicleCount] = Vehicle({
name: _name,
owner: payable(msg.sender),
pricePerKm: _pricePerKm,
active: true
});
emit VehicleRegistered(vehicleCount, _name, msg.sender, _pricePerKm);
}
function deactivateVehicle(uint256 _vehicleId) external {
Vehicle storage v = vehicles[_vehicleId];
require(msg.sender == v.owner, "Not vehicle owner");
v.active = false;
emit VehicleDeactivated(_vehicleId);
}
// -------------------- PAYMENT MANAGEMENT --------------------
function payForRide(uint256 _vehicleId, uint256 _distanceInKm) external payable {
Vehicle storage v = vehicles[_vehicleId];
require(v.active, "Vehicle inactive");
uint256 totalAmount = v.pricePerKm * _distanceInKm;
require(msg.value == totalAmount, "Incorrect payment");
v.owner.transfer(msg.value);
emit PaymentMade(_vehicleId, msg.sender, _distanceInKm, msg.value);
}
// -------------------- VIEW FUNCTIONS --------------------
function isVehicleActive(uint256 _vehicleId) external view returns (bool) {
return vehicles[_vehicleId].active;
}
function getVehiclePrice(uint256 _vehicleId) external view returns (uint256) {
return vehicles[_vehicleId].pricePerKm;
}
}