// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package contract

import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/juncachain/juncachain"
	"github.com/juncachain/juncachain/accounts/abi"
	"github.com/juncachain/juncachain/accounts/abi/bind"
	"github.com/juncachain/juncachain/common"
	"github.com/juncachain/juncachain/core/types"
	"github.com/juncachain/juncachain/event"
)

// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)

// JRC21IssuerMetaData contains all meta data concerning the JRC21Issuer contract.
var JRC21IssuerMetaData = &bind.MetaData{
	ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"supporter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Charge\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Issue\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"charge\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"gasLeft\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"initialAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"initialBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"}],\"name\":\"issueJRC21PresetFixed\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"}],\"name\":\"issueJRC21PresetMinter\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"issuer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"transferWithPermit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
	Bin: "0x608060405234801561001057600080fd5b5060405161604738038061604783398101604081905261002f91610037565b600055610050565b60006020828403121561004957600080fd5b5051919050565b615fe88061005f6000396000f3fe6080604052600436106200009d5760003560e01c8063657b52141162000060578063657b521414620001b65780636ca7c21614620001cd578063b72f85f914620001e4578063de66341e14620001fb578063fc6bd76a146200021257600080fd5b80630411b25214620000a257806305b0107814620000c957806317bd6a6814620000ee5780634f64b2be146200013b5780635711caaf1462000179575b600080fd5b348015620000af57600080fd5b50620000c7620000c136600462000eae565b62000229565b005b348015620000d657600080fd5b50620000c7620000e836600462000ef5565b6200045c565b348015620000fb57600080fd5b50620001286200010d36600462000e90565b6001600160a01b031660009081526002602052604090205490565b6040519081526020015b60405180910390f35b3480156200014857600080fd5b50620001606200015a366004620010bb565b62000728565b6040516001600160a01b03909116815260200162000132565b3480156200018657600080fd5b50620001606200019836600462000e90565b6001600160a01b039081166000908152600360205260409020541690565b620000c7620001c736600462001036565b6200075b565b348015620001da57600080fd5b5060005462000128565b620000c7620001f536600462000f94565b620008a9565b3480156200020857600080fd5b5060015462000128565b620000c76200022336600462000e90565b620009fd565b600080546001600160a01b0386168252600260205260409091205411620002935760405162461bcd60e51b8152602060048201526019602482015278129490cc8c4819d85cc81a5cc81a5b9cdd59999a58da595b9d603a1b60448201526064015b60405180910390fd5b60405163127e8e4d60e01b81526004810183905281906001600160a01b0386169063127e8e4d9060240160206040518083038186803b158015620002d657600080fd5b505afa158015620002eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003119190620010d5565b14620003505760405162461bcd60e51b815260206004820152600d60248201526c426164204a524332312066656560981b60448201526064016200028a565b600080546001600160a01b03861682526002602052604090912054620003769162000ac4565b6001600160a01b0385166000908152600260205260408082209290925580549151419280156108fc0292909190818181858888f19350505050158015620003c1573d6000803e3d6000fd5b50620003d08433858562000ad9565b6001600160a01b03808516600090815260036020526040902054620003fb9186913391168462000ad9565b6001600160a01b038085166000818152600360205260409081902054905192169133907ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99906200044e9086815260200190565b60405180910390a450505050565b600080546001600160a01b038a168252600260205260409091205411620004c25760405162461bcd60e51b8152602060048201526019602482015278129490cc8c4819d85cc81a5cc81a5b9cdd59999a58da595b9d603a1b60448201526064016200028a565b60405163127e8e4d60e01b81526004810187905285906001600160a01b038a169063127e8e4d9060240160206040518083038186803b1580156200050557600080fd5b505afa1580156200051a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005409190620010d5565b146200057f5760405162461bcd60e51b815260206004820152600d60248201526c426164204a524332312066656560981b60448201526064016200028a565b60006200058d868862001250565b60405163d505accf60e01b8152336004820152306024820152604481018290526064810187905260ff8616608482015260a4810185905260c481018490529091506001600160a01b038a169063d505accf9060e401600060405180830381600087803b158015620005fd57600080fd5b505af115801562000612573d6000803e3d6000fd5b5050600080546001600160a01b038d16825260026020526040909120546200063d9350915062000ac4565b6001600160a01b038a166000908152600260205260408082209290925580549151419280156108fc0292909190818181858888f1935050505015801562000688573d6000803e3d6000fd5b506200069789338a8a62000ad9565b6001600160a01b03808a16600090815260036020526040902054620006c2918b913391168962000ad9565b6001600160a01b03808a166000818152600360205260409081902054905192169133907ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999062000715908b815260200190565b60405180910390a4505050505050505050565b600060018281548110620007405762000740620012ca565b6000918252602090912001546001600160a01b031692915050565b690a968163f0a57b400000341015620007885760405162461bcd60e51b81526004016200028a9062001202565b600084848430856040516200079d9062000db0565b620007ad95949392919062001150565b604051809103906000f080158015620007ca573d6000803e3d6000fd5b50600180548082019091557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0383166001600160a01b0319918216811790925560009182526003602090815260408084208054909316331790925560029052902054909150819062000847903462000b3b565b6001600160a01b0382166000818152600260205260409081902092909255905133907f4b2682685b046a3dae8e75ff49b82fa703e366056a43c6a791411011134f4f5d90620008999034815260200190565b60405180910390a3505050505050565b690a968163f0a57b400000341015620008d65760405162461bcd60e51b81526004016200028a9062001202565b600086868686863087604051620008ed9062000dbe565b620008ff9796959493929190620011a3565b604051809103906000f0801580156200091c573d6000803e3d6000fd5b50600180548082019091557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0383166001600160a01b0319918216811790925560009182526003602090815260408084208054909316331790925560029052902054909150819062000999903462000b3b565b6001600160a01b0382166000818152600260205260409081902092909255905133907f4b2682685b046a3dae8e75ff49b82fa703e366056a43c6a791411011134f4f5d90620009eb9034815260200190565b60405180910390a35050505050505050565b6000341162000a425760405162461bcd60e51b815260206004820152601060248201526f043616e6e6f74207265636861676520360841b60448201526064016200028a565b6001600160a01b03811660009081526002602052604090205462000a67903462000b3b565b6001600160a01b0382166000818152600260205260409081902092909255905133907f5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e069062000ab99034815260200190565b60405180910390a350565b600062000ad282846200126b565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905262000b3590859062000b49565b50505050565b600062000ad2828462001250565b600062000ba0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000c279092919063ffffffff16565b80519091501562000c22578080602001905181019062000bc1919062000f70565b62000c225760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200028a565b505050565b606062000c38848460008562000c40565b949350505050565b60608247101562000ca35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200028a565b843b62000cf35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200028a565b600080866001600160a01b0316858760405162000d1191906200111d565b60006040518083038185875af1925050503d806000811462000d50576040519150601f19603f3d011682016040523d82523d6000602084013e62000d55565b606091505b509150915062000d6782828662000d72565b979650505050505050565b6060831562000d8357508162000ad2565b82511562000d945782518084602001fd5b8160405162461bcd60e51b81526004016200028a91906200113b565b61277980620012f783390190565b6125438062003a7083390190565b80356001600160a01b038116811462000de457600080fd5b919050565b600082601f83011262000dfb57600080fd5b813567ffffffffffffffff8082111562000e195762000e19620012e0565b604051601f8301601f19908116603f0116810190828211818310171562000e445762000e44620012e0565b8160405283815286602085880101111562000e5e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803560ff8116811462000de457600080fd5b60006020828403121562000ea357600080fd5b62000ad28262000dcc565b6000806000806080858703121562000ec557600080fd5b62000ed08562000dcc565b935062000ee06020860162000dcc565b93969395505050506040820135916060013590565b600080600080600080600080610100898b03121562000f1357600080fd5b62000f1e8962000dcc565b975062000f2e60208a0162000dcc565b965060408901359550606089013594506080890135935062000f5360a08a0162000e7e565b925060c0890135915060e089013590509295985092959890939650565b60006020828403121562000f8357600080fd5b8151801515811462000ad257600080fd5b60008060008060008060c0878903121562000fae57600080fd5b863567ffffffffffffffff8082111562000fc757600080fd5b62000fd58a838b0162000de9565b9750602089013591508082111562000fec57600080fd5b5062000ffb89828a0162000de9565b9550506200100c6040880162000e7e565b93506200101c6060880162000dcc565b92506080870135915060a087013590509295509295509295565b600080600080608085870312156200104d57600080fd5b843567ffffffffffffffff808211156200106657600080fd5b620010748883890162000de9565b955060208701359150808211156200108b57600080fd5b506200109a8782880162000de9565b935050620010ab6040860162000e7e565b9396929550929360600135925050565b600060208284031215620010ce57600080fd5b5035919050565b600060208284031215620010e857600080fd5b5051919050565b600081518084526200110981602086016020860162001285565b601f01601f19169290920160200192915050565b600082516200113181846020870162001285565b9190910192915050565b60208152600062000ad26020830184620010ef565b60a0815260006200116560a0830188620010ef565b8281036020840152620011798188620010ef565b60ff96909616604084015250506001600160a01b0392909216606083015260809091015292915050565b60e081526000620011b860e083018a620010ef565b8281036020840152620011cc818a620010ef565b60ff98909816604084015250506001600160a01b0394851660608201526080810193909352921660a082015260c0015292915050565b6020808252602e908201527f35302c30303020746f6b656e73206d757374206265207265636861726765642060408201526d746f206973737565204a5243323160901b606082015260800190565b60008219821115620012665762001266620012b4565b500190565b600082821015620012805762001280620012b4565b500390565b60005b83811015620012a257818101518382015260200162001288565b8381111562000b355750506000910152565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b5060405162002779380380620027798339810160408190526200005a91620004bd565b6040805180820190915260018152603160f81b602082015285908190818786866200008d600033620001fb565b620001fb565b600380546001600160a01b0319166001600160a01b0393909316929092179091556002558151620000c690600790602085019062000360565b508051620000dc90600890602084019062000360565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c052610120525050600a805461ffff191661010060ff8916021790555062000198915060009050620000873390565b620001c47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620001fb565b620001f07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620001fb565b5050505050620005c0565b6200020782826200020b565b5050565b6200022282826200024e60201b62000d031760201c565b60008281526001602090815260409091206200024991839062000d87620002ee821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000207576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002aa3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000305836001600160a01b0384166200030e565b90505b92915050565b6000818152600183016020526040812054620003575750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000308565b50600062000308565b8280546200036e906200056d565b90600052602060002090601f016020900481019282620003925760008555620003dd565b82601f10620003ad57805160ff1916838001178555620003dd565b82800160010185558215620003dd579182015b82811115620003dd578251825591602001919060010190620003c0565b50620003eb929150620003ef565b5090565b5b80821115620003eb5760008155600101620003f0565b600082601f8301126200041857600080fd5b81516001600160401b0380821115620004355762000435620005aa565b604051601f8301601f19908116603f01168101908282118183101715620004605762000460620005aa565b816040528381526020925086838588010111156200047d57600080fd5b600091505b83821015620004a1578582018301518183018401529082019062000482565b83821115620004b35760008385830101525b9695505050505050565b600080600080600060a08688031215620004d657600080fd5b85516001600160401b0380821115620004ee57600080fd5b620004fc89838a0162000406565b965060208801519150808211156200051357600080fd5b50620005228882890162000406565b945050604086015160ff811681146200053a57600080fd5b60608701519093506001600160a01b03811681146200055857600080fd5b80925050608086015190509295509295909350565b600181811c908216806200058257607f821691505b60208210811415620005a457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160601c60e05161010051610120516101405161215b6200061e6000396000610bcd015260006111e801526000611237015260006112120152600061116b01526000611195015260006111bf015261215b6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806342966c6811610125578063a217fddf116100ad578063d505accf1161007c578063d505accf14610462578063d539139314610475578063d547741f1461049c578063dd62ed3e146104af578063e63ab1e9146104e857600080fd5b8063a217fddf14610421578063a457c2d714610429578063a9059cbb1461043c578063ca15c8731461044f57600080fd5b80637ecebe00116100f45780637ecebe00146103d85780638456cb59146103eb5780639010d07c146103f357806391d148541461040657806395d89b411461041957600080fd5b806342966c681461037e5780635c975abb1461039157806370a082311461039c57806379cc6790146103c557600080fd5b80632f2ff15d116101a85780633644e515116101775780633644e5151461033557806336568abe1461033d57806339509351146103505780633f4ba83a1461036357806340c10f191461036b57600080fd5b80632f2ff15d146102ea578063313ce567146102ff57806331ac99201461031c5780633408e4701461032f57600080fd5b806318160ddd116101e457806318160ddd146102875780631d1438481461028f57806323b872dd146102b4578063248a9ca3146102c757600080fd5b806301ffc9a71461021657806306fdde031461023e578063095ea7b314610253578063127e8e4d14610266575b600080fd5b610229610224366004611f1f565b61050f565b60405190151581526020015b60405180910390f35b610246610520565b6040516102359190611fbe565b610229610261366004611e97565b6105b2565b610279610274366004611ec1565b6105c8565b604051908152602001610235565b600654610279565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610235565b6102296102c2366004611de8565b6105e2565b6102796102d5366004611ec1565b60009081526020819052604090206001015490565b6102fd6102f8366004611eda565b610691565b005b600a54610100900460ff1660405160ff9091168152602001610235565b6102fd61032a366004611ec1565b6106bc565b46610279565b610279610723565b6102fd61034b366004611eda565b610732565b61022961035e366004611e97565b6107b0565b6102fd6107ec565b6102fd610379366004611e97565b610888565b6102fd61038c366004611ec1565b610921565b600a5460ff16610229565b6102796103aa366004611d9a565b6001600160a01b031660009081526004602052604090205490565b6102fd6103d3366004611e97565b61092e565b6102796103e6366004611d9a565b6109af565b6102fd6109cd565b61029c610401366004611efd565b610a65565b610229610414366004611eda565b610a84565b610246610aad565b610279600081565b610229610437366004611e97565b610abc565b61022961044a366004611e97565b610b55565b61027961045d366004611ec1565b610b62565b6102fd610470366004611e24565b610b79565b6102797f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102fd6104aa366004611eda565b610cdd565b6102796104bd366004611db5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6102797f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b600061051a82610d9c565b92915050565b60606007805461052f90612082565b80601f016020809104026020016040519081016040528092919081815260200182805461055b90612082565b80156105a85780601f1061057d576101008083540402835291602001916105a8565b820191906000526020600020905b81548152906001019060200180831161058b57829003601f168201915b5050505050905090565b60006105bf338484610dc1565b50600192915050565b60025460009061051a906105dc8484610ee5565b90610ef1565b60006105ef848484610efd565b6001600160a01b0384166000908152600560209081526040808320338452909152902054828110156106795760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106868533858403610dc1565b506001949350505050565b6000828152602081905260409020600101546106ad81336110d8565b6106b7838361113c565b505050565b6106c7600033610a84565b61071e5760405162461bcd60e51b815260206004820152602260248201527f4a524332313a206d75737420686176652061646d696e20726f6c6520746f2073604482015261195d60f21b6064820152608401610670565b600255565b600061072d61115e565b905090565b6001600160a01b03811633146107a25760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610670565b6107ac8282611285565b5050565b3360008181526005602090815260408083206001600160a01b038716845290915281205490916105bf9185906107e7908690611ff1565b610dc1565b6108167f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610a84565b61087e5760405162461bcd60e51b815260206004820152603360248201527f4a524332315072657365744d696e7465723a206d75737420686176652070617560448201527273657220726f6c6520746f20756e706175736560681b6064820152608401610670565b6108866112a7565b565b6108b27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610a84565b6109175760405162461bcd60e51b815260206004820152603060248201527f4a524332315072657365744d696e7465723a206d7573742068617665206d696e60448201526f1d195c881c9bdb19481d1bc81b5a5b9d60821b6064820152608401610670565b6107ac828261133a565b61092b3382611425565b50565b600061093a83336104bd565b9050818110156109985760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610670565b6109a58333848403610dc1565b6106b78383611425565b6001600160a01b03811660009081526009602052604081205461051a565b6109f77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610a84565b610a5d5760405162461bcd60e51b815260206004820152603160248201527f4a524332315072657365744d696e7465723a206d75737420686176652070617560448201527073657220726f6c6520746f20706175736560781b6064820152608401610670565b61088661157f565b6000828152600160205260408120610a7d90836115fa565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606008805461052f90612082565b3360009081526005602090815260408083206001600160a01b038616845290915281205482811015610b3e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610670565b610b4b3385858403610dc1565b5060019392505050565b60006105bf338484610efd565b600081815260016020526040812061051a90611606565b83421115610bc95760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610670565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610bf88c611610565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610c5382611638565b90506000610c6382878787611686565b9050896001600160a01b0316816001600160a01b031614610cc65760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610670565b610cd18a8a8a610dc1565b50505050505050505050565b600082815260208190526040902060010154610cf981336110d8565b6106b78383611285565b610d0d8282610a84565b6107ac576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610d433390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610a7d836001600160a01b0384166116ae565b60006001600160e01b03198216635a05180f60e01b148061051a575061051a826116fd565b6001600160a01b038316610e235760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610670565b6001600160a01b038216610e845760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610670565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610a7d8284612009565b6000610a7d8284611ff1565b6001600160a01b038316610f615760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610670565b6001600160a01b038216610fc35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610670565b610fce838383611732565b6001600160a01b038316600090815260046020526040902054818110156110465760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610670565b6001600160a01b0380851660009081526004602052604080822085850390559185168152908120805484929061107d908490611ff1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516110c991815260200190565b60405180910390a35b50505050565b6110e28282610a84565b6107ac576110fa816001600160a01b0316601461173d565b61110583602061173d565b604051602001611116929190611f49565b60408051601f198184030181529082905262461bcd60e51b825261067091600401611fbe565b6111468282610d03565b60008281526001602052604090206106b79082610d87565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156111b757507f000000000000000000000000000000000000000000000000000000000000000046145b156111e157507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b61128f82826118d9565b60008281526001602052604090206106b7908261193e565b600a5460ff166112f05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610670565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166113905760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610670565b61139c60008383611732565b80600660008282546113ae9190611ff1565b90915550506001600160a01b038216600090815260046020526040812080548392906113db908490611ff1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166114855760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610670565b61149182600083611732565b6001600160a01b038216600090815260046020526040902054818110156115055760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610670565b6001600160a01b0383166000908152600460205260408120838303905560068054849290611534908490612028565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600a5460ff16156115c55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610670565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861131d3390565b6000610a7d8383611953565b600061051a825490565b6001600160a01b03811660009081526009602052604090208054600181018255905b50919050565b600061051a61164561115e565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006116978787878761197d565b915091506116a481611a6a565b5095945050505050565b60008181526001830160205260408120546116f55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561051a565b50600061051a565b60006001600160e01b03198216637965db0b60e01b148061051a57506301ffc9a760e01b6001600160e01b031983161461051a565b6106b7838383611c25565b6060600061174c836002612009565b611757906002611ff1565b67ffffffffffffffff81111561176f5761176f61210f565b6040519080825280601f01601f191660200182016040528015611799576020820181803683370190505b509050600360fc1b816000815181106117b4576117b46120f9565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117e3576117e36120f9565b60200101906001600160f81b031916908160001a9053506000611807846002612009565b611812906001611ff1565b90505b600181111561188a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611846576118466120f9565b1a60f81b82828151811061185c5761185c6120f9565b60200101906001600160f81b031916908160001a90535060049490941c936118838161206b565b9050611815565b508315610a7d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610670565b6118e38282610a84565b156107ac576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a7d836001600160a01b038416611c8b565b600082600001828154811061196a5761196a6120f9565b9060005260206000200154905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156119b45750600090506003611a61565b8460ff16601b141580156119cc57508460ff16601c14155b156119dd5750600090506004611a61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a5a57600060019250925050611a61565b9150600090505b94509492505050565b6000816004811115611a7e57611a7e6120cd565b1415611a875750565b6001816004811115611a9b57611a9b6120cd565b1415611ae95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610670565b6002816004811115611afd57611afd6120cd565b1415611b4b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610670565b6003816004811115611b5f57611b5f6120cd565b1415611bb85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610670565b6004816004811115611bcc57611bcc6120cd565b141561092b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610670565b600a5460ff16156106b75760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610670565b60008181526001830160205260408120548015611d74576000611caf600183612028565b8554909150600090611cc390600190612028565b9050818114611d28576000866000018281548110611ce357611ce36120f9565b9060005260206000200154905080876000018481548110611d0657611d066120f9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d3957611d396120e3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061051a565b600091505061051a565b80356001600160a01b0381168114611d9557600080fd5b919050565b600060208284031215611dac57600080fd5b610a7d82611d7e565b60008060408385031215611dc857600080fd5b611dd183611d7e565b9150611ddf60208401611d7e565b90509250929050565b600080600060608486031215611dfd57600080fd5b611e0684611d7e565b9250611e1460208501611d7e565b9150604084013590509250925092565b600080600080600080600060e0888a031215611e3f57600080fd5b611e4888611d7e565b9650611e5660208901611d7e565b95506040880135945060608801359350608088013560ff81168114611e7a57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611eaa57600080fd5b611eb383611d7e565b946020939093013593505050565b600060208284031215611ed357600080fd5b5035919050565b60008060408385031215611eed57600080fd5b82359150611ddf60208401611d7e565b60008060408385031215611f1057600080fd5b50508035926020909101359150565b600060208284031215611f3157600080fd5b81356001600160e01b031981168114610a7d57600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611f8181601785016020880161203f565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611fb281602884016020880161203f565b01602801949350505050565b6020815260008251806020840152611fdd81604085016020870161203f565b601f01601f19169190910160400192915050565b60008219821115612004576120046120b7565b500190565b6000816000190483118215151615612023576120236120b7565b500290565b60008282101561203a5761203a6120b7565b500390565b60005b8381101561205a578181015183820152602001612042565b838111156110d25750506000910152565b60008161207a5761207a6120b7565b506000190190565b600181811c9082168061209657607f821691505b6020821081141561163257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220bba08f00fc3afdb5b1640e013e2888f9b8168b2b4f8c1b188dd677150f75278964736f6c634300080700336101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b5060405162002543380380620025438339810160408190526200005a916200064b565b6040805180820190915260018152603160f81b602082015287908190818986866200008d600033620001dd565b620001dd565b600380546001600160a01b0319166001600160a01b0393909316929092179091556002558151620000c6906007906020850190620004d1565b508051620000dc906008906020840190620004d1565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c052610120525050600a805461ffff191661010060ff8b16021790555062000198915060009050620000873390565b620001c47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620001dd565b620001d08484620001ed565b5050505050505062000781565b620001e98282620002e4565b5050565b6001600160a01b038216620002495760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620002576000838362000327565b80600660008282546200026b919062000707565b90915550506001600160a01b038216600090815260046020526040812080548392906200029a90849062000707565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b620002fb82826200033f60201b62000b4e1760201c565b60008281526001602090815260409091206200032291839062000bd2620003df821b17901c565b505050565b62000322838383620003ff60201b62000be71760201c565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001e9576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200039b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000620003f6836001600160a01b0384166200047f565b90505b92915050565b620004178383836200032260201b6200062b1760201c565b600a5460ff1615620003225760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b606482015260840162000240565b6000818152600183016020526040812054620004c857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003f9565b506000620003f9565b828054620004df906200072e565b90600052602060002090601f0160209004810192826200050357600085556200054e565b82601f106200051e57805160ff19168380011785556200054e565b828001600101855582156200054e579182015b828111156200054e57825182559160200191906001019062000531565b506200055c92915062000560565b5090565b5b808211156200055c576000815560010162000561565b80516001600160a01b03811681146200058f57600080fd5b919050565b600082601f830112620005a657600080fd5b81516001600160401b0380821115620005c357620005c36200076b565b604051601f8301601f19908116603f01168101908282118183101715620005ee57620005ee6200076b565b816040528381526020925086838588010111156200060b57600080fd5b600091505b838210156200062f578582018301518183018401529082019062000610565b83821115620006415760008385830101525b9695505050505050565b600080600080600080600060e0888a0312156200066757600080fd5b87516001600160401b03808211156200067f57600080fd5b6200068d8b838c0162000594565b985060208a0151915080821115620006a457600080fd5b50620006b38a828b0162000594565b965050604088015160ff81168114620006cb57600080fd5b9450620006db6060890162000577565b935060808801519250620006f260a0890162000577565b915060c0880151905092959891949750929550565b600082198211156200072957634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200074357607f821691505b602082108114156200076557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160601c60e051610100516101205161014051611d64620007df6000396000610a1801526000611099015260006110e8015260006110c30152600061101c01526000611046015260006110700152611d646000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80633f4ba83a1161010f578063a217fddf116100a2578063d505accf11610071578063d505accf146103fd578063d547741f14610410578063dd62ed3e14610423578063e63ab1e91461045c57600080fd5b8063a217fddf146103bc578063a457c2d7146103c4578063a9059cbb146103d7578063ca15c873146103ea57600080fd5b80638456cb59116100de5780638456cb59146103865780639010d07c1461038e57806391d14854146103a157806395d89b41146103b457600080fd5b80633f4ba83a146103375780635c975abb1461033f57806370a082311461034a5780637ecebe001461037357600080fd5b8063248a9ca3116101875780633408e470116101565780633408e470146103035780633644e5151461030957806336568abe14610311578063395093511461032457600080fd5b8063248a9ca31461029b5780632f2ff15d146102be578063313ce567146102d357806331ac9920146102f057600080fd5b8063127e8e4d116101c3578063127e8e4d1461023a57806318160ddd1461025b5780631d1438481461026357806323b872dd1461028857600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063095ea7b314610227575b600080fd5b6101fd6101f8366004611b28565b610483565b60405190151581526020015b60405180910390f35b61021a610494565b6040516102099190611bc7565b6101fd610235366004611aa0565b610526565b61024d610248366004611aca565b61053c565b604051908152602001610209565b60065461024d565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610209565b6101fd6102963660046119f1565b610556565b61024d6102a9366004611aca565b60009081526020819052604090206001015490565b6102d16102cc366004611ae3565b610605565b005b600a54610100900460ff1660405160ff9091168152602001610209565b6102d16102fe366004611aca565b610630565b4661024d565b61024d610697565b6102d161031f366004611ae3565b6106a6565b6101fd610332366004611aa0565b610724565b6102d1610760565b600a5460ff166101fd565b61024d6103583660046119a3565b6001600160a01b031660009081526004602052604090205490565b61024d6103813660046119a3565b6107fb565b6102d1610819565b61027061039c366004611b06565b6108b0565b6101fd6103af366004611ae3565b6108cf565b61021a6108f8565b61024d600081565b6101fd6103d2366004611aa0565b610907565b6101fd6103e5366004611aa0565b6109a0565b61024d6103f8366004611aca565b6109ad565b6102d161040b366004611a2d565b6109c4565b6102d161041e366004611ae3565b610b28565b61024d6104313660046119be565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b61024d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b600061048e82610c4d565b92915050565b6060600780546104a390611c8b565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf90611c8b565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b6000610533338484610c72565b50600192915050565b60025460009061048e906105508484610d96565b90610da2565b6000610563848484610dae565b6001600160a01b0384166000908152600560209081526040808320338452909152902054828110156105ed5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105fa8533858403610c72565b506001949350505050565b6000828152602081905260409020600101546106218133610f89565b61062b8383610fed565b505050565b61063b6000336108cf565b6106925760405162461bcd60e51b815260206004820152602260248201527f4a524332313a206d75737420686176652061646d696e20726f6c6520746f2073604482015261195d60f21b60648201526084016105e4565b600255565b60006106a161100f565b905090565b6001600160a01b03811633146107165760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105e4565b6107208282611136565b5050565b3360008181526005602090815260408083206001600160a01b0387168452909152812054909161053391859061075b908690611bfa565b610c72565b61078a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336108cf565b6107f15760405162461bcd60e51b815260206004820152603260248201527f4a5243323150726573657446697865643a206d75737420686176652070617573604482015271657220726f6c6520746f20756e706175736560701b60648201526084016105e4565b6107f9611158565b565b6001600160a01b03811660009081526009602052604081205461048e565b6108437f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336108cf565b6108a85760405162461bcd60e51b815260206004820152603060248201527f4a5243323150726573657446697865643a206d7573742068617665207061757360448201526f657220726f6c6520746f20706175736560801b60648201526084016105e4565b6107f96111eb565b60008281526001602052604081206108c89083611266565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600880546104a390611c8b565b3360009081526005602090815260408083206001600160a01b0386168452909152812054828110156109895760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105e4565b6109963385858403610c72565b5060019392505050565b6000610533338484610dae565b600081815260016020526040812061048e90611272565b83421115610a145760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105e4565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610a438c61127c565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a9e826112a4565b90506000610aae828787876112f2565b9050896001600160a01b0316816001600160a01b031614610b115760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105e4565b610b1c8a8a8a610c72565b50505050505050505050565b600082815260208190526040902060010154610b448133610f89565b61062b8383611136565b610b5882826108cf565b610720576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610b8e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006108c8836001600160a01b03841661131a565b600a5460ff161561062b5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105e4565b60006001600160e01b03198216635a05180f60e01b148061048e575061048e82611369565b6001600160a01b038316610cd45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105e4565b6001600160a01b038216610d355760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105e4565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006108c88284611c12565b60006108c88284611bfa565b6001600160a01b038316610e125760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105e4565b6001600160a01b038216610e745760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105e4565b610e7f83838361139e565b6001600160a01b03831660009081526004602052604090205481811015610ef75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105e4565b6001600160a01b03808516600090815260046020526040808220858503905591851681529081208054849290610f2e908490611bfa565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f7a91815260200190565b60405180910390a35b50505050565b610f9382826108cf565b61072057610fab816001600160a01b031660146113a9565b610fb68360206113a9565b604051602001610fc7929190611b52565b60408051601f198184030181529082905262461bcd60e51b82526105e491600401611bc7565b610ff78282610b4e565b600082815260016020526040902061062b9082610bd2565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561106857507f000000000000000000000000000000000000000000000000000000000000000046145b1561109257507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6111408282611545565b600082815260016020526040902061062b90826115aa565b600a5460ff166111a15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105e4565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a5460ff16156112315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105e4565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111ce3390565b60006108c883836115bf565b600061048e825490565b6001600160a01b03811660009081526009602052604090208054600181018255905b50919050565b600061048e6112b161100f565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611303878787876115e9565b91509150611310816116d6565b5095945050505050565b60008181526001830160205260408120546113615750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561048e565b50600061048e565b60006001600160e01b03198216637965db0b60e01b148061048e57506301ffc9a760e01b6001600160e01b031983161461048e565b61062b838383610be7565b606060006113b8836002611c12565b6113c3906002611bfa565b67ffffffffffffffff8111156113db576113db611d18565b6040519080825280601f01601f191660200182016040528015611405576020820181803683370190505b509050600360fc1b8160008151811061142057611420611d02565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061144f5761144f611d02565b60200101906001600160f81b031916908160001a9053506000611473846002611c12565b61147e906001611bfa565b90505b60018111156114f6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106114b2576114b2611d02565b1a60f81b8282815181106114c8576114c8611d02565b60200101906001600160f81b031916908160001a90535060049490941c936114ef81611c74565b9050611481565b5083156108c85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105e4565b61154f82826108cf565b15610720576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006108c8836001600160a01b038416611894565b60008260000182815481106115d6576115d6611d02565b9060005260206000200154905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561162057506000905060036116cd565b8460ff16601b1415801561163857508460ff16601c14155b1561164957506000905060046116cd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561169d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166116c6576000600192509250506116cd565b9150600090505b94509492505050565b60008160048111156116ea576116ea611cd6565b14156116f35750565b600181600481111561170757611707611cd6565b14156117555760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105e4565b600281600481111561176957611769611cd6565b14156117b75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105e4565b60038160048111156117cb576117cb611cd6565b14156118245760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105e4565b600481600481111561183857611838611cd6565b14156118915760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105e4565b50565b6000818152600183016020526040812054801561197d5760006118b8600183611c31565b85549091506000906118cc90600190611c31565b90508181146119315760008660000182815481106118ec576118ec611d02565b906000526020600020015490508087600001848154811061190f5761190f611d02565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061194257611942611cec565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061048e565b600091505061048e565b80356001600160a01b038116811461199e57600080fd5b919050565b6000602082840312156119b557600080fd5b6108c882611987565b600080604083850312156119d157600080fd5b6119da83611987565b91506119e860208401611987565b90509250929050565b600080600060608486031215611a0657600080fd5b611a0f84611987565b9250611a1d60208501611987565b9150604084013590509250925092565b600080600080600080600060e0888a031215611a4857600080fd5b611a5188611987565b9650611a5f60208901611987565b95506040880135945060608801359350608088013560ff81168114611a8357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611ab357600080fd5b611abc83611987565b946020939093013593505050565b600060208284031215611adc57600080fd5b5035919050565b60008060408385031215611af657600080fd5b823591506119e860208401611987565b60008060408385031215611b1957600080fd5b50508035926020909101359150565b600060208284031215611b3a57600080fd5b81356001600160e01b0319811681146108c857600080fd5b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611b8a816017850160208801611c48565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611bbb816028840160208801611c48565b01602801949350505050565b6020815260008251806020840152611be6816040850160208701611c48565b601f01601f19169190910160400192915050565b60008219821115611c0d57611c0d611cc0565b500190565b6000816000190483118215151615611c2c57611c2c611cc0565b500290565b600082821015611c4357611c43611cc0565b500390565b60005b83811015611c63578181015183820152602001611c4b565b83811115610f835750506000910152565b600081611c8357611c83611cc0565b506000190190565b600181811c90821680611c9f57607f821691505b6020821081141561129e57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220edce605dd60293197884811144d10f2b2269075f6783e10f2fdec9ba915086b664736f6c63430008070033a2646970667358221220d52ae4dbd59de7f993e3af0bf9f41f5fa2117f2df5dc732a191897f6ce02044364736f6c63430008070033",
}

