Aj007 SmartContract (Aj007 coin)

Ethereum based Aj007 Smart Contract


pragma solidity 0.4.24;

contract admined{
	address public admin;

	constructor() public {
		admin = msg.sender;
	}
	
	modifier onlyAdmin() { 
		if(msg.sender != admin) revert();
		_;
	}

	function transferAdminship (address newAdmin) onlyAdmin public{
		admin = newAdmin;
	}
}

contract Aj007Base{

	mapping (address => uint256) public balanceOf;
	// allowing others to execute transactions on your behalf
	mapping (address => mapping ( address => uint256)) public allowance;
	
	// balanceOf[address] = 5;
	string public standard = "Aj007 v1.0";
	string public name;
	string public symbol;
	uint8 public decimal; // 1.23 Number of decimal
	uint256 public totalSupply;
	//indexed address passsed will be stored in log memory and not contract data
	event Transfer(address indexed from, address indexed to, uint256 _value);

	constructor (uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits) public{
		balanceOf[msg.sender] = initialSupply;
		totalSupply = initialSupply;
		decimal = decimalUnits;
		name = tokenName;
		symbol = tokenSymbol;

	} 

	function transfer (address _to,uint256 _value) public{
		if(balanceOf[msg.sender] < _value) revert();
		//0-255 8 bit
		// 250,10 = 4 Buffer overflow
		if(balanceOf[_to] + _value < balanceOf [_to]) revert();
		// Any number of conditions can be added here
		balanceOf[msg.sender] -= _value;
		balanceOf[_to] += _value;
		// Can be used for debugging values of smart contract and also act as an event for other clients
		// Technically a logging method
		emit Transfer(msg.sender,_to,_value);
	}

	function approve (address _spender, uint256 _value) public returns(bool res){
		allowance[msg.sender][_spender] = _value;
		return true;
	}
	
	function transferFrom (address _from, address _to, uint256 _value) public returns(bool res){
		if(balanceOf[_from] < _value) revert();
		if(balanceOf[_to] + _value < balanceOf[_to]) revert();
		if(_value > allowance[_from][msg.sender]) revert();

		balanceOf[_from] -= _value;
		balanceOf[_to] += _value;

		allowance[_from][msg.sender] -= _value;

		emit Transfer(_from,_to, _value);
		return true;
	}
	
}

contract Aj007 is admined, Aj007Base{

	uint256 public minimumBalanceForAccounts = 5 finney;
	uint256 public sellPrice;
	uint256 public buyPrice;
	mapping (address => bool) public frozenAccount;

	event FrozenFund(address target, bool frozenStatus);
	

	constructor (uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits, address centralAdmin) Aj007Base(0,tokenName,tokenSymbol,decimalUnits) public{
		totalSupply = initialSupply;
		if(centralAdmin != 0)
			admin = centralAdmin;
		else
			admin = msg.sender;
		balanceOf[admin]=initialSupply;
		totalSupply = initialSupply;	
	}

	function mintToken (address target, uint256 mintedAmount) onlyAdmin public returns(bool res) {
		balanceOf[target]+= mintedAmount;
		totalSupply += mintedAmount;
		// Notify the total amount is increased
		emit Transfer(0, this, mintedAmount);
		// Notify that the token is added to the given account
		emit Transfer(this, target, mintedAmount);
		return true;
	}

	function freezeAccount (address target, bool freeze) onlyAdmin public{
		frozenAccount[target] = freeze;
		emit FrozenFund(target, freeze);
	}
	
	function transfer (address _to,uint256 _value) public{
		if(msg.sender.balance < minimumBalanceForAccounts){
			//Ensures minimum balance is maintained in account. 
			//If ether amount goes to 0 the transaction cannot be processed further.
			sell((minimumBalanceForAccounts - msg.sender.balance)/sellPrice);
		}
		if(frozenAccount[msg.sender]) revert();
		if(balanceOf[msg.sender] < _value) revert();
		//0-255 8 bit
		// 250,10 = 4 Buffer overflow
		if(balanceOf[_to] + _value < balanceOf [_to]) revert();
		// Any number of conditions can be added here
		balanceOf[msg.sender] -= _value;
		balanceOf[_to] += _value;
		// Can be used for debugging values of smart contract and also act as an event for other clients
		// Technically a logging method
		emit Transfer(msg.sender,_to,_value);
	}

	// Ensure admin frozen accounts wont be able to transfer any coins anywhere
	function transferFrom (address _from, address _to, uint256 _value) public returns(bool res){
		if(frozenAccount[_from]) revert();
		if(balanceOf[_from] < _value) revert();
		if(balanceOf[_to] + _value < balanceOf[_to]) revert();
		if(_value > allowance[_from][msg.sender]) revert();

		balanceOf[_from] -= _value;
		balanceOf[_to] += _value;

		allowance[_from][msg.sender] -= _value;

		emit Transfer(_from,_to, _value);
		return true;
	}

	function setPrices (uint256 newSellPrice, uint256 newBuyPrice) onlyAdmin public returns(bool res){
		sellPrice = newSellPrice;
		buyPrice = newBuyPrice;
		return true;
	}
	
	//Sent Ether's contract gives the buyer tokens (For messageSender who wants to get the token)
	function buy () public payable{
		// convert to wei
		uint256 amount = (msg.value/(1 ether)) / buyPrice;
		// check if smart contract itself has those any coins to transfer
		if(balanceOf[this] < amount) revert();
		balanceOf[msg.sender] += amount;
		balanceOf[this] -= amount;
		emit Transfer(this, msg.sender, amount);
	}
	
	function sell (uint256 amount) public{
		
		// Check if the sender himself has those many tokens
		if (balanceOf[msg.sender] < amount) revert();
		balanceOf[this] += amount;
		// change coin balance of sender
		balanceOf[msg.sender] -= amount;
		if(!msg.sender.send(amount * sellPrice * 1 ether)){
			// revert() will revert all the changes which have been done above
			revert();
		}
		else{
			// Aj007 coin function to receive the coins back to the contract
			emit Transfer(msg.sender, this, amount);			
		}
	}
	
	// Function to have block rewards for mining
	function giveBlockreward () private {
		balanceOf[block.coinbase] += 1;
	}

	// Add the currentChallenge and set difficulty for the blockChain
	bytes32 public currentChallenge;
	uint public timeOfLastProof;
	uint public difficulty = 10**32;

	function proofOfWork (uint nonce) public{
		bytes32 n = keccak256(abi.encodePacked(nonce, currentChallenge));

		// revert() Exception as difficulty alsways has to be greater than the previous 
		if(n < bytes8(difficulty)) revert();

		uint timeSinceLastBlock = (now - timeOfLastProof);
		if(timeSinceLastBlock < 5 seconds) revert();

		// Reward given for every 1 minute here
		balanceOf[msg.sender] += timeSinceLastBlock / 60 seconds;

		//Ensures average mining time is 10 minutes
		difficulty = difficulty * 10 minutes / timeOfLastProof * 1;
		timeOfLastProof = now;

		currentChallenge = keccak256(abi.encodePacked(nonce, currentChallenge,blockhash(block.number-1)));
	}	
}

