2016-03-21 12:34:49 +00:00
// Copyright 2016 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package bind
import "github.com/ethereum/go-ethereum/accounts/abi"
// tmplData is the data structure required to fill the binding template.
type tmplData struct {
Package string // Name of the package to place the generated file in
Contracts map [ string ] * tmplContract // List of contracts to generate into this file
2019-07-08 08:27:05 +00:00
Libraries map [ string ] string // Map the bytecode's link pattern to the library name
2019-11-25 13:03:22 +00:00
Structs map [ string ] * tmplStruct // Contract struct type definitions
2016-03-21 12:34:49 +00:00
}
// tmplContract contains the data needed to generate an individual contract binding.
type tmplContract struct {
Type string // Type name of the main contract binding
InputABI string // JSON ABI used as the input to generate the binding from
2020-09-20 08:43:57 +00:00
InputBin string // Optional EVM bytecode used to generate deploy code from
2019-07-02 07:52:58 +00:00
FuncSigs map [ string ] string // Optional map: string signature -> 4-byte signature
2016-03-21 12:34:49 +00:00
Constructor abi . Method // Contract constructor for deploy parametrization
Calls map [ string ] * tmplMethod // Contract calls that only read state data
Transacts map [ string ] * tmplMethod // Contract calls that write state data
2020-04-15 07:23:58 +00:00
Fallback * tmplMethod // Additional special fallback function
Receive * tmplMethod // Additional special receive function
2018-01-05 10:39:24 +00:00
Events map [ string ] * tmplEvent // Contract events accessors
2019-07-08 08:27:05 +00:00
Libraries map [ string ] string // Same as tmplData, but filtered to only keep what the contract needs
2019-11-25 13:03:22 +00:00
Library bool // Indicator whether the contract is a library
2016-03-21 12:34:49 +00:00
}
// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed
// and cached data fields.
type tmplMethod struct {
Original abi . Method // Original method as parsed by the abi package
Normalized abi . Method // Normalized version of the parsed method (capitalized names, non-anonymous args/returns)
2018-01-05 10:39:24 +00:00
Structured bool // Whether the returns should be accumulated into a struct
}
2020-09-20 08:43:57 +00:00
// tmplEvent is a wrapper around an abi.Event that contains a few preprocessed
// and cached data fields.
2018-01-05 10:39:24 +00:00
type tmplEvent struct {
Original abi . Event // Original event as parsed by the abi package
Normalized abi . Event // Normalized version of the parsed fields
2016-03-21 12:34:49 +00:00
}
2019-07-03 10:17:43 +00:00
// 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
}
2020-09-20 08:43:57 +00:00
// tmplStruct is a wrapper around an abi.tuple and contains an auto-generated
2019-07-03 10:17:43 +00:00
// struct name.
type tmplStruct struct {
2019-10-31 13:17:51 +00:00
Name string // Auto-generated struct name(before solidity v0.5.11) or raw name.
2019-07-03 10:17:43 +00:00
Fields [ ] * tmplField // Struct fields definition depends on the binding language.
}
2016-09-05 16:07:57 +00:00
// tmplSource is language to template mapping containing all the supported
// programming languages the package can generate to.
var tmplSource = map [ Lang ] string {
LangGo : tmplSourceGo ,
LangJava : tmplSourceJava ,
}
2020-09-20 08:43:57 +00:00
// tmplSourceGo is the Go source template that the generated Go contract binding
// is based on.
2016-09-05 16:07:57 +00:00
const tmplSourceGo = `
2017-07-24 12:09:03 +00:00
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
2016-03-21 12:34:49 +00:00
package { { . Package } }
2018-10-05 20:24:54 +00:00
import (
"math/big"
"strings"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
)
// Reference imports to suppress errors if they are not otherwise used.
var (
_ = big . NewInt
_ = strings . NewReader
_ = ethereum . NotFound
_ = bind . Bind
_ = common . Big1
_ = types . BloomLookup
_ = event . NewSubscription
)
2019-11-25 13:03:22 +00:00
{ { $ structs := . Structs } }
{ { 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 } }
2016-03-21 12:34:49 +00:00
{ { range $ contract := . Contracts } }
// {{.Type}}ABI is the input ABI used to generate the binding from.
2016-09-05 16:07:57 +00:00
const { { . Type } } ABI = "{{.InputABI}}"
2016-03-21 12:34:49 +00:00
2019-07-02 07:52:58 +00:00
{ { if $ contract . FuncSigs } }
// {{.Type}}FuncSigs maps the 4-byte function signature to its string representation.
var { { . Type } } FuncSigs = map [ string ] string {
2019-07-08 08:27:05 +00:00
{ { range $ strsig , $ binsig := . FuncSigs } } "{{$binsig}}" : "{{$strsig}}" ,
2019-07-02 07:52:58 +00:00
{ { end } }
}
{ { end } }
2016-03-21 12:34:49 +00:00
{ { if . InputBin } }
// {{.Type}}Bin is the compiled bytecode used for deploying new contracts.
2019-07-08 08:27:05 +00:00
var { { . Type } } Bin = "0x{{.InputBin}}"
2016-03-21 12:34:49 +00:00
// Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it.
2019-07-03 10:17:43 +00:00
func Deploy { { . Type } } ( auth * bind . TransactOpts , backend bind . ContractBackend { { range . Constructor . Inputs } } , { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( common . Address , * types . Transaction , * { { . Type } } , error ) {
2016-03-21 12:34:49 +00:00
parsed , err := abi . JSON ( strings . NewReader ( { { . Type } } ABI ) )
if err != nil {
return common . Address { } , nil , nil , err
}
2019-07-08 08:27:05 +00:00
{ { range $ pattern , $ name := . Libraries } }
{ { decapitalise $ name } } Addr , _ , _ , _ := Deploy { { capitalise $ name } } ( auth , backend )
{ { $ contract . Type } } Bin = strings . Replace ( { { $ contract . Type } } Bin , "__${{$pattern}}$__" , { { decapitalise $ name } } Addr . String ( ) [ 2 : ] , - 1 )
{ { end } }
2016-03-21 12:34:49 +00:00
address , tx , contract , err := bind . DeployContract ( auth , parsed , common . FromHex ( { { . Type } } Bin ) , backend { { range . Constructor . Inputs } } , { { . Name } } { { end } } )
if err != nil {
return common . Address { } , nil , nil , err
}
2018-01-05 10:39:24 +00:00
return address , tx , & { { . Type } } { { { . Type } } Caller : { { . Type } } Caller { contract : contract } , { { . Type } } Transactor : { { . Type } } Transactor { contract : contract } , { { . Type } } Filterer : { { . Type } } Filterer { contract : contract } } , nil
2016-03-21 12:34:49 +00:00
}
{ { end } }
// {{.Type}} is an auto generated Go binding around an Ethereum contract.
type { { . Type } } struct {
{ { . Type } } Caller // Read-only binding to the contract
{ { . Type } } Transactor // Write-only binding to the contract
2019-07-03 10:17:43 +00:00
{ { . Type } } Filterer // Log filterer for contract events
2016-03-21 12:34:49 +00:00
}
// {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract.
type { { . Type } } Caller struct {
contract * bind . BoundContract // Generic contract wrapper for the low level calls
}
// {{.Type}}Transactor is an auto generated write-only Go binding around an Ethereum contract.
type { { . Type } } Transactor struct {
contract * bind . BoundContract // Generic contract wrapper for the low level calls
}
2018-01-05 10:39:24 +00:00
// {{.Type}}Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
type { { . Type } } Filterer struct {
contract * bind . BoundContract // Generic contract wrapper for the low level calls
}
2016-03-21 12:34:49 +00:00
// {{.Type}}Session is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type { { . Type } } Session struct {
Contract * { { . Type } } // Generic contract binding to set the session for
CallOpts bind . CallOpts // Call options to use throughout this session
TransactOpts bind . TransactOpts // Transaction auth options to use throughout this session
}
// {{.Type}}CallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type { { . Type } } CallerSession struct {
Contract * { { . Type } } Caller // Generic contract caller binding to set the session for
CallOpts bind . CallOpts // Call options to use throughout this session
}
// {{.Type}}TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type { { . Type } } TransactorSession struct {
Contract * { { . Type } } Transactor // Generic contract transactor binding to set the session for
TransactOpts bind . TransactOpts // Transaction auth options to use throughout this session
}
2016-04-01 10:02:43 +00:00
// {{.Type}}Raw is an auto generated low-level Go binding around an Ethereum contract.
type { { . Type } } Raw struct {
Contract * { { . Type } } // Generic contract binding to access the raw methods on
}
// {{.Type}}CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type { { . Type } } CallerRaw struct {
Contract * { { . Type } } Caller // Generic read-only contract binding to access the raw methods on
}
// {{.Type}}TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type { { . Type } } TransactorRaw struct {
Contract * { { . Type } } Transactor // Generic write-only contract binding to access the raw methods on
}
2016-03-21 12:34:49 +00:00
// New{{.Type}} creates a new instance of {{.Type}}, bound to a specific deployed contract.
func New { { . Type } } ( address common . Address , backend bind . ContractBackend ) ( * { { . Type } } , error ) {
2018-01-05 10:39:24 +00:00
contract , err := bind { { . Type } } ( address , backend , backend , backend )
2016-03-21 12:34:49 +00:00
if err != nil {
return nil , err
}
2018-01-05 10:39:24 +00:00
return & { { . Type } } { { { . Type } } Caller : { { . Type } } Caller { contract : contract } , { { . Type } } Transactor : { { . Type } } Transactor { contract : contract } , { { . Type } } Filterer : { { . Type } } Filterer { contract : contract } } , nil
2016-03-21 12:34:49 +00:00
}
// New{{.Type}}Caller creates a new read-only instance of {{.Type}}, bound to a specific deployed contract.
func New { { . Type } } Caller ( address common . Address , caller bind . ContractCaller ) ( * { { . Type } } Caller , error ) {
2018-01-05 10:39:24 +00:00
contract , err := bind { { . Type } } ( address , caller , nil , nil )
2016-03-21 12:34:49 +00:00
if err != nil {
return nil , err
}
return & { { . Type } } Caller { contract : contract } , nil
}
// New{{.Type}}Transactor creates a new write-only instance of {{.Type}}, bound to a specific deployed contract.
func New { { . Type } } Transactor ( address common . Address , transactor bind . ContractTransactor ) ( * { { . Type } } Transactor , error ) {
2018-01-05 10:39:24 +00:00
contract , err := bind { { . Type } } ( address , nil , transactor , nil )
2016-03-21 12:34:49 +00:00
if err != nil {
return nil , err
}
return & { { . Type } } Transactor { contract : contract } , nil
}
2018-01-05 10:39:24 +00:00
// New{{.Type}}Filterer creates a new log filterer instance of {{.Type}}, bound to a specific deployed contract.
func New { { . Type } } Filterer ( address common . Address , filterer bind . ContractFilterer ) ( * { { . Type } } Filterer , error ) {
contract , err := bind { { . Type } } ( address , nil , nil , filterer )
if err != nil {
return nil , err
}
return & { { . Type } } Filterer { contract : contract } , nil
}
2016-03-21 12:34:49 +00:00
// bind{{.Type}} binds a generic wrapper to an already deployed contract.
2018-01-05 10:39:24 +00:00
func bind { { . Type } } ( address common . Address , caller bind . ContractCaller , transactor bind . ContractTransactor , filterer bind . ContractFilterer ) ( * bind . BoundContract , error ) {
2016-03-21 12:34:49 +00:00
parsed , err := abi . JSON ( strings . NewReader ( { { . Type } } ABI ) )
if err != nil {
return nil , err
}
2018-01-05 10:39:24 +00:00
return bind . NewBoundContract ( address , parsed , caller , transactor , filterer ) , nil
2016-03-21 12:34:49 +00:00
}
2016-04-01 10:02:43 +00:00
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
2020-09-28 12:10:26 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Raw ) Call ( opts * bind . CallOpts , result * [ ] interface { } , method string , params ... interface { } ) error {
2016-04-01 10:02:43 +00:00
return _ { { $ contract . Type } } . Contract . { { $ contract . Type } } Caller . contract . Call ( opts , result , method , params ... )
}
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Raw ) Transfer ( opts * bind . TransactOpts ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . { { $ contract . Type } } Transactor . contract . Transfer ( opts )
}
// Transact invokes the (paid) contract method with params as input values.
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Raw ) Transact ( opts * bind . TransactOpts , method string , params ... interface { } ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . { { $ contract . Type } } Transactor . contract . Transact ( opts , method , params ... )
}
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
2020-09-28 12:10:26 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } CallerRaw ) Call ( opts * bind . CallOpts , result * [ ] interface { } , method string , params ... interface { } ) error {
2016-04-01 10:02:43 +00:00
return _ { { $ contract . Type } } . Contract . contract . Call ( opts , result , method , params ... )
}
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorRaw ) Transfer ( opts * bind . TransactOpts ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . contract . Transfer ( opts )
}
// Transact invokes the (paid) contract method with params as input values.
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorRaw ) Transact ( opts * bind . TransactOpts , method string , params ... interface { } ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . contract . Transact ( opts , method , params ... )
}
2016-03-21 12:34:49 +00:00
{ { range . Calls } }
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2020-09-28 12:10:26 +00:00
var out [ ] interface { }
err := _ { { $ contract . Type } } . contract . Call ( opts , & out , "{{.Original.Name}}" { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
{ { if . Structured } }
outstruct := new ( struct { { { range . Normalized . Outputs } } { { . Name } } { { bindtype . Type $ structs } } ; { { end } } } )
2020-12-12 09:16:34 +00:00
if err != nil {
return * outstruct , err
}
2020-09-28 12:10:26 +00:00
{ { range $ i , $ t := . Normalized . Outputs } }
2021-02-10 12:12:13 +00:00
outstruct . { { . Name } } = * abi . ConvertType ( out [ { { $ i } } ] , new ( { { bindtype . Type $ structs } } ) ) . ( * { { bindtype . Type $ structs } } ) { { end } }
2020-09-28 12:10:26 +00:00
return * outstruct , err
{ { else } }
if err != nil {
return { { range $ i , $ _ := . Normalized . Outputs } } * new ( { { bindtype . Type $ structs } } ) , { { end } } err
}
{ { range $ i , $ t := . Normalized . Outputs } }
out { { $ i } } := * abi . ConvertType ( out [ { { $ i } } ] , new ( { { bindtype . Type $ structs } } ) ) . ( * { { bindtype . Type $ structs } } ) { { end } }
return { { range $ i , $ t := . Normalized . Outputs } } out { { $ i } } , { { end } } err
{ { end } }
2016-03-21 12:34:49 +00:00
}
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2016-03-21 12:34:49 +00:00
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2016-03-21 12:34:49 +00:00
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . CallOpts { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
{ { end } }
{ { range . Transacts } }
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Transactor ) { { . Normalized . Name } } ( opts * bind . TransactOpts { { range . Normalized . Inputs } } , { { . Name } } { { bindtype . Type $ structs } } { { end } } ) ( * types . Transaction , error ) {
2016-03-21 12:34:49 +00:00
return _ { { $ contract . Type } } . contract . Transact ( opts , "{{.Original.Name}}" { { range . Normalized . Inputs } } , { { . Name } } { { end } } )
}
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2016-03-21 12:34:49 +00:00
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . TransactOpts { { range $ i , $ _ := . Normalized . Inputs } } , { { . Name } } { { end } } )
}
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}.
2016-03-21 12:34:49 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2016-03-21 12:34:49 +00:00
return _ { { $ contract . Type } } . Contract . { { . Normalized . Name } } ( & _ { { $ contract . Type } } . TransactOpts { { range $ i , $ _ := . Normalized . Inputs } } , { { . Name } } { { end } } )
}
{ { end } }
2018-01-05 10:39:24 +00:00
2020-04-15 07:23:58 +00:00
{ { if . Fallback } }
// Fallback is a paid mutator transaction binding the contract fallback function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Fallback.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Transactor ) Fallback ( opts * bind . TransactOpts , calldata [ ] byte ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . contract . RawTransact ( opts , calldata )
}
// Fallback is a paid mutator transaction binding the contract fallback function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Fallback.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) Fallback ( calldata [ ] byte ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . Fallback ( & _ { { $ contract . Type } } . TransactOpts , calldata )
}
// Fallback is a paid mutator transaction binding the contract fallback function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Fallback.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorSession ) Fallback ( calldata [ ] byte ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . Fallback ( & _ { { $ contract . Type } } . TransactOpts , calldata )
}
{ { end } }
{ { if . Receive } }
// Receive is a paid mutator transaction binding the contract receive function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Receive.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Transactor ) Receive ( opts * bind . TransactOpts ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . contract . RawTransact ( opts , nil ) // calldata is disallowed for receive function
}
// Receive is a paid mutator transaction binding the contract receive function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Receive.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Session ) Receive ( ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . Receive ( & _ { { $ contract . Type } } . TransactOpts )
}
// Receive is a paid mutator transaction binding the contract receive function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Receive.Original.String}}
2020-04-15 07:23:58 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } TransactorSession ) Receive ( ) ( * types . Transaction , error ) {
return _ { { $ contract . Type } } . Contract . Receive ( & _ { { $ contract . Type } } . TransactOpts )
}
{ { end } }
2018-01-05 10:39:24 +00:00
{ { range . Events } }
// {{$contract.Type}}{{.Normalized.Name}}Iterator is returned from Filter{{.Normalized.Name}} and is used to iterate over the raw logs and unpacked data for {{.Normalized.Name}} events raised by the {{$contract.Type}} contract.
type { { $ contract . Type } } { { . Normalized . Name } } Iterator struct {
Event * { { $ contract . Type } } { { . Normalized . Name } } // Event containing the contract specifics and raw log
contract * bind . BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types . Log // Log channel receiving the found contract events
sub ethereum . Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func ( it * { { $ contract . Type } } { { . Normalized . Name } } Iterator ) Next ( ) bool {
// If the iterator failed, stop iterating
if ( it . fail != nil ) {
return false
}
// If the iterator completed, deliver directly whatever's available
if ( it . done ) {
select {
case log := <- it . logs :
it . Event = new ( { { $ contract . Type } } { { . Normalized . Name } } )
if err := it . contract . UnpackLog ( it . Event , it . event , log ) ; err != nil {
it . fail = err
return false
}
it . Event . Raw = log
return true
default :
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <- it . logs :
it . Event = new ( { { $ contract . Type } } { { . Normalized . Name } } )
if err := it . contract . UnpackLog ( it . Event , it . event , log ) ; err != nil {
it . fail = err
return false
}
it . Event . Raw = log
return true
case err := <- it . sub . Err ( ) :
it . done = true
it . fail = err
return it . Next ( )
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func ( it * { { $ contract . Type } } { { . Normalized . Name } } Iterator ) Error ( ) error {
return it . fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func ( it * { { $ contract . Type } } { { . Normalized . Name } } Iterator ) Close ( ) error {
it . sub . Unsubscribe ( )
return nil
}
// {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract.
type { { $ contract . Type } } { { . Normalized . Name } } struct { { { range . Normalized . Inputs } }
2019-07-03 10:17:43 +00:00
{ { capitalise . Name } } { { if . Indexed } } { { bindtopictype . Type $ structs } } { { else } } { { bindtype . Type $ structs } } { { end } } ; { { end } }
2018-01-05 10:39:24 +00:00
Raw types . Log // Blockchain specific contextual infos
}
2019-08-02 07:20:46 +00:00
// Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.ID}}.
2018-01-05 10:39:24 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2018-01-05 10:39:24 +00:00
{ { range . Normalized . Inputs } }
{ { if . Indexed } } var { { . Name } } Rule [ ] interface { }
for _ , { { . Name } } Item := range { { . Name } } {
{ { . Name } } Rule = append ( { { . Name } } Rule , { { . Name } } Item )
} { { end } } { { end } }
logs , sub , err := _ { { $ contract . Type } } . contract . FilterLogs ( opts , "{{.Original.Name}}" { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } Rule { { end } } { { end } } )
if err != nil {
return nil , err
}
return & { { $ contract . Type } } { { . Normalized . Name } } Iterator { contract : _ { { $ contract . Type } } . contract , event : "{{.Original.Name}}" , logs : logs , sub : sub } , nil
}
2019-08-02 07:20:46 +00:00
// Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.ID}}.
2018-01-05 10:39:24 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
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 ) {
2018-01-05 10:39:24 +00:00
{ { range . Normalized . Inputs } }
{ { if . Indexed } } var { { . Name } } Rule [ ] interface { }
for _ , { { . Name } } Item := range { { . Name } } {
{ { . Name } } Rule = append ( { { . Name } } Rule , { { . Name } } Item )
} { { end } } { { end } }
logs , sub , err := _ { { $ contract . Type } } . contract . WatchLogs ( opts , "{{.Original.Name}}" { { range . Normalized . Inputs } } { { if . Indexed } } , { { . Name } } Rule { { end } } { { end } } )
if err != nil {
return nil , err
}
return event . NewSubscription ( func ( quit <- chan struct { } ) error {
defer sub . Unsubscribe ( )
for {
select {
case log := <- logs :
// New log arrived, parse the event and forward to the user
event := new ( { { $ contract . Type } } { { . Normalized . Name } } )
if err := _ { { $ contract . Type } } . contract . UnpackLog ( event , "{{.Original.Name}}" , log ) ; err != nil {
return err
}
event . Raw = log
select {
case sink <- event :
case err := <- sub . Err ( ) :
return err
case <- quit :
return nil
}
case err := <- sub . Err ( ) :
return err
case <- quit :
return nil
}
}
} ) , nil
}
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
2019-06-28 07:34:02 +00:00
2019-08-02 07:20:46 +00:00
// Parse{{.Normalized.Name}} is a log parse operation binding the contract event 0x{{printf "%x" .Original.ID}}.
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
2019-06-28 07:34:02 +00:00
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Original.String}}
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
2019-06-28 07:34:02 +00:00
func ( _ { { $ contract . Type } } * { { $ contract . Type } } Filterer ) Parse { { . Normalized . Name } } ( log types . Log ) ( * { { $ contract . Type } } { { . Normalized . Name } } , error ) {
event := new ( { { $ contract . Type } } { { . Normalized . Name } } )
if err := _ { { $ contract . Type } } . contract . UnpackLog ( event , "{{.Original.Name}}" , log ) ; err != nil {
return nil , err
}
2020-11-13 12:43:15 +00:00
event . Raw = log
all: on-chain oracle checkpoint syncing (#19543)
* all: implement simple checkpoint syncing
cmd, les, node: remove callback mechanism
cmd, node: remove callback definition
les: simplify the registrar
les: expose checkpoint rpc services in the light client
les, light: don't store untrusted receipt
cmd, contracts, les: discard stale checkpoint
cmd, contracts/registrar: loose restriction of registeration
cmd, contracts: add replay-protection
all: off-chain multi-signature contract
params: deploy checkpoint contract for rinkeby
cmd/registrar: add raw signing mode for registrar
cmd/registrar, contracts/registrar, les: fixed messages
* cmd/registrar, contracts/registrar: fix lints
* accounts/abi/bind, les: address comments
* cmd, contracts, les, light, params: minor checkpoint sync cleanups
* cmd, eth, les, light: move checkpoint config to config file
* cmd, eth, les, params: address comments
* eth, les, params: address comments
* cmd: polish up the checkpoint admin CLI
* cmd, contracts, params: deploy new version contract
* cmd/checkpoint-admin: add another flag for clef mode signing
* cmd, contracts, les: rename and regen checkpoint oracle with abigen
2019-06-28 07:34:02 +00:00
return event , nil
}
2018-01-05 10:39:24 +00:00
{ { end } }
2016-03-21 12:34:49 +00:00
{ { end } }
`
2016-09-05 16:07:57 +00:00
2020-09-20 08:43:57 +00:00
// tmplSourceJava is the Java source template that the generated Java contract binding
// is based on.
2016-09-05 16:07:57 +00:00
const tmplSourceJava = `
// This file is an automatically generated Java binding. Do not modify as any
// change will likely be lost upon the next re-generation!
package { { . Package } } ;
import org . ethereum . geth . * ;
2019-07-02 07:52:58 +00:00
import java . util . * ;
2016-09-05 16:07:57 +00:00
2019-11-25 13:03:22 +00:00
{ { $ structs := . Structs } }
2016-09-05 16:07:57 +00:00
{ { range $ contract := . Contracts } }
2019-07-08 08:27:05 +00:00
{ { if not . Library } } public { { end } } class { { . Type } } {
2019-06-27 08:48:13 +00:00
// ABI is the input ABI used to generate the binding from.
public final static String ABI = "{{.InputABI}}" ;
2019-07-02 07:52:58 +00:00
{ { if $ contract . FuncSigs } }
// {{.Type}}FuncSigs maps the 4-byte function signature to its string representation.
public final static Map < String , String > { { . Type } } FuncSigs ;
static {
Hashtable < String , String > temp = new Hashtable < String , String > ( ) ;
2019-07-08 08:27:05 +00:00
{ { range $ strsig , $ binsig := . FuncSigs } } temp . put ( "{{$binsig}}" , "{{$strsig}}" ) ;
2019-07-02 07:52:58 +00:00
{ { end } }
{ { . Type } } FuncSigs = Collections . unmodifiableMap ( temp ) ;
}
{ { end } }
2019-06-27 08:48:13 +00:00
{ { if . InputBin } }
// BYTECODE is the compiled bytecode used for deploying new contracts.
public final static String BYTECODE = "0x{{.InputBin}}" ;
// deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it.
2019-07-03 10:17:43 +00:00
public static { { . Type } } deploy ( TransactOpts auth , EthereumClient client { { range . Constructor . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
2019-06-27 08:48:13 +00:00
Interfaces args = Geth . newInterfaces ( { { ( len . Constructor . Inputs ) } } ) ;
2019-07-08 08:27:05 +00:00
String bytecode = BYTECODE ;
{ { if . Libraries } }
// "link" contract to dependent libraries by deploying them first.
{ { range $ pattern , $ name := . Libraries } }
{ { capitalise $ name } } { { decapitalise $ name } } Inst = { { capitalise $ name } } . deploy ( auth , client ) ;
bytecode = bytecode . replace ( "__${{$pattern}}$__" , { { decapitalise $ name } } Inst . Address . getHex ( ) . substring ( 2 ) ) ;
{ { end } }
{ { end } }
2019-07-03 10:17:43 +00:00
{ { range $ index , $ element := . Constructor . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
2016-09-05 16:07:57 +00:00
{ { end } }
2019-07-08 08:27:05 +00:00
return new { { . Type } } ( Geth . deployContract ( auth , ABI , Geth . decodeFromHex ( bytecode ) , client , args ) ) ;
2019-06-27 08:48:13 +00:00
}
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
// Internal constructor used by contract deployment.
private { { . Type } } ( BoundContract deployment ) {
this . Address = deployment . getAddress ( ) ;
this . Deployer = deployment . getDeployer ( ) ;
this . Contract = deployment ;
}
{ { end } }
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
// Ethereum address where this contract is located at.
public final Address Address ;
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
// Ethereum transaction in which this contract was deployed (if known!).
public final Transaction Deployer ;
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
// Contract instance bound to a blockchain address.
private final BoundContract Contract ;
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
// Creates a new instance of {{.Type}}, bound to a specific deployed contract.
public { { . Type } } ( Address address , EthereumClient client ) throws Exception {
this ( Geth . bindContract ( address , ABI , client ) ) ;
}
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
{ { range . Calls } }
{ { 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 {
2019-07-03 10:17:43 +00:00
{ { range $ index , $ item := . Normalized . Outputs } } public { { bindtype . Type $ structs } } { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } ;
2019-06-27 08:48:13 +00:00
{ { end } }
}
{ { end } }
2016-09-05 16:07:57 +00:00
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}.
2019-06-27 08:48:13 +00:00
//
// Solidity: {{.Original.String}}
2020-05-07 07:24:10 +00:00
public { { if gt ( len . Normalized . Outputs ) 1 } } { { capitalise . Normalized . Name } } Results { { else if eq ( len . Normalized . Outputs ) 0 } } void { { else } } { { range . Normalized . Outputs } } { { bindtype . Type $ structs } } { { end } } { { end } } { { . Normalized . Name } } ( CallOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
2019-06-27 08:48:13 +00:00
Interfaces args = Geth . newInterfaces ( { { ( len . Normalized . Inputs ) } } ) ;
2019-07-03 10:17:43 +00:00
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
2019-06-27 08:48:13 +00:00
{ { end } }
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
Interfaces results = Geth . newInterfaces ( { { ( len . Normalized . Outputs ) } } ) ;
2019-07-03 10:17:43 +00:00
{ { range $ index , $ item := . Normalized . Outputs } } Interface result { { $ index } } = Geth . newInterface ( ) ; result { { $ index } } . setDefault { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ; results . set ( { { $ index } } , result { { $ index } } ) ;
2016-09-05 16:07:57 +00:00
{ { end } }
2019-06-27 08:48:13 +00:00
if ( opts == null ) {
opts = Geth . newCallOpts ( ) ;
}
this . Contract . call ( opts , results , "{{.Original.Name}}" , args ) ;
{ { if gt ( len . Normalized . Outputs ) 1 } }
{ { capitalise . Normalized . Name } } Results result = new { { capitalise . Normalized . Name } } Results ( ) ;
2019-07-03 10:17:43 +00:00
{ { range $ index , $ item := . Normalized . Outputs } } result . { { if ne . Name "" } } { { . Name } } { { else } } Return { { $ index } } { { end } } = results . get ( { { $ index } } ) . get { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ;
2019-06-27 08:48:13 +00:00
{ { end } }
return result ;
2019-07-03 10:17:43 +00:00
{ { else } } { { range . Normalized . Outputs } } return results . get ( 0 ) . get { { namedtype ( bindtype . Type $ structs ) . Type } } ( ) ; { { end } }
2019-06-27 08:48:13 +00:00
{ { end } }
}
{ { end } }
2016-09-05 16:07:57 +00:00
2019-06-27 08:48:13 +00:00
{ { range . Transacts } }
2019-08-02 07:20:46 +00:00
// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}.
2019-06-27 08:48:13 +00:00
//
// Solidity: {{.Original.String}}
2019-07-03 10:17:43 +00:00
public Transaction { { . Normalized . Name } } ( TransactOpts opts { { range . Normalized . Inputs } } , { { bindtype . Type $ structs } } { { . Name } } { { end } } ) throws Exception {
2019-06-27 08:48:13 +00:00
Interfaces args = Geth . newInterfaces ( { { ( len . Normalized . Inputs ) } } ) ;
2019-07-03 10:17:43 +00:00
{ { range $ index , $ item := . Normalized . Inputs } } Interface arg { { $ index } } = Geth . newInterface ( ) ; arg { { $ index } } . set { { namedtype ( bindtype . Type $ structs ) . Type } } ( { { . Name } } ) ; args . set ( { { $ index } } , arg { { $ index } } ) ;
2016-09-05 16:07:57 +00:00
{ { end } }
2019-06-27 08:48:13 +00:00
return this . Contract . transact ( opts , "{{.Original.Name}}" , args ) ;
2016-09-05 16:07:57 +00:00
}
2019-06-27 08:48:13 +00:00
{ { end } }
2020-04-15 07:23:58 +00:00
{ { if . Fallback } }
// Fallback is a paid mutator transaction binding the contract fallback function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Fallback.Original.String}}
2020-04-15 07:23:58 +00:00
public Transaction Fallback ( TransactOpts opts , byte [ ] calldata ) throws Exception {
return this . Contract . rawTransact ( opts , calldata ) ;
}
{ { end } }
{ { if . Receive } }
// Receive is a paid mutator transaction binding the contract receive function.
//
2020-05-12 10:21:40 +00:00
// Solidity: {{.Receive.Original.String}}
2020-04-15 07:23:58 +00:00
public Transaction Receive ( TransactOpts opts ) throws Exception {
return this . Contract . rawTransact ( opts , null ) ;
}
{ { end } }
2019-06-27 08:48:13 +00:00
}
2016-09-05 16:07:57 +00:00
{ { end } }
`