Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 54 additions & 14 deletions contracts/src/DeviceRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,21 @@ contract DeviceRegistry {
mapping(address => DeviceInfo) public devices;
mapping(string => address) public deviceIdToAddress;
address[] public registeredDevices;

event DeviceRegistered(
address indexed deviceAddress,
string deviceId,
string publicKey,
address indexed registeredBy
);

event DeviceUpdated(
address indexed deviceAddress,
string deviceId,
bool isActive
);

event DeviceDeactivated(
address indexed deviceAddress,
string deviceId
);

event DeviceDeactivated(address indexed deviceAddress, string deviceId);
function registerDevice(
address _deviceAddress,
string memory _publicKey,
Expand All @@ -51,8 +48,14 @@ contract DeviceRegistry {
require(bytes(_publicKey).length > 0, "Public key required");
require(bytes(_deviceId).length > 0, "Device ID required");
require(bytes(_cameraId).length > 0, "Camera ID required");
require(devices[_deviceAddress].deviceAddress == address(0), "Device already registered");
require(deviceIdToAddress[_deviceId] == address(0), "Device ID already in use");
require(
devices[_deviceAddress].deviceAddress == address(0),
"Device already registered"
);
require(
deviceIdToAddress[_deviceId] == address(0),
"Device ID already in use"
);

DeviceInfo memory newDevice = DeviceInfo({
deviceAddress: _deviceAddress,
Expand All @@ -70,7 +73,12 @@ contract DeviceRegistry {
deviceIdToAddress[_deviceId] = _deviceAddress;
registeredDevices.push(_deviceAddress);

emit DeviceRegistered(_deviceAddress, _deviceId, _publicKey, msg.sender);
emit DeviceRegistered(
_deviceAddress,
_deviceId,
_publicKey,
msg.sender
);
}

function updateDevice(
Expand Down Expand Up @@ -104,15 +112,21 @@ contract DeviceRegistry {
emit DeviceDeactivated(_deviceAddress, device.deviceId);
}

function getDevice(address _deviceAddress) external view returns (DeviceInfo memory) {
function getDevice(
address _deviceAddress
) external view returns (DeviceInfo memory) {
return devices[_deviceAddress];
}

function getDeviceByDeviceId(string memory _deviceId) external view returns (address) {
function getDeviceByDeviceId(
string memory _deviceId
) external view returns (address) {
return deviceIdToAddress[_deviceId];
}

function isDeviceActive(address _deviceAddress) external view returns (bool) {
function isDeviceActive(
address _deviceAddress
) external view returns (bool) {
DeviceInfo memory device = devices[_deviceAddress];
return device.deviceAddress != address(0) && device.isActive;
}
Expand All @@ -124,5 +138,31 @@ contract DeviceRegistry {
function getAllDevices() external view returns (address[] memory) {
return registeredDevices;
}
}

/**
* @dev Returns a paginated list of registered devices to avoid gas limit issues.
* @param cursor The starting index (0-indexed).
* @param count The number of device addresses to return.
*/
function getDevicesPaginated(
uint256 cursor,
uint256 count
) external view returns (address[] memory) {
uint256 total = registeredDevices.length;
if (cursor >= total || count == 0) {
return new address[](0);
}

uint256 length = count;
if (cursor + count > total) {
length = total - cursor;
}

address[] memory devicesList = new address[](length);
for (uint256 i = 0; i < length; i++) {
devicesList[i] = registeredDevices[cursor + i];
}

return devicesList;
}
}