package com.table.transfer.module.enpty;

import lombok.Data;

import java.math.BigDecimal;

/**
 * 用于封装不同区块链（如 TRON、Ethereum、BNB Chain 等）的交易信息，
 * 将各异的原始 API 返回结构标准化，便于业务层统一处理。
 * 支持主币（TRX/ETH/BNB）和代币（USDT、USDC 等）转账的统一表示。
 */
@Data
public final class TransactionInfoDTO {

    /**
     * 交易哈希（Hash）
     * 区块链上交易的唯一标识符
     */
    private String hash;

    /**
     * 发送方地址
     * 资产转出的源地址
     */
    private String fromAddress;

    /**
     * 接收方地址
     * 资产转入的目标地址
     */
    private String toAddress;

    /**
     * 转账金额（主单位）
     * 已根据代币精度转换为人类可读单位，例如：
     * - 13.611877 USDT（非 13611877 Sun）
     * - 0.5 TRX / ETH / BNB
     */
    private BigDecimal amount;

    /**
     * 代币符号
     * 例如：TRX, ETH, BNB, USDT, USDC, BTC
     */
    private String symbol;

    /**
     * 代币类型
     * 取值包括：
     * - NATIVE：主币（如 TRX、ETH、BNB）
     * - ERC20：Ethereum 上的代币
     * - BEP20：BNB Chain 上的代币
     * - TRC20：TRON 上的代币
     * - SPL：Solana 代币（可扩展）
     */
    private String tokenType;

    /**
     * 代币合约地址
     * - 对于代币转账：填写代币的智能合约地址（如 USDT 合约）
     * - 对于主币转账：填写 null 或空字符串
     */
    private String contractAddress;

    /**
     * 交易时间戳（毫秒）
     * Unix 时间戳，单位为毫秒（例如：1758089232000）
     */
    private Long timestamp;

    /**
     * 区块链名称
     * 标识该交易所属的链，例如：
     * - tron
     * - ethereum
     * - bnb
     * - polygon
     * - arbitrum
     * - optimism
     */
    private String chain;

    /**
     * 交易状态
     * 取值：
     * - success：成功
     * - failed：失败
     * - pending：待确认
     * - reverted：已回滚
     */
    private String status;


    /**
     * 所在区块高度
     * 交易被打包的区块编号
     */
    private Long blockNumber;

    /**
     * 交易手续费（主单位）
     * 已转换为链的主币单位，例如：
     * - 0.0021 ETH
     * - 0.1 TRX
     * - 0.0003 BNB
     */
    private BigDecimal gasFee;


    /**
     * 代币精度（小数位数）
     * 例如：
     * - USDT/TRC20: 6
     * - TRX: 6
     * - BNB: 18
     * 用于金额转换和展示
     */
    private Integer decimals;

    /**
     * 调用的方法名（Function Name）
     * 例如：transfer, approve, swapExactTokensForTokens
     * 主要用于合约交互类交易
     */
    private String methodName;

    /**
     * 交易类型
     * 用于分类交易行为，例如：
     * - transfer：转账
     * - approve：授权
     * - swap：兑换
     * - mint：铸币
     * - burn：销毁
     */
    private String type;

}