// JRC21IssuerABI is the input ABI used to generate the binding from.
// Deprecated: Use JRC21IssuerMetaData.ABI instead.
var JRC21IssuerABI = JRC21IssuerMetaData.ABI

// JRC21IssuerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use JRC21IssuerMetaData.Bin instead.
var JRC21IssuerBin = JRC21IssuerMetaData.Bin

// DeployJRC21Issuer deploys a new Ethereum contract, binding an instance of JRC21Issuer to it.
func DeployJRC21Issuer(auth *bind.TransactOpts, backend bind.ContractBackend, value *big.Int) (common.Address, *types.Transaction, *JRC21Issuer, error) {
	parsed, err := JRC21IssuerMetaData.GetAbi()
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	if parsed == nil {
		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
	}

	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(JRC21IssuerBin), backend, value)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &JRC21Issuer{JRC21IssuerCaller: JRC21IssuerCaller{contract: contract}, JRC21IssuerTransactor: JRC21IssuerTransactor{contract: contract}, JRC21IssuerFilterer: JRC21IssuerFilterer{contract: contract}}, nil
}

// JRC21Issuer is an auto generated Go binding around an Ethereum contract.
type JRC21Issuer struct {
	JRC21IssuerCaller     // Read-only binding to the contract
	JRC21IssuerTransactor // Write-only binding to the contract
	JRC21IssuerFilterer   // Log filterer for contract events
}