Ethereum Token/Coin (Aj007)

Ethereum Coin Aj007

Solidity Smart Contract


pragma solidity 0.4.8;
contract Aj007{

	mapping (address => uint256) public balanceOf;
	// allowing others to execute transactions on your behalf
	mapping (address => mapping (address => uint256)) public allowance;
	
	// balanceOf[address] = 5;
	string public standard = "Aj007 v1.0";
	string public name;
	string public symbol;
	uint8 public decimal; // 1.23 Number of decimal
	uint256 public totalSupply;
	//indexed address passsed will be stored in log memory and not contract data
	event Transfer(address indexed from, address indexed to, uint256 _value);

	function  Aj007 (uint256 initialSupply, string tokenName, string tokenSymbol, uint8 decimalUnits){
		balanceOf[msg.sender] = initialSupply;
		totalSupply = initialSupply;
		decimal = decimalUnits;
		name = tokenName;
		symbol = tokenSymbol;

	} 

	function transfer (address _to,uint256 _value){
		if(balanceOf[msg.sender] < _value) throw;
		//0-255 8 bit
		// 250,10 = 4 Buffer overflow
		if(balanceOf[_to] + _value < balanceOf [_to]) throw;
		// Any number of conditions can be added here
		balanceOf[msg.sender] -= _value;
		balanceOf[_to] += _value;
		// Can be used for debugging values of smart contract and also act as an event for other clients
		// Technically a logging method
		Transfer(msg.sender,_to,_value);
	}

	function approve (address _spender, uint256 _value) returns(bool res){
		allowance[msg.sender][_spender] = _value;
		return true;
	}
	
	function transferFrom (address _from, address _to, uint256 _value) returns(bool res){
		if(balanceOf[_from] < _value) throw;
		if(balanceOf[_to] + _value < balanceOf[_to]) throw; if(_value > allowance[_from][msg.sender]) throw;

		balanceOf[_from] -= _value;
		balanceOf[_to] += _value;

		allowance[_from][msg.sender] -= _value;

		Transfer(_from,_to, _value);
		return true;
	}
	
}

Deploy Smart Contract in Ethereum Consortium

This can be done in many ways.

One of the ways is to use the Ethereum Remix IDE

Ethereum Remix IDE: https://remix.ethereum.org/

Remix will auto compile the code if you have selected “Auto Compile” else click on  to compile you code. Now we will deploy this smart contract in Ethereum Consortium Blockchain, which we had created.

Deploy smart contracts on azure ethereum consortium blockchain

To deploy smart contract, we will use Remix only. In remix browser click on “Run” tab, which is located on top right side of screen

From “Environment” drop down select “Web3 Provider”. It will show a pop up like shown below.

Click on OK. Now you need to provide “Web3 Provider Endpoint” for you Ethereum blockchain network. It is the “ethereum-rpc-endpoint”  value which we had saved from Azure portal as part of step1. Paste this value in popup window and click on “OK”.

Now It will show you some values in “Account” dropdown, which was earlier blank. Now we have connected remix IDE with in Ethereum Consortium Blockchain. Lets deploy smart contract. Click on “Create”


Ethereum or Mist Wallet

You can also make use of the Ethereum or mist wallet from your local system and connect to the transactionn node on the remote azure consortium deployment.

Command:

./ethereumwallet --rpc --rpcapi="db,eth,net,web3,personal,web3" ethereum admin side from Consortium deployment

./mist --rpc --rpcapi="db,eth,net,web3,personal,web3" ethereum admin side from Consortium deployment

Eg:./ethereumwallet --rpc --rpcapi="db,eth,net,web3,personal,web3" http://a3uc7l-dns-reg1.eastus.cloudapp.azure.com:8545

The Ethereum/Mist wallet would provide with more convinient UI and access to the remote Transaction node and would facilitate easy deployment of the Smart Contract.

Reference: https://blogs.msdn.microsoft.com/reenusaluja/2018/03/12/deploy-your-first-smart-contract-on-azure-ethereum-consortium-blockchain/