//Write your own contracts here. Currently compiles using solc v0.4.15+commit.bbb8e64f. pragma solidity ^0.4.24; contract AssetTracker { struct Asset { string name; string description; string manufacturer; uint uuid; uint indexInArray; bool initialized; } mapping(uint => Asset) private idToAssetMap; mapping(address => mapping(uint => bool)) private addressToIdToIsOwnedMap; mapping(address => Asset[]) private assetsOfAddress; mapping(uint => address) private assetIdToManufacturer; event AssetCreate(address account, uint uuid, string manufacturer); event RejectCreate(address account, uint uuid, string message); event AssetTransfer(address from, address to, uint uuid); event RejectTransfer(address from, address to, uint uuid, string message); event RecallIssued(int uuid, string name, string description); function createAsset(string name, string description, uint uuid, string manufacturer) public { if(idToAssetMap[uuid].initialized) { emit RejectCreate(msg.sender, uuid, "Asset with this UUID already exists."); return; } assetIdToManufacturer[uuid] = msg.sender; Asset[] storage assetsOfSender = assetsOfAddress[msg.sender]; uint assetIndex = assetsOfSender.length; Asset memory newAsset = Asset(name, description, manufacturer, uuid, assetIndex, true); assetsOfSender.push(newAsset); idToAssetMap[uuid] = newAsset; addressToIdToIsOwnedMap[msg.sender][uuid] = true; emit AssetCreate(msg.sender, uuid, manufacturer); } function transferAsset(address to, uint uuid) public { //TODO trigger automatically when location changes if(!idToAssetMap[uuid].initialized) { emit RejectTransfer(msg.sender, to, uuid, "No asset with this UUID exists"); return; } if(!addressToIdToIsOwnedMap[msg.sender][uuid]) { emit RejectTransfer(msg.sender, to, uuid, "Sender does not own this asset."); return; } addressToIdToIsOwnedMap[msg.sender][uuid] = false; addressToIdToIsOwnedMap[to][uuid] = true; Asset[] storage assetsOfSender = assetsOfAddress[msg.sender]; Asset[] storage assetsOfReceiver = assetsOfAddress[to]; Asset storage transferedAsset = idToAssetMap[uuid]; assetsOfSender[transferedAsset.indexInArray] = assetsOfSender[assetsOfSender.length-1]; //swap last element to fill gap in array assetsOfSender[transferedAsset.indexInArray].indexInArray = transferedAsset.indexInArray; assetsOfSender.length--; transferedAsset.indexInArray = assetsOfReceiver.length; assetsOfReceiver.push(transferedAsset); emit AssetTransfer(msg.sender, to, uuid); } function getAsset(uint id) public constant returns (string, string, string, bool) { Asset storage foundAsset = idToAssetMap[id]; return (foundAsset.name, foundAsset.description, foundAsset.manufacturer, foundAsset.initialized); } function getAssetsOfAddress(address owner) public constant returns (uint[]) { Asset[] storage assetsArray = assetsOfAddress[owner]; uint[] memory result = new uint[](assetsArray.length); for (uint i = 0; i < assetsArray.length; i++) { result[i] = assetsArray[i].uuid; } return result; } }
0.4.24