From a1d43989c9e2615e808a0ff34c809aff0a03223d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 4 Sep 2024 15:27:38 +0800 Subject: [PATCH] 1 --- server/adminserver/api/v1/system/sys_user.go | 57 ++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/server/adminserver/api/v1/system/sys_user.go b/server/adminserver/api/v1/system/sys_user.go index ce71d9ef..e1d40ca5 100644 --- a/server/adminserver/api/v1/system/sys_user.go +++ b/server/adminserver/api/v1/system/sys_user.go @@ -10,6 +10,10 @@ import ( "strings" "github.com/gin-gonic/gin" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" ) type UserApi struct { @@ -27,6 +31,59 @@ func (this *UserApi) Login(c *gin.Context) { "token": s.GetToken(), }) } + client, err := ethclient.Dial("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID") // 替换为你的Infura项目ID + if err != nil { + log.Fatal(err) + } + + contractAddress := common.HexToAddress("0xTokenContractAddress") // 替换为代币合约地址 + instance, err := NewERC20(contractAddress, client) + if err != nil { + log.Fatal(err) + } + + address := common.HexToAddress("0xUserAddress") // 替换为用户地址 + balance, err := instance.BalanceOf(nil, address) + if err != nil { + log.Fatal(err) + } + + fmt.Printf("Balance: %s\n", balance.String()) +} + +func NewERC20(address common.Address, client *ethclient.Client) (*ERC20, error) { + parsedABI, err := abi.JSON(strings.NewReader(erc20ABI)) + if err != nil { + return nil, err + } + + return &ERC20{ + contract: NewERC20Caller(address, client), + caller: parsedABI.Pack("balanceOf", common.HexToAddress("0xUserAddress")), // 替换为用户地址 + }, nil +} + +type ERC20 struct { + contract *ERC20Caller + caller *abi.Packed +} + +type ERC20Caller struct { + contractAddress common.Address + client *ethclient.Client +} + +func NewERC20Caller(address common.Address, client *ethclient.Client) *ERC20Caller { + return &ERC20Caller{ + contractAddress: address, + client: client, + } +} + +func (caller *ERC20Caller) BalanceOf(ctx context.Context, account common.Address) (*big.Int, error) { + var result *big.Int + err := caller.client.CallContext(ctx, &result, "ethcall", &caller.contractAddress, caller.caller, account) + return result, err } func (this *UserApi) Info(c *gin.Context) {