forked from block-vision/sui-go-sdk
/
signer.go
51 lines (44 loc) · 1.12 KB
/
signer.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
package signer
import (
"crypto/ed25519"
"encoding/hex"
"github.com/fluidity-money/sui-go-sdk/common/keypair"
"github.com/tyler-smith/go-bip39"
"golang.org/x/crypto/blake2b"
)
const (
SigntureFlagEd25519 = 0x0
SigntureFlagSecp256k1 = 0x1
AddressLength = 64
DerivationPathEd25519 = `m/44'/784'/0'/0'/0'`
DerivationPathSecp256k1 = `m/54'/784'/0'/0/0`
)
type Signer struct {
PriKey ed25519.PrivateKey
PubKey ed25519.PublicKey
Address string
}
func NewSigner(seed []byte) *Signer {
priKey := ed25519.NewKeyFromSeed(seed[:])
pubKey := priKey.Public().(ed25519.PublicKey)
tmp := []byte{byte(keypair.Ed25519Flag)}
tmp = append(tmp, pubKey...)
addrBytes := blake2b.Sum256(tmp)
addr := "0x" + hex.EncodeToString(addrBytes[:])[:AddressLength]
return &Signer{
PriKey: priKey,
PubKey: pubKey,
Address: addr,
}
}
func NewSignertWithMnemonic(mnemonic string) (*Signer, error) {
seed, err := bip39.NewSeedWithErrorChecking(mnemonic, "")
if err != nil {
return nil, err
}
key, err := DeriveForPath("m/44'/784'/0'/0'/0'", seed)
if err != nil {
return nil, err
}
return NewSigner(key.Key), nil
}