A system contract used to interact with smart contract.
<?php 
define("TRX_TO_SUN",'1000000');
define("SUN_TO_TRX", '0.000001');
include_once "../libraries/vendor/autoload.php";
include_once("html_iframe_header.php");
include_once("tron_utils.php");
//include all php files that generated by protoc
$dir   = new RecursiveDirectoryIterator('protobuf/core/');
$iter  = new RecursiveIteratorIterator($dir);
$files = new RegexIterator($iter, '/^.+\.php$/', RecursiveRegexIterator::GET_MATCH); // an Iterator, not an array
foreach ( $files as $file ) {
	
	if (is_array($file)) {
		foreach($file as $filename) {
			include $filename;
		}
	} else {
		include $file;
	}
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    try {
		
		$data = ltrim($_POST['data'], '0x');
		$ownerAddressHex = base58check2HexString($_POST['from']);
		$contractAddressHex = base58check2HexString($_POST['caddress']);
		
		$ownerAddressBin = hex2str($ownerAddressHex);
		$contractAddressBin = hex2str($contractAddressHex);
		
		$callValueInSun = bcmul($_POST['callvalue'], TRX_TO_SUN);
		$contract = new \Protocol\Transaction\Contract();
		$triggerSmartContract = new \Protocol\TriggerSmartContract();
		
		$triggerSmartContract->setData(hex2str($data));
		$triggerSmartContract->setOwnerAddress($ownerAddressBin);
		$triggerSmartContract->setContractAddress($contractAddressBin);
		$triggerSmartContract->setCallValue($callValueInSun);
		
		$any = new \Google\Protobuf\Any();
		$any->pack($triggerSmartContract);
		
		$contract->setParameter( $any );
		$contract->setType( \Protocol\Transaction\Contract\ContractType::TriggerSmartContract );
		
    ?>
	<div class="alert alert-success">
		<h6 class="mt-3">Contract Serialized Hex</h6>
		<textarea class="form-control" rows="5" id="comment" readonly><?php echo str2hex($contract->serializeToString());?></textarea>
		
		<h6 class="mt-3">Contract Serialized Json</h6>
		<textarea class="form-control" rows="5" id="comment" readonly><?php echo $contract->serializeToJsonString()?></textarea>
	</div>
<?php 
    } catch (Exception $e) {
        $errmsg .= "Problem found. " . $e->getMessage();
    }
} 
if ($errmsg) {
?>
    <div class="alert alert-danger">
        <strong>Error!</strong> <?php echo $errmsg?>
    </div>
<?php
}
?>
<form action='' method='post'>
    <div class="form-group">
        <label for="from">Owner Address:</label>
        <input class="form-control" type='text' name='from' id='from' value='<?php echo $_POST['from']?>'>
    </div>
	
	<div class="form-group">
        <label for="caddress">Contract Address:</label>
        <input class="form-control" type='text' name='caddress' id='caddress' value='<?php echo $_POST['caddress']?>'>
    </div>
	
	<div class="form-group">
		<label for="callvalue">Call Value:</label>
		
		<div class="input-group mb-3">
			<input class="form-control" type='text' name='callvalue' id='callvalue' value='<?php echo $_POST['callvalue']?>'>
			<div class="input-group-append">
			  <span class="input-group-text">TRX</span>
			</div>
		</div>
		
		<small>* Put 0 if you do not want to send any TRX to contract address.</small>
	</div>
	
	<div class="form-group">
        <label for="data">Encoded Data (Hex):</label>
        <input class="form-control" type='text' name='data' id='data' value='<?php echo $_POST['data']?>'>
		
		<small>* You can use <a href="https://www.btcschools.net/ethereum/eth_abi_data_encoding.php" target="_blank">ethereum abi encoding tool</a> to generate this data.</small>
    </div>
   
    <input type='submit' class="btn btn-success btn-block"/>
</form>
<?php
include_once("html_iframe_footer.php"); 		
	
