func (_Wtoken *WtokenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *WtokenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error) {
	var ownerRule []interface{}
	for _, ownerItem := range owner {
		ownerRule = append(ownerRule, ownerItem)
	}
	var spenderRule []interface{}
	for _, spenderItem := range spender {
		spenderRule = append(spenderRule, spenderItem)
	}
	logs, sub, err := _Wtoken.contract.WatchLogs(opts, "Approval", ownerRule, spenderRule)
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				event := new(WtokenApproval)
				if err := _Wtoken.contract.UnpackLog(event, "Approval", 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
}
WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.

Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
package wtoken
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"
)
var (
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)
const WtokenABI = "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newController\",\"type\":\"address\"}],\"name\":\"ControllerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"domainSeparators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"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\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"setController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
type Wtoken struct {
	WtokenCaller      
	WtokenTransactor  
	WtokenFilterer    
}
type WtokenCaller struct {
	contract *bind.BoundContract  
}
type WtokenTransactor struct {
	contract *bind.BoundContract  
}
type WtokenFilterer struct {
	contract *bind.BoundContract  
}
type WtokenSession struct {
	Contract     *Wtoken            
	CallOpts     bind.CallOpts      
	TransactOpts bind.TransactOpts  
}
type WtokenCallerSession struct {
	Contract *WtokenCaller  
	CallOpts bind.CallOpts  
}
type WtokenTransactorSession struct {
	Contract     *WtokenTransactor  
	TransactOpts bind.TransactOpts  
}
type WtokenRaw struct {
	Contract *Wtoken  
}
type WtokenCallerRaw struct {
	Contract *WtokenCaller  
}
type WtokenTransactorRaw struct {
	Contract *WtokenTransactor  
}
func NewWtoken(address common.Address, backend bind.ContractBackend) (*Wtoken, error) {
	contract, err := bindWtoken(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &Wtoken{WtokenCaller: WtokenCaller{contract: contract}, WtokenTransactor: WtokenTransactor{contract: contract}, WtokenFilterer: WtokenFilterer{contract: contract}}, nil
}
func NewWtokenCaller(address common.Address, caller bind.ContractCaller) (*WtokenCaller, error) {
	contract, err := bindWtoken(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &WtokenCaller{contract: contract}, nil
}
func NewWtokenTransactor(address common.Address, transactor bind.ContractTransactor) (*WtokenTransactor, error) {
	contract, err := bindWtoken(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &WtokenTransactor{contract: contract}, nil
}
func NewWtokenFilterer(address common.Address, filterer bind.ContractFilterer) (*WtokenFilterer, error) {
	contract, err := bindWtoken(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &WtokenFilterer{contract: contract}, nil
}
func bindWtoken(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(WtokenABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
func (_Wtoken *WtokenRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Wtoken.Contract.WtokenCaller.contract.Call(opts, result, method, params...)
}
func (_Wtoken *WtokenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wtoken.Contract.WtokenTransactor.contract.Transfer(opts)
}
func (_Wtoken *WtokenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Wtoken.Contract.WtokenTransactor.contract.Transact(opts, method, params...)
}
func (_Wtoken *WtokenCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Wtoken.Contract.contract.Call(opts, result, method, params...)
}
func (_Wtoken *WtokenTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wtoken.Contract.contract.Transfer(opts)
}
func (_Wtoken *WtokenTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Wtoken.Contract.contract.Transact(opts, method, params...)
}
func (_Wtoken *WtokenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "allowance", owner, spender)
	if err != nil {
		return *new(*big.Int), err
	}
	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	return out0, err
}
func (_Wtoken *WtokenSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
	return _Wtoken.Contract.Allowance(&_Wtoken.CallOpts, owner, spender)
}
func (_Wtoken *WtokenCallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
	return _Wtoken.Contract.Allowance(&_Wtoken.CallOpts, owner, spender)
}
func (_Wtoken *WtokenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "balanceOf", account)
	if err != nil {
		return *new(*big.Int), err
	}
	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	return out0, err
}
func (_Wtoken *WtokenSession) BalanceOf(account common.Address) (*big.Int, error) {
	return _Wtoken.Contract.BalanceOf(&_Wtoken.CallOpts, account)
}
func (_Wtoken *WtokenCallerSession) BalanceOf(account common.Address) (*big.Int, error) {
	return _Wtoken.Contract.BalanceOf(&_Wtoken.CallOpts, account)
}
func (_Wtoken *WtokenCaller) Controller(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "controller")
	if err != nil {
		return *new(common.Address), err
	}
	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	return out0, err
}
func (_Wtoken *WtokenSession) Controller() (common.Address, error) {
	return _Wtoken.Contract.Controller(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Controller() (common.Address, error) {
	return _Wtoken.Contract.Controller(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) Decimals(opts *bind.CallOpts) (uint8, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "decimals")
	if err != nil {
		return *new(uint8), err
	}
	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
	return out0, err
}
func (_Wtoken *WtokenSession) Decimals() (uint8, error) {
	return _Wtoken.Contract.Decimals(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Decimals() (uint8, error) {
	return _Wtoken.Contract.Decimals(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) DomainSeparators(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "domainSeparators", arg0)
	if err != nil {
		return *new([32]byte), err
	}
	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
	return out0, err
}
func (_Wtoken *WtokenSession) DomainSeparators(arg0 *big.Int) ([32]byte, error) {
	return _Wtoken.Contract.DomainSeparators(&_Wtoken.CallOpts, arg0)
}
func (_Wtoken *WtokenCallerSession) DomainSeparators(arg0 *big.Int) ([32]byte, error) {
	return _Wtoken.Contract.DomainSeparators(&_Wtoken.CallOpts, arg0)
}
func (_Wtoken *WtokenCaller) Name(opts *bind.CallOpts) (string, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "name")
	if err != nil {
		return *new(string), err
	}
	out0 := *abi.ConvertType(out[0], new(string)).(*string)
	return out0, err
}
func (_Wtoken *WtokenSession) Name() (string, error) {
	return _Wtoken.Contract.Name(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Name() (string, error) {
	return _Wtoken.Contract.Name(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "nonces", owner)
	if err != nil {
		return *new(*big.Int), err
	}
	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	return out0, err
}
func (_Wtoken *WtokenSession) Nonces(owner common.Address) (*big.Int, error) {
	return _Wtoken.Contract.Nonces(&_Wtoken.CallOpts, owner)
}
func (_Wtoken *WtokenCallerSession) Nonces(owner common.Address) (*big.Int, error) {
	return _Wtoken.Contract.Nonces(&_Wtoken.CallOpts, owner)
}
func (_Wtoken *WtokenCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "owner")
	if err != nil {
		return *new(common.Address), err
	}
	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	return out0, err
}
func (_Wtoken *WtokenSession) Owner() (common.Address, error) {
	return _Wtoken.Contract.Owner(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Owner() (common.Address, error) {
	return _Wtoken.Contract.Owner(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) Paused(opts *bind.CallOpts) (bool, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "paused")
	if err != nil {
		return *new(bool), err
	}
	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
	return out0, err
}
func (_Wtoken *WtokenSession) Paused() (bool, error) {
	return _Wtoken.Contract.Paused(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Paused() (bool, error) {
	return _Wtoken.Contract.Paused(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) Symbol(opts *bind.CallOpts) (string, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "symbol")
	if err != nil {
		return *new(string), err
	}
	out0 := *abi.ConvertType(out[0], new(string)).(*string)
	return out0, err
}
func (_Wtoken *WtokenSession) Symbol() (string, error) {
	return _Wtoken.Contract.Symbol(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) Symbol() (string, error) {
	return _Wtoken.Contract.Symbol(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _Wtoken.contract.Call(opts, &out, "totalSupply")
	if err != nil {
		return *new(*big.Int), err
	}
	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	return out0, err
}
func (_Wtoken *WtokenSession) TotalSupply() (*big.Int, error) {
	return _Wtoken.Contract.TotalSupply(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenCallerSession) TotalSupply() (*big.Int, error) {
	return _Wtoken.Contract.TotalSupply(&_Wtoken.CallOpts)
}
func (_Wtoken *WtokenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "approve", spender, amount)
}
func (_Wtoken *WtokenSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Approve(&_Wtoken.TransactOpts, spender, amount)
}
func (_Wtoken *WtokenTransactorSession) Approve(spender common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Approve(&_Wtoken.TransactOpts, spender, amount)
}
func (_Wtoken *WtokenTransactor) BurnFrom(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "burnFrom", account, amount)
}
func (_Wtoken *WtokenSession) BurnFrom(account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.BurnFrom(&_Wtoken.TransactOpts, account, amount)
}
func (_Wtoken *WtokenTransactorSession) BurnFrom(account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.BurnFrom(&_Wtoken.TransactOpts, account, amount)
}
func (_Wtoken *WtokenTransactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "decreaseAllowance", spender, subtractedValue)
}
func (_Wtoken *WtokenSession) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.DecreaseAllowance(&_Wtoken.TransactOpts, spender, subtractedValue)
}
func (_Wtoken *WtokenTransactorSession) DecreaseAllowance(spender common.Address, subtractedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.DecreaseAllowance(&_Wtoken.TransactOpts, spender, subtractedValue)
}
func (_Wtoken *WtokenTransactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "increaseAllowance", spender, addedValue)
}
func (_Wtoken *WtokenSession) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.IncreaseAllowance(&_Wtoken.TransactOpts, spender, addedValue)
}
func (_Wtoken *WtokenTransactorSession) IncreaseAllowance(spender common.Address, addedValue *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.IncreaseAllowance(&_Wtoken.TransactOpts, spender, addedValue)
}
func (_Wtoken *WtokenTransactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "mint", account, amount)
}
func (_Wtoken *WtokenSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Mint(&_Wtoken.TransactOpts, account, amount)
}
func (_Wtoken *WtokenTransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Mint(&_Wtoken.TransactOpts, account, amount)
}
func (_Wtoken *WtokenTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "pause")
}
func (_Wtoken *WtokenSession) Pause() (*types.Transaction, error) {
	return _Wtoken.Contract.Pause(&_Wtoken.TransactOpts)
}
func (_Wtoken *WtokenTransactorSession) Pause() (*types.Transaction, error) {
	return _Wtoken.Contract.Pause(&_Wtoken.TransactOpts)
}
func (_Wtoken *WtokenTransactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "permit", owner, spender, amount, deadline, v, r, s)
}
func (_Wtoken *WtokenSession) Permit(owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _Wtoken.Contract.Permit(&_Wtoken.TransactOpts, owner, spender, amount, deadline, v, r, s)
}
func (_Wtoken *WtokenTransactorSession) Permit(owner common.Address, spender common.Address, amount *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error) {
	return _Wtoken.Contract.Permit(&_Wtoken.TransactOpts, owner, spender, amount, deadline, v, r, s)
}
func (_Wtoken *WtokenTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "renounceOwnership")
}
func (_Wtoken *WtokenSession) RenounceOwnership() (*types.Transaction, error) {
	return _Wtoken.Contract.RenounceOwnership(&_Wtoken.TransactOpts)
}
func (_Wtoken *WtokenTransactorSession) RenounceOwnership() (*types.Transaction, error) {
	return _Wtoken.Contract.RenounceOwnership(&_Wtoken.TransactOpts)
}
func (_Wtoken *WtokenTransactor) SetController(opts *bind.TransactOpts, _controller common.Address) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "setController", _controller)
}
func (_Wtoken *WtokenSession) SetController(_controller common.Address) (*types.Transaction, error) {
	return _Wtoken.Contract.SetController(&_Wtoken.TransactOpts, _controller)
}
func (_Wtoken *WtokenTransactorSession) SetController(_controller common.Address) (*types.Transaction, error) {
	return _Wtoken.Contract.SetController(&_Wtoken.TransactOpts, _controller)
}
func (_Wtoken *WtokenTransactor) Transfer(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "transfer", recipient, amount)
}
func (_Wtoken *WtokenSession) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Transfer(&_Wtoken.TransactOpts, recipient, amount)
}
func (_Wtoken *WtokenTransactorSession) Transfer(recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.Transfer(&_Wtoken.TransactOpts, recipient, amount)
}
func (_Wtoken *WtokenTransactor) TransferFrom(opts *bind.TransactOpts, sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "transferFrom", sender, recipient, amount)
}
func (_Wtoken *WtokenSession) TransferFrom(sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.TransferFrom(&_Wtoken.TransactOpts, sender, recipient, amount)
}
func (_Wtoken *WtokenTransactorSession) TransferFrom(sender common.Address, recipient common.Address, amount *big.Int) (*types.Transaction, error) {
	return _Wtoken.Contract.TransferFrom(&_Wtoken.TransactOpts, sender, recipient, amount)
}
func (_Wtoken *WtokenTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "transferOwnership", newOwner)
}
func (_Wtoken *WtokenSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
	return _Wtoken.Contract.TransferOwnership(&_Wtoken.TransactOpts, newOwner)
}
func (_Wtoken *WtokenTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
	return _Wtoken.Contract.TransferOwnership(&_Wtoken.TransactOpts, newOwner)
}
func (_Wtoken *WtokenTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wtoken.contract.Transact(opts, "unpause")
}
func (_Wtoken *WtokenSession) Unpause() (*types.Transaction, error) {
	return _Wtoken.Contract.Unpause(&_Wtoken.TransactOpts)
}
func (_Wtoken *WtokenTransactorSession) Unpause() (*types.Transaction, error) {
	return _Wtoken.Contract.Unpause(&_Wtoken.TransactOpts)
}
type WtokenApprovalIterator struct {
	Event *WtokenApproval  
	contract *bind.BoundContract  
	event    string               
	logs chan types.Log         
	sub  ethereum.Subscription  
	done bool                   
	fail error                  
}
func (it *WtokenApprovalIterator) Next() bool {
	if it.fail != nil {
		return false
	}
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(WtokenApproval)
			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
		}
	}
	select {
	case log := <-it.logs:
		it.Event = new(WtokenApproval)
		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()
	}
}
func (it *WtokenApprovalIterator) Error() error {
	return it.fail
}
func (it *WtokenApprovalIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}
type WtokenApproval struct {
	Owner   common.Address
	Spender common.Address
	Value   *big.Int
	Raw     types.Log  
}
func (_Wtoken *WtokenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*WtokenApprovalIterator, error) {
	var ownerRule []interface{}
	for _, ownerItem := range owner {
		ownerRule = append(ownerRule, ownerItem)
	}
	var spenderRule []interface{}
	for _, spenderItem := range spender {
		spenderRule = append(spenderRule, spenderItem)
	}
	logs, sub, err := _Wtoken.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
	if err != nil {
		return nil, err
	}
	return &WtokenApprovalIterator{contract: _Wtoken.contract, event: "Approval", logs: logs, sub: sub}, nil
}