// JRC21IssuerCaller is an auto generated read-only Go binding around an Ethereum contract.
type JRC21IssuerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// JRC21IssuerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type JRC21IssuerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// JRC21IssuerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type JRC21IssuerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// JRC21IssuerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type JRC21IssuerSession struct {
	Contract     *JRC21Issuer      // 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
}

// JRC21IssuerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type JRC21IssuerCallerSession struct {
	Contract *JRC21IssuerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}

// JRC21IssuerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type JRC21IssuerTransactorSession struct {
	Contract     *JRC21IssuerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}

// JRC21IssuerRaw is an auto generated low-level Go binding around an Ethereum contract.
type JRC21IssuerRaw struct {
	Contract *JRC21Issuer // Generic contract binding to access the raw methods on
}

// JRC21IssuerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type JRC21IssuerCallerRaw struct {
	Contract *JRC21IssuerCaller // Generic read-only contract binding to access the raw methods on
}

// JRC21IssuerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type JRC21IssuerTransactorRaw struct {
	Contract *JRC21IssuerTransactor // Generic write-only contract binding to access the raw methods on
}

// NewJRC21Issuer creates a new instance of JRC21Issuer, bound to a specific deployed contract.
func NewJRC21Issuer(address common.Address, backend bind.ContractBackend) (*JRC21Issuer, error) {
	contract, err := bindJRC21Issuer(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &JRC21Issuer{JRC21IssuerCaller: JRC21IssuerCaller{contract: contract}, JRC21IssuerTransactor: JRC21IssuerTransactor{contract: contract}, JRC21IssuerFilterer: JRC21IssuerFilterer{contract: contract}}, nil
}

// NewJRC21IssuerCaller creates a new read-only instance of JRC21Issuer, bound to a specific deployed contract.
func NewJRC21IssuerCaller(address common.Address, caller bind.ContractCaller) (*JRC21IssuerCaller, error) {
	contract, err := bindJRC21Issuer(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerCaller{contract: contract}, nil
}

// NewJRC21IssuerTransactor creates a new write-only instance of JRC21Issuer, bound to a specific deployed contract.
func NewJRC21IssuerTransactor(address common.Address, transactor bind.ContractTransactor) (*JRC21IssuerTransactor, error) {
	contract, err := bindJRC21Issuer(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerTransactor{contract: contract}, nil
}

// NewJRC21IssuerFilterer creates a new log filterer instance of JRC21Issuer, bound to a specific deployed contract.
func NewJRC21IssuerFilterer(address common.Address, filterer bind.ContractFilterer) (*JRC21IssuerFilterer, error) {
	contract, err := bindJRC21Issuer(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerFilterer{contract: contract}, nil
}

// bindJRC21Issuer binds a generic wrapper to an already deployed contract.
func bindJRC21Issuer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(JRC21IssuerABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// 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.
func (_JRC21Issuer *JRC21IssuerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _JRC21Issuer.Contract.JRC21IssuerCaller.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 (_JRC21Issuer *JRC21IssuerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.JRC21IssuerTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_JRC21Issuer *JRC21IssuerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.JRC21IssuerTransactor.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.
func (_JRC21Issuer *JRC21IssuerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _JRC21Issuer.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 (_JRC21Issuer *JRC21IssuerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_JRC21Issuer *JRC21IssuerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.contract.Transact(opts, method, params...)
}

// Gas is a free data retrieval call binding the contract method 0x6ca7c216.
//
// Solidity: function gas() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCaller) Gas(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _JRC21Issuer.contract.Call(opts, &out, "gas")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// Gas is a free data retrieval call binding the contract method 0x6ca7c216.
//
// Solidity: function gas() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerSession) Gas() (*big.Int, error) {
	return _JRC21Issuer.Contract.Gas(&_JRC21Issuer.CallOpts)
}

// Gas is a free data retrieval call binding the contract method 0x6ca7c216.
//
// Solidity: function gas() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCallerSession) Gas() (*big.Int, error) {
	return _JRC21Issuer.Contract.Gas(&_JRC21Issuer.CallOpts)
}

// GasLeft is a free data retrieval call binding the contract method 0x17bd6a68.
//
// Solidity: function gasLeft(address token) view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCaller) GasLeft(opts *bind.CallOpts, token common.Address) (*big.Int, error) {
	var out []interface{}
	err := _JRC21Issuer.contract.Call(opts, &out, "gasLeft", token)

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GasLeft is a free data retrieval call binding the contract method 0x17bd6a68.
//
// Solidity: function gasLeft(address token) view returns(uint256)
func (_JRC21Issuer *JRC21IssuerSession) GasLeft(token common.Address) (*big.Int, error) {
	return _JRC21Issuer.Contract.GasLeft(&_JRC21Issuer.CallOpts, token)
}

// GasLeft is a free data retrieval call binding the contract method 0x17bd6a68.
//
// Solidity: function gasLeft(address token) view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCallerSession) GasLeft(token common.Address) (*big.Int, error) {
	return _JRC21Issuer.Contract.GasLeft(&_JRC21Issuer.CallOpts, token)
}

// Issuer is a free data retrieval call binding the contract method 0x5711caaf.
//
// Solidity: function issuer(address token) view returns(address)
func (_JRC21Issuer *JRC21IssuerCaller) Issuer(opts *bind.CallOpts, token common.Address) (common.Address, error) {
	var out []interface{}
	err := _JRC21Issuer.contract.Call(opts, &out, "issuer", token)

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Issuer is a free data retrieval call binding the contract method 0x5711caaf.
//
// Solidity: function issuer(address token) view returns(address)
func (_JRC21Issuer *JRC21IssuerSession) Issuer(token common.Address) (common.Address, error) {
	return _JRC21Issuer.Contract.Issuer(&_JRC21Issuer.CallOpts, token)
}

// Issuer is a free data retrieval call binding the contract method 0x5711caaf.
//
// Solidity: function issuer(address token) view returns(address)
func (_JRC21Issuer *JRC21IssuerCallerSession) Issuer(token common.Address) (common.Address, error) {
	return _JRC21Issuer.Contract.Issuer(&_JRC21Issuer.CallOpts, token)
}

// TokenLength is a free data retrieval call binding the contract method 0xde66341e.
//
// Solidity: function tokenLength() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCaller) TokenLength(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _JRC21Issuer.contract.Call(opts, &out, "tokenLength")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// TokenLength is a free data retrieval call binding the contract method 0xde66341e.
//
// Solidity: function tokenLength() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerSession) TokenLength() (*big.Int, error) {
	return _JRC21Issuer.Contract.TokenLength(&_JRC21Issuer.CallOpts)
}

// TokenLength is a free data retrieval call binding the contract method 0xde66341e.
//
// Solidity: function tokenLength() view returns(uint256)
func (_JRC21Issuer *JRC21IssuerCallerSession) TokenLength() (*big.Int, error) {
	return _JRC21Issuer.Contract.TokenLength(&_JRC21Issuer.CallOpts)
}

// Tokens is a free data retrieval call binding the contract method 0x4f64b2be.
//
// Solidity: function tokens(uint256 index) view returns(address)
func (_JRC21Issuer *JRC21IssuerCaller) Tokens(opts *bind.CallOpts, index *big.Int) (common.Address, error) {
	var out []interface{}
	err := _JRC21Issuer.contract.Call(opts, &out, "tokens", index)

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Tokens is a free data retrieval call binding the contract method 0x4f64b2be.
//
// Solidity: function tokens(uint256 index) view returns(address)
func (_JRC21Issuer *JRC21IssuerSession) Tokens(index *big.Int) (common.Address, error) {
	return _JRC21Issuer.Contract.Tokens(&_JRC21Issuer.CallOpts, index)
}

// Tokens is a free data retrieval call binding the contract method 0x4f64b2be.
//
// Solidity: function tokens(uint256 index) view returns(address)
func (_JRC21Issuer *JRC21IssuerCallerSession) Tokens(index *big.Int) (common.Address, error) {
	return _JRC21Issuer.Contract.Tokens(&_JRC21Issuer.CallOpts, index)
}

// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
//
// Solidity: function charge(address token) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactor) Charge(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
	return _JRC21Issuer.contract.Transact(opts, "charge", token)
}

// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
//
// Solidity: function charge(address token) payable returns()
func (_JRC21Issuer *JRC21IssuerSession) Charge(token common.Address) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.Charge(&_JRC21Issuer.TransactOpts, token)
}

// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
//
// Solidity: function charge(address token) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactorSession) Charge(token common.Address) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.Charge(&_JRC21Issuer.TransactOpts, token)
}

// IssueJRC21PresetFixed is a paid mutator transaction binding the contract method 0xb72f85f9.
//
// Solidity: function issueJRC21PresetFixed(string name, string symbol, uint8 decimals_, address initialAccount, uint256 initialBalance, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactor) IssueJRC21PresetFixed(opts *bind.TransactOpts, name string, symbol string, decimals_ uint8, initialAccount common.Address, initialBalance *big.Int, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.contract.Transact(opts, "issueJRC21PresetFixed", name, symbol, decimals_, initialAccount, initialBalance, minFee)
}

// IssueJRC21PresetFixed is a paid mutator transaction binding the contract method 0xb72f85f9.
//
// Solidity: function issueJRC21PresetFixed(string name, string symbol, uint8 decimals_, address initialAccount, uint256 initialBalance, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerSession) IssueJRC21PresetFixed(name string, symbol string, decimals_ uint8, initialAccount common.Address, initialBalance *big.Int, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.IssueJRC21PresetFixed(&_JRC21Issuer.TransactOpts, name, symbol, decimals_, initialAccount, initialBalance, minFee)
}

// IssueJRC21PresetFixed is a paid mutator transaction binding the contract method 0xb72f85f9.
//
// Solidity: function issueJRC21PresetFixed(string name, string symbol, uint8 decimals_, address initialAccount, uint256 initialBalance, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactorSession) IssueJRC21PresetFixed(name string, symbol string, decimals_ uint8, initialAccount common.Address, initialBalance *big.Int, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.IssueJRC21PresetFixed(&_JRC21Issuer.TransactOpts, name, symbol, decimals_, initialAccount, initialBalance, minFee)
}