message TriggerSmartContract {
	
  #The owner of the current account
  bytes owner_address = 1;
  
  #A contract address to interact
  bytes contract_address = 2;
  
  #TRX value
  int64 call_value = 3;
  
  #Encoded data includes contract function and its params
  bytes data = 4;
}
 		
	<?php
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: core/contract/smart_contract.proto
namespace Protocol;
use Google\Protobuf\Internal\GPBType;
use Google\Protobuf\Internal\RepeatedField;
use Google\Protobuf\Internal\GPBUtil;
/**
 * Generated from protobuf message <code>protocol.TriggerSmartContract</code>
 */
class TriggerSmartContract extends \Google\Protobuf\Internal\Message
{
    /**
     * Generated from protobuf field <code>bytes owner_address = 1;</code>
     */
    protected $owner_address = '';
    /**
     * Generated from protobuf field <code>bytes contract_address = 2;</code>
     */
    protected $contract_address = '';
    /**
     * Generated from protobuf field <code>int64 call_value = 3;</code>
     */
    protected $call_value = 0;
    /**
     * Generated from protobuf field <code>bytes data = 4;</code>
     */
    protected $data = '';
    /**
     * Generated from protobuf field <code>int64 call_token_value = 5;</code>
     */
    protected $call_token_value = 0;
    /**
     * Generated from protobuf field <code>int64 token_id = 6;</code>
     */
    protected $token_id = 0;
    /**
     * Constructor.
     *
     * @param array $data {
     *     Optional. Data for populating the Message object.
     *
     *     @type string $owner_address
     *     @type string $contract_address
     *     @type int|string $call_value
     *     @type string $data
     *     @type int|string $call_token_value
     *     @type int|string $token_id
     * }
     */
    public function __construct($data = NULL) {
        \GPBMetadata\Core\Contract\SmartContract::initOnce();
        parent::__construct($data);
    }
    /**
     * Generated from protobuf field <code>bytes owner_address = 1;</code>
     * @return string
     */
    public function getOwnerAddress()
    {
        return $this->owner_address;
    }
    /**
     * Generated from protobuf field <code>bytes owner_address = 1;</code>
     * @param string $var
     * @return $this
     */
    public function setOwnerAddress($var)
    {
        GPBUtil::checkString($var, False);
        $this->owner_address = $var;
        return $this;
    }
    /**
     * Generated from protobuf field <code>bytes contract_address = 2;</code>
     * @return string
     */
    public function getContractAddress()
    {
        return $this->contract_address;
    }
    /**
     * Generated from protobuf field <code>bytes contract_address = 2;</code>
     * @param string $var
     * @return $this
     */
    public function setContractAddress($var)
    {
        GPBUtil::checkString($var, False);
        $this->contract_address = $var;
        return $this;
    }
    /**
     * Generated from protobuf field <code>int64 call_value = 3;</code>
     * @return int|string
     */
    public function getCallValue()
    {
        return $this->call_value;
    }
    /**
     * Generated from protobuf field <code>int64 call_value = 3;</code>
     * @param int|string $var
     * @return $this
     */
    public function setCallValue($var)
    {
        GPBUtil::checkInt64($var);
        $this->call_value = $var;
        return $this;
    }
    /**
     * Generated from protobuf field <code>bytes data = 4;</code>
     * @return string
     */
    public function getData()
    {
        return $this->data;
    }
    /**
     * Generated from protobuf field <code>bytes data = 4;</code>
     * @param string $var
     * @return $this
     */
    public function setData($var)
    {
        GPBUtil::checkString($var, False);
        $this->data = $var;
        return $this;
    }
    /**
     * Generated from protobuf field <code>int64 call_token_value = 5;</code>
     * @return int|string
     */
    public function getCallTokenValue()
    {
        return $this->call_token_value;
    }
    /**
     * Generated from protobuf field <code>int64 call_token_value = 5;</code>
     * @param int|string $var
     * @return $this
     */
    public function setCallTokenValue($var)
    {
        GPBUtil::checkInt64($var);
        $this->call_token_value = $var;
        return $this;
    }
    /**
     * Generated from protobuf field <code>int64 token_id = 6;</code>
     * @return int|string
     */
    public function getTokenId()
    {
        return $this->token_id;
    }
    /**
     * Generated from protobuf field <code>int64 token_id = 6;</code>
     * @param int|string $var
     * @return $this
     */
    public function setTokenId($var)
    {
        GPBUtil::checkInt64($var);
        $this->token_id = $var;
        return $this;
    }
}