14
14
// You should have received a copy of the GNU Lesser General Public License
15
15
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16
16
17
- // Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper) .
17
+ // Package compiler wraps the ABI compilation outputs .
18
18
package compiler
19
19
20
20
import (
21
- "bytes"
22
21
"encoding/json"
23
- "errors"
24
22
"fmt"
25
- "os/exec"
26
- "strconv"
27
- "strings"
28
23
)
29
24
30
- // Solidity contains information about the solidity compiler.
31
- type Solidity struct {
32
- Path , Version , FullVersion string
33
- Major , Minor , Patch int
34
- ExtraAllowedPath []string
35
- }
36
-
37
25
// --combined-output format
38
26
type solcOutput struct {
39
27
Contracts map [string ]struct {
@@ -59,109 +47,6 @@ type solcOutputV8 struct {
59
47
Version string
60
48
}
61
49
62
- func (s * Solidity ) allowedPaths () string {
63
- paths := []string {"." , "./" , "../" } // default to support relative paths
64
- if len (s .ExtraAllowedPath ) > 0 {
65
- paths = append (paths , s .ExtraAllowedPath ... )
66
- }
67
- return strings .Join (paths , ", " )
68
- }
69
-
70
- func (s * Solidity ) makeArgs () []string {
71
- p := []string {
72
- "--combined-json" , "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc" ,
73
- "--optimize" , // code optimizer switched on
74
- "--allow-paths" , s .allowedPaths (),
75
- }
76
- if s .Major > 0 || s .Minor > 4 || s .Patch > 6 {
77
- p [1 ] += ",metadata,hashes"
78
- }
79
- return p
80
- }
81
-
82
- // SolidityVersion runs solc and parses its version output.
83
- func SolidityVersion (solc string ) (* Solidity , error ) {
84
- if solc == "" {
85
- solc = "solc"
86
- }
87
- var out bytes.Buffer
88
- cmd := exec .Command (solc , "--version" )
89
- cmd .Stdout = & out
90
- err := cmd .Run ()
91
- if err != nil {
92
- return nil , err
93
- }
94
- matches := versionRegexp .FindStringSubmatch (out .String ())
95
- if len (matches ) != 4 {
96
- return nil , fmt .Errorf ("can't parse solc version %q" , out .String ())
97
- }
98
- s := & Solidity {Path : cmd .Path , FullVersion : out .String (), Version : matches [0 ]}
99
- if s .Major , err = strconv .Atoi (matches [1 ]); err != nil {
100
- return nil , err
101
- }
102
- if s .Minor , err = strconv .Atoi (matches [2 ]); err != nil {
103
- return nil , err
104
- }
105
- if s .Patch , err = strconv .Atoi (matches [3 ]); err != nil {
106
- return nil , err
107
- }
108
- return s , nil
109
- }
110
-
111
- // CompileSolidityString builds and returns all the contracts contained within a source string.
112
- func CompileSolidityString (solc , source string ) (map [string ]* Contract , error ) {
113
- if len (source ) == 0 {
114
- return nil , errors .New ("solc: empty source string" )
115
- }
116
- s , err := SolidityVersion (solc )
117
- if err != nil {
118
- return nil , err
119
- }
120
- return s .CompileSource (source )
121
- }
122
-
123
- // CompileSolidity compiles all given Solidity source files.
124
- func CompileSolidity (solc string , sourcefiles ... string ) (map [string ]* Contract , error ) {
125
- if len (sourcefiles ) == 0 {
126
- return nil , errors .New ("solc: no source files" )
127
- }
128
- s , err := SolidityVersion (solc )
129
- if err != nil {
130
- return nil , err
131
- }
132
-
133
- return s .CompileFiles (sourcefiles ... )
134
- }
135
-
136
- // CompileSource builds and returns all the contracts contained within a source string.
137
- func (s * Solidity ) CompileSource (source string ) (map [string ]* Contract , error ) {
138
- args := append (s .makeArgs (), "--" )
139
- cmd := exec .Command (s .Path , append (args , "-" )... )
140
- cmd .Stdin = strings .NewReader (source )
141
- return s .run (cmd , source )
142
- }
143
-
144
- // CompileFiles compiles all given Solidity source files.
145
- func (s * Solidity ) CompileFiles (sourcefiles ... string ) (map [string ]* Contract , error ) {
146
- source , err := slurpFiles (sourcefiles )
147
- if err != nil {
148
- return nil , err
149
- }
150
- args := append (s .makeArgs (), "--" )
151
- cmd := exec .Command (s .Path , append (args , sourcefiles ... )... )
152
- return s .run (cmd , source )
153
- }
154
-
155
- func (s * Solidity ) run (cmd * exec.Cmd , source string ) (map [string ]* Contract , error ) {
156
- var stderr , stdout bytes.Buffer
157
- cmd .Stderr = & stderr
158
- cmd .Stdout = & stdout
159
- if err := cmd .Run (); err != nil {
160
- return nil , fmt .Errorf ("solc: %v\n %s" , err , stderr .Bytes ())
161
- }
162
- return ParseCombinedJSON (stdout .Bytes (), source , s .Version , s .Version , strings .Join (s .makeArgs (), " " ))
163
- }
164
-
165
50
// ParseCombinedJSON takes the direct output of a solc --combined-output run and
166
51
// parses it into a map of string contract name to Contract structs. The
167
52
// provided source, language and compiler version, and compiler options are all
0 commit comments