// IssueJRC21PresetMinter is a paid mutator transaction binding the contract method 0x657b5214.
//
// Solidity: function issueJRC21PresetMinter(string name, string symbol, uint8 decimals_, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactor) IssueJRC21PresetMinter(opts *bind.TransactOpts, name string, symbol string, decimals_ uint8, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.contract.Transact(opts, "issueJRC21PresetMinter", name, symbol, decimals_, minFee)
}

// IssueJRC21PresetMinter is a paid mutator transaction binding the contract method 0x657b5214.
//
// Solidity: function issueJRC21PresetMinter(string name, string symbol, uint8 decimals_, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerSession) IssueJRC21PresetMinter(name string, symbol string, decimals_ uint8, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.IssueJRC21PresetMinter(&_JRC21Issuer.TransactOpts, name, symbol, decimals_, minFee)
}

// IssueJRC21PresetMinter is a paid mutator transaction binding the contract method 0x657b5214.
//
// Solidity: function issueJRC21PresetMinter(string name, string symbol, uint8 decimals_, uint256 minFee) payable returns()
func (_JRC21Issuer *JRC21IssuerTransactorSession) IssueJRC21PresetMinter(name string, symbol string, decimals_ uint8, minFee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.IssueJRC21PresetMinter(&_JRC21Issuer.TransactOpts, name, symbol, decimals_, minFee)
}

