This repository has been archived by the owner on Jun 8, 2023. It is now read-only.
/
selfpermit.go
74 lines (60 loc) 路 1.68 KB
/
selfpermit.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
package periphery
import (
_ "embed"
"encoding/json"
"errors"
"math/big"
"github.com/daoleno/uniswap-sdk-core/entities"
"github.com/ethereum/go-ethereum/accounts/abi"
)
//go:embed contracts/interfaces/ISelfPermit.sol/ISelfPermit.json
var selfpermitABI []byte
var (
ErrInvalidOptions = errors.New("invalid options")
)
type StandardPermitArguments struct {
V uint8
R [32]byte
S [32]byte
Amount *big.Int
Deadline *big.Int
}
type AllowedPermitArguments struct {
V uint8
R [32]byte
S [32]byte
Nonce *big.Int
Expiry *big.Int
}
type PermitOptions struct {
*StandardPermitArguments
*AllowedPermitArguments
}
func getSelfPermitABI() abi.ABI {
var wabi WrappedABI
err := json.Unmarshal(selfpermitABI, &wabi)
if err != nil {
panic(err)
}
return wabi.ABI
}
func EncodePermit(token *entities.Token, options *PermitOptions) ([]byte, error) {
if options == nil {
return nil, ErrInvalidOptions
}
if options.StandardPermitArguments != nil {
return EncodeStandardPermit(token, options.StandardPermitArguments)
}
if options.AllowedPermitArguments != nil {
return EncodeAllowedPermit(token, options.AllowedPermitArguments)
}
return nil, ErrInvalidOptions
}
func EncodeStandardPermit(token *entities.Token, options *StandardPermitArguments) ([]byte, error) {
abi := getSelfPermitABI()
return abi.Pack("selfPermit", token.Address, options.Amount, options.Deadline, options.V, options.R, options.S)
}
func EncodeAllowedPermit(token *entities.Token, options *AllowedPermitArguments) ([]byte, error) {
abi := getSelfPermitABI()
return abi.Pack("selfPermitAllowed", token.Address, options.Nonce, options.Expiry, options.V, options.R, options.S)
}