@ -34,6 +34,7 @@ type tmplContract struct {
Calls map [ string ] * tmplMethod // Contract calls that only read state data
Transacts map [ string ] * tmplMethod // Contract calls that write state data
Events map [ string ] * tmplEvent // Contract events accessors
Structs map [ string ] * tmplStruct // Contract struct type definitions
}
// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed
@ -50,6 +51,21 @@ type tmplEvent struct {
Normalized abi . Event // Normalized version of the parsed fields
}
// tmplField is a wrapper around a struct field with binding language
// struct type definition and relative filed name.
type tmplField struct {
Type string // Field type representation depends on target binding language
Name string // Field name converted from the raw user-defined field name
SolKind abi . Type // Raw abi type information
}
// tmplStruct is a wrapper around an abi.tuple contains a auto-generated
// struct name.
type tmplStruct struct {
Name string // Auto-generated struct name(We can't obtain the raw struct name through abi)
Fields [ ] * tmplField // Struct fields definition depends on the binding language.
}
// tmplSource is language to template mapping containing all the supported
// programming languages the package can generate to.
var tmplSource = map [ Lang ] string {
@ -90,6 +106,7 @@ var (
)
{ { range $ contract := . Contracts } }
{ { $ structs := $ contract . Structs } }
// {{.Type}}ABI is the input ABI used to generate the binding from.
const { { . Type } } ABI = "{{.InputABI}}"
@ -107,7 +124,7 @@ var (
const { { . Type } } Bin = ` + " ` " + `{{.InputBin}}` + " ` " + `
// Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it.
func Deploy { { . Type } } ( auth * bind . TransactOpts , backend bind . ContractBackend { { range . Constructor . Inputs } } , { { . Name } } { { bindtype . Type } } { { end } } ) ( common . Address , * types . Transaction , * { { . Type } } , error ) {
func Deploy { { . Type } } ( auth * bind . TransactOpts , backend bind . ContractBackend { { range . Constructor . Inputs } } , { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( common . Address , * types . Transaction , * { { . Type } } , error ) {
parsed , err := abi . JSON ( strings . NewReader ( { { . Type } } ABI ) )
if err != nil {
return common . Address { } , nil , nil , err
@ -124,7 +141,7 @@ var (
type { { . Type } } struct {
{ { . Type } } Caller // Read-only binding to the contract
{ { . Type } } Transactor // Write-only binding to the contract
{ { . Type } } Filterer // Log filterer for contract events
{ { . Type } } Filterer // Log filterer for contract events
}
// {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract.
@ -262,16 +279,24 @@ var (
return _ { { $ contract . Type } } . Contract . contract . Transact ( opts , method , params ... )
}
{ { range . Structs } }
// {{.Name}} is an auto generated low-level Go binding around an user-defined struct.
type { { . Name } } struct {
{ { range $ field := . Fields } }
{ { $ field . Name } } { { $ field . Type } } { { end } }
}
{ { end } }
{ { range . Calls } }
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String}}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Caller ) { { . Normalized . Name } } ( opts * bind . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { bindtype . Type } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type } } , { { end } } { { end } } error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Caller ) { { . Normalized . Name } } ( opts * bind . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type $ structs } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type $ structs } } , { { end } } { { end } } error ) {
{ { if . Structured } } ret := new ( struct {
{ { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type } }
{ { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type $ structs } }
{ { end } }
} ) { { else } } var (
{ { range $ i , $ _ := . Normalized . Outputs } } ret { { $ i } } = new ( { { bindtype . Type } } )
{ { range $ i , $ _ := . Normalized . Outputs } } ret { { $ i } } = new ( { { bindtype . Type $ structs } } )
{ { end } }
) { { end } }
out := { { if . Structured } } ret { { else } } { { if eq ( len . Normalized . Outputs ) 1 } } ret0 { { else } } & [ ] interface { } {
@ -284,15 +309,15 @@ var (
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type } } , { { end } } { { end } } error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type $ structs } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type $ structs } } , { { end } } { { end } } error ) {
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } CallerSession ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type } } , { { end } } { { end } } error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } CallerSession ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( { { if . Structured } } struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type $ structs } } ; { { end } } } , { { else } } { { range . Normalized . Outputs } } { { bindtype . Type $ structs } } , { { end } } { { end } } error ) {
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
{ { end } }
@ -300,22 +325,22 @@ var (
{ { range . Transacts } }
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Transactor ) { { . Normalized . Name } } ( opts * bind . TransactOpts { { range . Normalized . Inputs } } , { { . Name } } { { bindtype . Type } } { { end } } ) ( * types . Transaction , error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Transactor ) { { . Normalized . Name } } ( opts * bind . TransactOpts { { range . Normalized . Inputs } } , { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . contract . Transact ( opts , "{{.Original.Name}}" { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type } } { { end } } ) ( * types . Transaction , error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . TransactOpts { { range $ i , $ _ := . Normalized . Inputs } } , { { . Name } } { { end } } )
}
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorSession ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type } } { { end } } ) ( * types . Transaction , error ) {
// Solidity: {{formatmethod .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorSession ) { { . Normalized . Name } } ( { { range $ i , $ _ := . Normalized . Inputs } } { { if ne $ i 0 } } , { { end } } { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . TransactOpts { { range $ i , $ _ := . Normalized . Inputs } } , { { . Name } } { { end } } )
}
{ { end } }
@ -387,14 +412,14 @@ var (
// {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract.
type { { $ contract . Type } } { { . Normalized . Name } } struct { { { range . Normalized . Inputs } }
{ { capitalise . Name } } { { if . Indexed } } { { bindtopictype . Type } } { { else } } { { bindtype . Type } } { { end } } ; { { end } }
{ { capitalise . Name } } { { if . Indexed } } { { bindtopictype . Type $ structs } } { { else } } { { bindtype . Type $ structs } } { { end } } ; { { end } }
Raw types . Log // Blockchain specific contextual infos
}
// Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Filterer ) Filter { { . Normalized . Name } } ( opts * bind . FilterOpts { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } [ ] { { bindtype . Type } } { { end } } { { end } } ) ( * { { $ contract . Type } } { { . Normalized . Name } } Iterator , error ) {
// Solidity: {{formatevent .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Filterer ) Filter { { . Normalized . Name } } ( opts * bind . FilterOpts { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } [ ] { { bindtype . Type $ structs } } { { end } } { { end } } ) ( * { { $ contract . Type } } { { . Normalized . Name } } Iterator , error ) {
{ { range . Normalized . Inputs } }
{ { if . Indexed } } var { { . Name } } Rule [ ] interface { }
for _ , { { . Name } } Item := range { { . Name } } {
@ -410,8 +435,8 @@ var (
// Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Filterer ) Watch { { . Normalized . Name } } ( opts * bind . WatchOpts , sink chan <- * { { $ contract . Type } } { { . Normalized . Name } } { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } [ ] { { bindtype . Type } } { { end } } { { end } } ) ( event . Subscription , error ) {
// Solidity: {{formatevent .Original $structs }}
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Filterer ) Watch { { . Normalized . Name } } ( opts * bind . WatchOpts , sink chan <- * { { $ contract . Type } } { { . Normalized . Name } } { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } [ ] { { bindtype . Type $ structs } } { { end } } { { end } } ) ( event . Subscription , error ) {
{ { range . Normalized . Inputs } }
{ { if . Indexed } } var { { . Name } } Rule [ ] interface { }
for _ , { { . Name } } Item := range { { . Name } } {
@ -477,6 +502,7 @@ import org.ethereum.geth.*;
import java . util . * ;
{ { range $ contract := . Contracts } }
{ { $ structs := $ contract . Structs } }
public class { { . Type } } {
// ABI is the input ABI used to generate the binding from.
public final static String ABI = "{{.InputABI}}" ;
@ -496,9 +522,9 @@ public class {{.Type}} {
public final static String BYTECODE = "0x{{.InputBin}}" ;
// deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it.
public static { { . Type } } deploy ( TransactOpts auth , EthereumClient client { { range . Constructor . Inputs } } , { { bindtype . Type } } { { . Name } } { { end } } ) throws Exception {
public static { { . Type } } deploy ( TransactOpts auth , EthereumClient client { { range . Constructor . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
Interfaces args = Geth . newInterfaces ( { { ( len . Constructor . Inputs ) } } ) ;
{ { range $ index , $ element := . Constructor . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { range $ index , $ element := . Constructor . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { end } }
return new { { . Type } } ( Geth . deployContract ( auth , ABI , Geth . decodeFromHex ( BYTECODE ) , client , args ) ) ;
}
@ -529,7 +555,7 @@ public class {{.Type}} {
{ { if gt ( len . Normalized . Outputs ) 1 } }
// {{capitalise .Normalized.Name}}Results is the output of a call to {{.Normalized.Name}}.
public class { { capitalise . Normalized . Name } } Results {
{ { range $ index , $ item := . Normalized . Outputs } } public { { bindtype . Type } } { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } ;
{ { range $ index , $ item := . Normalized . Outputs } } public { { bindtype . Type $ structs } } { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } ;
{ { end } }
}
{ { end } }
@ -537,13 +563,13 @@ public class {{.Type}} {
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String}}
public { { if gt ( len . Normalized . Outputs ) 1 } } { { capitalise . Normalized . Name } } Results { { else } } { { range . Normalized . Outputs } } { { bindtype . Type } } { { end } } { { end } } { { . Normalized . Name } } ( CallOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type } } { { . Name } } { { end } } ) throws Exception {
public { { if gt ( len . Normalized . Outputs ) 1 } } { { capitalise . Normalized . Name } } Results { { else } } { { range . Normalized . Outputs } } { { bindtype . Type $ structs } } { { end } } { { end } } { { . Normalized . Name } } ( CallOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
Interfaces args = Geth . newInterfaces ( { { ( len . Normalized . Inputs ) } } ) ;
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { end } }
Interfaces results = Geth . newInterfaces ( { { ( len . Normalized . Outputs ) } } ) ;
{ { range $ index , $ item := . Normalized . Outputs } } Interface result { { $ index } } = Geth . newInterface ( ) ; result { { $ index } } . setDefault { { namedtype ( bindtype . Type ) . Type } } ( ) ; results . set ( { { $ index } } , result { { $ index } } ) ;
{ { range $ index , $ item := . Normalized . Outputs } } Interface result { { $ index } } = Geth . newInterface ( ) ; result { { $ index } } . setDefault { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ; results . set ( { { $ index } } , result { { $ index } } ) ;
{ { end } }
if ( opts == null ) {
@ -552,10 +578,10 @@ public class {{.Type}} {
this . Contract . call ( opts , results , "{{.Original.Name}}" , args ) ;
{ { if gt ( len . Normalized . Outputs ) 1 } }
{ { capitalise . Normalized . Name } } Results result = new { { capitalise . Normalized . Name } } Results ( ) ;
{ { range $ index , $ item := . Normalized . Outputs } } result . { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } = results . get ( { { $ index } } ) . get { { namedtype ( bindtype . Type ) . Type } } ( ) ;
{ { range $ index , $ item := . Normalized . Outputs } } result . { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } = results . get ( { { $ index } } ) . get { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ;
{ { end } }
return result ;
{ { else } } { { range . Normalized . Outputs } } return results . get ( 0 ) . get { { namedtype ( bindtype . Type ) . Type } } ( ) ; { { end } }
{ { else } } { { range . Normalized . Outputs } } return results . get ( 0 ) . get { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ; { { end } }
{ { end } }
}
{ { end } }
@ -564,9 +590,9 @@ public class {{.Type}} {
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}.
//
// Solidity: {{.Original.String}}
public Transaction { { . Normalized . Name } } ( TransactOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type } } { { . Name } } { { end } } ) throws Exception {
public Transaction { { . Normalized . Name } } ( TransactOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
Interfaces args = Geth . newInterfaces ( { { ( len . Normalized . Inputs ) } } ) ;
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
{ { end } }
return this . Contract . transact ( opts , "{{.Original.Name}}" , args ) ;
}