package main

import (
    "encoding/json" // 导入 JSON 编码/解码包
    "fmt"           // 导入 fmt 包用于格式化输出
    "io"            // 导入 io 包用于读取响应体
    "log"           // 导入 log 包用于记录日志
    "math"
    "net/http" // 导入 http 包用于发起 HTTP 请求
    "net/url"  // 导入 url 包用于构建请求的 URL
    "strconv"

    "github.com/dromara/carbon/v2"
)

// 定义 TokenTransfer 结构体用于解析每个转账记录
type TokenTransfer struct {
    TransactionID   string                 `json:"transaction_id"`   // 交易 ID
    Status          int                    `json:"status"`           // 状态
    BlockTS         int64                  `json:"block_ts"`         // 区块时间戳
    FromAddress     string                 `json:"from_address"`     // 发送者地址
    FromAddressTag  map[string]interface{} `json:"from_address_tag"` // 发送者标签
    ToAddress       string                 `json:"to_address"`       // 接收者地址
    ToAddressTag    map[string]interface{} `json:"to_address_tag"`   // 接收者标签
    Block           int                    `json:"block"`            // 区块号
    ContractAddress string                 `json:"contract_address"` // 合约地址
    Quant           string                 `json:"quant"`            // 转账数量
    Confirmed       bool                   `json:"confirmed"`        // 是否确认
    ContractRet     string                 `json:"contractRet"`      // 合约返回
    FinalResult     string                 `json:"finalResult"`      // 最终结果
    Revert          bool                   `json:"revert"`           // 是否回滚
    TokenInfo       struct {
        TokenID      string `json:"tokenId"`      // 代币 ID
        TokenAbbr    string `json:"tokenAbbr"`    // 代币符号
        TokenName    string `json:"tokenName"`    // 代币名称
        TokenDecimal int    `json:"tokenDecimal"` // 代币小数位数
        TokenCanShow int    `json:"tokenCanShow"` // 是否可显示
        TokenType    string `json:"tokenType"`    // 代币类型
        TokenLogo    string `json:"tokenLogo"`    // 代币 Logo
        TokenLevel   string `json:"tokenLevel"`   // 代币级别
        IssuerAddr   string `json:"issuerAddr"`   // 代币发行地址
        Vip          bool   `json:"vip"`          // 是否 VIP
    } `json:"tokenInfo"` // 代币信息
    ContractType          string `json:"contract_type"`         // 合约类型
    FromAddressIsContract bool   `json:"fromAddressIsContract"` // 发送者是否为合约
    ToAddressIsContract   bool   `json:"toAddressIsContract"`   // 接收者是否为合约
    RiskTransaction       bool   `json:"riskTransaction"`       // 是否为风险交易
}

// 定义 ApiResponse 结构体用于解析整个 API 响应
type ApiResponse struct {
    Total          int             `json:"total"`           // 总转账数量
    RangeTotal     int             `json:"rangeTotal"`      // 范围内的转账数量
    TokenTransfers []TokenTransfer `json:"token_transfers"` // 转账记录数组
}
// 传入钱包地址
func GetTransactions(toAddress string) {
    // 获取当前时间戳(毫秒)
    endTime := carbon.Now().TimestampMilli()

    // 计算24小时前的时间戳(毫秒)
    startTime := carbon.Now().AddHours(-24).TimestampMilli()

    // 构建请求的 URL 参数
    // API地址【trc20链的API地址】
    baseURL := "https://apilist.tronscan.org/api/token_trc20/transfers"
    params := url.Values{}
    // 要查询的钱包地址
    params.Add("toAddress", toAddress)
    params.Add("limit", "1") // 修改 limit 参数为 2,获取两条转账记录
    params.Add("confirm", "true")
    params.Add("start_timestamp", fmt.Sprintf("%d", startTime))
    params.Add("end_timestamp", fmt.Sprintf("%d", endTime))
    params.Add("contract_address", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t")

    // 使用 url 拼接完整的 URL
    finalURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())

    // 发起 GET 请求
    resp, err := http.Get(finalURL)
    if err != nil { // 如果请求失败,打印错误并退出
        log.Fatalf("Error fetching data: %v", err)
    }
    defer resp.Body.Close() // 确保请求结束后关闭响应体

    // 读取响应数据
    body, err := io.ReadAll(resp.Body)
    if err != nil { // 如果读取响应失败,打印错误并退出
        log.Fatalf("Error reading response body: %v", err)
    }

    // 解析 JSON 响应到 ApiResponse 结构体
    var response ApiResponse
    err = json.Unmarshal(body, &response)
    if err != nil { // 如果 JSON 解析失败,打印错误并退出
        log.Fatalf("Error unmarshalling JSON: %v", err)
    }

    // 打印总转账数量
    // fmt.Printf("Total transfers: %d\n", response.Total)

    // 如果有转账记录,遍历打印每条转账记录的关键信息
    for _, transfer := range response.TokenTransfers {
        if transfer.FinalResult == "SUCCESS" {
            fmt.Printf("代币:%s\n", transfer.TokenInfo.TokenAbbr)
            fmt.Printf("交易哈希值:%s\n", transfer.TransactionID)
            // 确保输出格式正确,保留2位小数
            fmt.Println("金额:", formatAmount(transfer.Quant))
            fmt.Println("付款地址:", transfer.FromAddress)
            fmt.Println("收款地址:", transfer.ToAddress)
            fmt.Println("交易结果", transfer.FinalResult)

        }
    }
}

func main() {

    GetTransactions("TXFchkPBXBkHGifcUdQdErhBzP5T6kRfyv")

}

// formatAmount 格式化金额为指定的小数位数,返回浮动数值(保留2位小数)
func formatAmount(quant string) float64 {
    // 直接将字符串转为 float64 类型
    amount, err := strconv.ParseFloat(quant, 64)
    if err != nil {
        log.Printf("Error parsing amount: %v", err)
        return 0 // 如果转换失败,返回 0
    }

    // 使用 1e6 计算金额,转换为 float64 类型
    amountFloat := amount / 1e6 // 使用 1e6 来处理精度

    // 保留小数点后2位
    amountFloat = math.Round(amountFloat*100) / 100

    return amountFloat
}

返回结果:
*[Running] go run "/Users/niu/Documents/gotmp/main.go"
代币:USDT
交易哈希值:85ac0db152617533339119bde3970e7967cdb8c86a63ecf6e8b7ed07432526ab
金额: 25
付款地址: THSiKT3wwZKGcR4WuJ5m3fdTvw2siEgBo5
收款地址: TXFchkPBXBkHGifcUdQdErhBzP5T6kRfyv
交易结果 SUCCESS*

每日更新-免费小火箭账号
不要错过任何机会,探索最新的应用和游戏,就在我们的平台。
立即访问
最后修改:2025 年 03 月 01 日
如果觉得我的文章对你有用,请随意赞赏