pragma solidity ^0.4.25; contract Sign { struct SignStruct { // address user; uint index; } struct DocStruct { address owner; mapping (address => SignStruct) signStructs; address[] signIndex; uint index; } uint private _docId; mapping (bytes32 => DocStruct) private docStructs; bytes32[] private docIndex; event LogNewDoc (bytes32 indexed docId, uint index, address owner); event LogUpdateDoc(bytes32 indexed docId, uint index, address owner); event LogDeleteDoc(bytes32 indexed docId, uint index); event LogDocSigning(bytes32 indexed docId, address signBy, uint signCount); // register doc baru, returnnya docId (id dari document yg siap di sign) // smart contract mencatat yg memanggil fungsi ini sebagai pemilik document function newDoc() external returns(bytes32 docId) { docId = keccak256(abi.encodePacked(_docId++)); docStructs[docId].owner=msg.sender; docStructs[docId].index = docIndex.push(docId)-1; emit LogNewDoc(docId, docStructs[docId].index, docStructs[docId].owner); return docId; } // ngecek apakan document terdaftar function isDoc(bytes32 docId) public constant returns(bool isIndeed) { if (docIndex.length == 0) return false; return (docIndex[docStructs[docId].index] == docId); } // menghapus document function deleteDoc(bytes32 docId) external returns(uint index) { require(isDoc(docId) && (docStructs[docId].owner == msg.sender)); uint rowToDelete = docStructs[docId].index; bytes32 keyToMove = docIndex[docIndex.length-1]; docIndex[rowToDelete] = keyToMove; docStructs[keyToMove].index = rowToDelete; docIndex.length--; emit LogDeleteDoc(docId, rowToDelete); if (docIndex.length > 0) { emit LogUpdateDoc(keyToMove, rowToDelete, docStructs[keyToMove].owner); } return rowToDelete; } // mendapatkan informasi pemilik dan index document function getDoc(bytes32 docId) external constant returns(address owner, uint index) { require(isDoc(docId)); return(docStructs[docId].owner, docStructs[docId].index); } // mengganti kepemilikan dokumen, yg boleh memanggil fungsi ini, hanya pemilik saat ini function changeOwner(bytes32 docId, address newOwner) external returns(bool success) { require(isDoc(docId) && (docStructs[docId].owner == msg.sender)); docStructs[docId].owner = newOwner; emit LogUpdateDoc(docId, docStructs[docId].index, docStructs[docId].owner); return true; } // ngecek jumlah dockumen yg siap di sign function getDoctCount() external constant returns(uint count) { return docIndex.length; } // ngecek apakah sebuah document sudah saya sign function isDocSigned(bytes32 docId) public constant returns(bool isIndeed) { require((docIndex.length > 0) && (docIndex[docStructs[docId].index] == docId)); uint _signIndex = docStructs[docId].signStructs[msg.sender].index; return (docStructs[docId].signIndex.length > 0) && (docStructs[docId].signIndex[_signIndex] == msg.sender); } // ngecek apakah sebuah document sudah di sign oleh user tertentu, yg bisa manggil ini hanya pemilik dokumen function isDocSigned(bytes32 docId, address byUser) public constant returns(bool isIndeed) { require((docIndex.length > 0) && (docIndex[docStructs[docId].index] == docId)); uint _signIndex = docStructs[docId].signStructs[byUser].index; return (docStructs[docId].signIndex.length > 0) && (docStructs[docId].signIndex[_signIndex] == byUser); } // nge-sign document function signDoc(bytes32 docId) external returns(uint signCount) { require(isDoc(docId) && !isDocSigned(docId)); docStructs[docId].signStructs[msg.sender].index=docStructs[docId].signIndex.push(msg.sender)-1; emit LogDocSigning(docId, msg.sender, docStructs[docId].signIndex.length); return docStructs[docId].signIndex.length; } // ngecek jumlah user yg sudah nge-sign sebuah document function getSignCount(bytes32 docId) external constant returns(uint count){ require(isDoc(docId)); return docStructs[docId].signIndex.length; } }
0.4.25