-
Notifications
You must be signed in to change notification settings - Fork 0
/
erc20.go
94 lines (73 loc) · 2.7 KB
/
erc20.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package util
import (
"math/big"
"github.com/ethereum/go-ethereum/common"
"golang.org/x/crypto/sha3"
)
// EvmContractMethodId encodes a method signature to the method id used in eth calldata.
func EvmContractMethodId(signature string) []byte {
transferFnSignature := []byte(signature)
hash := sha3.NewLegacyKeccak256()
hash.Write(transferFnSignature)
return hash.Sum(nil)[:4]
}
func BuildErc20ApproveCallData(spender common.Address, amount *big.Int) []byte {
methodId := EvmContractMethodId("approve(address,uint256)")
paddedAddress := common.LeftPadBytes(spender.Bytes(), 32)
paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedAddress...)
data = append(data, paddedAmount...)
return data
}
func BuildErc20TransferCallData(to common.Address, amount *big.Int) []byte {
methodId := EvmContractMethodId("transfer(address,uint256)")
paddedAddress := common.LeftPadBytes(to.Bytes(), 32)
paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedAddress...)
data = append(data, paddedAmount...)
return data
}
func BuildErc20TransferFromCallData(from common.Address, to common.Address, amount *big.Int) []byte {
methodId := EvmContractMethodId("transferFrom(address,address,uint256)")
paddedFrom := common.LeftPadBytes(from.Bytes(), 32)
paddedTo := common.LeftPadBytes(to.Bytes(), 32)
paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedFrom...)
data = append(data, paddedTo...)
data = append(data, paddedAmount...)
return data
}
func BuildErc20MintCallData(to common.Address, amount *big.Int) []byte {
methodId := EvmContractMethodId("mint(address,uint256)")
paddedAddress := common.LeftPadBytes(to.Bytes(), 32)
paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedAddress...)
data = append(data, paddedAmount...)
return data
}
func BuildErc20BurnCallData(from common.Address, amount *big.Int) []byte {
methodId := EvmContractMethodId("burn(address,uint256)")
paddedAddress := common.LeftPadBytes(from.Bytes(), 32)
paddedAmount := common.LeftPadBytes(amount.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedAddress...)
data = append(data, paddedAmount...)
return data
}
func BuildErc20BalanceOfCallData(address common.Address) []byte {
methodId := EvmContractMethodId("balanceOf(address)")
paddedAddress := common.LeftPadBytes(address.Bytes(), 32)
var data []byte
data = append(data, methodId...)
data = append(data, paddedAddress...)
return data
}