Santhosh Reddy
Santhosh Reddy


Santhosh Reddy

A smart contract for a Smart City Government (Solidity)

A smart contract for a Smart City Government (Solidity)

Santhosh Reddy's photo
Santhosh Reddy
ยทFeb 10, 2022ยท

4 min read

Play this article

๐Ÿ‘‹ Hello world! This is Santhosh Reddy and I'm back again with a solidity smart contract project. The theme of the smart contract is, A Smart City Government and Administration.


This smart contract created with Solidity is a sample that depicts how the government administration can work in a more transparent and secure way using a futuristic technology - Blockchain.

Reading the smart contract code helps new blockchain learners as this covers all the important concepts like structs, mappings, events, enums, modifiers, functions, payable functions etc...

Here is the solidity code of the smart contract...


Now, I'm going to explain the functionalities of this smart contract and how it was built. Let's start...

Mayor and aadharAdmin

Mayor is the main administrator of the city, whereas the aadharAdmin is a character who has the responsibility of managing the citizens data (CRUD). These two characters are declared with a public addressees.

Structs & Mappings

The main data objects are Citizens and Activities. Citizens is like a database of people in the city and is created by mapping struct person (name, age, tax due) with address keys.

Activities are the data of activities initiated by the Mayor to govern & develop the city and is created by mapping struct activity (title, description, funds required, upvotes, downvotes, voters list, current status & time) with uint8 key.


The enum activityStatus has the elements - pending, approved & failed. The status in struct activity is created with this enum and will be updated in required functions.


The 3 events created in this contract are taxPayed(address name, uint8 amount) which emits when a citizen pays an amount of tax, voted(string activityTitle, address citizen) which emits when a citizen votes and activity and activityProposedOrApproved(uint8 id) which emits when an activity is either proposed by the Mayor or approved under certain conditions.


The restricting modifiers used in the contract are, onlyMayor which restricts some functions only to the Mayor of the city, onlyAadharAdmin which restricts few functions only to the aadharAdmin, onlyCitizen which restricts some specific functions only to the people living in the city.

The other two modifiers are toVote which modifies the voting function of the citizens to prevent the duplication of votes and approved which checks the conditions to be met for making an activity approved and modifies the funds receiving function of the Mayor.

As per my knowledge, there is no much difference between using modifier() for a function and using require() directly a function, even in terms of gas fee.

The function revert() is used to throw an error message, when something failed.


Let's discuss the functions in the smart contract separately for each character.

The functions of an aadharAdmin are, addCitizen which adds a citizen to the citizens' data in the contract, readCitizen which reads the data of every citizen by giving the citizen's address and removeCitizen which deletes a citizen from the citizens' data. All these functions are restricted to aadharAdmin.

The functions of the Mayor are, imposeTax which increments the tax due of the specified citizen address by the specified tax amount, proposeActivity which proposes an activity by adding the data (title, description, funds) to the activities data in the contract and the last function is getFunds which checks the required conditions to be met and transfers the ethers to the Mayor's wallet and sets the status of activity to approved if the conditions are met.

The conditions are a minimum of 24 hours (886400 sec) should be given as the voting time to the citizens and the main condition is that upvotes should be more than the downvotes. If the 24 hours is crossed and if the downvotes are more than upvotes, the status of the activity sets to failed.

The functions of Citizens are, payTax which pays the specified amount (=<tax due) to the government (here it's the smart contract), voteActivity which allows the citizen to vote a specified activity and a specified vote (boolean) and the last function is myDetails which shows the details of that citizen.

Payable functions

The only payable function is payTax which will be called by citizens to pay the tax amount to the smart contract using call(). The other function getFunds which isn't technically payable but transfers ethers from the smart contract to the Mayor using transfer() under certain conditions.

Public Functions & Variables

The public function in the smart contract which can be called by anyone is getActivities which returns the details of the specified activity.

The public variables are population population of the city, totalTaxTxs total number of tax transactions made till date, totalActivities total number of activities proposed till date and treasury the available funds of the government (smart contract balance).


Finally, smart-city-gov.sol is ready! This is my solidity smart contract project created to increase my experience and expertise around blockchain development.

If any blockchain expert or who is good at blockchain is reading this, I want to hear a small judgement from your side in the comments section and comment section is open to report bugs in the code.

If any blockchain learner reading this article, I hope reading this code helps you understand the smart contract coding.

Thanks for reading and for now, taking a leave!

๐Ÿ‘‹ Bye...!

Share this