// Transfer is a paid mutator transaction binding the contract method 0x0411b252.
//
// Solidity: function transfer(address token, address recipient, uint256 value, uint256 fee) returns()
func (_JRC21Issuer *JRC21IssuerTransactor) Transfer(opts *bind.TransactOpts, token common.Address, recipient common.Address, value *big.Int, fee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.contract.Transact(opts, "transfer", token, recipient, value, fee)
}

// Transfer is a paid mutator transaction binding the contract method 0x0411b252.
//
// Solidity: function transfer(address token, address recipient, uint256 value, uint256 fee) returns()
func (_JRC21Issuer *JRC21IssuerSession) Transfer(token common.Address, recipient common.Address, value *big.Int, fee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.Transfer(&_JRC21Issuer.TransactOpts, token, recipient, value, fee)
}

// Transfer is a paid mutator transaction binding the contract method 0x0411b252.
//
// Solidity: function transfer(address token, address recipient, uint256 value, uint256 fee) returns()
func (_JRC21Issuer *JRC21IssuerTransactorSession) Transfer(token common.Address, recipient common.Address, value *big.Int, fee *big.Int) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.Transfer(&_JRC21Issuer.TransactOpts, token, recipient, value, fee)
}

// TransferWithPermit is a paid mutator transaction binding the contract method 0x05b01078.
//
// Solidity: function transferWithPermit(address token, address recipient, uint256 value, uint256 fee, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
func (_JRC21Issuer *JRC21IssuerTransactor) TransferWithPermit(opts *bind.TransactOpts, token common.Address, recipient common.Address, value *big.Int, fee *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _JRC21Issuer.contract.Transact(opts, "transferWithPermit", token, recipient, value, fee, deadline, v, r, s)
}

