Пост

Деплоим Tron смарт-контракт на PHP

Деплоим Tron смарт-контракт на PHP

Ранее мы уже успели немного поработать с TRC-10 смарт-контрактами, когда активировали адрес. Продолжим дальше работать с сетью Shasta и попробуем повзаимодействовать с TRC-20 смарт-контрактом USDT (TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs).

1
2
3
4
5
6
7
8
$fullNode = new \IEXBase\TronAPI\Provider\HttpProvider(
    'https://api.shasta.trongrid.io'
);
$solidityNode = new \IEXBase\TronAPI\Provider\HttpProvider(
    'https://api.shasta.trongrid.io'
);

$tron = new \IEXBase\TronAPI\Tron($fullNode, $solidityNode);

Где взять TRC-20 в тестнете Shasta? У Tron-а есть свой официальный discord. Там в канале #faucet-test-coins можно через бота получить себе немного TRX и USDT.

Создание объекта

Для взаимодействия со смарт-контрактом из PHP нужно создать объект контракта, передав адрес:

1
$contract = $tron->contract('TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs');  

Метод contract() подходит только для работы с TRC-20 контрактами

Чтение данных из контракта

Можно повызывать стандартные методы из интерфейса TRC-20 для получения информации о токене:

1
2
echo "Name: {$contract->name()}\n"; // Name: TetherToken
echo "Symbol: {$contract->symbol()}\n"; // Symbol: USDT

Или всю информацию в виде массива:

1
2
3
4
5
6
7
8
print_r($contract->array());
// Array
//(
//    [name] => TetherToken
//    [symbol] => USDT
//    [decimals] => 6
//    [totalSupply] => 10000000000.000000
//)

Получить свой баланс:

1
2
3
$balance = $contract->balanceOf('TRcaRU8eLxUsnj2htorxZGncT9ZB4xYxQr');
echo "Balance is $balance USDT\n"; 
// Balance is 5000.000000 USDT

Баланс вернется сразу в виде decimal числа. Все эти вызовы были чтением контракта (данных из блокчейна) и поэтому не требовали создания и подписи транзакции. Теперь попробуем отправить немного токенов с одного адреса на другой.

Отправка токенов

Для отправки токенов с одного адреса на другой используется TRC-20 метод transfer():

1
2
3
4
5
6
$result = $contract->transfer('TY5vve1fL4odqFmVwB4pwCJsiy8jfGJaFe', '5');
if (!$result['result']) {
    echo 'Error: ' . $result['message'] . PHP_EOL;
} else {
    echo 'Transaction hash: ' . $result['txid'] . PHP_EOL;
}

Обычно для вызова метода transfer() смарт-контракт USDT TRC-20 хватает feeLimit в 10 TRX. Но если вдруг вызов смарт-контракта фейлится по причине Out of Energy, то можно вручную установить этот лимит:

1
$contract->setFeeLimit(20); // 20 TRX

Библиотека внутри сразу создает, подписывает и бродкастит транзакцию. В результате мы получаем хэш и саму подписанную транзакцию.