Skip to main content
TAC proxy functions receive their parameters as ABI-encoded bytes. This guide shows the encoding patterns for different data structure complexities.
All proxy functions must follow the signature function name(bytes calldata tacHeader, bytes calldata arguments). The arguments parameter contains your custom ABI-encoded data.

Simple Parameters

Parameters without structure:
address tokenFrom;
address tokenTo;
uint256 amount;
Frontend encoding example using ethers:
import { ethers } from "ethers";
const abiCoder = ethers.AbiCoder.defaultAbiCoder();

const myProxyFunctionArguments = abiCoder.encode(
    ['address', 'address', 'uint256'],
    [tokenFromAddress, tokenToAddress, tokenFromAmount]
);
And the associated decoding example in Solidity:
(address tokenFromAddress, address tokenToAddress, uint256 tokenFromAmount) =
    abi.decode(arguments, (address, address, uint256));

Advanced Parameters

Parameters in structs containing other structs:
struct AnyExtraInfo {
    address feeCollector;
    uint256 feeRate;
}

struct MyProxyFunctionArguments {
    AnyExtraInfo extraInfo;
    address tokenFrom;
    address tokenTo;
    uint256 amount;
}
Frontend encoding example using ethers:
const extraInfo = [feeCollectorAddress, feeRate];
const myProxyFunctionArguments = abiCoder.encode(
    ["tuple(tuple(address,uint256),address,address,uint256)"],
    [[extraInfo, tokenFromAddress, tokenToAddress, tokenAmount]]
);
And the associated decoding example in Solidity:
MyProxyFunctionArguments memory args =
    abi.decode(arguments, (MyProxyFunctionArguments));

TAC SDK Integration

When using the TAC SDK to create messages for bridging, you must provide:
  • target: the address of your Proxy contract
  • method_name: the complete function signature, e.g. "myProxyFunction(bytes,bytes)"
  • arguments: the ABI-encoded arguments (second parameter in your proxy function)
  • gasLimit (optional): the parameter that will be passed to the TAC side. The executor must allocate at least gasLimit gas for executing the transaction on the TAC side. If this parameter is not specified, it will be calculated using the simulateEVMMessage method (preferred)
Example:
const myProxyFunctionName = "myProxyFunction(bytes,bytes)";

const userMessage = {
  target: MyProxyContractAddress,
  method_name: myProxyFunctionName,
  arguments: myProxyFunctionArguments, // from the previous encoding step
  gasLimit?: // optional
};

What’s Next?

Still have questions after reading the Advanced Custom Proxy guide? Check out the comprehensive documentation to find the answers you need.

Custom Proxy

Developer documentation within @tonappchain/evm-ccl NPM-package
You can also reach out to our developer community in Telegram or Discord.