// TransferWithPermit is a paid mutator transaction binding the contract method 0x05b01078.
//
// Solidity: function transferWithPermit(address token, address recipient, uint256 value, uint256 fee, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
func (_JRC21Issuer *JRC21IssuerSession) TransferWithPermit(token common.Address, recipient common.Address, value *big.Int, fee *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.TransferWithPermit(&_JRC21Issuer.TransactOpts, token, recipient, value, fee, deadline, v, r, s)
}

// TransferWithPermit is a paid mutator transaction binding the contract method 0x05b01078.
//
// Solidity: function transferWithPermit(address token, address recipient, uint256 value, uint256 fee, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
func (_JRC21Issuer *JRC21IssuerTransactorSession) TransferWithPermit(token common.Address, recipient common.Address, value *big.Int, fee *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _JRC21Issuer.Contract.TransferWithPermit(&_JRC21Issuer.TransactOpts, token, recipient, value, fee, deadline, v, r, s)
}

// JRC21IssuerChargeIterator is returned from FilterCharge and is used to iterate over the raw logs and unpacked data for Charge events raised by the JRC21Issuer contract.
type JRC21IssuerChargeIterator struct {
	Event *JRC21IssuerCharge // 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 *JRC21IssuerChargeIterator) 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(JRC21IssuerCharge)
			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(JRC21IssuerCharge)
		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 *JRC21IssuerChargeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *JRC21IssuerChargeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// JRC21IssuerCharge represents a Charge event raised by the JRC21Issuer contract.
type JRC21IssuerCharge struct {
	Supporter common.Address
	Token     common.Address
	Value     *big.Int
	Raw       types.Log // Blockchain specific contextual infos
}

// FilterCharge is a free log retrieval operation binding the contract event 0x5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e06.
//
// Solidity: event Charge(address indexed supporter, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) FilterCharge(opts *bind.FilterOpts, supporter []common.Address, token []common.Address) (*JRC21IssuerChargeIterator, error) {

	var supporterRule []interface{}
	for _, supporterItem := range supporter {
		supporterRule = append(supporterRule, supporterItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}

	logs, sub, err := _JRC21Issuer.contract.FilterLogs(opts, "Charge", supporterRule, tokenRule)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerChargeIterator{contract: _JRC21Issuer.contract, event: "Charge", logs: logs, sub: sub}, nil
}

// WatchCharge is a free log subscription operation binding the contract event 0x5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e06.
//
// Solidity: event Charge(address indexed supporter, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) WatchCharge(opts *bind.WatchOpts, sink chan<- *JRC21IssuerCharge, supporter []common.Address, token []common.Address) (event.Subscription, error) {

	var supporterRule []interface{}
	for _, supporterItem := range supporter {
		supporterRule = append(supporterRule, supporterItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}

	logs, sub, err := _JRC21Issuer.contract.WatchLogs(opts, "Charge", supporterRule, tokenRule)
	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(JRC21IssuerCharge)
				if err := _JRC21Issuer.contract.UnpackLog(event, "Charge", 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
}

// ParseCharge is a log parse operation binding the contract event 0x5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e06.
//
// Solidity: event Charge(address indexed supporter, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) ParseCharge(log types.Log) (*JRC21IssuerCharge, error) {
	event := new(JRC21IssuerCharge)
	if err := _JRC21Issuer.contract.UnpackLog(event, "Charge", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// JRC21IssuerFeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the JRC21Issuer contract.
type JRC21IssuerFeeIterator struct {
	Event *JRC21IssuerFee // 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 *JRC21IssuerFeeIterator) 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(JRC21IssuerFee)
			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(JRC21IssuerFee)
		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 *JRC21IssuerFeeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *JRC21IssuerFeeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// JRC21IssuerFee represents a Fee event raised by the JRC21Issuer contract.
type JRC21IssuerFee struct {
	Sender common.Address
	Token  common.Address
	Issuer common.Address
	Value  *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}

// FilterFee is a free log retrieval operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
//
// Solidity: event Fee(address indexed sender, address indexed token, address indexed issuer, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) FilterFee(opts *bind.FilterOpts, sender []common.Address, token []common.Address, issuer []common.Address) (*JRC21IssuerFeeIterator, error) {

	var senderRule []interface{}
	for _, senderItem := range sender {
		senderRule = append(senderRule, senderItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}
	var issuerRule []interface{}
	for _, issuerItem := range issuer {
		issuerRule = append(issuerRule, issuerItem)
	}

	logs, sub, err := _JRC21Issuer.contract.FilterLogs(opts, "Fee", senderRule, tokenRule, issuerRule)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerFeeIterator{contract: _JRC21Issuer.contract, event: "Fee", logs: logs, sub: sub}, nil
}

// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
//
// Solidity: event Fee(address indexed sender, address indexed token, address indexed issuer, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) WatchFee(opts *bind.WatchOpts, sink chan<- *JRC21IssuerFee, sender []common.Address, token []common.Address, issuer []common.Address) (event.Subscription, error) {

	var senderRule []interface{}
	for _, senderItem := range sender {
		senderRule = append(senderRule, senderItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}
	var issuerRule []interface{}
	for _, issuerItem := range issuer {
		issuerRule = append(issuerRule, issuerItem)
	}

	logs, sub, err := _JRC21Issuer.contract.WatchLogs(opts, "Fee", senderRule, tokenRule, issuerRule)
	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(JRC21IssuerFee)
				if err := _JRC21Issuer.contract.UnpackLog(event, "Fee", 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
}

// ParseFee is a log parse operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
//
// Solidity: event Fee(address indexed sender, address indexed token, address indexed issuer, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) ParseFee(log types.Log) (*JRC21IssuerFee, error) {
	event := new(JRC21IssuerFee)
	if err := _JRC21Issuer.contract.UnpackLog(event, "Fee", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// JRC21IssuerIssueIterator is returned from FilterIssue and is used to iterate over the raw logs and unpacked data for Issue events raised by the JRC21Issuer contract.
type JRC21IssuerIssueIterator struct {
	Event *JRC21IssuerIssue // 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 *JRC21IssuerIssueIterator) 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(JRC21IssuerIssue)
			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(JRC21IssuerIssue)
		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 *JRC21IssuerIssueIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *JRC21IssuerIssueIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// JRC21IssuerIssue represents a Issue event raised by the JRC21Issuer contract.
type JRC21IssuerIssue struct {
	Issuer common.Address
	Token  common.Address
	Value  *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}

// FilterIssue is a free log retrieval operation binding the contract event 0x4b2682685b046a3dae8e75ff49b82fa703e366056a43c6a791411011134f4f5d.
//
// Solidity: event Issue(address indexed issuer, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) FilterIssue(opts *bind.FilterOpts, issuer []common.Address, token []common.Address) (*JRC21IssuerIssueIterator, error) {

	var issuerRule []interface{}
	for _, issuerItem := range issuer {
		issuerRule = append(issuerRule, issuerItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}

	logs, sub, err := _JRC21Issuer.contract.FilterLogs(opts, "Issue", issuerRule, tokenRule)
	if err != nil {
		return nil, err
	}
	return &JRC21IssuerIssueIterator{contract: _JRC21Issuer.contract, event: "Issue", logs: logs, sub: sub}, nil
}

// WatchIssue is a free log subscription operation binding the contract event 0x4b2682685b046a3dae8e75ff49b82fa703e366056a43c6a791411011134f4f5d.
//
// Solidity: event Issue(address indexed issuer, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) WatchIssue(opts *bind.WatchOpts, sink chan<- *JRC21IssuerIssue, issuer []common.Address, token []common.Address) (event.Subscription, error) {

	var issuerRule []interface{}
	for _, issuerItem := range issuer {
		issuerRule = append(issuerRule, issuerItem)
	}
	var tokenRule []interface{}
	for _, tokenItem := range token {
		tokenRule = append(tokenRule, tokenItem)
	}

	logs, sub, err := _JRC21Issuer.contract.WatchLogs(opts, "Issue", issuerRule, tokenRule)
	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(JRC21IssuerIssue)
				if err := _JRC21Issuer.contract.UnpackLog(event, "Issue", 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
}

// ParseIssue is a log parse operation binding the contract event 0x4b2682685b046a3dae8e75ff49b82fa703e366056a43c6a791411011134f4f5d.
//
// Solidity: event Issue(address indexed issuer, address indexed token, uint256 value)
func (_JRC21Issuer *JRC21IssuerFilterer) ParseIssue(log types.Log) (*JRC21IssuerIssue, error) {
	event := new(JRC21IssuerIssue)
	if err := _JRC21Issuer.contract.UnpackLog(event, "Issue", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
