// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import { TacProxy } from "./TacProxy.sol"; import { TacHeaderV1, OutMessageV1 } from "../core/Structs.sol"; import { ICrossChainLayer } from "../interfaces/ICrossChainLayer.sol"; abstract contract TacProxyV1 is TacProxy { uint256 private constant TAC_HEADER_VERSION = 1; uint256 private constant TAC_OUT_MESSAGE_VERSION_1 = 1; ICrossChainLayer private immutable _crossChainLayer; constructor(address crossChainLayer) { _crossChainLayer = ICrossChainLayer(crossChainLayer); } modifier _onlyCrossChainLayer() { if (msg.sender != _getCrossChainLayerAddress()) { revert OnlyCrossChainLayer(); } _; } /** * @dev Get CrossChainLayer contract address. * @return CrossChainLayer contract address. */ function _getCrossChainLayerAddress() internal view returns (address) { return address(_crossChainLayer); } /** * @dev Gets the current min protocol fee. * @return uint256 Fee amount. */ function getProtocolFee() internal view returns (uint256) { return _crossChainLayer.getProtocolFee(); } /** * @dev Decode TacHeaderV1 data. * @param tacHeader encoded TacHeaderV1 data. * @return TacHeaderV1 struct. */ function _decodeTacHeader(bytes calldata tacHeader) internal pure returns (TacHeaderV1 memory) { return abi.decode(tacHeader, (TacHeaderV1)); } /** * @dev Send v1 message to TON * @param outMessage v1 message to TON * @param tacAmount Amount of TAC to send. */ function _sendMessageV1(OutMessageV1 memory outMessage, uint256 tacAmount) internal { _crossChainLayer.sendMessage{value: tacAmount}(TAC_OUT_MESSAGE_VERSION_1, abi.encode(outMessage)); } /** * @dev Get Tac Proxy contract version. * @return Contract version. */ function getVersion() public pure override returns (uint256) { return TAC_HEADER_VERSION; } /* All proxy functions must have the following signature: function (bytes calldata encodedTacHeader, bytes calldata arguments) external; */ }