简体   繁体   English

ERC-20 代币转移问题:执行恢复:ERC20:从零地址转移

[英]ERC-20 Token transfer problem: execution reverted: ERC20: transfer from the zero address

i ve been trying to learn stuff about smart contracts lately, but when i tried to understand how a token transfer works i ve encountered this problem.我最近一直在努力学习有关智能合约的知识,但是当我试图了解代币转移的工作原理时,我遇到了这个问题。 || || execution reverted: ERC20: transfer from the zero address ||执行恢复:ERC20:从零地址转移 || (ropsten network) (罗普森网络)

the code:编码:


import (
    "context"
    "crypto/ecdsa"
    "fmt"
    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/common/hexutil"
    "github.com/ethereum/go-ethereum/core/types"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
    "golang.org/x/crypto/sha3"
    "log"
    "math/big"
)

func main() {

    client, err := ethclient.Dial("https://ropsten.infura.io/v3")
    if err != nil {
        panic(err)
    }

    chainID, _ := client.NetworkID(context.Background())

    privateKey, err := crypto.HexToECDSA("280a5fb7d2eef8c7956f4e6754c82a46f30496e43f50be4c8a457ef4e45fb1f4")
    if err != nil {
        log.Fatal(err)
    }

    publicKey := privateKey.Public()
    publicKeyECDSA, ok :=publicKey.(*ecdsa.PublicKey)
    if !ok {
        log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
    }

    fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
    nonce, err := client.PendingNonceAt(context.Background(), fromAddress)

    if err != nil {
        log.Fatal(err)
    }

    value := big.NewInt(0)

    toAddress := common.HexToAddress("0x0cFd37C2A1c9d0B8833fFE5a772003a350B5Be3f")

    tokenAddress := common.HexToAddress("0x4f1c3F4D89826f27204769Af1617540c219E3A62")

    transferFnSignature := []byte("transfer(address,uint256)")
    hash := sha3.NewLegacyKeccak256()
    hash.Write(transferFnSignature)

    methodID := hash.Sum(nil)[:4]
    fmt.Println(hexutil.Encode(methodID))

    paddedAddress := common.LeftPadBytes(toAddress.Bytes(),32)
    fmt.Println(hexutil.Encode(paddedAddress))

    amount := new(big.Int)
    amount.SetString("10000000000000000000", 10)
    paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
    fmt.Println(hexutil.Encode(paddedAmount))

    var data []byte
    data = append(data, methodID...)
    data = append(data, paddedAddress...)
    data = append(data, paddedAmount...)

    gasLimit, err := client.EstimateGas(context.Background(), ethereum.CallMsg{
        To: &tokenAddress,
        Data: data,
    })
    if err != nil {
        log.Fatal(err)
    }
    gasPrice, err := client.SuggestGasPrice(context.Background())
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(gasLimit)

    tx := types.NewTx(&types.LegacyTx{
        Nonce:    nonce,
        GasPrice: gasPrice,
        Gas:      gasLimit,
        To:       &tokenAddress,
        Value:    value,
        Data:     data,
        V:        nil,
        R:        nil,
        S:        nil,
    })

    signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID),privateKey)
    if err != nil {
        log.Fatal(err)
    }

    err = client.SendTransaction(context.Background(), signedTx)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("TOKEN TX SENT! || %s ||", signedTx.Hash().Hex())


}

the token address is my contract address, the fromAddress is my wallet who is holding 10000 of my tokens, and the toAddress is a normal wallet.代币地址是我的合约地址,fromAddress 是我持有 10000 个代币的钱包,toAddress 是一个普通钱包。 what am i missing here?我在这里错过了什么?

Apparently the problem was with the gasLimit.显然问题出在gasLimit上。 changed the gasLimit to gasLimit := uint64(200000) and it worked.将 gasLimit 更改为gasLimit := uint64(200000)并且它起作用了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM