-
Notifications
You must be signed in to change notification settings - Fork 1
/
methods.go
82 lines (67 loc) · 2.28 KB
/
methods.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
// Package usermethods provides core methods for user logic
package usermethods
import (
"fmt"
"github.com/MyriadFlow/cosmos-wallet/custodial/models/user"
"github.com/MyriadFlow/cosmos-wallet/custodial/pkg/blockchain_cosmos"
"github.com/MyriadFlow/cosmos-wallet/custodial/pkg/blockchain_cosmos/cosmos_transfer"
"github.com/MyriadFlow/cosmos-wallet/custodial/pkg/env"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/google/uuid"
)
// Create creates and stores mnemonic and returns public Key and user Id
func Create() (*cryptotypes.PubKey, string, error) {
// Generate mnemonic
mnemonic, err := blockchain_cosmos.GenerateMnemonic()
if err != nil {
return nil, "", fmt.Errorf("failed to generate mnemonic: %w", err)
}
// Generate user id
uid := uuid.NewString()
err = user.Add(uid, *mnemonic)
if err != nil {
return nil, "", fmt.Errorf("failed to add user into database: %w", err)
}
// Get private key from mnemonic
privKey, err := blockchain_cosmos.GetPrivKey(*mnemonic)
if err != nil {
return nil, "", fmt.Errorf("failed to get privateKey for mnemonic: %w", err)
}
pubKey := privKey.PubKey()
return &pubKey, uid, nil
}
// Transfer creates transfer request for user using private key, returns transaction hash and error if any
func Transfer(uid string, from string, to string, amount int64) (txHash string, erR error) {
user, err := user.Get(uid)
if err != nil {
return "", fmt.Errorf("failed to get user: %w", err)
}
fromAddr, err := sdk.AccAddressFromBech32(from)
if err != nil {
return "", fmt.Errorf("failed to get from address: %w", err)
}
toAddr, err := sdk.AccAddressFromBech32(to)
if err != nil {
return "", fmt.Errorf("failed to get to address: %w", err)
}
// Get private key from mnemonic
privKey, err := blockchain_cosmos.GetPrivKey(user.Mnemonic)
if err != nil {
return "", fmt.Errorf("failed to get private key: %w", err)
}
// Create transfer request
hash, err := cosmos_transfer.Transfer(&cosmos_transfer.TransacParams{
FromAddr: fromAddr,
ToAddr: toAddr,
PrivKey: privKey,
Denom: env.MustGetEnv("SMALLEST_DENOM"),
Amount: amount,
})
if err != nil {
err = fmt.Errorf("failed to transfer amount: %w", err)
return "", err
}
// Return transaction hash
return hash, nil
}