Vivian
0
Q:

solidity code for electricity trading transaction programming

pragma solidity ^0.5.10;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";import "@hq20/contracts/contracts/access/Whitelist.sol";/** * @title Energy Market * @notice Implements a simple energy market, using ERC20 and  * Whitelist. ERC20 is used to enable payments from the consumers to * the distribution network, represented by this contract, and from * the distribution network to the producers. Whitelist is used to * keep a list of compliant smart meters that communicate the * production and consumption of energy. */contract EnergyMarket is ERC20, Whitelist {  event EnergyProduced(address producer, uint256 time);  event EnergyConsumed(address consumer, uint256 time);  // uint128 is used here to facilitate the price formula  // Casting between uint128 and int256 never overflows  // int256(uint128) - int256(uint128) never overflows  mapping(uint256 => uint128) public consumption;  mapping(uint256 => uint128) public production;  uint128 public basePrice;  /**   * @dev The constructor initializes the underlying currency token   * and the smart meter whitelist. The constructor also mints the   * requested amount of the underlying currency token to fund the   * network load. Also sets the base energy price, used for    * calculating prices.   */  constructor (uint256 _initialSupply, uint128 _basePrice)    public    ERC20()    Whitelist()  {    _mint(address(this), _initialSupply);    basePrice = _basePrice;  }  /**   * @dev The production price for each time slot.   */  function getProductionPrice(uint256 _time)    public    view    returns(uint256)  {    return uint256(      max(        0,        int256(basePrice) *          (3 + safeSub(production[_time], consumption[_time]))      )    );  }  /**   * @dev The consumption price for each time slot   */  function getConsumptionPrice(uint256 _time)    public    view    returns(uint256)  {    return uint256(      max(        0,        int256(basePrice) *          (3 + safeSub(consumption[_time], production[_time]))      )    );  }  /**   * @dev Add one energy unit to the distribution network at the   * specified time and be paid the production price. Only   * whitelisted smart meters can call this function.   */  function produce(uint256 _time)    public  {    require(isMember(msg.sender), "Unknown meter.");    this.transfer(      msg.sender,      getProductionPrice(_time)    );    production[_time] = production[_time] + 1;    emit EnergyProduced(msg.sender, _time);  }  /**   * @dev Take one energy unit from the distribution network at the   * specified time by paying the consumption price. Only   * whitelisted smart meters can call this function.   */  function consume(uint256 _time)    public  {    require(isMember(msg.sender), "Unknown meter.");    this.transferFrom(      msg.sender,      address(this),      getConsumptionPrice(_time)    );    consumption[_time] = consumption[_time] + 1;    emit EnergyConsumed(msg.sender, _time);  }  /**   * @dev Returns the largest of two numbers.   */  function max(int256 a, int256 b)    internal    pure    returns(int256)  {    return a >= b ? a : b;  }  /**   * @dev Substracts b from a using types safely casting from   * uint128 to int256.   */  function safeSub(uint128 a, uint128 b)    internal    pure    returns(int256)  {    return int256(a) - int256(b);  }}
0

New to Communities?

Join the community