@@ -5,39 +5,56 @@ import (
5
5
"errors"
6
6
"flag"
7
7
"fmt"
8
-
9
- "github.com/gnolang/gno/gnovm/pkg/packages"
10
- "github.com/gnolang/gno/tm2/pkg/crypto"
8
+ "os"
11
9
12
10
"github.com/gnolang/gno/gno.land/pkg/gnoland"
13
11
"github.com/gnolang/gno/gno.land/pkg/gnoland/ugnot"
12
+ "github.com/gnolang/gno/gnovm/pkg/packages"
14
13
"github.com/gnolang/gno/tm2/pkg/bft/types"
15
14
"github.com/gnolang/gno/tm2/pkg/commands"
15
+ "github.com/gnolang/gno/tm2/pkg/crypto/keys"
16
16
"github.com/gnolang/gno/tm2/pkg/std"
17
17
)
18
18
19
- var (
20
- errInvalidPackageDir = errors .New ("invalid package directory" )
21
- errInvalidDeployerAddr = errors .New ("invalid deployer address" )
19
+ const (
20
+ defaultAccount_Name = "test1"
21
+ defaultAccount_Address = "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"
22
+ defaultAccount_Seed = "source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast"
23
+ defaultAccount_publicKey = "gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0skzdkmzu0r9h6gny6eg8c9dc303xrrudee6z4he4y7cs5rnjwmyf40yaj"
22
24
)
23
25
26
+ var errInvalidPackageDir = errors .New ("invalid package directory" )
27
+
24
28
// Keep in sync with gno.land/cmd/start.go
25
- var (
26
- defaultCreator = crypto .MustAddressFromString ("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5" ) // test1
27
- genesisDeployFee = std .NewFee (50000 , std .MustParseCoin (ugnot .ValueString (1000000 )))
28
- )
29
+ var genesisDeployFee = std .NewFee (50000 , std .MustParseCoin (ugnot .ValueString (1000000 )))
29
30
30
31
type addPkgCfg struct {
31
- txsCfg * txsCfg
32
- deployerAddress string
32
+ txsCfg * txsCfg
33
+ keyName string
34
+ gnoHome string // default GNOHOME env var, just here to ease testing with parallel tests
35
+ insecurePasswordStdin bool
33
36
}
34
37
35
38
func (c * addPkgCfg ) RegisterFlags (fs * flag.FlagSet ) {
36
39
fs .StringVar (
37
- & c .deployerAddress ,
38
- "deployer-address" ,
39
- defaultCreator .String (),
40
- "the address that will be used to deploy the package" ,
40
+ & c .keyName ,
41
+ "key-name" ,
42
+ "" ,
43
+ "The package deployer key name or address contained on gnokey" ,
44
+ )
45
+
46
+ fs .StringVar (
47
+ & c .gnoHome ,
48
+ "gno-home" ,
49
+ os .Getenv ("GNOHOME" ),
50
+ "the gno home directory" ,
51
+ )
52
+
53
+ fs .BoolVar (
54
+ & c .insecurePasswordStdin ,
55
+ "insecure-password-stdin" ,
56
+ false ,
57
+ "the gno home directory" ,
41
58
)
42
59
}
43
60
@@ -66,30 +83,46 @@ func execTxsAddPackages(
66
83
io commands.IO ,
67
84
args []string ,
68
85
) error {
86
+ var (
87
+ keyname = defaultAccount_Name
88
+ keybase keys.Keybase
89
+ pass string
90
+ )
69
91
// Load the genesis
70
- genesis , loadErr := types .GenesisDocFromFile (cfg .txsCfg .GenesisPath )
71
- if loadErr != nil {
72
- return fmt .Errorf ("unable to load genesis, %w" , loadErr )
92
+ genesis , err := types .GenesisDocFromFile (cfg .txsCfg .GenesisPath )
93
+ if err != nil {
94
+ return fmt .Errorf ("unable to load genesis, %w" , err )
73
95
}
74
96
75
97
// Make sure the package dir is set
76
98
if len (args ) == 0 {
77
99
return errInvalidPackageDir
78
100
}
79
101
80
- var (
81
- creator = defaultCreator
82
- err error
83
- )
84
-
85
- // Check if the deployer address is set
86
- if cfg .deployerAddress != defaultCreator .String () {
87
- creator , err = crypto .AddressFromString (cfg .deployerAddress )
102
+ if cfg .keyName != "" {
103
+ keyname = cfg .keyName
104
+ keybase , err = keys .NewKeyBaseFromDir (cfg .gnoHome )
105
+ if err != nil {
106
+ return fmt .Errorf ("unable to load keybase: %w" , err )
107
+ }
108
+ pass , err = io .GetPassword ("Enter password." , cfg .insecurePasswordStdin )
88
109
if err != nil {
89
- return fmt .Errorf ("%w, %w" , errInvalidDeployerAddr , err )
110
+ return fmt .Errorf ("cannot read password: %w" , err )
111
+ }
112
+ } else {
113
+ keybase = keys .NewInMemory ()
114
+ _ , err := keybase .CreateAccount (defaultAccount_Name , defaultAccount_Seed , "" , "" , 0 , 0 )
115
+ if err != nil {
116
+ return fmt .Errorf ("unable to create account: %w" , err )
90
117
}
91
118
}
92
119
120
+ info , err := keybase .GetByNameOrAddress (keyname )
121
+ if err != nil {
122
+ return fmt .Errorf ("unable to find key in keybase: %w" , err )
123
+ }
124
+
125
+ creator := info .GetAddress ()
93
126
parsedTxs := make ([]gnoland.TxWithMetadata , 0 )
94
127
for _ , path := range args {
95
128
// Generate transactions from the packages (recursively)
@@ -99,6 +132,10 @@ func execTxsAddPackages(
99
132
return fmt .Errorf ("unable to load txs from directory, %w" , err )
100
133
}
101
134
135
+ if err := signTxs (txs , keybase , genesis .ChainID , keyname , pass ); err != nil {
136
+ return fmt .Errorf ("unable to sign txs, %w" , err )
137
+ }
138
+
102
139
parsedTxs = append (parsedTxs , txs ... )
103
140
}
104
141
@@ -119,3 +156,25 @@ func execTxsAddPackages(
119
156
120
157
return nil
121
158
}
159
+
160
+ func signTxs (txs []gnoland.TxWithMetadata , keybase keys.Keybase , chainID , keyname string , password string ) error {
161
+ for index , tx := range txs {
162
+ // Here accountNumber and sequenceNumber are set to 0 because they are considered as 0 on genesis transactions.
163
+ signBytes , err := tx .Tx .GetSignBytes (chainID , 0 , 0 )
164
+ if err != nil {
165
+ return fmt .Errorf ("unable to load txs from directory, %w" , err )
166
+ }
167
+ signature , publicKey , err := keybase .Sign (keyname , password , signBytes )
168
+ if err != nil {
169
+ return fmt .Errorf ("unable sign tx %w" , err )
170
+ }
171
+ txs [index ].Tx .Signatures = []std.Signature {
172
+ {
173
+ PubKey : publicKey ,
174
+ Signature : signature ,
175
+ },
176
+ }
177
+ }
178
+
179
+ return nil
180
+ }
0 commit comments