> For the complete documentation index, see [llms.txt](https://docs-sdk.crypto-chief.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs-sdk.crypto-chief.com/processing/php/guides/contract-calls.md).

# Contract calls (EVM / TRON)

Call EVM, TRON, and Solana contracts in PHP without hand-encoding calldata.

Most real-world transactions are smart-contract calls. You never encode the `data` field by hand: give the SDK a typed description and get back a signed reservation.

{% hint style="warning" %}
Contract-type transactions (`signEvmCall`, `erc20Transfer`, `signTronCall`, `signAnchorCall` — every helper in this guide signs `type=contract`) are covered by the same [execute-time pre-flight](/processing/php/guides/sign-execute.md): a wallet without enough native coin for gas gets `PREFLIGHT_FAILED` instead of an on-chain revert or a silent gas burn. On TRON, the call is additionally simulated, so a reverting call (including an insufficient token balance) is rejected as `simulation_reverted` before any fee is spent.
{% endhint %}

## EVM — by Solidity signature

{% hint style="danger" %}
This snippet shows the **encoder**, not a complete swap. Two things have to be true before a swap like this succeeds on chain:

* **An allowance.** Uniswap's router moves your input token with `transferFrom`, so it needs an ERC-20 `approve(address,uint256)` on that token first, confirmed before the swap is signed — the nonce comes from chain state. Without it the swap reverts and burns the gas.
* **A slippage floor.** `amountOutMin` of `0` accepts whatever the pool returns, which on a public mempool hands the trade to the first sandwich bot that sees it. Pass a real minimum, in the output token's base units.
  {% endhint %}

```php
use CryptoChief\Processing\Amount;
use CryptoChief\Processing\Chain;
use CryptoChief\Processing\Dto\EvmCallRequest;

$amountIn = Amount::humanToBase('0.01', 18);
$deadline = time() + 600;

$signed = $client->transactions()->signEvmCall(new EvmCallRequest(
    network:     Chain::EthMainnet->value,
    fromAddress: '0xYourWallet...',
    contract:    '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D',  // Uniswap V2 router
    method:      'swapExactTokensForTokens(uint256,uint256,address[],address,uint256)',
    args:        [$amountIn, '0', [$tokenIn, $tokenOut], '0xYou...', $deadline],
    urlCallback: 'https://your.app/webhooks/transaction',
));
```

The encoder supports `uint/int<M>`, `address`, `bool`, `bytes`, `bytes<N>`, `string`, and fixed/dynamic arrays of those. Argument values accept `int`, decimal/hex strings, raw bytes, and PHP arrays.

## ERC-20 / TRC-20 transfer (one-liner)

```php
use CryptoChief\Processing\Amount;
use CryptoChief\Processing\Dto\Erc20TransferRequest;

$amount = Amount::humanToBase('12.5', 6);  // USDT has 6 decimals

$client->transactions()->erc20Transfer(new Erc20TransferRequest(
    network:       Chain::EthMainnet->value,
    fromAddress:   '0xYourWallet...',
    tokenContract: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
    recipient:     '0xRecipient...',
    amount:        $amount,
));
```

## TRON — same encoder, base58 addresses

`signTronCall` (an alias of `signEvmCall`) accepts both base58 (`T...`) and `0x41`-prefixed hex addresses:

```php
$client->transactions()->signTronCall(new EvmCallRequest(
    network:     Chain::TronMainnet->value,
    fromAddress: 'TYourWallet...',
    contract:    'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',  // USDT TRC-20
    method:      'transfer(address,uint256)',
    args:        ['TRecipient...', $amount],
));
```

## Solana — Anchor program

```php
use CryptoChief\Processing\Contract\Borsh;
use CryptoChief\Processing\Dto\AnchorCallRequest;
use CryptoChief\Processing\Dto\SolanaAccount;

$signed = $client->transactions()->signAnchorCall(new AnchorCallRequest(
    network:     Chain::SolanaMainnet->value,
    fromAddress: 'YourWallet...',
    program:     'YourProgramId...',
    method:      'initialize',
    args: [
        Borsh::u64(1_000_000),
        Borsh::string('hello'),
    ],
    accounts: [
        new SolanaAccount(pubkey: 'YourWallet...', isSigner: true, isWritable: true),
    ],
));
```

For TON contracts, see [TON transfers](/processing/php/guides/ton.md).
