diff --git a/Dockerfile b/Dockerfile
index 9b70e9e8a0..32c91fc55a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,33 +1,21 @@
-# Support setting various labels on the final image
-ARG COMMIT=""
-ARG VERSION=""
-ARG BUILDNUM=""
+FROM golang:1.23-alpine AS builder
-# Build Geth in a stock Go builder container
-FROM golang:1.24-alpine AS builder
-
-RUN apk add --no-cache gcc musl-dev linux-headers git
-
-# Get dependencies - will also be cached if we won't change go.mod/go.sum
-COPY go.mod /go-ethereum/
-COPY go.sum /go-ethereum/
-RUN cd /go-ethereum && go mod download
+RUN apk add --no-cache make gcc musl-dev linux-headers git
ADD . /go-ethereum
-RUN cd /go-ethereum && go run build/ci.go install -static ./cmd/geth
+RUN cd /go-ethereum && make XDC
-# Pull Geth into a second stage deploy alpine container
FROM alpine:latest
-RUN apk add --no-cache ca-certificates
-COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/
+WORKDIR /xdc
-EXPOSE 8545 8546 30303 30303/udp
-ENTRYPOINT ["geth"]
+COPY --from=builder /go-ethereum/build/bin/XDC /usr/local/bin/XDC
-# Add some metadata labels to help programmatic image consumption
-ARG COMMIT=""
-ARG VERSION=""
-ARG BUILDNUM=""
+RUN chmod +x /usr/local/bin/XDC
-LABEL commit="$COMMIT" version="$VERSION" buildnum="$BUILDNUM"
+EXPOSE 8545
+EXPOSE 30303
+
+ENTRYPOINT ["/usr/local/bin/XDC"]
+
+CMD ["--help"]
diff --git a/Dockerfile.bootnode b/Dockerfile.bootnode
new file mode 100644
index 0000000000..e745bc45a2
--- /dev/null
+++ b/Dockerfile.bootnode
@@ -0,0 +1,24 @@
+FROM golang:1.23-alpine AS builder
+
+RUN apk add --no-cache make gcc musl-dev linux-headers
+
+ADD . /go-ethereum
+RUN cd /go-ethereum && make bootnode
+
+RUN chmod +x /go-ethereum/build/bin/bootnode
+
+FROM alpine:latest
+
+LABEL maintainer="xdc@xinfin.org"
+
+WORKDIR /xdc
+
+COPY --from=builder /go-ethereum/build/bin/bootnode /usr/local/bin/bootnode
+
+COPY docker/bootnode ./
+
+EXPOSE 30301
+
+ENTRYPOINT ["./entrypoint.sh"]
+
+CMD ["-verbosity", "6", "-nodekey", "bootnode.key", "--addr", ":30301"]
diff --git a/Dockerfile.node b/Dockerfile.node
new file mode 100644
index 0000000000..d2e0b48dab
--- /dev/null
+++ b/Dockerfile.node
@@ -0,0 +1,37 @@
+FROM golang:1.23-alpine AS builder
+
+RUN apk add --no-cache make gcc musl-dev linux-headers git
+
+ADD . /go-ethereum
+
+RUN cd /go-ethereum \
+ && make XDC \
+ && chmod +x /go-ethereum/build/bin/XDC
+
+FROM alpine:latest
+
+WORKDIR /xdc
+
+COPY --from=builder /go-ethereum/build/bin/XDC /usr/local/bin/XDC
+
+ENV IDENTITY ''
+ENV PASSWORD ''
+ENV PRIVATE_KEY ''
+ENV BOOTNODES ''
+ENV EXTIP ''
+ENV VERBOSITY 3
+ENV SYNC_MODE 'full'
+ENV NETWORK_ID '50'
+ENV WS_SECRET ''
+ENV NETSTATS_HOST 'netstats-server'
+ENV NETSTATS_PORT '3000'
+ENV ANNOUNCE_TXS ''
+
+RUN apk add --no-cache ca-certificates
+
+COPY docker/XDPoSChain ./
+COPY genesis/ ./
+
+EXPOSE 8545 8546 30303 30303/udp
+
+ENTRYPOINT ["./entrypoint.sh"]
diff --git a/common/constants.go b/common/constants.go
new file mode 100644
index 0000000000..2d08922d32
--- /dev/null
+++ b/common/constants.go
@@ -0,0 +1,23 @@
+// Notice: this file only saves const variables for all network.
+// Please run the following commands after modify this file:
+// cp common/constants.go common/constants/constants.go.testnet
+// cp common/constants.go common/constants/constants.go.devnet
+// cp common/constants.go common/constants/constants.go.local
+
+package common
+
+// const variables for all network (not redeclared in types.go)
+const (
+ MaxMasternodes = 18
+ LimitPenaltyEpoch = 4
+ LimitPenaltyEpochV2 = 0
+ LimitThresholdNonceInQueue = 10
+ DefaultMinGasPrice = 250000000
+ RangeReturnSigner = 150
+ MinimunMinerBlockPerEpoch = 1
+ BlocksPerYearTest = uint64(200000)
+ BlocksPerYear = uint64(15768000)
+ OneYear = uint64(365 * 86400)
+ LiquidateLendingTradeBlock = uint64(100)
+ LimitTimeFinality = uint64(30) // limit in 30 block
+)
diff --git a/common/sort/slice.go b/common/sort/slice.go
new file mode 100644
index 0000000000..a158c93a66
--- /dev/null
+++ b/common/sort/slice.go
@@ -0,0 +1,190 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package sort
+
+import "reflect"
+
+// any is an alias for interface{} and is equivalent to interface{} in all ways.
+type any = interface{}
+
+// lessSwap is a pair of Less and Swap function for use with the
+// auto-generated func-optimized variant of sort.go in
+// zfuncversion.go.
+type lessSwap struct {
+ Less func(i, j int) bool
+ Swap func(i, j int)
+}
+
+// Slice sorts the slice x given the provided less function.
+// It panics if x is not a slice.
+//
+// The sort is not guaranteed to be stable: equal elements
+// may be reversed from their original order.
+// For a stable sort, use SliceStable.
+//
+// The less function must satisfy the same requirements as
+// the Interface type's Less method.
+func Slice(x any, less func(i, j int) bool) {
+ rv := reflect.ValueOf(x)
+ swap := reflect.Swapper(x)
+ length := rv.Len()
+ quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length))
+}
+
+// maxDepth returns a threshold at which quicksort should switch
+// to heapsort. It returns 2*ceil(lg(n+1)).
+func maxDepth(n int) int {
+ var depth int
+ for i := n; i > 0; i >>= 1 {
+ depth++
+ }
+ return depth * 2
+}
+
+// Auto-generated variant of sort.go:quickSort
+func quickSort_func(data lessSwap, a, b, maxDepth int) {
+ for b-a > 12 {
+ if maxDepth == 0 {
+ heapSort_func(data, a, b)
+ return
+ }
+ maxDepth--
+ mlo, mhi := doPivot_func(data, a, b)
+ if mlo-a < b-mhi {
+ quickSort_func(data, a, mlo, maxDepth)
+ a = mhi
+ } else {
+ quickSort_func(data, mhi, b, maxDepth)
+ b = mlo
+ }
+ }
+ if b-a > 1 {
+ for i := a + 6; i < b; i++ {
+ if data.Less(i, i-6) {
+ data.Swap(i, i-6)
+ }
+ }
+ insertionSort_func(data, a, b)
+ }
+}
+
+// Auto-generated variant of sort.go:heapSort
+func heapSort_func(data lessSwap, a, b int) {
+ first := a
+ lo := 0
+ hi := b - a
+ for i := (hi - 1) / 2; i >= 0; i-- {
+ siftDown_func(data, i, hi, first)
+ }
+ for i := hi - 1; i >= 0; i-- {
+ data.Swap(first, first+i)
+ siftDown_func(data, lo, i, first)
+ }
+}
+
+// Auto-generated variant of sort.go:doPivot
+func doPivot_func(data lessSwap, lo, hi int) (midlo, midhi int) {
+ m := int(uint(lo+hi) >> 1)
+ if hi-lo > 40 {
+ s := (hi - lo) / 8
+ medianOfThree_func(data, lo, lo+s, lo+2*s)
+ medianOfThree_func(data, m, m-s, m+s)
+ medianOfThree_func(data, hi-1, hi-1-s, hi-1-2*s)
+ }
+ medianOfThree_func(data, lo, m, hi-1)
+ pivot := lo
+ a, c := lo+1, hi-1
+ for ; a < c && data.Less(a, pivot); a++ {
+ }
+ b := a
+ for {
+ for ; b < c && !data.Less(pivot, b); b++ {
+ }
+ for ; b < c && data.Less(pivot, c-1); c-- {
+ }
+ if b >= c {
+ break
+ }
+ data.Swap(b, c-1)
+ b++
+ c--
+ }
+ protect := hi-c < 5
+ if !protect && hi-c < (hi-lo)/4 {
+ dups := 0
+ if !data.Less(pivot, hi-1) {
+ data.Swap(c, hi-1)
+ c++
+ dups++
+ }
+ if !data.Less(b-1, pivot) {
+ b--
+ dups++
+ }
+ if !data.Less(m, pivot) {
+ data.Swap(m, b-1)
+ b--
+ dups++
+ }
+ protect = dups > 1
+ }
+ if protect {
+ for {
+ for ; a < b && !data.Less(b-1, pivot); b-- {
+ }
+ for ; a < b && data.Less(a, pivot); a++ {
+ }
+ if a >= b {
+ break
+ }
+ data.Swap(a, b-1)
+ a++
+ b--
+ }
+ }
+ data.Swap(pivot, b-1)
+ return b - 1, c
+}
+
+// Auto-generated variant of sort.go:insertionSort
+func insertionSort_func(data lessSwap, a, b int) {
+ for i := a + 1; i < b; i++ {
+ for j := i; j > a && data.Less(j, j-1); j-- {
+ data.Swap(j, j-1)
+ }
+ }
+}
+
+// Auto-generated variant of sort.go:siftDown
+func siftDown_func(data lessSwap, lo, hi, first int) {
+ root := lo
+ for {
+ child := 2*root + 1
+ if child >= hi {
+ break
+ }
+ if child+1 < hi && data.Less(first+child, first+child+1) {
+ child++
+ }
+ if !data.Less(first+root, first+child) {
+ return
+ }
+ data.Swap(first+root, first+child)
+ root = child
+ }
+}
+
+// Auto-generated variant of sort.go:medianOfThree
+func medianOfThree_func(data lessSwap, m1, m0, m2 int) {
+ if data.Less(m1, m0) {
+ data.Swap(m1, m0)
+ }
+ if data.Less(m2, m1) {
+ data.Swap(m2, m1)
+ if data.Less(m1, m0) {
+ data.Swap(m1, m0)
+ }
+ }
+}
diff --git a/contracts/XDCx/XDCxListing.go b/contracts/XDCx/XDCxListing.go
new file mode 100644
index 0000000000..dd93903e99
--- /dev/null
+++ b/contracts/XDCx/XDCxListing.go
@@ -0,0 +1,40 @@
+package XDCx
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/XDCx/contract"
+)
+
+type XDCXListing struct {
+ *contract.XDCXListingSession
+ contractBackend bind.ContractBackend
+}
+
+func NewMyXDCXListing(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*XDCXListing, error) {
+ smartContract, err := contract.NewXDCXListing(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &XDCXListing{
+ &contract.XDCXListingSession{
+ Contract: smartContract,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployXDCXListing(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *XDCXListing, error) {
+ contractAddr, _, _, err := contract.DeployXDCXListing(transactOpts, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ smartContract, err := NewMyXDCXListing(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, smartContract, nil
+}
diff --git a/contracts/XDCx/contract/LendingRegistration.go b/contracts/XDCx/contract/LendingRegistration.go
new file mode 100644
index 0000000000..cc58779483
--- /dev/null
+++ b/contracts/XDCx/contract/LendingRegistration.go
@@ -0,0 +1,1327 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+import (
+ "math/big"
+ "strings"
+
+ "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"
+)
+
+// LAbstractRegistrationABI is the input ABI used to generate the binding from.
+const LAbstractRegistrationABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RESIGN_REQUESTS\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"getRelayerByCoinbase\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// LAbstractRegistrationBin is the compiled bytecode used for deploying new contracts.
+const LAbstractRegistrationBin = `0x`
+
+// DeployLAbstractRegistration deploys a new Ethereum contract, binding an instance of LAbstractRegistration to it.
+func DeployLAbstractRegistration(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *LAbstractRegistration, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractRegistrationABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(LAbstractRegistrationBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &LAbstractRegistration{LAbstractRegistrationCaller: LAbstractRegistrationCaller{contract: contract}, LAbstractRegistrationTransactor: LAbstractRegistrationTransactor{contract: contract}, LAbstractRegistrationFilterer: LAbstractRegistrationFilterer{contract: contract}}, nil
+}
+
+// LAbstractRegistration is an auto generated Go binding around an Ethereum contract.
+type LAbstractRegistration struct {
+ LAbstractRegistrationCaller // Read-only binding to the contract
+ LAbstractRegistrationTransactor // Write-only binding to the contract
+ LAbstractRegistrationFilterer // Log filterer for contract events
+}
+
+// LAbstractRegistrationCaller is an auto generated read-only Go binding around an Ethereum contract.
+type LAbstractRegistrationCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractRegistrationTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type LAbstractRegistrationTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractRegistrationFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type LAbstractRegistrationFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractRegistrationSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type LAbstractRegistrationSession struct {
+ Contract *LAbstractRegistration // 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
+}
+
+// LAbstractRegistrationCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type LAbstractRegistrationCallerSession struct {
+ Contract *LAbstractRegistrationCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// LAbstractRegistrationTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type LAbstractRegistrationTransactorSession struct {
+ Contract *LAbstractRegistrationTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// LAbstractRegistrationRaw is an auto generated low-level Go binding around an Ethereum contract.
+type LAbstractRegistrationRaw struct {
+ Contract *LAbstractRegistration // Generic contract binding to access the raw methods on
+}
+
+// LAbstractRegistrationCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type LAbstractRegistrationCallerRaw struct {
+ Contract *LAbstractRegistrationCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// LAbstractRegistrationTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type LAbstractRegistrationTransactorRaw struct {
+ Contract *LAbstractRegistrationTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewLAbstractRegistration creates a new instance of LAbstractRegistration, bound to a specific deployed contract.
+func NewLAbstractRegistration(address common.Address, backend bind.ContractBackend) (*LAbstractRegistration, error) {
+ contract, err := bindLAbstractRegistration(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractRegistration{LAbstractRegistrationCaller: LAbstractRegistrationCaller{contract: contract}, LAbstractRegistrationTransactor: LAbstractRegistrationTransactor{contract: contract}, LAbstractRegistrationFilterer: LAbstractRegistrationFilterer{contract: contract}}, nil
+}
+
+// NewLAbstractRegistrationCaller creates a new read-only instance of LAbstractRegistration, bound to a specific deployed contract.
+func NewLAbstractRegistrationCaller(address common.Address, caller bind.ContractCaller) (*LAbstractRegistrationCaller, error) {
+ contract, err := bindLAbstractRegistration(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractRegistrationCaller{contract: contract}, nil
+}
+
+// NewLAbstractRegistrationTransactor creates a new write-only instance of LAbstractRegistration, bound to a specific deployed contract.
+func NewLAbstractRegistrationTransactor(address common.Address, transactor bind.ContractTransactor) (*LAbstractRegistrationTransactor, error) {
+ contract, err := bindLAbstractRegistration(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractRegistrationTransactor{contract: contract}, nil
+}
+
+// NewLAbstractRegistrationFilterer creates a new log filterer instance of LAbstractRegistration, bound to a specific deployed contract.
+func NewLAbstractRegistrationFilterer(address common.Address, filterer bind.ContractFilterer) (*LAbstractRegistrationFilterer, error) {
+ contract, err := bindLAbstractRegistration(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractRegistrationFilterer{contract: contract}, nil
+}
+
+// bindLAbstractRegistration binds a generic wrapper to an already deployed contract.
+func bindLAbstractRegistration(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractRegistrationABI))
+ 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 (_LAbstractRegistration *LAbstractRegistrationRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractRegistration.Contract.LAbstractRegistrationCaller.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 (_LAbstractRegistration *LAbstractRegistrationRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractRegistration.Contract.LAbstractRegistrationTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractRegistration *LAbstractRegistrationRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractRegistration.Contract.LAbstractRegistrationTransactor.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 (_LAbstractRegistration *LAbstractRegistrationCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractRegistration.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 (_LAbstractRegistration *LAbstractRegistrationTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractRegistration.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractRegistration *LAbstractRegistrationTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractRegistration.Contract.contract.Transact(opts, method, params...)
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_LAbstractRegistration *LAbstractRegistrationCaller) RESIGNREQUESTS(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _LAbstractRegistration.contract.Call(opts, out, "RESIGN_REQUESTS", arg0)
+ return *ret0, err
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_LAbstractRegistration *LAbstractRegistrationSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
+ return _LAbstractRegistration.Contract.RESIGNREQUESTS(&_LAbstractRegistration.CallOpts, arg0)
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_LAbstractRegistration *LAbstractRegistrationCallerSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
+ return _LAbstractRegistration.Contract.RESIGNREQUESTS(&_LAbstractRegistration.CallOpts, arg0)
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase( address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_LAbstractRegistration *LAbstractRegistrationCaller) GetRelayerByCoinbase(opts *bind.CallOpts, arg0 common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ var (
+ ret0 = new(*big.Int)
+ ret1 = new(common.Address)
+ ret2 = new(*big.Int)
+ ret3 = new(uint16)
+ ret4 = new([]common.Address)
+ ret5 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ ret1,
+ ret2,
+ ret3,
+ ret4,
+ ret5,
+ }
+ err := _LAbstractRegistration.contract.Call(opts, out, "getRelayerByCoinbase", arg0)
+ return *ret0, *ret1, *ret2, *ret3, *ret4, *ret5, err
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase( address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_LAbstractRegistration *LAbstractRegistrationSession) GetRelayerByCoinbase(arg0 common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ return _LAbstractRegistration.Contract.GetRelayerByCoinbase(&_LAbstractRegistration.CallOpts, arg0)
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase( address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_LAbstractRegistration *LAbstractRegistrationCallerSession) GetRelayerByCoinbase(arg0 common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ return _LAbstractRegistration.Contract.GetRelayerByCoinbase(&_LAbstractRegistration.CallOpts, arg0)
+}
+
+// LAbstractXDCXListingABI is the input ABI used to generate the binding from.
+const LAbstractXDCXListingABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"getTokenStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// LAbstractXDCXListingBin is the compiled bytecode used for deploying new contracts.
+const LAbstractXDCXListingBin = `0x`
+
+// DeployLAbstractXDCXListing deploys a new Ethereum contract, binding an instance of LAbstractXDCXListing to it.
+func DeployLAbstractXDCXListing(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *LAbstractXDCXListing, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractXDCXListingABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(LAbstractXDCXListingBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &LAbstractXDCXListing{LAbstractXDCXListingCaller: LAbstractXDCXListingCaller{contract: contract}, LAbstractXDCXListingTransactor: LAbstractXDCXListingTransactor{contract: contract}, LAbstractXDCXListingFilterer: LAbstractXDCXListingFilterer{contract: contract}}, nil
+}
+
+// LAbstractXDCXListing is an auto generated Go binding around an Ethereum contract.
+type LAbstractXDCXListing struct {
+ LAbstractXDCXListingCaller // Read-only binding to the contract
+ LAbstractXDCXListingTransactor // Write-only binding to the contract
+ LAbstractXDCXListingFilterer // Log filterer for contract events
+}
+
+// LAbstractXDCXListingCaller is an auto generated read-only Go binding around an Ethereum contract.
+type LAbstractXDCXListingCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractXDCXListingTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type LAbstractXDCXListingTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractXDCXListingFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type LAbstractXDCXListingFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractXDCXListingSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type LAbstractXDCXListingSession struct {
+ Contract *LAbstractXDCXListing // 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
+}
+
+// LAbstractXDCXListingCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type LAbstractXDCXListingCallerSession struct {
+ Contract *LAbstractXDCXListingCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// LAbstractXDCXListingTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type LAbstractXDCXListingTransactorSession struct {
+ Contract *LAbstractXDCXListingTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// LAbstractXDCXListingRaw is an auto generated low-level Go binding around an Ethereum contract.
+type LAbstractXDCXListingRaw struct {
+ Contract *LAbstractXDCXListing // Generic contract binding to access the raw methods on
+}
+
+// LAbstractXDCXListingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type LAbstractXDCXListingCallerRaw struct {
+ Contract *LAbstractXDCXListingCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// LAbstractXDCXListingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type LAbstractXDCXListingTransactorRaw struct {
+ Contract *LAbstractXDCXListingTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewLAbstractXDCXListing creates a new instance of LAbstractXDCXListing, bound to a specific deployed contract.
+func NewLAbstractXDCXListing(address common.Address, backend bind.ContractBackend) (*LAbstractXDCXListing, error) {
+ contract, err := bindLAbstractXDCXListing(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractXDCXListing{LAbstractXDCXListingCaller: LAbstractXDCXListingCaller{contract: contract}, LAbstractXDCXListingTransactor: LAbstractXDCXListingTransactor{contract: contract}, LAbstractXDCXListingFilterer: LAbstractXDCXListingFilterer{contract: contract}}, nil
+}
+
+// NewLAbstractXDCXListingCaller creates a new read-only instance of LAbstractXDCXListing, bound to a specific deployed contract.
+func NewLAbstractXDCXListingCaller(address common.Address, caller bind.ContractCaller) (*LAbstractXDCXListingCaller, error) {
+ contract, err := bindLAbstractXDCXListing(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractXDCXListingCaller{contract: contract}, nil
+}
+
+// NewLAbstractXDCXListingTransactor creates a new write-only instance of LAbstractXDCXListing, bound to a specific deployed contract.
+func NewLAbstractXDCXListingTransactor(address common.Address, transactor bind.ContractTransactor) (*LAbstractXDCXListingTransactor, error) {
+ contract, err := bindLAbstractXDCXListing(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractXDCXListingTransactor{contract: contract}, nil
+}
+
+// NewLAbstractXDCXListingFilterer creates a new log filterer instance of LAbstractXDCXListing, bound to a specific deployed contract.
+func NewLAbstractXDCXListingFilterer(address common.Address, filterer bind.ContractFilterer) (*LAbstractXDCXListingFilterer, error) {
+ contract, err := bindLAbstractXDCXListing(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractXDCXListingFilterer{contract: contract}, nil
+}
+
+// bindLAbstractXDCXListing binds a generic wrapper to an already deployed contract.
+func bindLAbstractXDCXListing(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractXDCXListingABI))
+ 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 (_LAbstractXDCXListing *LAbstractXDCXListingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractXDCXListing.Contract.LAbstractXDCXListingCaller.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 (_LAbstractXDCXListing *LAbstractXDCXListingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractXDCXListing.Contract.LAbstractXDCXListingTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractXDCXListing *LAbstractXDCXListingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractXDCXListing.Contract.LAbstractXDCXListingTransactor.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 (_LAbstractXDCXListing *LAbstractXDCXListingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractXDCXListing.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 (_LAbstractXDCXListing *LAbstractXDCXListingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractXDCXListing.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractXDCXListing *LAbstractXDCXListingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractXDCXListing.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_LAbstractXDCXListing *LAbstractXDCXListingCaller) GetTokenStatus(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _LAbstractXDCXListing.contract.Call(opts, out, "getTokenStatus", arg0)
+ return *ret0, err
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_LAbstractXDCXListing *LAbstractXDCXListingSession) GetTokenStatus(arg0 common.Address) (bool, error) {
+ return _LAbstractXDCXListing.Contract.GetTokenStatus(&_LAbstractXDCXListing.CallOpts, arg0)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_LAbstractXDCXListing *LAbstractXDCXListingCallerSession) GetTokenStatus(arg0 common.Address) (bool, error) {
+ return _LAbstractXDCXListing.Contract.GetTokenStatus(&_LAbstractXDCXListing.CallOpts, arg0)
+}
+
+// LAbstractTokenTRC21ABI is the input ABI used to generate the binding from.
+const LAbstractTokenTRC21ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// LAbstractTokenTRC21Bin is the compiled bytecode used for deploying new contracts.
+const LAbstractTokenTRC21Bin = `0x`
+
+// DeployLAbstractTokenTRC21 deploys a new Ethereum contract, binding an instance of LAbstractTokenTRC21 to it.
+func DeployLAbstractTokenTRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *LAbstractTokenTRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractTokenTRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(LAbstractTokenTRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &LAbstractTokenTRC21{LAbstractTokenTRC21Caller: LAbstractTokenTRC21Caller{contract: contract}, LAbstractTokenTRC21Transactor: LAbstractTokenTRC21Transactor{contract: contract}, LAbstractTokenTRC21Filterer: LAbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// LAbstractTokenTRC21 is an auto generated Go binding around an Ethereum contract.
+type LAbstractTokenTRC21 struct {
+ LAbstractTokenTRC21Caller // Read-only binding to the contract
+ LAbstractTokenTRC21Transactor // Write-only binding to the contract
+ LAbstractTokenTRC21Filterer // Log filterer for contract events
+}
+
+// LAbstractTokenTRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type LAbstractTokenTRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractTokenTRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type LAbstractTokenTRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractTokenTRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type LAbstractTokenTRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LAbstractTokenTRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type LAbstractTokenTRC21Session struct {
+ Contract *LAbstractTokenTRC21 // 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
+}
+
+// LAbstractTokenTRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type LAbstractTokenTRC21CallerSession struct {
+ Contract *LAbstractTokenTRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// LAbstractTokenTRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type LAbstractTokenTRC21TransactorSession struct {
+ Contract *LAbstractTokenTRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// LAbstractTokenTRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type LAbstractTokenTRC21Raw struct {
+ Contract *LAbstractTokenTRC21 // Generic contract binding to access the raw methods on
+}
+
+// LAbstractTokenTRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type LAbstractTokenTRC21CallerRaw struct {
+ Contract *LAbstractTokenTRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// LAbstractTokenTRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type LAbstractTokenTRC21TransactorRaw struct {
+ Contract *LAbstractTokenTRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewLAbstractTokenTRC21 creates a new instance of LAbstractTokenTRC21, bound to a specific deployed contract.
+func NewLAbstractTokenTRC21(address common.Address, backend bind.ContractBackend) (*LAbstractTokenTRC21, error) {
+ contract, err := bindLAbstractTokenTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractTokenTRC21{LAbstractTokenTRC21Caller: LAbstractTokenTRC21Caller{contract: contract}, LAbstractTokenTRC21Transactor: LAbstractTokenTRC21Transactor{contract: contract}, LAbstractTokenTRC21Filterer: LAbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// NewLAbstractTokenTRC21Caller creates a new read-only instance of LAbstractTokenTRC21, bound to a specific deployed contract.
+func NewLAbstractTokenTRC21Caller(address common.Address, caller bind.ContractCaller) (*LAbstractTokenTRC21Caller, error) {
+ contract, err := bindLAbstractTokenTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractTokenTRC21Caller{contract: contract}, nil
+}
+
+// NewLAbstractTokenTRC21Transactor creates a new write-only instance of LAbstractTokenTRC21, bound to a specific deployed contract.
+func NewLAbstractTokenTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*LAbstractTokenTRC21Transactor, error) {
+ contract, err := bindLAbstractTokenTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractTokenTRC21Transactor{contract: contract}, nil
+}
+
+// NewLAbstractTokenTRC21Filterer creates a new log filterer instance of LAbstractTokenTRC21, bound to a specific deployed contract.
+func NewLAbstractTokenTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*LAbstractTokenTRC21Filterer, error) {
+ contract, err := bindLAbstractTokenTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &LAbstractTokenTRC21Filterer{contract: contract}, nil
+}
+
+// bindLAbstractTokenTRC21 binds a generic wrapper to an already deployed contract.
+func bindLAbstractTokenTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(LAbstractTokenTRC21ABI))
+ 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 (_LAbstractTokenTRC21 *LAbstractTokenTRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractTokenTRC21.Contract.LAbstractTokenTRC21Caller.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 (_LAbstractTokenTRC21 *LAbstractTokenTRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractTokenTRC21.Contract.LAbstractTokenTRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractTokenTRC21 *LAbstractTokenTRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractTokenTRC21.Contract.LAbstractTokenTRC21Transactor.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 (_LAbstractTokenTRC21 *LAbstractTokenTRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _LAbstractTokenTRC21.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 (_LAbstractTokenTRC21 *LAbstractTokenTRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _LAbstractTokenTRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_LAbstractTokenTRC21 *LAbstractTokenTRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _LAbstractTokenTRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_LAbstractTokenTRC21 *LAbstractTokenTRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _LAbstractTokenTRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_LAbstractTokenTRC21 *LAbstractTokenTRC21Session) Issuer() (common.Address, error) {
+ return _LAbstractTokenTRC21.Contract.Issuer(&_LAbstractTokenTRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_LAbstractTokenTRC21 *LAbstractTokenTRC21CallerSession) Issuer() (common.Address, error) {
+ return _LAbstractTokenTRC21.Contract.Issuer(&_LAbstractTokenTRC21.CallOpts)
+}
+
+// LendingABI is the input ABI used to generate the binding from.
+const LendingABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"COLLATERALS\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ORACLE_PRICE_FEEDER\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"term\",\"type\":\"uint256\"}],\"name\":\"addTerm\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"LENDINGRELAYER_LIST\",\"outputs\":[{\"name\":\"_tradeFee\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"Relayer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"XDCXListing\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"name\":\"baseTokens\",\"type\":\"address[]\"},{\"name\":\"terms\",\"type\":\"uint256[]\"},{\"name\":\"collaterals\",\"type\":\"address[]\"}],\"name\":\"update\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODERATOR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"depositRate\",\"type\":\"uint256\"},{\"name\":\"liquidationRate\",\"type\":\"uint256\"},{\"name\":\"recallRate\",\"type\":\"uint256\"}],\"name\":\"addILOCollateral\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"}],\"name\":\"updateFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"moderator\",\"type\":\"address\"}],\"name\":\"changeModerator\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"TERMS\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"BASES\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"COLLATERAL_LIST\",\"outputs\":[{\"name\":\"_depositRate\",\"type\":\"uint256\"},{\"name\":\"_liquidationRate\",\"type\":\"uint256\"},{\"name\":\"_recallRate\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"addBaseToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"lendingToken\",\"type\":\"address\"},{\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"setCollateralPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ILO_COLLATERALS\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"feeder\",\"type\":\"address\"}],\"name\":\"changeOraclePriceFeeder\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"depositRate\",\"type\":\"uint256\"},{\"name\":\"liquidationRate\",\"type\":\"uint256\"},{\"name\":\"recallRate\",\"type\":\"uint256\"}],\"name\":\"addCollateral\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"},{\"name\":\"lendingToken\",\"type\":\"address\"}],\"name\":\"getCollateralPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"getLendingRelayerByCoinbase\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\"},{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"r\",\"type\":\"address\"},{\"name\":\"t\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]"
+
+// LendingBin is the compiled bytecode used for deploying new contracts.
+const LendingBin = `0x608060405234801561001057600080fd5b506040516040806124e183398101604052805160209091015160068054600160a060020a0319908116600160a060020a03948516179091556008805482169390921692909217905560098054339083168117909155600780549092161790556124638061007e6000396000f3006080604052600436106101035763ffffffff60e060020a6000350416630811f05a81146101085780630c4c2cbb1461013c5780630c655955146101515780630faf292c1461016b578063264949d8146101a357806329a4ddec146101b85780632ddada4c146101cd57806334b4e625146102aa5780633b874827146102bf5780633ea2391f146102e9578063466429211461031157806356327f57146103325780636d1dc42a1461035c578063822507011461037457806383e280d9146103b3578063acb8cd92146103d4578063b8687ec4146103fe578063c38f473f14610416578063e5eecf6814610437578063f2dbd07014610461578063fe824700146104a1575b600080fd5b34801561011457600080fd5b506101206004356105af565b60408051600160a060020a039092168252519081900360200190f35b34801561014857600080fd5b506101206105d7565b34801561015d57600080fd5b506101696004356105e6565b005b34801561017757600080fd5b5061018c600160a060020a0360043516610728565b6040805161ffff9092168252519081900360200190f35b3480156101af57600080fd5b5061012061073e565b3480156101c457600080fd5b5061012061074d565b3480156101d957600080fd5b506040805160206004604435818101358381028086018501909652808552610169958335600160a060020a0316956024803561ffff1696369695606495939492019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061075c9650505050505050565b3480156102b657600080fd5b50610120610e9b565b3480156102cb57600080fd5b50610169600160a060020a0360043516602435604435606435610eaa565b3480156102f557600080fd5b50610169600160a060020a036004351661ffff60243516611313565b34801561031d57600080fd5b50610169600160a060020a0360043516611664565b34801561033e57600080fd5b5061034a6004356116eb565b60408051918252519081900360200190f35b34801561036857600080fd5b5061012060043561170a565b34801561038057600080fd5b50610395600160a060020a0360043516611718565b60408051938452602084019290925282820152519081900360600190f35b3480156103bf57600080fd5b50610169600160a060020a0360043516611738565b3480156103e057600080fd5b50610169600160a060020a0360043581169060243516604435611930565b34801561040a57600080fd5b50610120600435611d11565b34801561042257600080fd5b50610169600160a060020a0360043516611d1f565b34801561044357600080fd5b50610169600160a060020a0360043516602435604435606435611db8565b34801561046d57600080fd5b50610488600160a060020a03600435811690602435166120f2565b6040805192835260208301919091528051918290030190f35b3480156104ad57600080fd5b506104c2600160a060020a0360043516612129565b604051808561ffff1661ffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015610518578181015183820152602001610500565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561055757818101518382015260200161053f565b50505050905001848103825285818151815260200191508051906020019060200280838360005b8381101561059657818101518382015260200161057e565b5050505090500197505050505050505060405180910390f35b60028054829081106105bd57fe5b600091825260209091200154600160a060020a0316905081565b600954600160a060020a031681565b600754600160a060020a03163314610636576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206123f8833981519152604482015290519081900360640190fd5b603c81101561068f576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c6964207465726d0000000000000000000000000000000000000000604482015290519081900360640190fd5b6106e960048054806020026020016040519081016040528092919081815260200182805480156106de57602002820191906000526020600020905b8154815260200190600101908083116106ca575b505050505082612272565b151561072557600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018190555b50565b60006020819052908152604090205461ffff1681565b600654600160a060020a031681565b600854600160a060020a031681565b600654604080517f540105c7000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015291516000938493849391169163540105c791602480820192869290919082900301818387803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c081101561080557600080fd5b81516020830151604084015160608501516080860180519496939592949193928301929164010000000081111561083b57600080fd5b8201602081018481111561084e57600080fd5b815185602082028301116401000000008211171561086b57600080fd5b5050929190602001805164010000000081111561088757600080fd5b8201602081018481111561089a57600080fd5b81518560208202830111640100000000821117156108b757600080fd5b50979b505050600160a060020a038a163314965061092695505050505050576040805160e560020a62461bcd02815260206004820152601660248201527f52656c61796572206f776e657220726571756972656400000000000000000000604482015290519081900360640190fd5b600654604080517f500f99f7000000000000000000000000000000000000000000000000000000008152600160a060020a038b811660048301529151919092169163500f99f79160248083019260209291908290030181600087803b15801561098e57600080fd5b505af11580156109a2573d6000803e3d6000fd5b505050506040513d60208110156109b857600080fd5b505115610a0f576040805160e560020a62461bcd02815260206004820152601960248201527f52656c6179657220726571756972656420746f20636c6f736500000000000000604482015290519081900360640190fd5b60008761ffff1610158015610a2957506103e88761ffff16105b1515610a7f576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420747261646520466565000000000000000000000000000000604482015290519081900360640190fd5b8451865114610ad8576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f742076616c6964206e756d626572206f66207465726d7300000000000000604482015290519081900360640190fd5b8351865114610b31576040805160e560020a62461bcd02815260206004820152601f60248201527f4e6f742076616c6964206e756d626572206f6620636f6c6c61746572616c7300604482015290519081900360640190fd5b5060009050805b8551811015610c2057610bbc6003805480602002602001604051908101604052809291908181526020018280548015610b9a57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b7c575b50505050508783815181101515610bad57fe5b906020019060200201516122bb565b9150600182151514610c18576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c6964206c656e64696e6720746f6b656e0000000000000000000000604482015290519081900360640190fd5b600101610b38565b5060005b8451811015610d0257610c9e6004805480602002602001604051908101604052809291908181526020018280548015610c7c57602002820191906000526020600020905b815481526020019060010190808311610c68575b50505050508683815181101515610c8f57fe5b90602001906020020151612272565b9150600182151514610cfa576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c6964207465726d0000000000000000000000000000000000000000604482015290519081900360640190fd5b600101610c24565b5060005b8351811015610df0578351600090859083908110610d2057fe5b60209081029091010151600160a060020a031614610de857610da46005805480602002602001604051908101604052809291908181526020018280548015610d9157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d73575b50505050508583815181101515610bad57fe5b1515610de8576040805160e560020a62461bcd0281526020600482015260126024820152600080516020612418833981519152604482015290519081900360640190fd5b600101610d06565b6040805160808101825261ffff898116825260208083018a81528385018a905260608401899052600160a060020a038d166000908152808352949094208351815461ffff191693169290921782559251805192939192610e56926001850192019061230a565b5060408201518051610e7291600284019160209091019061236f565b5060608201518051610e8e91600384019160209091019061230a565b5050505050505050505050565b600754600160a060020a031681565b60008060648510158015610ebe5750606484115b1515610f14576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420726174657300000000000000000000000000000000000000604482015290519081900360640190fd5b838511610f6b576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c6964206465706f7369742072617465730000000000000000000000604482015290519081900360640190fd5b848311610fc2576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420726563616c6c207261746573000000000000000000000000604482015290519081900360640190fd5b611026600280548060200260200160405190810160405280929190818152602001828054801561101b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610ffd575b5050505050876122bb565b1561107b576040805160e560020a62461bcd02815260206004820152601660248201527f496e76616c696420494c4f20636f6c6c61746572616c00000000000000000000604482015290519081900360640190fd5b6008546040805160e060020a63a3ff31b5028152600160a060020a0389811660048301529151919092169163a3ff31b59160248083019260209291908290030181600087803b1580156110cd57600080fd5b505af11580156110e1573d6000803e3d6000fd5b505050506040513d60208110156110f757600080fd5b50519150811515611140576040805160e560020a62461bcd0281526020600482015260126024820152600080516020612418833981519152604482015290519081900360640190fd5b85905033600160a060020a031681600160a060020a0316631d1438486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561118b57600080fd5b505af115801561119f573d6000803e3d6000fd5b505050506040513d60208110156111b557600080fd5b5051600160a060020a031614611215576040805160e560020a62461bcd02815260206004820152601560248201527f526571756972656420746f6b656e206973737565720000000000000000000000604482015290519081900360640190fd5b604080516060810182528681526020808201878152828401878152600160a060020a038b1660009081526001808552908690209451855591519184019190915551600290920191909155600580548351818402810184019094528084526112b9939283018282801561101b57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610ffd575050505050876122bb565b151561130b57600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a031916600160a060020a0388161790555b505050505050565b600654604080517f540105c7000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151600093929092169163540105c791602480820192869290919082900301818387803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260c08110156113ba57600080fd5b8151602083015160408401516060850151608086018051949693959294919392830192916401000000008111156113f057600080fd5b8201602081018481111561140357600080fd5b815185602082028301116401000000008211171561142057600080fd5b5050929190602001805164010000000081111561143c57600080fd5b8201602081018481111561144f57600080fd5b815185602082028301116401000000008211171561146c57600080fd5b509799505050600160a060020a038816331496506114db95505050505050576040805160e560020a62461bcd02815260206004820152601660248201527f52656c61796572206f776e657220726571756972656400000000000000000000604482015290519081900360640190fd5b600654604080517f500f99f7000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151919092169163500f99f79160248083019260209291908290030181600087803b15801561154357600080fd5b505af1158015611557573d6000803e3d6000fd5b505050506040513d602081101561156d57600080fd5b5051156115c4576040805160e560020a62461bcd02815260206004820152601960248201527f52656c6179657220726571756972656420746f20636c6f736500000000000000604482015290519081900360640190fd5b60008261ffff16101580156115de57506103e88261ffff16105b1515611634576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420747261646520466565000000000000000000000000000000604482015290519081900360640190fd5b50600160a060020a03919091166000908152602081905260409020805461ffff191661ffff909216919091179055565b600754600160a060020a031633146116b4576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206123f8833981519152604482015290519081900360640190fd5b600160a060020a03811615156116c957600080fd5b60078054600160a060020a031916600160a060020a0392909216919091179055565b60048054829081106116f957fe5b600091825260209091200154905081565b60038054829081106105bd57fe5b600160208190526000918252604090912080549181015460029091015483565b600754600090600160a060020a0316331461178b576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206123f8833981519152604482015290519081900360640190fd5b6008546040805160e060020a63a3ff31b5028152600160a060020a0385811660048301529151919092169163a3ff31b59160248083019260209291908290030181600087803b1580156117dd57600080fd5b505af11580156117f1573d6000803e3d6000fd5b505050506040513d602081101561180757600080fd5b50518061181d5750600160a060020a0382166001145b9050801515611876576040805160e560020a62461bcd02815260206004820152601260248201527f496e76616c6964206261736520746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b6118da60038054806020026020016040519081016040528092919081815260200182805480156118cf57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116118b1575b5050505050836122bb565b151561192c57600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018054600160a060020a031916600160a060020a0384161790555b5050565b6008546040805160e060020a63a3ff31b5028152600160a060020a03868116600483015291516000938493169163a3ff31b591602480830192602092919082900301818787803b15801561198357600080fd5b505af1158015611997573d6000803e3d6000fd5b505050506040513d60208110156119ad57600080fd5b5051806119c35750600160a060020a0385166001145b9150811515611a0a576040805160e560020a62461bcd0281526020600482015260126024820152600080516020612418833981519152604482015290519081900360640190fd5b611a6e6003805480602002602001604051908101604052809291908181526020018280548015611a6357602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611a45575b5050505050856122bb565b1515611ac4576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c6964206c656e64696e6720746f6b656e0000000000000000000000604482015290519081900360640190fd5b600160a060020a03851660009081526001602052604090205460641115611b23576040805160e560020a62461bcd0281526020600482015260126024820152600080516020612418833981519152604482015290519081900360640190fd5b611b876002805480602002602001604051908101604052809291908181526020018280548015611b7c57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611b5e575b5050505050866122bb565b15611bf357600954600160a060020a03163314611bee576040805160e560020a62461bcd02815260206004820152601c60248201527f4f7261636c652050726963652046656564657220726571756972656400000000604482015290519081900360640190fd5b611cc8565b84905033600160a060020a031681600160a060020a0316631d1438486040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611c3e57600080fd5b505af1158015611c52573d6000803e3d6000fd5b505050506040513d6020811015611c6857600080fd5b5051600160a060020a031614611cc8576040805160e560020a62461bcd02815260206004820152601560248201527f526571756972656420746f6b656e206973737565720000000000000000000000604482015290519081900360640190fd5b5050604080518082018252918252436020808401918252600160a060020a0395861660009081526001808352848220969097168152600390950190529220905181559051910155565b60058054829081106105bd57fe5b600954600160a060020a03163314611d81576040805160e560020a62461bcd02815260206004820152601960248201527f4f7261636c6520707269636520666565646572206f6e6c792e00000000000000604482015290519081900360640190fd5b600160a060020a0381161515611d9657600080fd5b60098054600160a060020a031916600160a060020a0392909216919091179055565b600754600090600160a060020a03163314611e0b576040805160e560020a62461bcd02815260206004820152600f60248201526000805160206123f8833981519152604482015290519081900360640190fd5b60648410158015611e1c5750606483115b1515611e72576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c696420726174657300000000000000000000000000000000000000604482015290519081900360640190fd5b828411611ec9576040805160e560020a62461bcd02815260206004820152601560248201527f496e76616c6964206465706f7369742072617465730000000000000000000000604482015290519081900360640190fd5b838211611f20576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c696420726563616c6c207261746573000000000000000000000000604482015290519081900360640190fd5b6008546040805160e060020a63a3ff31b5028152600160a060020a0388811660048301529151919092169163a3ff31b59160248083019260209291908290030181600087803b158015611f7257600080fd5b505af1158015611f86573d6000803e3d6000fd5b505050506040513d6020811015611f9c57600080fd5b505180611fb25750600160a060020a0385166001145b9050801515611ff9576040805160e560020a62461bcd0281526020600482015260126024820152600080516020612418833981519152604482015290519081900360640190fd5b604080516060810182528581526020808201868152828401868152600160a060020a038a16600090815260018085529086902094518555915191840191909155516002928301558154835181830281018301909452808452612099939291830182828015611b7c57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611b5e575050505050866122bb565b15156120eb57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace018054600160a060020a031916600160a060020a0387161790555b5050505050565b600160a060020a03918216600090815260016020818152604080842094909516835260039093019092529190912080549101549091565b600160a060020a03811660009081526020818152604080832080546001820180548451818702810187019095528085526060958695869561ffff9095169460028101936003909101928591908301828280156121ae57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311612190575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561220057602002820191906000526020600020905b8154815260200190600101908083116121ec575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561225c57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161223e575b5050505050905093509350935093509193509193565b6000805b83518110156122af5782848281518110151561228e57fe5b9060200190602002015114156122a757600191506122b4565b600101612276565b600091505b5092915050565b6000805b83518110156122af5782600160a060020a031684828151811015156122e057fe5b90602001906020020151600160a060020a0316141561230257600191506122b4565b6001016122bf565b82805482825590600052602060002090810192821561235f579160200282015b8281111561235f5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019061232a565b5061236b9291506123b6565b5090565b8280548282559060005260206000209081019282156123aa579160200282015b828111156123aa57825182559160200191906001019061238f565b5061236b9291506123dd565b6123da91905b8082111561236b578054600160a060020a03191681556001016123bc565b90565b6123da91905b8082111561236b57600081556001016123e356004d6f64657261746f72206f6e6c792e0000000000000000000000000000000000496e76616c696420636f6c6c61746572616c0000000000000000000000000000a165627a7a72305820c96a7844fbc99f6cd5124b4b98c05fdfa83bae82c294c9ecae7cce94364056950029`
+
+// DeployLending deploys a new Ethereum contract, binding an instance of Lending to it.
+func DeployLending(auth *bind.TransactOpts, backend bind.ContractBackend, r common.Address, t common.Address) (common.Address, *types.Transaction, *Lending, error) {
+ parsed, err := abi.JSON(strings.NewReader(LendingABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(LendingBin), backend, r, t)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &Lending{LendingCaller: LendingCaller{contract: contract}, LendingTransactor: LendingTransactor{contract: contract}, LendingFilterer: LendingFilterer{contract: contract}}, nil
+}
+
+// Lending is an auto generated Go binding around an Ethereum contract.
+type Lending struct {
+ LendingCaller // Read-only binding to the contract
+ LendingTransactor // Write-only binding to the contract
+ LendingFilterer // Log filterer for contract events
+}
+
+// LendingCaller is an auto generated read-only Go binding around an Ethereum contract.
+type LendingCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LendingTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type LendingTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LendingFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type LendingFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// LendingSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type LendingSession struct {
+ Contract *Lending // 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
+}
+
+// LendingCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type LendingCallerSession struct {
+ Contract *LendingCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// LendingTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type LendingTransactorSession struct {
+ Contract *LendingTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// LendingRaw is an auto generated low-level Go binding around an Ethereum contract.
+type LendingRaw struct {
+ Contract *Lending // Generic contract binding to access the raw methods on
+}
+
+// LendingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type LendingCallerRaw struct {
+ Contract *LendingCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// LendingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type LendingTransactorRaw struct {
+ Contract *LendingTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewLending creates a new instance of Lending, bound to a specific deployed contract.
+func NewLending(address common.Address, backend bind.ContractBackend) (*Lending, error) {
+ contract, err := bindLending(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &Lending{LendingCaller: LendingCaller{contract: contract}, LendingTransactor: LendingTransactor{contract: contract}, LendingFilterer: LendingFilterer{contract: contract}}, nil
+}
+
+// NewLendingCaller creates a new read-only instance of Lending, bound to a specific deployed contract.
+func NewLendingCaller(address common.Address, caller bind.ContractCaller) (*LendingCaller, error) {
+ contract, err := bindLending(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LendingCaller{contract: contract}, nil
+}
+
+// NewLendingTransactor creates a new write-only instance of Lending, bound to a specific deployed contract.
+func NewLendingTransactor(address common.Address, transactor bind.ContractTransactor) (*LendingTransactor, error) {
+ contract, err := bindLending(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &LendingTransactor{contract: contract}, nil
+}
+
+// NewLendingFilterer creates a new log filterer instance of Lending, bound to a specific deployed contract.
+func NewLendingFilterer(address common.Address, filterer bind.ContractFilterer) (*LendingFilterer, error) {
+ contract, err := bindLending(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &LendingFilterer{contract: contract}, nil
+}
+
+// bindLending binds a generic wrapper to an already deployed contract.
+func bindLending(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(LendingABI))
+ 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 (_Lending *LendingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _Lending.Contract.LendingCaller.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 (_Lending *LendingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _Lending.Contract.LendingTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_Lending *LendingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _Lending.Contract.LendingTransactor.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 (_Lending *LendingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _Lending.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 (_Lending *LendingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _Lending.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_Lending *LendingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _Lending.Contract.contract.Transact(opts, method, params...)
+}
+
+// BASES is a free data retrieval call binding the contract method 0x6d1dc42a.
+//
+// Solidity: function BASES( uint256) constant returns(address)
+func (_Lending *LendingCaller) BASES(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "BASES", arg0)
+ return *ret0, err
+}
+
+// BASES is a free data retrieval call binding the contract method 0x6d1dc42a.
+//
+// Solidity: function BASES( uint256) constant returns(address)
+func (_Lending *LendingSession) BASES(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.BASES(&_Lending.CallOpts, arg0)
+}
+
+// BASES is a free data retrieval call binding the contract method 0x6d1dc42a.
+//
+// Solidity: function BASES( uint256) constant returns(address)
+func (_Lending *LendingCallerSession) BASES(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.BASES(&_Lending.CallOpts, arg0)
+}
+
+// COLLATERALS is a free data retrieval call binding the contract method 0x0811f05a.
+//
+// Solidity: function COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingCaller) COLLATERALS(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "COLLATERALS", arg0)
+ return *ret0, err
+}
+
+// COLLATERALS is a free data retrieval call binding the contract method 0x0811f05a.
+//
+// Solidity: function COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingSession) COLLATERALS(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.COLLATERALS(&_Lending.CallOpts, arg0)
+}
+
+// COLLATERALS is a free data retrieval call binding the contract method 0x0811f05a.
+//
+// Solidity: function COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingCallerSession) COLLATERALS(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.COLLATERALS(&_Lending.CallOpts, arg0)
+}
+
+// COLLATERALLIST is a free data retrieval call binding the contract method 0x82250701.
+//
+// Solidity: function COLLATERAL_LIST( address) constant returns(_depositRate uint256, _liquidationRate uint256, _recallRate uint256)
+func (_Lending *LendingCaller) COLLATERALLIST(opts *bind.CallOpts, arg0 common.Address) (struct {
+ DepositRate *big.Int
+ LiquidationRate *big.Int
+ RecallRate *big.Int
+}, error) {
+ ret := new(struct {
+ DepositRate *big.Int
+ LiquidationRate *big.Int
+ RecallRate *big.Int
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _Lending.contract.Call(opts, out, "COLLATERAL_LIST", arg0)
+ return *ret, err
+}
+
+// COLLATERALLIST is a free data retrieval call binding the contract method 0x82250701.
+//
+// Solidity: function COLLATERAL_LIST( address) constant returns(_depositRate uint256, _liquidationRate uint256, _recallRate uint256)
+func (_Lending *LendingSession) COLLATERALLIST(arg0 common.Address) (struct {
+ DepositRate *big.Int
+ LiquidationRate *big.Int
+ RecallRate *big.Int
+}, error) {
+ return _Lending.Contract.COLLATERALLIST(&_Lending.CallOpts, arg0)
+}
+
+// COLLATERALLIST is a free data retrieval call binding the contract method 0x82250701.
+//
+// Solidity: function COLLATERAL_LIST( address) constant returns(_depositRate uint256, _liquidationRate uint256, _recallRate uint256)
+func (_Lending *LendingCallerSession) COLLATERALLIST(arg0 common.Address) (struct {
+ DepositRate *big.Int
+ LiquidationRate *big.Int
+ RecallRate *big.Int
+}, error) {
+ return _Lending.Contract.COLLATERALLIST(&_Lending.CallOpts, arg0)
+}
+
+// ILOCOLLATERALS is a free data retrieval call binding the contract method 0xb8687ec4.
+//
+// Solidity: function ILO_COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingCaller) ILOCOLLATERALS(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "ILO_COLLATERALS", arg0)
+ return *ret0, err
+}
+
+// ILOCOLLATERALS is a free data retrieval call binding the contract method 0xb8687ec4.
+//
+// Solidity: function ILO_COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingSession) ILOCOLLATERALS(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.ILOCOLLATERALS(&_Lending.CallOpts, arg0)
+}
+
+// ILOCOLLATERALS is a free data retrieval call binding the contract method 0xb8687ec4.
+//
+// Solidity: function ILO_COLLATERALS( uint256) constant returns(address)
+func (_Lending *LendingCallerSession) ILOCOLLATERALS(arg0 *big.Int) (common.Address, error) {
+ return _Lending.Contract.ILOCOLLATERALS(&_Lending.CallOpts, arg0)
+}
+
+// LENDINGRELAYERLIST is a free data retrieval call binding the contract method 0x0faf292c.
+//
+// Solidity: function LENDINGRELAYER_LIST( address) constant returns(_tradeFee uint16)
+func (_Lending *LendingCaller) LENDINGRELAYERLIST(opts *bind.CallOpts, arg0 common.Address) (uint16, error) {
+ var (
+ ret0 = new(uint16)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "LENDINGRELAYER_LIST", arg0)
+ return *ret0, err
+}
+
+// LENDINGRELAYERLIST is a free data retrieval call binding the contract method 0x0faf292c.
+//
+// Solidity: function LENDINGRELAYER_LIST( address) constant returns(_tradeFee uint16)
+func (_Lending *LendingSession) LENDINGRELAYERLIST(arg0 common.Address) (uint16, error) {
+ return _Lending.Contract.LENDINGRELAYERLIST(&_Lending.CallOpts, arg0)
+}
+
+// LENDINGRELAYERLIST is a free data retrieval call binding the contract method 0x0faf292c.
+//
+// Solidity: function LENDINGRELAYER_LIST( address) constant returns(_tradeFee uint16)
+func (_Lending *LendingCallerSession) LENDINGRELAYERLIST(arg0 common.Address) (uint16, error) {
+ return _Lending.Contract.LENDINGRELAYERLIST(&_Lending.CallOpts, arg0)
+}
+
+// MODERATOR is a free data retrieval call binding the contract method 0x34b4e625.
+//
+// Solidity: function MODERATOR() constant returns(address)
+func (_Lending *LendingCaller) MODERATOR(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "MODERATOR")
+ return *ret0, err
+}
+
+// MODERATOR is a free data retrieval call binding the contract method 0x34b4e625.
+//
+// Solidity: function MODERATOR() constant returns(address)
+func (_Lending *LendingSession) MODERATOR() (common.Address, error) {
+ return _Lending.Contract.MODERATOR(&_Lending.CallOpts)
+}
+
+// MODERATOR is a free data retrieval call binding the contract method 0x34b4e625.
+//
+// Solidity: function MODERATOR() constant returns(address)
+func (_Lending *LendingCallerSession) MODERATOR() (common.Address, error) {
+ return _Lending.Contract.MODERATOR(&_Lending.CallOpts)
+}
+
+// ORACLEPRICEFEEDER is a free data retrieval call binding the contract method 0x0c4c2cbb.
+//
+// Solidity: function ORACLE_PRICE_FEEDER() constant returns(address)
+func (_Lending *LendingCaller) ORACLEPRICEFEEDER(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "ORACLE_PRICE_FEEDER")
+ return *ret0, err
+}
+
+// ORACLEPRICEFEEDER is a free data retrieval call binding the contract method 0x0c4c2cbb.
+//
+// Solidity: function ORACLE_PRICE_FEEDER() constant returns(address)
+func (_Lending *LendingSession) ORACLEPRICEFEEDER() (common.Address, error) {
+ return _Lending.Contract.ORACLEPRICEFEEDER(&_Lending.CallOpts)
+}
+
+// ORACLEPRICEFEEDER is a free data retrieval call binding the contract method 0x0c4c2cbb.
+//
+// Solidity: function ORACLE_PRICE_FEEDER() constant returns(address)
+func (_Lending *LendingCallerSession) ORACLEPRICEFEEDER() (common.Address, error) {
+ return _Lending.Contract.ORACLEPRICEFEEDER(&_Lending.CallOpts)
+}
+
+// Relayer is a free data retrieval call binding the contract method 0x264949d8.
+//
+// Solidity: function Relayer() constant returns(address)
+func (_Lending *LendingCaller) Relayer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "Relayer")
+ return *ret0, err
+}
+
+// Relayer is a free data retrieval call binding the contract method 0x264949d8.
+//
+// Solidity: function Relayer() constant returns(address)
+func (_Lending *LendingSession) Relayer() (common.Address, error) {
+ return _Lending.Contract.Relayer(&_Lending.CallOpts)
+}
+
+// Relayer is a free data retrieval call binding the contract method 0x264949d8.
+//
+// Solidity: function Relayer() constant returns(address)
+func (_Lending *LendingCallerSession) Relayer() (common.Address, error) {
+ return _Lending.Contract.Relayer(&_Lending.CallOpts)
+}
+
+// TERMS is a free data retrieval call binding the contract method 0x56327f57.
+//
+// Solidity: function TERMS( uint256) constant returns(uint256)
+func (_Lending *LendingCaller) TERMS(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "TERMS", arg0)
+ return *ret0, err
+}
+
+// TERMS is a free data retrieval call binding the contract method 0x56327f57.
+//
+// Solidity: function TERMS( uint256) constant returns(uint256)
+func (_Lending *LendingSession) TERMS(arg0 *big.Int) (*big.Int, error) {
+ return _Lending.Contract.TERMS(&_Lending.CallOpts, arg0)
+}
+
+// TERMS is a free data retrieval call binding the contract method 0x56327f57.
+//
+// Solidity: function TERMS( uint256) constant returns(uint256)
+func (_Lending *LendingCallerSession) TERMS(arg0 *big.Int) (*big.Int, error) {
+ return _Lending.Contract.TERMS(&_Lending.CallOpts, arg0)
+}
+
+// XDCXListing is a free data retrieval call binding the contract method 0x29a4ddec.
+//
+// Solidity: function XDCXListing() constant returns(address)
+func (_Lending *LendingCaller) XDCXListing(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _Lending.contract.Call(opts, out, "XDCXListing")
+ return *ret0, err
+}
+
+// XDCXListing is a free data retrieval call binding the contract method 0x29a4ddec.
+//
+// Solidity: function XDCXListing() constant returns(address)
+func (_Lending *LendingSession) XDCXListing() (common.Address, error) {
+ return _Lending.Contract.XDCXListing(&_Lending.CallOpts)
+}
+
+// XDCXListing is a free data retrieval call binding the contract method 0x29a4ddec.
+//
+// Solidity: function XDCXListing() constant returns(address)
+func (_Lending *LendingCallerSession) XDCXListing() (common.Address, error) {
+ return _Lending.Contract.XDCXListing(&_Lending.CallOpts)
+}
+
+// GetCollateralPrice is a free data retrieval call binding the contract method 0xf2dbd070.
+//
+// Solidity: function getCollateralPrice(token address, lendingToken address) constant returns(uint256, uint256)
+func (_Lending *LendingCaller) GetCollateralPrice(opts *bind.CallOpts, token common.Address, lendingToken common.Address) (*big.Int, *big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ ret1 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ ret1,
+ }
+ err := _Lending.contract.Call(opts, out, "getCollateralPrice", token, lendingToken)
+ return *ret0, *ret1, err
+}
+
+// GetCollateralPrice is a free data retrieval call binding the contract method 0xf2dbd070.
+//
+// Solidity: function getCollateralPrice(token address, lendingToken address) constant returns(uint256, uint256)
+func (_Lending *LendingSession) GetCollateralPrice(token common.Address, lendingToken common.Address) (*big.Int, *big.Int, error) {
+ return _Lending.Contract.GetCollateralPrice(&_Lending.CallOpts, token, lendingToken)
+}
+
+// GetCollateralPrice is a free data retrieval call binding the contract method 0xf2dbd070.
+//
+// Solidity: function getCollateralPrice(token address, lendingToken address) constant returns(uint256, uint256)
+func (_Lending *LendingCallerSession) GetCollateralPrice(token common.Address, lendingToken common.Address) (*big.Int, *big.Int, error) {
+ return _Lending.Contract.GetCollateralPrice(&_Lending.CallOpts, token, lendingToken)
+}
+
+// GetLendingRelayerByCoinbase is a free data retrieval call binding the contract method 0xfe824700.
+//
+// Solidity: function getLendingRelayerByCoinbase(coinbase address) constant returns(uint16, address[], uint256[], address[])
+func (_Lending *LendingCaller) GetLendingRelayerByCoinbase(opts *bind.CallOpts, coinbase common.Address) (uint16, []common.Address, []*big.Int, []common.Address, error) {
+ var (
+ ret0 = new(uint16)
+ ret1 = new([]common.Address)
+ ret2 = new([]*big.Int)
+ ret3 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ ret1,
+ ret2,
+ ret3,
+ }
+ err := _Lending.contract.Call(opts, out, "getLendingRelayerByCoinbase", coinbase)
+ return *ret0, *ret1, *ret2, *ret3, err
+}
+
+// GetLendingRelayerByCoinbase is a free data retrieval call binding the contract method 0xfe824700.
+//
+// Solidity: function getLendingRelayerByCoinbase(coinbase address) constant returns(uint16, address[], uint256[], address[])
+func (_Lending *LendingSession) GetLendingRelayerByCoinbase(coinbase common.Address) (uint16, []common.Address, []*big.Int, []common.Address, error) {
+ return _Lending.Contract.GetLendingRelayerByCoinbase(&_Lending.CallOpts, coinbase)
+}
+
+// GetLendingRelayerByCoinbase is a free data retrieval call binding the contract method 0xfe824700.
+//
+// Solidity: function getLendingRelayerByCoinbase(coinbase address) constant returns(uint16, address[], uint256[], address[])
+func (_Lending *LendingCallerSession) GetLendingRelayerByCoinbase(coinbase common.Address) (uint16, []common.Address, []*big.Int, []common.Address, error) {
+ return _Lending.Contract.GetLendingRelayerByCoinbase(&_Lending.CallOpts, coinbase)
+}
+
+// AddBaseToken is a paid mutator transaction binding the contract method 0x83e280d9.
+//
+// Solidity: function addBaseToken(token address) returns()
+func (_Lending *LendingTransactor) AddBaseToken(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "addBaseToken", token)
+}
+
+// AddBaseToken is a paid mutator transaction binding the contract method 0x83e280d9.
+//
+// Solidity: function addBaseToken(token address) returns()
+func (_Lending *LendingSession) AddBaseToken(token common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.AddBaseToken(&_Lending.TransactOpts, token)
+}
+
+// AddBaseToken is a paid mutator transaction binding the contract method 0x83e280d9.
+//
+// Solidity: function addBaseToken(token address) returns()
+func (_Lending *LendingTransactorSession) AddBaseToken(token common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.AddBaseToken(&_Lending.TransactOpts, token)
+}
+
+// AddCollateral is a paid mutator transaction binding the contract method 0xe5eecf68.
+//
+// Solidity: function addCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingTransactor) AddCollateral(opts *bind.TransactOpts, token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "addCollateral", token, depositRate, liquidationRate, recallRate)
+}
+
+// AddCollateral is a paid mutator transaction binding the contract method 0xe5eecf68.
+//
+// Solidity: function addCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingSession) AddCollateral(token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddCollateral(&_Lending.TransactOpts, token, depositRate, liquidationRate, recallRate)
+}
+
+// AddCollateral is a paid mutator transaction binding the contract method 0xe5eecf68.
+//
+// Solidity: function addCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingTransactorSession) AddCollateral(token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddCollateral(&_Lending.TransactOpts, token, depositRate, liquidationRate, recallRate)
+}
+
+// AddILOCollateral is a paid mutator transaction binding the contract method 0x3b874827.
+//
+// Solidity: function addILOCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingTransactor) AddILOCollateral(opts *bind.TransactOpts, token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "addILOCollateral", token, depositRate, liquidationRate, recallRate)
+}
+
+// AddILOCollateral is a paid mutator transaction binding the contract method 0x3b874827.
+//
+// Solidity: function addILOCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingSession) AddILOCollateral(token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddILOCollateral(&_Lending.TransactOpts, token, depositRate, liquidationRate, recallRate)
+}
+
+// AddILOCollateral is a paid mutator transaction binding the contract method 0x3b874827.
+//
+// Solidity: function addILOCollateral(token address, depositRate uint256, liquidationRate uint256, recallRate uint256) returns()
+func (_Lending *LendingTransactorSession) AddILOCollateral(token common.Address, depositRate *big.Int, liquidationRate *big.Int, recallRate *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddILOCollateral(&_Lending.TransactOpts, token, depositRate, liquidationRate, recallRate)
+}
+
+// AddTerm is a paid mutator transaction binding the contract method 0x0c655955.
+//
+// Solidity: function addTerm(term uint256) returns()
+func (_Lending *LendingTransactor) AddTerm(opts *bind.TransactOpts, term *big.Int) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "addTerm", term)
+}
+
+// AddTerm is a paid mutator transaction binding the contract method 0x0c655955.
+//
+// Solidity: function addTerm(term uint256) returns()
+func (_Lending *LendingSession) AddTerm(term *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddTerm(&_Lending.TransactOpts, term)
+}
+
+// AddTerm is a paid mutator transaction binding the contract method 0x0c655955.
+//
+// Solidity: function addTerm(term uint256) returns()
+func (_Lending *LendingTransactorSession) AddTerm(term *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.AddTerm(&_Lending.TransactOpts, term)
+}
+
+// ChangeModerator is a paid mutator transaction binding the contract method 0x46642921.
+//
+// Solidity: function changeModerator(moderator address) returns()
+func (_Lending *LendingTransactor) ChangeModerator(opts *bind.TransactOpts, moderator common.Address) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "changeModerator", moderator)
+}
+
+// ChangeModerator is a paid mutator transaction binding the contract method 0x46642921.
+//
+// Solidity: function changeModerator(moderator address) returns()
+func (_Lending *LendingSession) ChangeModerator(moderator common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.ChangeModerator(&_Lending.TransactOpts, moderator)
+}
+
+// ChangeModerator is a paid mutator transaction binding the contract method 0x46642921.
+//
+// Solidity: function changeModerator(moderator address) returns()
+func (_Lending *LendingTransactorSession) ChangeModerator(moderator common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.ChangeModerator(&_Lending.TransactOpts, moderator)
+}
+
+// ChangeOraclePriceFeeder is a paid mutator transaction binding the contract method 0xc38f473f.
+//
+// Solidity: function changeOraclePriceFeeder(feeder address) returns()
+func (_Lending *LendingTransactor) ChangeOraclePriceFeeder(opts *bind.TransactOpts, feeder common.Address) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "changeOraclePriceFeeder", feeder)
+}
+
+// ChangeOraclePriceFeeder is a paid mutator transaction binding the contract method 0xc38f473f.
+//
+// Solidity: function changeOraclePriceFeeder(feeder address) returns()
+func (_Lending *LendingSession) ChangeOraclePriceFeeder(feeder common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.ChangeOraclePriceFeeder(&_Lending.TransactOpts, feeder)
+}
+
+// ChangeOraclePriceFeeder is a paid mutator transaction binding the contract method 0xc38f473f.
+//
+// Solidity: function changeOraclePriceFeeder(feeder address) returns()
+func (_Lending *LendingTransactorSession) ChangeOraclePriceFeeder(feeder common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.ChangeOraclePriceFeeder(&_Lending.TransactOpts, feeder)
+}
+
+// SetCollateralPrice is a paid mutator transaction binding the contract method 0xacb8cd92.
+//
+// Solidity: function setCollateralPrice(token address, lendingToken address, price uint256) returns()
+func (_Lending *LendingTransactor) SetCollateralPrice(opts *bind.TransactOpts, token common.Address, lendingToken common.Address, price *big.Int) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "setCollateralPrice", token, lendingToken, price)
+}
+
+// SetCollateralPrice is a paid mutator transaction binding the contract method 0xacb8cd92.
+//
+// Solidity: function setCollateralPrice(token address, lendingToken address, price uint256) returns()
+func (_Lending *LendingSession) SetCollateralPrice(token common.Address, lendingToken common.Address, price *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.SetCollateralPrice(&_Lending.TransactOpts, token, lendingToken, price)
+}
+
+// SetCollateralPrice is a paid mutator transaction binding the contract method 0xacb8cd92.
+//
+// Solidity: function setCollateralPrice(token address, lendingToken address, price uint256) returns()
+func (_Lending *LendingTransactorSession) SetCollateralPrice(token common.Address, lendingToken common.Address, price *big.Int) (*types.Transaction, error) {
+ return _Lending.Contract.SetCollateralPrice(&_Lending.TransactOpts, token, lendingToken, price)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x2ddada4c.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, baseTokens address[], terms uint256[], collaterals address[]) returns()
+func (_Lending *LendingTransactor) Update(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16, baseTokens []common.Address, terms []*big.Int, collaterals []common.Address) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "update", coinbase, tradeFee, baseTokens, terms, collaterals)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x2ddada4c.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, baseTokens address[], terms uint256[], collaterals address[]) returns()
+func (_Lending *LendingSession) Update(coinbase common.Address, tradeFee uint16, baseTokens []common.Address, terms []*big.Int, collaterals []common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.Update(&_Lending.TransactOpts, coinbase, tradeFee, baseTokens, terms, collaterals)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x2ddada4c.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, baseTokens address[], terms uint256[], collaterals address[]) returns()
+func (_Lending *LendingTransactorSession) Update(coinbase common.Address, tradeFee uint16, baseTokens []common.Address, terms []*big.Int, collaterals []common.Address) (*types.Transaction, error) {
+ return _Lending.Contract.Update(&_Lending.TransactOpts, coinbase, tradeFee, baseTokens, terms, collaterals)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_Lending *LendingTransactor) UpdateFee(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _Lending.contract.Transact(opts, "updateFee", coinbase, tradeFee)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_Lending *LendingSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _Lending.Contract.UpdateFee(&_Lending.TransactOpts, coinbase, tradeFee)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_Lending *LendingTransactorSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _Lending.Contract.UpdateFee(&_Lending.TransactOpts, coinbase, tradeFee)
+}
diff --git a/contracts/XDCx/contract/Registration.go b/contracts/XDCx/contract/Registration.go
new file mode 100644
index 0000000000..9109707160
--- /dev/null
+++ b/contracts/XDCx/contract/Registration.go
@@ -0,0 +1,2275 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// AbstractXDCXListingABI is the input ABI used to generate the binding from.
+const AbstractXDCXListingABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"getTokenStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// AbstractXDCXListingBin is the compiled bytecode used for deploying new contracts.
+const AbstractXDCXListingBin = `0x`
+
+// DeployAbstractXDCXListing deploys a new Ethereum contract, binding an instance of AbstractXDCXListing to it.
+func DeployAbstractXDCXListing(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *AbstractXDCXListing, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractXDCXListingABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(AbstractXDCXListingBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &AbstractXDCXListing{AbstractXDCXListingCaller: AbstractXDCXListingCaller{contract: contract}, AbstractXDCXListingTransactor: AbstractXDCXListingTransactor{contract: contract}, AbstractXDCXListingFilterer: AbstractXDCXListingFilterer{contract: contract}}, nil
+}
+
+// AbstractXDCXListing is an auto generated Go binding around an Ethereum contract.
+type AbstractXDCXListing struct {
+ AbstractXDCXListingCaller // Read-only binding to the contract
+ AbstractXDCXListingTransactor // Write-only binding to the contract
+ AbstractXDCXListingFilterer // Log filterer for contract events
+}
+
+// AbstractXDCXListingCaller is an auto generated read-only Go binding around an Ethereum contract.
+type AbstractXDCXListingCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractXDCXListingTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type AbstractXDCXListingTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractXDCXListingFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type AbstractXDCXListingFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractXDCXListingSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type AbstractXDCXListingSession struct {
+ Contract *AbstractXDCXListing // 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
+}
+
+// AbstractXDCXListingCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type AbstractXDCXListingCallerSession struct {
+ Contract *AbstractXDCXListingCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// AbstractXDCXListingTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type AbstractXDCXListingTransactorSession struct {
+ Contract *AbstractXDCXListingTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// AbstractXDCXListingRaw is an auto generated low-level Go binding around an Ethereum contract.
+type AbstractXDCXListingRaw struct {
+ Contract *AbstractXDCXListing // Generic contract binding to access the raw methods on
+}
+
+// AbstractXDCXListingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type AbstractXDCXListingCallerRaw struct {
+ Contract *AbstractXDCXListingCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// AbstractXDCXListingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type AbstractXDCXListingTransactorRaw struct {
+ Contract *AbstractXDCXListingTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewAbstractXDCXListing creates a new instance of AbstractXDCXListing, bound to a specific deployed contract.
+func NewAbstractXDCXListing(address common.Address, backend bind.ContractBackend) (*AbstractXDCXListing, error) {
+ contract, err := bindAbstractXDCXListing(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractXDCXListing{AbstractXDCXListingCaller: AbstractXDCXListingCaller{contract: contract}, AbstractXDCXListingTransactor: AbstractXDCXListingTransactor{contract: contract}, AbstractXDCXListingFilterer: AbstractXDCXListingFilterer{contract: contract}}, nil
+}
+
+// NewAbstractXDCXListingCaller creates a new read-only instance of AbstractXDCXListing, bound to a specific deployed contract.
+func NewAbstractXDCXListingCaller(address common.Address, caller bind.ContractCaller) (*AbstractXDCXListingCaller, error) {
+ contract, err := bindAbstractXDCXListing(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractXDCXListingCaller{contract: contract}, nil
+}
+
+// NewAbstractXDCXListingTransactor creates a new write-only instance of AbstractXDCXListing, bound to a specific deployed contract.
+func NewAbstractXDCXListingTransactor(address common.Address, transactor bind.ContractTransactor) (*AbstractXDCXListingTransactor, error) {
+ contract, err := bindAbstractXDCXListing(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractXDCXListingTransactor{contract: contract}, nil
+}
+
+// NewAbstractXDCXListingFilterer creates a new log filterer instance of AbstractXDCXListing, bound to a specific deployed contract.
+func NewAbstractXDCXListingFilterer(address common.Address, filterer bind.ContractFilterer) (*AbstractXDCXListingFilterer, error) {
+ contract, err := bindAbstractXDCXListing(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractXDCXListingFilterer{contract: contract}, nil
+}
+
+// bindAbstractXDCXListing binds a generic wrapper to an already deployed contract.
+func bindAbstractXDCXListing(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractXDCXListingABI))
+ 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 (_AbstractXDCXListing *AbstractXDCXListingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractXDCXListing.Contract.AbstractXDCXListingCaller.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 (_AbstractXDCXListing *AbstractXDCXListingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractXDCXListing.Contract.AbstractXDCXListingTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractXDCXListing *AbstractXDCXListingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractXDCXListing.Contract.AbstractXDCXListingTransactor.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 (_AbstractXDCXListing *AbstractXDCXListingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractXDCXListing.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 (_AbstractXDCXListing *AbstractXDCXListingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractXDCXListing.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractXDCXListing *AbstractXDCXListingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractXDCXListing.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_AbstractXDCXListing *AbstractXDCXListingCaller) GetTokenStatus(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _AbstractXDCXListing.contract.Call(opts, out, "getTokenStatus", arg0)
+ return *ret0, err
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_AbstractXDCXListing *AbstractXDCXListingSession) GetTokenStatus(arg0 common.Address) (bool, error) {
+ return _AbstractXDCXListing.Contract.GetTokenStatus(&_AbstractXDCXListing.CallOpts, arg0)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus( address) constant returns(bool)
+func (_AbstractXDCXListing *AbstractXDCXListingCallerSession) GetTokenStatus(arg0 common.Address) (bool, error) {
+ return _AbstractXDCXListing.Contract.GetTokenStatus(&_AbstractXDCXListing.CallOpts, arg0)
+}
+
+// RelayerRegistrationABI is the input ABI used to generate the binding from.
+const RelayerRegistrationABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"fromToken\",\"type\":\"address\"},{\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"listToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MaximumRelayers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"}],\"name\":\"updateFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"changeContractOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RELAYER_LIST\",\"outputs\":[{\"name\":\"_deposit\",\"type\":\"uint256\"},{\"name\":\"_tradeFee\",\"type\":\"uint16\"},{\"name\":\"_index\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"depositMore\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"RELAYER_COINBASES\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RESIGN_REQUESTS\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"getRelayerByCoinbase\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"update\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"maxRelayer\",\"type\":\"uint256\"},{\"name\":\"maxToken\",\"type\":\"uint256\"},{\"name\":\"minDeposit\",\"type\":\"uint256\"}],\"name\":\"reconfigure\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"cancelSelling\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ActiveRelayerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"fromToken\",\"type\":\"address\"},{\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"deListToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"sellRelayer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"RelayerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RELAYER_ON_SALE_LIST\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"new_owner\",\"type\":\"address\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MinimumDeposit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"register\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MaximumTokenList\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"buyRelayer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"refund\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRACT_OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"XDCxListing\",\"type\":\"address\"},{\"name\":\"maxRelayers\",\"type\":\"uint256\"},{\"name\":\"maxTokenList\",\"type\":\"uint256\"},{\"name\":\"minDeposit\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"max_relayer\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"max_token\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"min_deposit\",\"type\":\"uint256\"}],\"name\":\"ConfigEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"RegisterEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"UpdateEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"}],\"name\":\"UpdateFeeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"TransferEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit_release_time\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"deposit_amount\",\"type\":\"uint256\"}],\"name\":\"ResignEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"remaining_time\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"deposit_amount\",\"type\":\"uint256\"}],\"name\":\"RefundEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"is_on_sale\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"SellEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BuyEvent\",\"type\":\"event\"}]"
+
+// RelayerRegistrationBin is the compiled bytecode used for deploying new contracts.
+const RelayerRegistrationBin = `0x608060405234801561001057600080fd5b50604051608080613d298339810160409081528151602083015191830151606090930151600a8054600160a060020a03909316600160a060020a0319938416179055600060078190556009819055600193909355600293909355600892909255805490911633179055613ca1806100886000396000f30060806040526004361061012f5763ffffffff60e060020a60003504166308764b9d81146101345780630e5c0fee146101635780633ea2391f1461018a5780633ead67b5146101b257806349ba1f70146101d35780634ce69bf5146102265780634fa339271461023a578063500f99f71461026e578063540105c71461028f57806356246b681461037f57806357ea3c41146104235780635b673b1f14610441578063735db683146104625780637aa667301461047757806387c6bbcd146104a457806387d340ab146104c8578063885b7137146104dd578063ae6e43f5146104fe578063ba45b0b81461051f578063c635a9f214610546578063c6c71aed1461055b578063cfaece12146105f2578063e699df0e14610607578063fa89401a1461061b578063fd301c491461063c575b600080fd5b34801561014057600080fd5b50610161600160a060020a0360043581169060243581169060443516610651565b005b34801561016f57600080fd5b506101786109c1565b60408051918252519081900360200190f35b34801561019657600080fd5b50610161600160a060020a036004351661ffff602435166109c7565b3480156101be57600080fd5b50610161600160a060020a0360043516610bf0565b3480156101df57600080fd5b506101f4600160a060020a0360043516610c89565b6040805194855261ffff909316602085015283830191909152600160a060020a03166060830152519081900360800190f35b610161600160a060020a0360043516610cbe565b34801561024657600080fd5b50610252600435611010565b60408051600160a060020a039092168252519081900360200190f35b34801561027a57600080fd5b50610178600160a060020a036004351661102b565b34801561029b57600080fd5b506102b0600160a060020a036004351661103d565b6040518087815260200186600160a060020a0316600160a060020a031681526020018581526020018461ffff1661ffff1681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561032657818101518382015260200161030e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561036557818101518382015260200161034d565b505050509050019850505050505050505060405180910390f35b34801561038b57600080fd5b506040805160206004604435818101358381028086018501909652808552610161958335600160a060020a0316956024803561ffff1696369695606495939492019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506111509650505050505050565b34801561042f57600080fd5b50610161600435602435604435611595565b34801561044d57600080fd5b50610161600160a060020a0360043516611684565b34801561046e57600080fd5b50610178611850565b34801561048357600080fd5b50610161600160a060020a0360043581169060243581169060443516611856565b3480156104b057600080fd5b50610161600160a060020a0360043516602435611b79565b3480156104d457600080fd5b50610178611d30565b3480156104e957600080fd5b50610178600160a060020a0360043516611d36565b34801561050a57600080fd5b50610161600160a060020a0360043516611d48565b34801561052b57600080fd5b50610161600160a060020a0360043581169060243516611f94565b34801561055257600080fd5b506101786122dc565b6040805160206004604435818101358381028086018501909652808552610161958335600160a060020a0316956024803561ffff1696369695606495939492019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506122e29650505050505050565b3480156105fe57600080fd5b5061017861299f565b610161600160a060020a03600435166129a5565b34801561062757600080fd5b50610161600160a060020a0360043516612c5e565b34801561064857600080fd5b50610252612f7b565b600160a060020a0383811660009081526003602052604090206005015484911633146106b5576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038416600090815260056020526040902054849015610727576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038516600090815260066020526040902054859015610799576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60028054600160a060020a0388166000908152600360205260409020909101541061080e576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b610819868686612f8a565b1515600114610872576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420706169720000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0380871660008181526003602081815260408084206002810180546001818101835582885285882090910180548f8b16600160a060020a031991821617909155958301805480830182558189528689200180549a8f169a909716999099179095559590945283549290930154835183815261ffff90911691810182905260809381018481528554948201859052600080516020613c168339815191529693959294929392606083019060a08401908690801561095e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610940575b505083810382528481815481526020019150805480156109a757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610989575b5050965050505050505060405180910390a1505050505050565b60015481565b600160a060020a038281166000908152600360205260409020600501548391163314610a2b576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038316600090815260056020526040902054839015610a9d576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038416600090815260066020526040902054849015610b0f576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60008461ffff1610158015610b2957506103e88461ffff16105b1515610b7f576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600081815260036020908152604091829020600101805461ffff191661ffff89811691909117918290558351948552169083015280517f5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc4599281900390910190a15050505050565b600054600160a060020a03163314610c52576040805160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374204f776e6572204f6e6c792e000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610c6757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6003602052600090815260409020805460018201546004830154600590930154919261ffff90911691600160a060020a031684565b600160a060020a038181166000908152600360205260409020600501548291163314610d22576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260056020526040902054829015610d94576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038316600090815260066020526040902054839015610e06576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60003411610e5e576040805160e560020a62461bcd02815260206004820152601a60248201527f5472616e736665722076616c7565206d757374206265203e2030000000000000604482015290519081900360640190fd5b670de0b6b3a7640000341015610ee4576040805160e560020a62461bcd02815260206004820152603160248201527f4174206c65617374203120544f4d4f20697320726571756972656420666f722060448201527f61206465706f7369742072657175657374000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038416600090815260036020526040902054610f0d903463ffffffff61333c16565b600160a060020a0385166000908152600360208181526040928390208481556001810154845186815261ffff9091169281018390526080948101858152600283018054968301879052600080516020613c16833981519152979694959094930192606083019060a084019086908015610faf57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f91575b50508381038252848181548152602001915080548015610ff857602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610fda575b5050965050505050505060405180910390a150505050565b600460205260009081526040902054600160a060020a031681565b60056020526000908152604090205481565b600160a060020a03808216600090815260036020818152604080842060048101546005820154825460018401546002850180548751818a0281018a01909852808852999a8b9a8b9a8b9a60609a8b9a989094169761ffff90961695909101929184918301828280156110d857602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110ba575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561113457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611116575b5050505050905095509550955095509550955091939550919395565b600160a060020a0384811660009081526003602052604090206005015485911633146111b4576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038516600090815260056020526040902054859015611226576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038616600090815260066020526040902054869015611298576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60008661ffff16101580156112b257506103e88661ffff16105b1515611308576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b60025485511115611363576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b84518451146113bc576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f742076616c6964206e756d626572206f6620506169727300000000000000604482015290519081900360640190fd5b6113c68585613359565b151560011461141f576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b600160a060020a038716600090815260036020908152604090912060018101805461ffff191661ffff8a16179055865161146192600290920191880190613aee565b50600160a060020a0387166000908152600360208181526040909220865161149193919092019190870190613aee565b50600160a060020a03871660009081526003602081815260409283902080546001820154855182815261ffff9091169381018490526080958101868152600284018054978301889052600080516020613c1683398151915297939690940192606083019060a08401908690801561153157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611513575b5050838103825284818154815260200191508054801561157a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161155c575b5050965050505050505060405180910390a150505050505050565b600054600160a060020a031633146115f7576040805160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374204f776e6572204f6e6c792e000000000000000000000000604482015290519081900360640190fd5b60095483101561160657600080fd5b60048211801561161757506103e982105b151561162257600080fd5b612710811161163057600080fd5b600183905560028290556008819055604080518481526020810184905280820183905290517f8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d939239181900360600190a1505050565b600160a060020a0381811660009081526003602052604090206005015482911633146116e8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526005602052604090205482901561175a576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038316600090815260066020526040812054116117ee576040805160e560020a62461bcd02815260206004820152602160248201527f52656c61796572206973206e6f742063757272656e746c7920666f722073616c60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831660008181526006602090815260408083208390558051838152918201939093528083019190915290517fdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d0829181900360600190a1505050565b60095481565b600160a060020a03838116600090815260036020526040902060050154606091829186911633146118bf576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038616600090815260056020526040902054869015611931576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a0387166000908152600660205260409020548790156119a3576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b6119ae888888613718565b945094506119bc8585613359565b1515600114611a15576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b600160a060020a03881660009081526003602090815260409091208651611a4492600290920191880190613aee565b50600160a060020a03881660009081526003602081815260409092208651611a7493919092019190870190613aee565b50600160a060020a03881660009081526003602081815260409283902080546001820154855182815261ffff9091169381018490526080958101868152600284018054978301889052600080516020613c1683398151915297939690940192606083019060a084019086908015611b1457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611af6575b50508381038252848181548152602001915080548015611b5d57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611b3f575b5050965050505050505060405180910390a15050505050505050565b600160a060020a038281166000908152600360205260409020600501548391163314611bdd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038316600090815260056020526040902054839015611c4f576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b60008311611ccd576040805160e560020a62461bcd02815260206004820152602860248201527f507269636520746167206d75737420626520646966666572656e74207468616e60448201527f205a65726f283029000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03841660008181526006602090815260409182902086905581516001815290810192909252818101859052517fdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d0829181900360600190a150505050565b60075481565b60066020526000908152604090205481565b600160a060020a038181166000908152600360205260409020600501548291163314611dac576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260066020526040902054829015611e1e576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a03831660009081526003602052604081205411611eb2576040805160e560020a62461bcd02815260206004820152602760248201527f4e6f2072656c61796572206173736f636961746564207769746820746869732060448201527f6164647265737300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831660009081526005602052604090205415611f20576040805160e560020a62461bcd02815260206004820152601860248201527f5265717565737420616c72656164792072656365697665640000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526005602090815260408083206224ea0042018155600980546000190190555460038352928190205481519384529183019190915280517f2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae59281900390910190a1505050565b600160a060020a038281166000908152600360205260409020600501548391163314611ff8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526005602052604090205483901561206a576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a0384166000908152600660205260409020548490156120dc576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a038416158015906120fd5750600160a060020a0384163314155b151561210857600080fd5b600160a060020a0384811660009081526003602052604090206005015416156121a1576040805160e560020a62461bcd02815260206004820152603c60248201527f4f776e65722061646472657373206d757374206e6f742062652063757272656e60448201527f746c7920757365642061732072656c617965722d636f696e6261736500000000606482015290519081900360840190fd5b600160a060020a03858116600090815260036020818152604092839020600581018054600160a060020a0319168a871617908190558154600183015486519290971680835293820181905261ffff90961694810185905260a0606082018181526002840180549284018390527fc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b66298959795969094019291608083019060c08401908690801561227957602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161225b575b505083810382528481815481526020019150805480156122c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116122a4575b505097505050505050505060405180910390a15050505050565b60085481565b600054600160a060020a031633141561236b576040805160e560020a62461bcd02815260206004820152602f60248201527f436f6e7472616374204f776e657220697320666f7262696464656e20746f206360448201527f726561746520612052656c617965720000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a03851614156123f2576040805160e560020a62461bcd02815260206004820152603660248201527f436f696e6261736520616e642052656c617965724f776e65722061646472657360448201527f73206d757374206e6f74206265207468652073616d6500000000000000000000606482015290519081900360840190fd5b600054600160a060020a038581169116141561247e576040805160e560020a62461bcd02815260206004820152602b60248201527f436f696e62617365206d757374206e6f742062652073616d6520617320434f4e60448201527f54524143545f4f574e4552000000000000000000000000000000000000000000606482015290519081900360840190fd5b6008543410156124d8576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e696d756d206465706f736974206e6f74207361746973666965642e0000604482015290519081900360640190fd5b60008361ffff16101580156124f257506103e88361ffff16105b1515612548576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b600254825111156125a3576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b81518151146125fc576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f742076616c6964206e756d626572206f6620506169727300000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600360205260409020541561266a576040805160e560020a62461bcd02815260206004820152601c60248201527f436f696e6261736520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b600160a060020a038416600090815260056020526040902054156126da576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b60015460095410612735576040805160e560020a62461bcd02815260206004820152601b60248201527f4d6178696d756d2072656c617965727320726567697374657265640000000000604482015290519081900360640190fd5b61273f8282613359565b1515600114612798576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b6007805460009081526004602090815260408083208054600160a060020a031916600160a060020a038a16908117909155815160c08101835234815261ffff8981168286019081528285018a8152606084018a9052975460808401523360a0840152928652600385529290942084518155905160018201805461ffff19169190931617909155925180519293926128359260028501920190613aee565b5060608201518051612851916003840191602090910190613aee565b50608082810151600483015560a09283015160059092018054600160a060020a031916600160a060020a039384161790556007805460019081019091556009805482019055918716600090815260036020818152604092839020805495810154845187815261ffff9091169281018390529384018581526002820180549686018790527fcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b9893969095929094019391929091606084019184019086908015610faf57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f915750508381038252848181548152602001915080548015610ff857602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610fda575050965050505050505060405180910390a150505050565b60025481565b600160a060020a0381166000908152600560205260408120548190839015612a19576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a03841660009081526006602052604081205493508311612ab0576040805160e560020a62461bcd02815260206004820152602160248201527f52656c61796572206973206e6f742063757272656e746c7920666f722073616c60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b348314612b07576040805160e560020a62461bcd02815260206004820152601960248201527f50726963652d746167206d757374206265206d61746368656400000000000000604482015290519081900360640190fd5b600160a060020a038085166000908152600360205260409020600501541691503315801590612b3f575033600160a060020a03831614155b8015612b535750600160a060020a03821615155b1515612ba9576040805160e560020a62461bcd02815260206004820152601160248201527f41646472657373206e6f742076616c6964000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0380851660009081526003602090815260408083206005018054600160a060020a031916331790556006909152808220829055519184169185156108fc0291869190818181858888f19350505050158015612c0f573d6000803e3d6000fd5b506040805160018152600160a060020a0386166020820152348183015290517f07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c69181900360600190a150505050565b600160a060020a038181166000908152600360205260408120600501549091829182918591163314612cc8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038516600090815260066020526040902054859015612d3a576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a03861660009081526005602052604081205411612da8576040805160e560020a62461bcd02815260206004820152601160248201527f52657175657374206e6f7420666f756e64000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600360209081526040808320805460049091015460059093529220549196509450421115612f1657600160a060020a038616600090815260036020526040812081815560018101805461ffff1916905590612e156002830182613b53565b612e23600383016000613b53565b506000600482810182905560059283018054600160a060020a0319908116909155600160a060020a038a811684526020948552604080852085905560078054600019908101875285885282872080548087169091558c88528388208054919095169516851790935583865260039096528085209093018990558454019093555191945033916108fc88150291889190818181858888f19350505050158015612ecf573d6000803e3d6000fd5b5060408051600181526000602082015280820187905290517ffaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d302509181900360600190a1612f73565b600160a060020a038616600090815260056020908152604080832054815193845242900391830191909152818101879052517ffaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d302509181900360600190a15b505050505050565b600054600160a060020a031681565b600160a060020a0383166000908152600360208181526040808420909201548251600190910180825280830282019092019092528291606091839182918015612fdd578160200160208202803883390190505b50600a54604080517fa3ff31b5000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152915193965091169163a3ff31b5916024808201926020929091908290030181600087803b15801561304857600080fd5b505af115801561305c573d6000803e3d6000fd5b505050506040513d602081101561307257600080fd5b5051806130885750600160a060020a0386166001145b915081801561313a5750600a54604080517fa3ff31b5000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301529151919092169163a3ff31b59160248083019260209291908290030181600087803b1580156130fa57600080fd5b505af115801561310e573d6000803e3d6000fd5b505050506040513d602081101561312457600080fd5b50518061313a5750600160a060020a0387166001145b915081151561314c5760009450613331565b600160a060020a0387166001148061316d5750600160a060020a0386166001145b1561317b5760019450613331565b5060005b600160a060020a0388166000908152600360208190526040909120015481101561331357600160a060020a038816600090815260036020819052604090912001805460019190839081106131cf57fe5b600091825260209091200154600160a060020a0316141561325957600160a060020a038816600090815260036020526040902060020180548290811061321157fe5b6000918252602090912001548351600160a060020a039091169084908690811061323757fe5b600160a060020a0390921660209283029091019091015260019093019261330b565b600160a060020a03881660009081526003602052604090206002018054600191908390811061328457fe5b600091825260209091200154600160a060020a0316141561330b57600160a060020a0388166000908152600360208190526040909120018054829081106132c757fe5b6000918252602090912001548351600160a060020a03909116908490869081106132ed57fe5b600160a060020a039092166020928302909101909101526001909301925b60010161317f565b61331d8387613a95565b151561332c5760009450613331565b600194505b505050509392505050565b60008282018381101561334e57600080fd5b8091505b5092915050565b60008060006060806000806000809650600095508951604051908082528060200260200182016040528015613398578160200160208202803883390190505b50945089516040519080825280602002602001820160405280156133c6578160200160208202803883390190505b509350600092505b88518310156136c257600a548951600160a060020a039091169063a3ff31b5908b90869081106133fa57fe5b906020019060200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561344f57600080fd5b505af1158015613463573d6000803e3d6000fd5b505050506040513d602081101561347957600080fd5b5051806134a7575088516001908a908590811061349257fe5b90602001906020020151600160a060020a0316145b91508180156135815750600a548a51600160a060020a039091169063a3ff31b5908c90869081106134d457fe5b906020019060200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561352957600080fd5b505af115801561353d573d6000803e3d6000fd5b505050506040513d602081101561355357600080fd5b505180613581575089516001908b908590811061356c57fe5b90602001906020020151600160a060020a0316145b9150811515613593576000975061370b565b88516001908a90859081106135a457fe5b90602001906020020151600160a060020a031614156136055789838151811015156135cb57fe5b9060200190602002015185888151811015156135e357fe5b600160a060020a039092166020928302909101909101526001909601956136b7565b89516001908b908590811061361657fe5b90602001906020020151600160a060020a0316141561367357888381518110151561363d57fe5b90602001906020020151858881518110151561365557fe5b600160a060020a039092166020928302909101909101526001909601955b888381518110151561368157fe5b90602001906020020151848781518110151561369957fe5b600160a060020a039092166020928302909101909101526001909501945b6001909201916133ce565b5060005b85811015613706576136ef8585838151811015156136e057fe5b90602001906020020151613a95565b15156136fe576000975061370b565b6001016136c6565b600197505b5050505050505092915050565b6060806060806000806060806000600360008d600160a060020a0316600160a060020a031681526020019081526020016000206003018054905060405190808252806020026020018201604052801561377b578160200160208202803883390190505b50600160a060020a038d16600090815260036020818152604092839020909101548251818152818302810190920190925291985080156137c5578160200160208202803883390190505b50955060009450600093505b600160a060020a038c166000908152600360208190526040909120015484101561395c57600160a060020a038c81166000908152600360208190526040909120018054918c16918690811061382257fe5b600091825260209091200154600160a060020a03161415806138835750600160a060020a038c811660009081526003602052604090206002018054918d16918690811061386b57fe5b600091825260209091200154600160a060020a031614155b1561395157600160a060020a038c1660009081526003602052604090206002018054859081106138af57fe5b6000918252602090912001548751600160a060020a03909116908890879081106138d557fe5b600160a060020a039283166020918202909201810191909152908d166000908152600391829052604090200180548590811061390d57fe5b6000918252602090912001548651600160a060020a039091169087908790811061393357fe5b600160a060020a039092166020928302909101909101526001909401935b6001909301926137d1565b600160a060020a038c16600090815260036020819052604090912001548514613a7f5760018651036040519080825280602002602001820160405280156139ad578160200160208202803883390190505b50925060018651036040519080825280602002602001820160405280156139de578160200160208202803883390190505b509150600090505b6001865103811015613a74578681815181101515613a0057fe5b906020019060200201518382815181101515613a1857fe5b600160a060020a039092166020928302909101909101528551869082908110613a3d57fe5b906020019060200201518282815181101515613a5557fe5b600160a060020a039092166020928302909101909101526001016139e6565b828298509850613a86565b8686985098505b50505050505050935093915050565b6000805b8351811015613ae45782600160a060020a03168482815181101515613aba57fe5b90602001906020020151600160a060020a03161415613adc5760019150613352565b600101613a99565b5060009392505050565b828054828255906000526020600020908101928215613b43579160200282015b82811115613b435782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190613b0e565b50613b4f929150613b74565b5090565b5080546000825590600052602060002090810190613b719190613b9b565b50565b613b9891905b80821115613b4f578054600160a060020a0319168155600101613b7a565b90565b613b9891905b80821115613b4f5760008155600101613ba1560052656c61796572204f776e6572204f6e6c792e000000000000000000000000005468652072656c6179657220686173206265656e2072657175657374656420745468652072656c61796572206d757374206265206e6f742063757272656e746ccaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f6f20636c6f73652e0000000000000000000000000000000000000000000000007920666f722053616c6500000000000000000000000000000000000000000000a165627a7a723058207d9c49eecfd59b2ae9911da7296be4a9f5e5d938cbf3dfb6327f454bc1c46a4f0029`
+
+// DeployRelayerRegistration deploys a new Ethereum contract, binding an instance of RelayerRegistration to it.
+func DeployRelayerRegistration(auth *bind.TransactOpts, backend bind.ContractBackend, XDCxListing common.Address, maxRelayers *big.Int, maxTokenList *big.Int, minDeposit *big.Int) (common.Address, *types.Transaction, *RelayerRegistration, error) {
+ parsed, err := abi.JSON(strings.NewReader(RelayerRegistrationABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(RelayerRegistrationBin), backend, XDCxListing, maxRelayers, maxTokenList, minDeposit)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &RelayerRegistration{RelayerRegistrationCaller: RelayerRegistrationCaller{contract: contract}, RelayerRegistrationTransactor: RelayerRegistrationTransactor{contract: contract}, RelayerRegistrationFilterer: RelayerRegistrationFilterer{contract: contract}}, nil
+}
+
+// RelayerRegistration is an auto generated Go binding around an Ethereum contract.
+type RelayerRegistration struct {
+ RelayerRegistrationCaller // Read-only binding to the contract
+ RelayerRegistrationTransactor // Write-only binding to the contract
+ RelayerRegistrationFilterer // Log filterer for contract events
+}
+
+// RelayerRegistrationCaller is an auto generated read-only Go binding around an Ethereum contract.
+type RelayerRegistrationCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// RelayerRegistrationTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type RelayerRegistrationTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// RelayerRegistrationFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type RelayerRegistrationFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// RelayerRegistrationSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type RelayerRegistrationSession struct {
+ Contract *RelayerRegistration // 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
+}
+
+// RelayerRegistrationCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type RelayerRegistrationCallerSession struct {
+ Contract *RelayerRegistrationCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// RelayerRegistrationTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type RelayerRegistrationTransactorSession struct {
+ Contract *RelayerRegistrationTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// RelayerRegistrationRaw is an auto generated low-level Go binding around an Ethereum contract.
+type RelayerRegistrationRaw struct {
+ Contract *RelayerRegistration // Generic contract binding to access the raw methods on
+}
+
+// RelayerRegistrationCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type RelayerRegistrationCallerRaw struct {
+ Contract *RelayerRegistrationCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// RelayerRegistrationTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type RelayerRegistrationTransactorRaw struct {
+ Contract *RelayerRegistrationTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewRelayerRegistration creates a new instance of RelayerRegistration, bound to a specific deployed contract.
+func NewRelayerRegistration(address common.Address, backend bind.ContractBackend) (*RelayerRegistration, error) {
+ contract, err := bindRelayerRegistration(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistration{RelayerRegistrationCaller: RelayerRegistrationCaller{contract: contract}, RelayerRegistrationTransactor: RelayerRegistrationTransactor{contract: contract}, RelayerRegistrationFilterer: RelayerRegistrationFilterer{contract: contract}}, nil
+}
+
+// NewRelayerRegistrationCaller creates a new read-only instance of RelayerRegistration, bound to a specific deployed contract.
+func NewRelayerRegistrationCaller(address common.Address, caller bind.ContractCaller) (*RelayerRegistrationCaller, error) {
+ contract, err := bindRelayerRegistration(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationCaller{contract: contract}, nil
+}
+
+// NewRelayerRegistrationTransactor creates a new write-only instance of RelayerRegistration, bound to a specific deployed contract.
+func NewRelayerRegistrationTransactor(address common.Address, transactor bind.ContractTransactor) (*RelayerRegistrationTransactor, error) {
+ contract, err := bindRelayerRegistration(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationTransactor{contract: contract}, nil
+}
+
+// NewRelayerRegistrationFilterer creates a new log filterer instance of RelayerRegistration, bound to a specific deployed contract.
+func NewRelayerRegistrationFilterer(address common.Address, filterer bind.ContractFilterer) (*RelayerRegistrationFilterer, error) {
+ contract, err := bindRelayerRegistration(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationFilterer{contract: contract}, nil
+}
+
+// bindRelayerRegistration binds a generic wrapper to an already deployed contract.
+func bindRelayerRegistration(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(RelayerRegistrationABI))
+ 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 (_RelayerRegistration *RelayerRegistrationRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _RelayerRegistration.Contract.RelayerRegistrationCaller.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 (_RelayerRegistration *RelayerRegistrationRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.RelayerRegistrationTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_RelayerRegistration *RelayerRegistrationRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.RelayerRegistrationTransactor.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 (_RelayerRegistration *RelayerRegistrationCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _RelayerRegistration.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 (_RelayerRegistration *RelayerRegistrationTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_RelayerRegistration *RelayerRegistrationTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.contract.Transact(opts, method, params...)
+}
+
+// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
+//
+// Solidity: function ActiveRelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) ActiveRelayerCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "ActiveRelayerCount")
+ return *ret0, err
+}
+
+// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
+//
+// Solidity: function ActiveRelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) ActiveRelayerCount() (*big.Int, error) {
+ return _RelayerRegistration.Contract.ActiveRelayerCount(&_RelayerRegistration.CallOpts)
+}
+
+// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
+//
+// Solidity: function ActiveRelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) ActiveRelayerCount() (*big.Int, error) {
+ return _RelayerRegistration.Contract.ActiveRelayerCount(&_RelayerRegistration.CallOpts)
+}
+
+// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
+//
+// Solidity: function CONTRACT_OWNER() constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationCaller) CONTRACTOWNER(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "CONTRACT_OWNER")
+ return *ret0, err
+}
+
+// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
+//
+// Solidity: function CONTRACT_OWNER() constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationSession) CONTRACTOWNER() (common.Address, error) {
+ return _RelayerRegistration.Contract.CONTRACTOWNER(&_RelayerRegistration.CallOpts)
+}
+
+// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
+//
+// Solidity: function CONTRACT_OWNER() constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) CONTRACTOWNER() (common.Address, error) {
+ return _RelayerRegistration.Contract.CONTRACTOWNER(&_RelayerRegistration.CallOpts)
+}
+
+// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
+//
+// Solidity: function MaximumRelayers() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) MaximumRelayers(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "MaximumRelayers")
+ return *ret0, err
+}
+
+// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
+//
+// Solidity: function MaximumRelayers() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) MaximumRelayers() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MaximumRelayers(&_RelayerRegistration.CallOpts)
+}
+
+// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
+//
+// Solidity: function MaximumRelayers() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) MaximumRelayers() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MaximumRelayers(&_RelayerRegistration.CallOpts)
+}
+
+// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
+//
+// Solidity: function MaximumTokenList() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) MaximumTokenList(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "MaximumTokenList")
+ return *ret0, err
+}
+
+// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
+//
+// Solidity: function MaximumTokenList() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) MaximumTokenList() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MaximumTokenList(&_RelayerRegistration.CallOpts)
+}
+
+// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
+//
+// Solidity: function MaximumTokenList() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) MaximumTokenList() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MaximumTokenList(&_RelayerRegistration.CallOpts)
+}
+
+// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
+//
+// Solidity: function MinimumDeposit() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) MinimumDeposit(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "MinimumDeposit")
+ return *ret0, err
+}
+
+// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
+//
+// Solidity: function MinimumDeposit() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) MinimumDeposit() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MinimumDeposit(&_RelayerRegistration.CallOpts)
+}
+
+// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
+//
+// Solidity: function MinimumDeposit() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) MinimumDeposit() (*big.Int, error) {
+ return _RelayerRegistration.Contract.MinimumDeposit(&_RelayerRegistration.CallOpts)
+}
+
+// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
+//
+// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERCOINBASES(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_COINBASES", arg0)
+ return *ret0, err
+}
+
+// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
+//
+// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationSession) RELAYERCOINBASES(arg0 *big.Int) (common.Address, error) {
+ return _RelayerRegistration.Contract.RELAYERCOINBASES(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
+//
+// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERCOINBASES(arg0 *big.Int) (common.Address, error) {
+ return _RelayerRegistration.Contract.RELAYERCOINBASES(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
+//
+// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
+func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERLIST(opts *bind.CallOpts, arg0 common.Address) (struct {
+ Deposit *big.Int
+ TradeFee uint16
+ Index *big.Int
+ Owner common.Address
+}, error) {
+ ret := new(struct {
+ Deposit *big.Int
+ TradeFee uint16
+ Index *big.Int
+ Owner common.Address
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_LIST", arg0)
+ return *ret, err
+}
+
+// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
+//
+// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
+func (_RelayerRegistration *RelayerRegistrationSession) RELAYERLIST(arg0 common.Address) (struct {
+ Deposit *big.Int
+ TradeFee uint16
+ Index *big.Int
+ Owner common.Address
+}, error) {
+ return _RelayerRegistration.Contract.RELAYERLIST(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
+//
+// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERLIST(arg0 common.Address) (struct {
+ Deposit *big.Int
+ TradeFee uint16
+ Index *big.Int
+ Owner common.Address
+}, error) {
+ return _RelayerRegistration.Contract.RELAYERLIST(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
+//
+// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERONSALELIST(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_ON_SALE_LIST", arg0)
+ return *ret0, err
+}
+
+// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
+//
+// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) RELAYERONSALELIST(arg0 common.Address) (*big.Int, error) {
+ return _RelayerRegistration.Contract.RELAYERONSALELIST(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
+//
+// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERONSALELIST(arg0 common.Address) (*big.Int, error) {
+ return _RelayerRegistration.Contract.RELAYERONSALELIST(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) RESIGNREQUESTS(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "RESIGN_REQUESTS", arg0)
+ return *ret0, err
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
+ return _RelayerRegistration.Contract.RESIGNREQUESTS(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
+//
+// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
+ return _RelayerRegistration.Contract.RESIGNREQUESTS(&_RelayerRegistration.CallOpts, arg0)
+}
+
+// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
+//
+// Solidity: function RelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCaller) RelayerCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "RelayerCount")
+ return *ret0, err
+}
+
+// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
+//
+// Solidity: function RelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationSession) RelayerCount() (*big.Int, error) {
+ return _RelayerRegistration.Contract.RelayerCount(&_RelayerRegistration.CallOpts)
+}
+
+// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
+//
+// Solidity: function RelayerCount() constant returns(uint256)
+func (_RelayerRegistration *RelayerRegistrationCallerSession) RelayerCount() (*big.Int, error) {
+ return _RelayerRegistration.Contract.RelayerCount(&_RelayerRegistration.CallOpts)
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_RelayerRegistration *RelayerRegistrationCaller) GetRelayerByCoinbase(opts *bind.CallOpts, coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ var (
+ ret0 = new(*big.Int)
+ ret1 = new(common.Address)
+ ret2 = new(*big.Int)
+ ret3 = new(uint16)
+ ret4 = new([]common.Address)
+ ret5 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ ret1,
+ ret2,
+ ret3,
+ ret4,
+ ret5,
+ }
+ err := _RelayerRegistration.contract.Call(opts, out, "getRelayerByCoinbase", coinbase)
+ return *ret0, *ret1, *ret2, *ret3, *ret4, *ret5, err
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_RelayerRegistration *RelayerRegistrationSession) GetRelayerByCoinbase(coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ return _RelayerRegistration.Contract.GetRelayerByCoinbase(&_RelayerRegistration.CallOpts, coinbase)
+}
+
+// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
+//
+// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
+func (_RelayerRegistration *RelayerRegistrationCallerSession) GetRelayerByCoinbase(coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
+ return _RelayerRegistration.Contract.GetRelayerByCoinbase(&_RelayerRegistration.CallOpts, coinbase)
+}
+
+// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
+//
+// Solidity: function buyRelayer(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) BuyRelayer(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "buyRelayer", coinbase)
+}
+
+// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
+//
+// Solidity: function buyRelayer(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) BuyRelayer(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.BuyRelayer(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
+//
+// Solidity: function buyRelayer(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) BuyRelayer(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.BuyRelayer(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
+//
+// Solidity: function cancelSelling(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) CancelSelling(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "cancelSelling", coinbase)
+}
+
+// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
+//
+// Solidity: function cancelSelling(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) CancelSelling(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.CancelSelling(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
+//
+// Solidity: function cancelSelling(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) CancelSelling(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.CancelSelling(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
+//
+// Solidity: function changeContractOwner(owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) ChangeContractOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "changeContractOwner", owner)
+}
+
+// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
+//
+// Solidity: function changeContractOwner(owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) ChangeContractOwner(owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.ChangeContractOwner(&_RelayerRegistration.TransactOpts, owner)
+}
+
+// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
+//
+// Solidity: function changeContractOwner(owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) ChangeContractOwner(owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.ChangeContractOwner(&_RelayerRegistration.TransactOpts, owner)
+}
+
+// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
+//
+// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) DeListToken(opts *bind.TransactOpts, coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "deListToken", coinbase, fromToken, toToken)
+}
+
+// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
+//
+// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) DeListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.DeListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
+}
+
+// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
+//
+// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) DeListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.DeListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
+}
+
+// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
+//
+// Solidity: function depositMore(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) DepositMore(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "depositMore", coinbase)
+}
+
+// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
+//
+// Solidity: function depositMore(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) DepositMore(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.DepositMore(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
+//
+// Solidity: function depositMore(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) DepositMore(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.DepositMore(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
+//
+// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) ListToken(opts *bind.TransactOpts, coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "listToken", coinbase, fromToken, toToken)
+}
+
+// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
+//
+// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) ListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.ListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
+}
+
+// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
+//
+// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) ListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.ListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
+}
+
+// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
+//
+// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Reconfigure(opts *bind.TransactOpts, maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "reconfigure", maxRelayer, maxToken, minDeposit)
+}
+
+// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
+//
+// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Reconfigure(maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Reconfigure(&_RelayerRegistration.TransactOpts, maxRelayer, maxToken, minDeposit)
+}
+
+// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
+//
+// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Reconfigure(maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Reconfigure(&_RelayerRegistration.TransactOpts, maxRelayer, maxToken, minDeposit)
+}
+
+// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
+//
+// Solidity: function refund(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Refund(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "refund", coinbase)
+}
+
+// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
+//
+// Solidity: function refund(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Refund(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Refund(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
+//
+// Solidity: function refund(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Refund(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Refund(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
+//
+// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Register(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "register", coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
+//
+// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Register(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Register(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
+//
+// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Register(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Register(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Resign(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "resign", coinbase)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Resign(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Resign(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(coinbase address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Resign(coinbase common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Resign(&_RelayerRegistration.TransactOpts, coinbase)
+}
+
+// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
+//
+// Solidity: function sellRelayer(coinbase address, price uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) SellRelayer(opts *bind.TransactOpts, coinbase common.Address, price *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "sellRelayer", coinbase, price)
+}
+
+// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
+//
+// Solidity: function sellRelayer(coinbase address, price uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) SellRelayer(coinbase common.Address, price *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.SellRelayer(&_RelayerRegistration.TransactOpts, coinbase, price)
+}
+
+// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
+//
+// Solidity: function sellRelayer(coinbase address, price uint256) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) SellRelayer(coinbase common.Address, price *big.Int) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.SellRelayer(&_RelayerRegistration.TransactOpts, coinbase, price)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
+//
+// Solidity: function transfer(coinbase address, new_owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Transfer(opts *bind.TransactOpts, coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "transfer", coinbase, new_owner)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
+//
+// Solidity: function transfer(coinbase address, new_owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Transfer(coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Transfer(&_RelayerRegistration.TransactOpts, coinbase, new_owner)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
+//
+// Solidity: function transfer(coinbase address, new_owner address) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Transfer(coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Transfer(&_RelayerRegistration.TransactOpts, coinbase, new_owner)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x56246b68.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) Update(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "update", coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x56246b68.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) Update(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Update(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// Update is a paid mutator transaction binding the contract method 0x56246b68.
+//
+// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) Update(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.Update(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactor) UpdateFee(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _RelayerRegistration.contract.Transact(opts, "updateFee", coinbase, tradeFee)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_RelayerRegistration *RelayerRegistrationSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.UpdateFee(&_RelayerRegistration.TransactOpts, coinbase, tradeFee)
+}
+
+// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
+//
+// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
+func (_RelayerRegistration *RelayerRegistrationTransactorSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
+ return _RelayerRegistration.Contract.UpdateFee(&_RelayerRegistration.TransactOpts, coinbase, tradeFee)
+}
+
+// RelayerRegistrationBuyEventIterator is returned from FilterBuyEvent and is used to iterate over the raw logs and unpacked data for BuyEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationBuyEventIterator struct {
+ Event *RelayerRegistrationBuyEvent // 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 *RelayerRegistrationBuyEventIterator) 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(RelayerRegistrationBuyEvent)
+ 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(RelayerRegistrationBuyEvent)
+ 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 *RelayerRegistrationBuyEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationBuyEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationBuyEvent represents a BuyEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationBuyEvent struct {
+ Success bool
+ Coinbase common.Address
+ Price *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterBuyEvent is a free log retrieval operation binding the contract event 0x07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c6.
+//
+// Solidity: event BuyEvent(success bool, coinbase address, price uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterBuyEvent(opts *bind.FilterOpts) (*RelayerRegistrationBuyEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "BuyEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationBuyEventIterator{contract: _RelayerRegistration.contract, event: "BuyEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchBuyEvent is a free log subscription operation binding the contract event 0x07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c6.
+//
+// Solidity: event BuyEvent(success bool, coinbase address, price uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchBuyEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationBuyEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "BuyEvent")
+ 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(RelayerRegistrationBuyEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "BuyEvent", 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
+}
+
+// RelayerRegistrationConfigEventIterator is returned from FilterConfigEvent and is used to iterate over the raw logs and unpacked data for ConfigEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationConfigEventIterator struct {
+ Event *RelayerRegistrationConfigEvent // 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 *RelayerRegistrationConfigEventIterator) 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(RelayerRegistrationConfigEvent)
+ 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(RelayerRegistrationConfigEvent)
+ 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 *RelayerRegistrationConfigEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationConfigEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationConfigEvent represents a ConfigEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationConfigEvent struct {
+ MaxRelayer *big.Int
+ MaxToken *big.Int
+ MinDeposit *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterConfigEvent is a free log retrieval operation binding the contract event 0x8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d93923.
+//
+// Solidity: event ConfigEvent(max_relayer uint256, max_token uint256, min_deposit uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterConfigEvent(opts *bind.FilterOpts) (*RelayerRegistrationConfigEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "ConfigEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationConfigEventIterator{contract: _RelayerRegistration.contract, event: "ConfigEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchConfigEvent is a free log subscription operation binding the contract event 0x8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d93923.
+//
+// Solidity: event ConfigEvent(max_relayer uint256, max_token uint256, min_deposit uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchConfigEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationConfigEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "ConfigEvent")
+ 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(RelayerRegistrationConfigEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "ConfigEvent", 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
+}
+
+// RelayerRegistrationRefundEventIterator is returned from FilterRefundEvent and is used to iterate over the raw logs and unpacked data for RefundEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationRefundEventIterator struct {
+ Event *RelayerRegistrationRefundEvent // 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 *RelayerRegistrationRefundEventIterator) 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(RelayerRegistrationRefundEvent)
+ 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(RelayerRegistrationRefundEvent)
+ 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 *RelayerRegistrationRefundEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationRefundEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationRefundEvent represents a RefundEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationRefundEvent struct {
+ Success bool
+ RemainingTime *big.Int
+ DepositAmount *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRefundEvent is a free log retrieval operation binding the contract event 0xfaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d30250.
+//
+// Solidity: event RefundEvent(success bool, remaining_time uint256, deposit_amount uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterRefundEvent(opts *bind.FilterOpts) (*RelayerRegistrationRefundEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "RefundEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationRefundEventIterator{contract: _RelayerRegistration.contract, event: "RefundEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchRefundEvent is a free log subscription operation binding the contract event 0xfaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d30250.
+//
+// Solidity: event RefundEvent(success bool, remaining_time uint256, deposit_amount uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchRefundEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationRefundEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "RefundEvent")
+ 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(RelayerRegistrationRefundEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "RefundEvent", 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
+}
+
+// RelayerRegistrationRegisterEventIterator is returned from FilterRegisterEvent and is used to iterate over the raw logs and unpacked data for RegisterEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationRegisterEventIterator struct {
+ Event *RelayerRegistrationRegisterEvent // 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 *RelayerRegistrationRegisterEventIterator) 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(RelayerRegistrationRegisterEvent)
+ 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(RelayerRegistrationRegisterEvent)
+ 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 *RelayerRegistrationRegisterEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationRegisterEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationRegisterEvent represents a RegisterEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationRegisterEvent struct {
+ Deposit *big.Int
+ TradeFee uint16
+ FromTokens []common.Address
+ ToTokens []common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRegisterEvent is a free log retrieval operation binding the contract event 0xcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b.
+//
+// Solidity: event RegisterEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterRegisterEvent(opts *bind.FilterOpts) (*RelayerRegistrationRegisterEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "RegisterEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationRegisterEventIterator{contract: _RelayerRegistration.contract, event: "RegisterEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchRegisterEvent is a free log subscription operation binding the contract event 0xcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b.
+//
+// Solidity: event RegisterEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchRegisterEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationRegisterEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "RegisterEvent")
+ 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(RelayerRegistrationRegisterEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "RegisterEvent", 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
+}
+
+// RelayerRegistrationResignEventIterator is returned from FilterResignEvent and is used to iterate over the raw logs and unpacked data for ResignEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationResignEventIterator struct {
+ Event *RelayerRegistrationResignEvent // 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 *RelayerRegistrationResignEventIterator) 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(RelayerRegistrationResignEvent)
+ 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(RelayerRegistrationResignEvent)
+ 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 *RelayerRegistrationResignEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationResignEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationResignEvent represents a ResignEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationResignEvent struct {
+ DepositReleaseTime *big.Int
+ DepositAmount *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterResignEvent is a free log retrieval operation binding the contract event 0x2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae5.
+//
+// Solidity: event ResignEvent(deposit_release_time uint256, deposit_amount uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterResignEvent(opts *bind.FilterOpts) (*RelayerRegistrationResignEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "ResignEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationResignEventIterator{contract: _RelayerRegistration.contract, event: "ResignEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchResignEvent is a free log subscription operation binding the contract event 0x2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae5.
+//
+// Solidity: event ResignEvent(deposit_release_time uint256, deposit_amount uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchResignEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationResignEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "ResignEvent")
+ 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(RelayerRegistrationResignEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "ResignEvent", 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
+}
+
+// RelayerRegistrationSellEventIterator is returned from FilterSellEvent and is used to iterate over the raw logs and unpacked data for SellEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationSellEventIterator struct {
+ Event *RelayerRegistrationSellEvent // 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 *RelayerRegistrationSellEventIterator) 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(RelayerRegistrationSellEvent)
+ 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(RelayerRegistrationSellEvent)
+ 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 *RelayerRegistrationSellEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationSellEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationSellEvent represents a SellEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationSellEvent struct {
+ IsOnSale bool
+ Coinbase common.Address
+ Price *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSellEvent is a free log retrieval operation binding the contract event 0xdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d082.
+//
+// Solidity: event SellEvent(is_on_sale bool, coinbase address, price uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterSellEvent(opts *bind.FilterOpts) (*RelayerRegistrationSellEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "SellEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationSellEventIterator{contract: _RelayerRegistration.contract, event: "SellEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchSellEvent is a free log subscription operation binding the contract event 0xdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d082.
+//
+// Solidity: event SellEvent(is_on_sale bool, coinbase address, price uint256)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchSellEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationSellEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "SellEvent")
+ 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(RelayerRegistrationSellEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "SellEvent", 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
+}
+
+// RelayerRegistrationTransferEventIterator is returned from FilterTransferEvent and is used to iterate over the raw logs and unpacked data for TransferEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationTransferEventIterator struct {
+ Event *RelayerRegistrationTransferEvent // 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 *RelayerRegistrationTransferEventIterator) 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(RelayerRegistrationTransferEvent)
+ 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(RelayerRegistrationTransferEvent)
+ 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 *RelayerRegistrationTransferEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationTransferEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationTransferEvent represents a TransferEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationTransferEvent struct {
+ Owner common.Address
+ Deposit *big.Int
+ TradeFee uint16
+ FromTokens []common.Address
+ ToTokens []common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransferEvent is a free log retrieval operation binding the contract event 0xc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b662.
+//
+// Solidity: event TransferEvent(owner address, deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterTransferEvent(opts *bind.FilterOpts) (*RelayerRegistrationTransferEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "TransferEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationTransferEventIterator{contract: _RelayerRegistration.contract, event: "TransferEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchTransferEvent is a free log subscription operation binding the contract event 0xc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b662.
+//
+// Solidity: event TransferEvent(owner address, deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchTransferEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationTransferEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "TransferEvent")
+ 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(RelayerRegistrationTransferEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "TransferEvent", 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
+}
+
+// RelayerRegistrationUpdateEventIterator is returned from FilterUpdateEvent and is used to iterate over the raw logs and unpacked data for UpdateEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationUpdateEventIterator struct {
+ Event *RelayerRegistrationUpdateEvent // 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 *RelayerRegistrationUpdateEventIterator) 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(RelayerRegistrationUpdateEvent)
+ 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(RelayerRegistrationUpdateEvent)
+ 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 *RelayerRegistrationUpdateEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationUpdateEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationUpdateEvent represents a UpdateEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationUpdateEvent struct {
+ Deposit *big.Int
+ TradeFee uint16
+ FromTokens []common.Address
+ ToTokens []common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUpdateEvent is a free log retrieval operation binding the contract event 0xcaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f.
+//
+// Solidity: event UpdateEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterUpdateEvent(opts *bind.FilterOpts) (*RelayerRegistrationUpdateEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "UpdateEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationUpdateEventIterator{contract: _RelayerRegistration.contract, event: "UpdateEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchUpdateEvent is a free log subscription operation binding the contract event 0xcaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f.
+//
+// Solidity: event UpdateEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchUpdateEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationUpdateEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "UpdateEvent")
+ 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(RelayerRegistrationUpdateEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "UpdateEvent", 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
+}
+
+// RelayerRegistrationUpdateFeeEventIterator is returned from FilterUpdateFeeEvent and is used to iterate over the raw logs and unpacked data for UpdateFeeEvent events raised by the RelayerRegistration contract.
+type RelayerRegistrationUpdateFeeEventIterator struct {
+ Event *RelayerRegistrationUpdateFeeEvent // 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 *RelayerRegistrationUpdateFeeEventIterator) 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(RelayerRegistrationUpdateFeeEvent)
+ 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(RelayerRegistrationUpdateFeeEvent)
+ 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 *RelayerRegistrationUpdateFeeEventIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *RelayerRegistrationUpdateFeeEventIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// RelayerRegistrationUpdateFeeEvent represents a UpdateFeeEvent event raised by the RelayerRegistration contract.
+type RelayerRegistrationUpdateFeeEvent struct {
+ Coinbase common.Address
+ TradeFee uint16
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUpdateFeeEvent is a free log retrieval operation binding the contract event 0x5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc459.
+//
+// Solidity: event UpdateFeeEvent(coinbase address, tradeFee uint16)
+func (_RelayerRegistration *RelayerRegistrationFilterer) FilterUpdateFeeEvent(opts *bind.FilterOpts) (*RelayerRegistrationUpdateFeeEventIterator, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "UpdateFeeEvent")
+ if err != nil {
+ return nil, err
+ }
+ return &RelayerRegistrationUpdateFeeEventIterator{contract: _RelayerRegistration.contract, event: "UpdateFeeEvent", logs: logs, sub: sub}, nil
+}
+
+// WatchUpdateFeeEvent is a free log subscription operation binding the contract event 0x5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc459.
+//
+// Solidity: event UpdateFeeEvent(coinbase address, tradeFee uint16)
+func (_RelayerRegistration *RelayerRegistrationFilterer) WatchUpdateFeeEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationUpdateFeeEvent) (event.Subscription, error) {
+
+ logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "UpdateFeeEvent")
+ 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(RelayerRegistrationUpdateFeeEvent)
+ if err := _RelayerRegistration.contract.UnpackLog(event, "UpdateFeeEvent", 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
+}
+
+// SafeMathABI is the input ABI used to generate the binding from.
+const SafeMathABI = "[]"
+
+// SafeMathBin is the compiled bytecode used for deploying new contracts.
+const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820c6c4834061dabec64e5ceac30b20029de90ad520415e80a05c3d6dd6fae00bc80029`
+
+// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it.
+func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// SafeMath is an auto generated Go binding around an Ethereum contract.
+type SafeMath struct {
+ SafeMathCaller // Read-only binding to the contract
+ SafeMathTransactor // Write-only binding to the contract
+ SafeMathFilterer // Log filterer for contract events
+}
+
+// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SafeMathCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SafeMathTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SafeMathFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SafeMathSession struct {
+ Contract *SafeMath // 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
+}
+
+// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SafeMathCallerSession struct {
+ Contract *SafeMathCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SafeMathTransactorSession struct {
+ Contract *SafeMathTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SafeMathRaw struct {
+ Contract *SafeMath // Generic contract binding to access the raw methods on
+}
+
+// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SafeMathCallerRaw struct {
+ Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SafeMathTransactorRaw struct {
+ Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) {
+ contract, err := bindSafeMath(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) {
+ contract, err := bindSafeMath(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathCaller{contract: contract}, nil
+}
+
+// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) {
+ contract, err := bindSafeMath(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathTransactor{contract: contract}, nil
+}
+
+// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) {
+ contract, err := bindSafeMath(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathFilterer{contract: contract}, nil
+}
+
+// bindSafeMath binds a generic wrapper to an already deployed contract.
+func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ 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 (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.Contract.SafeMathCaller.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 (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.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 (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.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 (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transact(opts, method, params...)
+}
diff --git a/contracts/XDCx/contract/TRC21.go b/contracts/XDCx/contract/TRC21.go
new file mode 100644
index 0000000000..d30a9a6fe9
--- /dev/null
+++ b/contracts/XDCx/contract/TRC21.go
@@ -0,0 +1,4716 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// ITRC21ABI is the input ABI used to generate the binding from.
+const ITRC21ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// ITRC21Bin is the compiled bytecode used for deploying new contracts.
+const ITRC21Bin = `0x`
+
+// DeployITRC21 deploys a new Ethereum contract, binding an instance of ITRC21 to it.
+func DeployITRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ITRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(ITRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ITRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ITRC21{ITRC21Caller: ITRC21Caller{contract: contract}, ITRC21Transactor: ITRC21Transactor{contract: contract}, ITRC21Filterer: ITRC21Filterer{contract: contract}}, nil
+}
+
+// ITRC21 is an auto generated Go binding around an Ethereum contract.
+type ITRC21 struct {
+ ITRC21Caller // Read-only binding to the contract
+ ITRC21Transactor // Write-only binding to the contract
+ ITRC21Filterer // Log filterer for contract events
+}
+
+// ITRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type ITRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type ITRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ITRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ITRC21Session struct {
+ Contract *ITRC21 // 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
+}
+
+// ITRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ITRC21CallerSession struct {
+ Contract *ITRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ITRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ITRC21TransactorSession struct {
+ Contract *ITRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ITRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type ITRC21Raw struct {
+ Contract *ITRC21 // Generic contract binding to access the raw methods on
+}
+
+// ITRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ITRC21CallerRaw struct {
+ Contract *ITRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// ITRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ITRC21TransactorRaw struct {
+ Contract *ITRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewITRC21 creates a new instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21(address common.Address, backend bind.ContractBackend) (*ITRC21, error) {
+ contract, err := bindITRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21{ITRC21Caller: ITRC21Caller{contract: contract}, ITRC21Transactor: ITRC21Transactor{contract: contract}, ITRC21Filterer: ITRC21Filterer{contract: contract}}, nil
+}
+
+// NewITRC21Caller creates a new read-only instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Caller(address common.Address, caller bind.ContractCaller) (*ITRC21Caller, error) {
+ contract, err := bindITRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Caller{contract: contract}, nil
+}
+
+// NewITRC21Transactor creates a new write-only instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*ITRC21Transactor, error) {
+ contract, err := bindITRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Transactor{contract: contract}, nil
+}
+
+// NewITRC21Filterer creates a new log filterer instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*ITRC21Filterer, error) {
+ contract, err := bindITRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Filterer{contract: contract}, nil
+}
+
+// bindITRC21 binds a generic wrapper to an already deployed contract.
+func bindITRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(ITRC21ABI))
+ 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 (_ITRC21 *ITRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ITRC21.Contract.ITRC21Caller.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 (_ITRC21 *ITRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ITRC21.Contract.ITRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ITRC21 *ITRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ITRC21.Contract.ITRC21Transactor.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 (_ITRC21 *ITRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ITRC21.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 (_ITRC21 *ITRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ITRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ITRC21 *ITRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ITRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.Allowance(&_ITRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.Allowance(&_ITRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) BalanceOf(opts *bind.CallOpts, who common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "balanceOf", who)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) BalanceOf(who common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.BalanceOf(&_ITRC21.CallOpts, who)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) BalanceOf(who common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.BalanceOf(&_ITRC21.CallOpts, who)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_ITRC21 *ITRC21Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+ var (
+ ret0 = new(uint8)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "decimals")
+ return *ret0, err
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_ITRC21 *ITRC21Session) Decimals() (uint8, error) {
+ return _ITRC21.Contract.Decimals(&_ITRC21.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_ITRC21 *ITRC21CallerSession) Decimals() (uint8, error) {
+ return _ITRC21.Contract.Decimals(&_ITRC21.CallOpts)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _ITRC21.Contract.EstimateFee(&_ITRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _ITRC21.Contract.EstimateFee(&_ITRC21.CallOpts, value)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_ITRC21 *ITRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_ITRC21 *ITRC21Session) Issuer() (common.Address, error) {
+ return _ITRC21.Contract.Issuer(&_ITRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_ITRC21 *ITRC21CallerSession) Issuer() (common.Address, error) {
+ return _ITRC21.Contract.Issuer(&_ITRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21Session) TotalSupply() (*big.Int, error) {
+ return _ITRC21.Contract.TotalSupply(&_ITRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _ITRC21.Contract.TotalSupply(&_ITRC21.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Approve(&_ITRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Approve(&_ITRC21.TransactOpts, spender, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Transfer(&_ITRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Transfer(&_ITRC21.TransactOpts, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.TransferFrom(&_ITRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.TransferFrom(&_ITRC21.TransactOpts, from, to, value)
+}
+
+// ITRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ITRC21 contract.
+type ITRC21ApprovalIterator struct {
+ Event *ITRC21Approval // 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 *ITRC21ApprovalIterator) 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(ITRC21Approval)
+ 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(ITRC21Approval)
+ 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 *ITRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Approval represents a Approval event raised by the ITRC21 contract.
+type ITRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ITRC21ApprovalIterator, 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 := _ITRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21ApprovalIterator{contract: _ITRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ITRC21Approval, 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 := _ITRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(ITRC21Approval)
+ if err := _ITRC21.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
+}
+
+// ITRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the ITRC21 contract.
+type ITRC21FeeIterator struct {
+ Event *ITRC21Fee // 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 *ITRC21FeeIterator) 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(ITRC21Fee)
+ 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(ITRC21Fee)
+ 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 *ITRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Fee represents a Fee event raised by the ITRC21 contract.
+type ITRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*ITRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21FeeIterator{contract: _ITRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *ITRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(ITRC21Fee)
+ if err := _ITRC21.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
+}
+
+// ITRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ITRC21 contract.
+type ITRC21TransferIterator struct {
+ Event *ITRC21Transfer // 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 *ITRC21TransferIterator) 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(ITRC21Transfer)
+ 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(ITRC21Transfer)
+ 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 *ITRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Transfer represents a Transfer event raised by the ITRC21 contract.
+type ITRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ITRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21TransferIterator{contract: _ITRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ITRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(ITRC21Transfer)
+ if err := _ITRC21.contract.UnpackLog(event, "Transfer", 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
+}
+
+// MyTRC21ABI is the input ABI used to generate the binding from.
+const MyTRC21ABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"burnId\",\"type\":\"uint256\"}],\"name\":\"getBurn\",\"outputs\":[{\"name\":\"_burner\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setMinFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"depositFee\",\"type\":\"uint256\"}],\"name\":\"setDepositFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"burnList\",\"outputs\":[{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"burner\",\"type\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"WITHDRAW_FEE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"withdrawFee\",\"type\":\"uint256\"}],\"name\":\"setWithdrawFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferContractIssuer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DEPOSIT_FEE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBurnCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"burn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"},{\"name\":\"_name\",\"type\":\"string\"},{\"name\":\"_symbol\",\"type\":\"string\"},{\"name\":\"_decimals\",\"type\":\"uint8\"},{\"name\":\"cap\",\"type\":\"uint256\"},{\"name\":\"minFee\",\"type\":\"uint256\"},{\"name\":\"depositFee\",\"type\":\"uint256\"},{\"name\":\"withdrawFee\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"burnID\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"burner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"TokenBurn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// MyTRC21Bin is the compiled bytecode used for deploying new contracts.
+const MyTRC21Bin = `0x6080604052600060085560006009553480156200001b57600080fd5b5060405162002a7b38038062002a7b8339810160409081528151602080840151928401516060850151608086015160a087015160c088015160e08901516101008a0151958a018051988b019a909895019693959294919390929160009189918991899162000090916005919086019062000356565b508151620000a690600690602085019062000356565b506007805460ff191660ff92909216919091179055505089518960328211801590620000d25750818111155b8015620000de57508015155b8015620000ea57508115155b1515620000f657600080fd5b6200010b338864010000000062000240810204565b6200011f33640100000000620002ff810204565b620001338664010000000062000337810204565b600092505b8b518310156200020b57600c60008d858151811015156200015557fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff16158015620001ab57508b838151811015156200019357fe5b90602001906020020151600160a060020a0316600014155b1515620001b757600080fd5b6001600c60008e86815181101515620001cc57fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790556001929092019162000138565b8b516200022090600d9060208f0190620003db565b505050600e98909855600991909155600855506200048895505050505050565b600160a060020a03821615156200025657600080fd5b6004546200027390826401000000006200221b6200033c82021704565b600455600160a060020a038216600090815260208190526040902054620002a990826401000000006200221b6200033c82021704565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600160a060020a03811615156200031557600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600155565b6000828201838110156200034f57600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039957805160ff1916838001178555620003c9565b82800160010185558215620003c9579182015b82811115620003c9578251825591602001919060010190620003ac565b50620003d792915062000441565b5090565b82805482825590600052602060002090810192821562000433579160200282015b82811115620004335782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190620003fc565b50620003d792915062000461565b6200045e91905b80821115620003d7576000815560010162000448565b90565b6200045e91905b80821115620003d7578054600160a060020a031916815560010162000468565b6125e380620004986000396000f30060806040526004361061020e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461021357806306fdde0314610247578063095ea7b3146102d1578063127e8e4d14610309578063173825d91461033357806318160ddd146103565780631d1438481461036b57806320ea8d861461038057806323b872dd1461039857806324ec7590146103c25780632eb3f49b146103d75780632f54bf6e14610487578063313ce567146104a857806331ac9920146104d35780633411c81c146104eb578063490ae2101461050f57806354741525146105275780637065cb481461054657806370a082311461056757806377661c6414610588578063784547a7146105fa5780638b51d13f1461061257806395d89b411461062a5780639ace38c21461063f5780639bff5ddb146106fa578063a0e67e2b1461070f578063a8abe69a14610774578063a9059cbb14610799578063b5dc40c3146107bd578063b6ac642a146107d5578063b77bf600146107ed578063ba51a6df14610802578063c01a8c841461081a578063c28ce6ff14610832578063c642747414610853578063d74f8edd146108bc578063dc8452cd146108d1578063dd62ed3e146108e6578063de363e651461090d578063e20056e614610922578063e7cf548c14610949578063ee22610b1461095e578063fe9d930314610976575b600080fd5b34801561021f57600080fd5b5061022b6004356109d4565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b5061025c6109fc565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029657818101518382015260200161027e565b50505050905090810190601f1680156102c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102dd57600080fd5b506102f5600160a060020a0360043516602435610a93565b604080519115158252519081900360200190f35b34801561031557600080fd5b50610321600435610b4d565b60408051918252519081900360200190f35b34801561033f57600080fd5b50610354600160a060020a0360043516610b79565b005b34801561036257600080fd5b50610321610cf0565b34801561037757600080fd5b5061022b610cf6565b34801561038c57600080fd5b50610354600435610d05565b3480156103a457600080fd5b506102f5600160a060020a0360043581169060243516604435610dbf565b3480156103ce57600080fd5b50610321610f03565b3480156103e357600080fd5b506103ef600435610f09565b6040518084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561044a578181015183820152602001610432565b50505050905090810190601f1680156104775780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561049357600080fd5b506102f5600160a060020a0360043516611016565b3480156104b457600080fd5b506104bd61102b565b6040805160ff9092168252519081900360200190f35b3480156104df57600080fd5b50610354600435611034565b3480156104f757600080fd5b506102f5600435600160a060020a0360243516611057565b34801561051b57600080fd5b50610354600435611077565b34801561053357600080fd5b5061032160043515156024351515611098565b34801561055257600080fd5b50610354600160a060020a0360043516611104565b34801561057357600080fd5b50610321600160a060020a0360043516611229565b34801561059457600080fd5b506105a0600435611244565b6040518084815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360008381101561044a578181015183820152602001610432565b34801561060657600080fd5b506102f560043561130d565b34801561061e57600080fd5b50610321600435611391565b34801561063657600080fd5b5061025c611400565b34801561064b57600080fd5b50610657600435611461565b6040518085600160a060020a0316600160a060020a031681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156106bc5781810151838201526020016106a4565b50505050905090810190601f1680156106e95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561070657600080fd5b50610321611520565b34801561071b57600080fd5b50610724611526565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610760578181015183820152602001610748565b505050509050019250505060405180910390f35b34801561078057600080fd5b5061072460043560243560443515156064351515611587565b3480156107a557600080fd5b506102f5600160a060020a03600435166024356116d3565b3480156107c957600080fd5b506107246004356117a5565b3480156107e157600080fd5b5061035460043561191e565b3480156107f957600080fd5b5061032161193f565b34801561080e57600080fd5b50610354600435611945565b34801561082657600080fd5b506103546004356119c4565b34801561083e57600080fd5b50610354600160a060020a0360043516611a8d565b34801561085f57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610321948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750611ac19650505050505050565b3480156108c857600080fd5b50610321611ae0565b3480156108dd57600080fd5b50610321611ae5565b3480156108f257600080fd5b50610321600160a060020a0360043581169060243516611aeb565b34801561091957600080fd5b50610321611b16565b34801561092e57600080fd5b50610354600160a060020a0360043581169060243516611b1c565b34801561095557600080fd5b50610321611ca6565b34801561096a57600080fd5b50610354600435611cac565b34801561098257600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610354958335953695604494919390910191908190840183828082843750949750611f079650505050505050565b600d8054829081106109e257fe5b600091825260209091200154600160a060020a0316905081565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a885780601f10610a5d57610100808354040283529160200191610a88565b820191906000526020600020905b815481529060010190602001808311610a6b57829003601f168201915b505050505090505b90565b6000600160a060020a0383161515610aaa57600080fd5b600154336000908152602081905260409020541015610ac857600080fd5b336000818152600360209081526040808320600160a060020a0388811685529252909120849055600254600154610b04939291909116906120fb565b604080518381529051600160a060020a0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600154600090610b7390610b67848463ffffffff6121ed16565b9063ffffffff61221b16565b92915050565b6000333014610b8757600080fd5b600160a060020a0382166000908152600c6020526040902054829060ff161515610bb057600080fd5b600160a060020a0383166000908152600c60205260408120805460ff1916905591505b600d5460001901821015610c8b5782600160a060020a0316600d83815481101515610bfa57fe5b600091825260209091200154600160a060020a03161415610c8057600d80546000198101908110610c2757fe5b600091825260209091200154600d8054600160a060020a039092169184908110610c4d57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550610c8b565b600190910190610bd3565b600d80546000190190610c9e90826124f6565b50600d54600e541115610cb757600d54610cb790611945565b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b60045490565b600254600160a060020a031690565b336000818152600c602052604090205460ff161515610d2357600080fd5b6000828152600b602090815260408083203380855292529091205483919060ff161515610d4f57600080fd5b6000848152600a6020526040902060030154849060ff1615610d7057600080fd5b6000858152600b60209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b600080610dd76001548461221b90919063ffffffff16565b600160a060020a038616600090815260208190526040902054909150811115610dff57600080fd5b600160a060020a0385166000908152600360209081526040808320338452909152902054831115610e2f57600080fd5b600160a060020a0385166000908152600360209081526040808320338452909152902054610e63908263ffffffff61222d16565b600160a060020a0386166000908152600360209081526040808320338452909152902055610e928585856120fb565b600254600154610eaf918791600160a060020a03909116906120fb565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4506001949350505050565b60015490565b6000806060601084815481101515610f1d57fe5b600091825260209091206001600390920201015460108054600160a060020a0390921694509085908110610f4d57fe5b9060005260206000209060030201600001549150601084815481101515610f7057fe5b600091825260209182902060026003909202018101805460408051601f6000196101006001861615020190931694909404918201859004850284018501905280835291929091908301828280156110085780601f10610fdd57610100808354040283529160200191611008565b820191906000526020600020905b815481529060010190602001808311610feb57829003601f168201915b505050505090509193909250565b600c6020526000908152604090205460ff1681565b60075460ff1690565b600254600160a060020a0316331461104b57600080fd5b61105481612244565b50565b600b60209081526000928352604080842090915290825290205460ff1681565b61107f610cf6565b600160a060020a0316331461109357600080fd5b600955565b6000805b600f548110156110fd578380156110c557506000818152600a602052604090206003015460ff16155b806110e957508280156110e957506000818152600a602052604090206003015460ff165b156110f5576001820191505b60010161109c565b5092915050565b33301461111057600080fd5b600160a060020a0381166000908152600c6020526040902054819060ff161561113857600080fd5b81600160a060020a038116151561114e57600080fd5b600d80549050600101600e546032821115801561116b5750818111155b801561117657508015155b801561118157508115155b151561118c57600080fd5b600160a060020a0385166000818152600c6020526040808220805460ff19166001908117909155600d8054918201815583527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501805473ffffffffffffffffffffffffffffffffffffffff191684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600160a060020a031660009081526020819052604090205490565b601080548290811061125257fe5b6000918252602091829020600391909102018054600180830154600280850180546040805161010096831615969096026000190190911692909204601f8101889004880285018801909252818452939650600160a060020a03909116949192918301828280156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b5050505050905083565b600080805b600d5481101561138a576000848152600b60205260408120600d80549192918490811061133b57fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff161561136f576001820191505b600e54821415611382576001925061138a565b600101611312565b5050919050565b6000805b600d548110156113fa576000838152600b60205260408120600d8054919291849081106113be57fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156113f2576001820191505b600101611395565b50919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a885780601f10610a5d57610100808354040283529160200191610a88565b600a6020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352600160a060020a0390931695909491929183018282801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b5050506003909301549192505060ff1684565b60085481565b6060600d805480602002602001604051908101604052809291908181526020018280548015610a8857602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611560575050505050905090565b606060006060600080600f54881161159f57876115a3565b600f545b93508884036040519080825280602002602001820160405280156115d1578160200160208202803883390190505b509250600091508890505b878110156116555786801561160357506000818152600a602052604090206003015460ff16155b80611627575085801561162757506000818152600a602052604090206003015460ff165b1561164d5780838381518110151561163b57fe5b60209081029091010152600191909101905b6001016115dc565b8160405190808252806020026020018201604052801561167f578160200160208202803883390190505b509450600090505b818110156116c757828181518110151561169d57fe5b9060200190602002015185828151811015156116b557fe5b60209081029091010152600101611687565b50505050949350505050565b600080600160a060020a03841615156116eb57600080fd5b6001546116ff90849063ffffffff61221b16565b3360009081526020819052604090205490915081111561171e57600080fd5b6117293385856120fb565b6000600154111561179b57600254600154611751913391600160a060020a03909116906120fb565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a45b5060019392505050565b606080600080600d805490506040519080825280602002602001820160405280156117da578160200160208202803883390190505b50925060009150600090505b600d54811015611897576000858152600b60205260408120600d80549192918490811061180f57fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff161561188f57600d80548290811061184a57fe5b6000918252602090912001548351600160a060020a039091169084908490811061187057fe5b600160a060020a03909216602092830290910190910152600191909101905b6001016117e6565b816040519080825280602002602001820160405280156118c1578160200160208202803883390190505b509350600090505b818110156119165782818151811015156118df57fe5b9060200190602002015184828151811015156118f757fe5b600160a060020a039092166020928302909101909101526001016118c9565b505050919050565b611926610cf6565b600160a060020a0316331461193a57600080fd5b600855565b600f5481565b33301461195157600080fd5b600d5481603282118015906119665750818111155b801561197157508015155b801561197c57508115155b151561198757600080fd5b600e8390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b336000818152600c602052604090205460ff1615156119e257600080fd5b6000828152600a60205260409020548290600160a060020a03161515611a0757600080fd5b6000838152600b602090815260408083203380855292529091205484919060ff1615611a3257600080fd5b6000858152600b60209081526040808320338085529252808320805460ff191660011790555187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611a8685611cac565b5050505050565b611a95610cf6565b600160a060020a03163314611aa957600080fd5b600160a060020a038116156110545761105433612249565b6000611ace84848461228d565b9050611ad9816119c4565b9392505050565b603281565b600e5481565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b60095481565b6000333014611b2a57600080fd5b600160a060020a0383166000908152600c6020526040902054839060ff161515611b5357600080fd5b600160a060020a0383166000908152600c6020526040902054839060ff1615611b7b57600080fd5b600092505b600d54831015611c0c5784600160a060020a0316600d84815481101515611ba357fe5b600091825260209091200154600160a060020a03161415611c015783600d84815481101515611bce57fe5b9060005260206000200160006101000a815481600160a060020a030219169083600160a060020a03160217905550611c0c565b600190920191611b80565b600160a060020a038086166000818152600c6020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b60105490565b336000818152600c602052604081205490919060ff161515611ccd57600080fd5b6000838152600b602090815260408083203380855292529091205484919060ff161515611cf957600080fd5b6000858152600a6020526040902060030154859060ff1615611d1a57600080fd5b611d238661130d565b15611eff576000868152600a6020526040902060038101805460ff19166001908117909155600280830154929750600019918316156101000291909101909116041515611ded576009546001860154611d819163ffffffff61222d16565b600186018190558554611d9f91600160a060020a039091169061237e565b60006009541115611dbd57611dbd611db5610cf6565b60095461237e565b60405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2611eff565b8460000160009054906101000a9004600160a060020a0316600160a060020a03168560010154866002016040518082805460018160011615610100020316600290048015611e7c5780601f10611e5157610100808354040283529160200191611e7c565b820191906000526020600020905b815481529060010190602001808311611e5f57829003601f168201915b505091505060006040518083038185875af19250505015611ec75760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2611eff565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b505050505050565b6008546000908311611f1857600080fd5b611f223384612428565b60006008541115611f4057611f40611f38610cf6565b60085461237e565b600854611f5490849063ffffffff61222d16565b604080516060810182528281523360208083019182529282018681526010805460018101808355600092909252845160039091027f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672810191825593517f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67385018054600160a060020a039290921673ffffffffffffffffffffffffffffffffffffffff199092169190911790559151805196975090959394919361203e937f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6740192919091019061251f565b5050505033600160a060020a03166001601080549050037f6905852b196f81e7e03058512a599446c358027fc943c1e193b6649a39379bb583856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120bb5781810151838201526020016120a3565b50505050905090810190601f1680156120e85780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3505050565b600160a060020a03831660009081526020819052604090205481111561212057600080fd5b600160a060020a038216151561213557600080fd5b600160a060020a03831660009081526020819052604090205461215e908263ffffffff61222d16565b600160a060020a038085166000908152602081905260408082209390935590841681522054612193908263ffffffff61221b16565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008083151561220057600091506110fd565b5082820282848281151561221057fe5b0414611ad957600080fd5b600082820183811015611ad957600080fd5b6000808383111561223d57600080fd5b5050900390565b600155565b600160a060020a038116151561225e57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600083600160a060020a03811615156122a557600080fd5b600f5460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152600a8452959095208451815473ffffffffffffffffffffffffffffffffffffffff19169416939093178355516001830155925180519496509193909261232692600285019291019061251f565b50606091909101516003909101805460ff1916911515919091179055600f8054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b600160a060020a038216151561239357600080fd5b6004546123a6908263ffffffff61221b16565b600455600160a060020a0382166000908152602081905260409020546123d2908263ffffffff61221b16565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600160a060020a038216151561243d57600080fd5b600160a060020a03821660009081526020819052604090205481111561246257600080fd5b600454612475908263ffffffff61222d16565b600455600160a060020a0382166000908152602081905260409020546124a1908263ffffffff61222d16565b600160a060020a038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b81548183558181111561251a5760008381526020902061251a91810190830161259d565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061256057805160ff191683800117855561258d565b8280016001018555821561258d579182015b8281111561258d578251825591602001919060010190612572565b5061259992915061259d565b5090565b610a9091905b8082111561259957600081556001016125a35600a165627a7a72305820bffa6044329c4005991204d5fa011824a3408b8d46a641ee00f98556e9536c350029`
+
+// DeployMyTRC21 deploys a new Ethereum contract, binding an instance of MyTRC21 to it.
+func DeployMyTRC21(auth *bind.TransactOpts, backend bind.ContractBackend, _owners []common.Address, _required *big.Int, _name string, _symbol string, _decimals uint8, cap *big.Int, minFee *big.Int, depositFee *big.Int, withdrawFee *big.Int) (common.Address, *types.Transaction, *MyTRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(MyTRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(MyTRC21Bin), backend, _owners, _required, _name, _symbol, _decimals, cap, minFee, depositFee, withdrawFee)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &MyTRC21{MyTRC21Caller: MyTRC21Caller{contract: contract}, MyTRC21Transactor: MyTRC21Transactor{contract: contract}, MyTRC21Filterer: MyTRC21Filterer{contract: contract}}, nil
+}
+
+// MyTRC21 is an auto generated Go binding around an Ethereum contract.
+type MyTRC21 struct {
+ MyTRC21Caller // Read-only binding to the contract
+ MyTRC21Transactor // Write-only binding to the contract
+ MyTRC21Filterer // Log filterer for contract events
+}
+
+// MyTRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type MyTRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type MyTRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type MyTRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type MyTRC21Session struct {
+ Contract *MyTRC21 // 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
+}
+
+// MyTRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type MyTRC21CallerSession struct {
+ Contract *MyTRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// MyTRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type MyTRC21TransactorSession struct {
+ Contract *MyTRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// MyTRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type MyTRC21Raw struct {
+ Contract *MyTRC21 // Generic contract binding to access the raw methods on
+}
+
+// MyTRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type MyTRC21CallerRaw struct {
+ Contract *MyTRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// MyTRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type MyTRC21TransactorRaw struct {
+ Contract *MyTRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewMyTRC21 creates a new instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21(address common.Address, backend bind.ContractBackend) (*MyTRC21, error) {
+ contract, err := bindMyTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21{MyTRC21Caller: MyTRC21Caller{contract: contract}, MyTRC21Transactor: MyTRC21Transactor{contract: contract}, MyTRC21Filterer: MyTRC21Filterer{contract: contract}}, nil
+}
+
+// NewMyTRC21Caller creates a new read-only instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Caller(address common.Address, caller bind.ContractCaller) (*MyTRC21Caller, error) {
+ contract, err := bindMyTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Caller{contract: contract}, nil
+}
+
+// NewMyTRC21Transactor creates a new write-only instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*MyTRC21Transactor, error) {
+ contract, err := bindMyTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Transactor{contract: contract}, nil
+}
+
+// NewMyTRC21Filterer creates a new log filterer instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*MyTRC21Filterer, error) {
+ contract, err := bindMyTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Filterer{contract: contract}, nil
+}
+
+// bindMyTRC21 binds a generic wrapper to an already deployed contract.
+func bindMyTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(MyTRC21ABI))
+ 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 (_MyTRC21 *MyTRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MyTRC21.Contract.MyTRC21Caller.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 (_MyTRC21 *MyTRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MyTRC21.Contract.MyTRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MyTRC21 *MyTRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MyTRC21.Contract.MyTRC21Transactor.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 (_MyTRC21 *MyTRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MyTRC21.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 (_MyTRC21 *MyTRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MyTRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MyTRC21 *MyTRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MyTRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// DEPOSITFEE is a free data retrieval call binding the contract method 0xde363e65.
+//
+// Solidity: function DEPOSIT_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) DEPOSITFEE(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "DEPOSIT_FEE")
+ return *ret0, err
+}
+
+// DEPOSITFEE is a free data retrieval call binding the contract method 0xde363e65.
+//
+// Solidity: function DEPOSIT_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) DEPOSITFEE() (*big.Int, error) {
+ return _MyTRC21.Contract.DEPOSITFEE(&_MyTRC21.CallOpts)
+}
+
+// DEPOSITFEE is a free data retrieval call binding the contract method 0xde363e65.
+//
+// Solidity: function DEPOSIT_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) DEPOSITFEE() (*big.Int, error) {
+ return _MyTRC21.Contract.DEPOSITFEE(&_MyTRC21.CallOpts)
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) MAXOWNERCOUNT(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "MAX_OWNER_COUNT")
+ return *ret0, err
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) MAXOWNERCOUNT() (*big.Int, error) {
+ return _MyTRC21.Contract.MAXOWNERCOUNT(&_MyTRC21.CallOpts)
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) MAXOWNERCOUNT() (*big.Int, error) {
+ return _MyTRC21.Contract.MAXOWNERCOUNT(&_MyTRC21.CallOpts)
+}
+
+// WITHDRAWFEE is a free data retrieval call binding the contract method 0x9bff5ddb.
+//
+// Solidity: function WITHDRAW_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) WITHDRAWFEE(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "WITHDRAW_FEE")
+ return *ret0, err
+}
+
+// WITHDRAWFEE is a free data retrieval call binding the contract method 0x9bff5ddb.
+//
+// Solidity: function WITHDRAW_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) WITHDRAWFEE() (*big.Int, error) {
+ return _MyTRC21.Contract.WITHDRAWFEE(&_MyTRC21.CallOpts)
+}
+
+// WITHDRAWFEE is a free data retrieval call binding the contract method 0x9bff5ddb.
+//
+// Solidity: function WITHDRAW_FEE() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) WITHDRAWFEE() (*big.Int, error) {
+ return _MyTRC21.Contract.WITHDRAWFEE(&_MyTRC21.CallOpts)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.Allowance(&_MyTRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.Allowance(&_MyTRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "balanceOf", owner)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.BalanceOf(&_MyTRC21.CallOpts, owner)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.BalanceOf(&_MyTRC21.CallOpts, owner)
+}
+
+// BurnList is a free data retrieval call binding the contract method 0x77661c64.
+//
+// Solidity: function burnList( uint256) constant returns(value uint256, burner address, data bytes)
+func (_MyTRC21 *MyTRC21Caller) BurnList(opts *bind.CallOpts, arg0 *big.Int) (struct {
+ Value *big.Int
+ Burner common.Address
+ Data []byte
+}, error) {
+ ret := new(struct {
+ Value *big.Int
+ Burner common.Address
+ Data []byte
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "burnList", arg0)
+ return *ret, err
+}
+
+// BurnList is a free data retrieval call binding the contract method 0x77661c64.
+//
+// Solidity: function burnList( uint256) constant returns(value uint256, burner address, data bytes)
+func (_MyTRC21 *MyTRC21Session) BurnList(arg0 *big.Int) (struct {
+ Value *big.Int
+ Burner common.Address
+ Data []byte
+}, error) {
+ return _MyTRC21.Contract.BurnList(&_MyTRC21.CallOpts, arg0)
+}
+
+// BurnList is a free data retrieval call binding the contract method 0x77661c64.
+//
+// Solidity: function burnList( uint256) constant returns(value uint256, burner address, data bytes)
+func (_MyTRC21 *MyTRC21CallerSession) BurnList(arg0 *big.Int) (struct {
+ Value *big.Int
+ Burner common.Address
+ Data []byte
+}, error) {
+ return _MyTRC21.Contract.BurnList(&_MyTRC21.CallOpts, arg0)
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MyTRC21 *MyTRC21Caller) Confirmations(opts *bind.CallOpts, arg0 *big.Int, arg1 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "confirmations", arg0, arg1)
+ return *ret0, err
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MyTRC21 *MyTRC21Session) Confirmations(arg0 *big.Int, arg1 common.Address) (bool, error) {
+ return _MyTRC21.Contract.Confirmations(&_MyTRC21.CallOpts, arg0, arg1)
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MyTRC21 *MyTRC21CallerSession) Confirmations(arg0 *big.Int, arg1 common.Address) (bool, error) {
+ return _MyTRC21.Contract.Confirmations(&_MyTRC21.CallOpts, arg0, arg1)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+ var (
+ ret0 = new(uint8)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "decimals")
+ return *ret0, err
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21Session) Decimals() (uint8, error) {
+ return _MyTRC21.Contract.Decimals(&_MyTRC21.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21CallerSession) Decimals() (uint8, error) {
+ return _MyTRC21.Contract.Decimals(&_MyTRC21.CallOpts)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.EstimateFee(&_MyTRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.EstimateFee(&_MyTRC21.CallOpts, value)
+}
+
+// GetBurn is a free data retrieval call binding the contract method 0x2eb3f49b.
+//
+// Solidity: function getBurn(burnId uint256) constant returns(_burner address, _value uint256, _data bytes)
+func (_MyTRC21 *MyTRC21Caller) GetBurn(opts *bind.CallOpts, burnId *big.Int) (struct {
+ Burner common.Address
+ Value *big.Int
+ Data []byte
+}, error) {
+ ret := new(struct {
+ Burner common.Address
+ Value *big.Int
+ Data []byte
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getBurn", burnId)
+ return *ret, err
+}
+
+// GetBurn is a free data retrieval call binding the contract method 0x2eb3f49b.
+//
+// Solidity: function getBurn(burnId uint256) constant returns(_burner address, _value uint256, _data bytes)
+func (_MyTRC21 *MyTRC21Session) GetBurn(burnId *big.Int) (struct {
+ Burner common.Address
+ Value *big.Int
+ Data []byte
+}, error) {
+ return _MyTRC21.Contract.GetBurn(&_MyTRC21.CallOpts, burnId)
+}
+
+// GetBurn is a free data retrieval call binding the contract method 0x2eb3f49b.
+//
+// Solidity: function getBurn(burnId uint256) constant returns(_burner address, _value uint256, _data bytes)
+func (_MyTRC21 *MyTRC21CallerSession) GetBurn(burnId *big.Int) (struct {
+ Burner common.Address
+ Value *big.Int
+ Data []byte
+}, error) {
+ return _MyTRC21.Contract.GetBurn(&_MyTRC21.CallOpts, burnId)
+}
+
+// GetBurnCount is a free data retrieval call binding the contract method 0xe7cf548c.
+//
+// Solidity: function getBurnCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) GetBurnCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getBurnCount")
+ return *ret0, err
+}
+
+// GetBurnCount is a free data retrieval call binding the contract method 0xe7cf548c.
+//
+// Solidity: function getBurnCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) GetBurnCount() (*big.Int, error) {
+ return _MyTRC21.Contract.GetBurnCount(&_MyTRC21.CallOpts)
+}
+
+// GetBurnCount is a free data retrieval call binding the contract method 0xe7cf548c.
+//
+// Solidity: function getBurnCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) GetBurnCount() (*big.Int, error) {
+ return _MyTRC21.Contract.GetBurnCount(&_MyTRC21.CallOpts)
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21Caller) GetConfirmationCount(opts *bind.CallOpts, transactionId *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getConfirmationCount", transactionId)
+ return *ret0, err
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21Session) GetConfirmationCount(transactionId *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.GetConfirmationCount(&_MyTRC21.CallOpts, transactionId)
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21CallerSession) GetConfirmationCount(transactionId *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.GetConfirmationCount(&_MyTRC21.CallOpts, transactionId)
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MyTRC21 *MyTRC21Caller) GetConfirmations(opts *bind.CallOpts, transactionId *big.Int) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getConfirmations", transactionId)
+ return *ret0, err
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MyTRC21 *MyTRC21Session) GetConfirmations(transactionId *big.Int) ([]common.Address, error) {
+ return _MyTRC21.Contract.GetConfirmations(&_MyTRC21.CallOpts, transactionId)
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MyTRC21 *MyTRC21CallerSession) GetConfirmations(transactionId *big.Int) ([]common.Address, error) {
+ return _MyTRC21.Contract.GetConfirmations(&_MyTRC21.CallOpts, transactionId)
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MyTRC21 *MyTRC21Caller) GetOwners(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getOwners")
+ return *ret0, err
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MyTRC21 *MyTRC21Session) GetOwners() ([]common.Address, error) {
+ return _MyTRC21.Contract.GetOwners(&_MyTRC21.CallOpts)
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MyTRC21 *MyTRC21CallerSession) GetOwners() ([]common.Address, error) {
+ return _MyTRC21.Contract.GetOwners(&_MyTRC21.CallOpts)
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21Caller) GetTransactionCount(opts *bind.CallOpts, pending bool, executed bool) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getTransactionCount", pending, executed)
+ return *ret0, err
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21Session) GetTransactionCount(pending bool, executed bool) (*big.Int, error) {
+ return _MyTRC21.Contract.GetTransactionCount(&_MyTRC21.CallOpts, pending, executed)
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MyTRC21 *MyTRC21CallerSession) GetTransactionCount(pending bool, executed bool) (*big.Int, error) {
+ return _MyTRC21.Contract.GetTransactionCount(&_MyTRC21.CallOpts, pending, executed)
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MyTRC21 *MyTRC21Caller) GetTransactionIds(opts *bind.CallOpts, from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ var (
+ ret0 = new([]*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "getTransactionIds", from, to, pending, executed)
+ return *ret0, err
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MyTRC21 *MyTRC21Session) GetTransactionIds(from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ return _MyTRC21.Contract.GetTransactionIds(&_MyTRC21.CallOpts, from, to, pending, executed)
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MyTRC21 *MyTRC21CallerSession) GetTransactionIds(from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ return _MyTRC21.Contract.GetTransactionIds(&_MyTRC21.CallOpts, from, to, pending, executed)
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MyTRC21 *MyTRC21Caller) IsConfirmed(opts *bind.CallOpts, transactionId *big.Int) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "isConfirmed", transactionId)
+ return *ret0, err
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MyTRC21 *MyTRC21Session) IsConfirmed(transactionId *big.Int) (bool, error) {
+ return _MyTRC21.Contract.IsConfirmed(&_MyTRC21.CallOpts, transactionId)
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MyTRC21 *MyTRC21CallerSession) IsConfirmed(transactionId *big.Int) (bool, error) {
+ return _MyTRC21.Contract.IsConfirmed(&_MyTRC21.CallOpts, transactionId)
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MyTRC21 *MyTRC21Caller) IsOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "isOwner", arg0)
+ return *ret0, err
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MyTRC21 *MyTRC21Session) IsOwner(arg0 common.Address) (bool, error) {
+ return _MyTRC21.Contract.IsOwner(&_MyTRC21.CallOpts, arg0)
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MyTRC21 *MyTRC21CallerSession) IsOwner(arg0 common.Address) (bool, error) {
+ return _MyTRC21.Contract.IsOwner(&_MyTRC21.CallOpts, arg0)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21Session) Issuer() (common.Address, error) {
+ return _MyTRC21.Contract.Issuer(&_MyTRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21CallerSession) Issuer() (common.Address, error) {
+ return _MyTRC21.Contract.Issuer(&_MyTRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) MinFee(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "minFee")
+ return *ret0, err
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) MinFee() (*big.Int, error) {
+ return _MyTRC21.Contract.MinFee(&_MyTRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) MinFee() (*big.Int, error) {
+ return _MyTRC21.Contract.MinFee(&_MyTRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21Caller) Name(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "name")
+ return *ret0, err
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21Session) Name() (string, error) {
+ return _MyTRC21.Contract.Name(&_MyTRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21CallerSession) Name() (string, error) {
+ return _MyTRC21.Contract.Name(&_MyTRC21.CallOpts)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MyTRC21 *MyTRC21Caller) Owners(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "owners", arg0)
+ return *ret0, err
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MyTRC21 *MyTRC21Session) Owners(arg0 *big.Int) (common.Address, error) {
+ return _MyTRC21.Contract.Owners(&_MyTRC21.CallOpts, arg0)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MyTRC21 *MyTRC21CallerSession) Owners(arg0 *big.Int) (common.Address, error) {
+ return _MyTRC21.Contract.Owners(&_MyTRC21.CallOpts, arg0)
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) Required(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "required")
+ return *ret0, err
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) Required() (*big.Int, error) {
+ return _MyTRC21.Contract.Required(&_MyTRC21.CallOpts)
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) Required() (*big.Int, error) {
+ return _MyTRC21.Contract.Required(&_MyTRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21Caller) Symbol(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "symbol")
+ return *ret0, err
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21Session) Symbol() (string, error) {
+ return _MyTRC21.Contract.Symbol(&_MyTRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21CallerSession) Symbol() (string, error) {
+ return _MyTRC21.Contract.Symbol(&_MyTRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) TotalSupply() (*big.Int, error) {
+ return _MyTRC21.Contract.TotalSupply(&_MyTRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _MyTRC21.Contract.TotalSupply(&_MyTRC21.CallOpts)
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) TransactionCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "transactionCount")
+ return *ret0, err
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) TransactionCount() (*big.Int, error) {
+ return _MyTRC21.Contract.TransactionCount(&_MyTRC21.CallOpts)
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) TransactionCount() (*big.Int, error) {
+ return _MyTRC21.Contract.TransactionCount(&_MyTRC21.CallOpts)
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MyTRC21 *MyTRC21Caller) Transactions(opts *bind.CallOpts, arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ ret := new(struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "transactions", arg0)
+ return *ret, err
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MyTRC21 *MyTRC21Session) Transactions(arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ return _MyTRC21.Contract.Transactions(&_MyTRC21.CallOpts, arg0)
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MyTRC21 *MyTRC21CallerSession) Transactions(arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ return _MyTRC21.Contract.Transactions(&_MyTRC21.CallOpts, arg0)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21Transactor) AddOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "addOwner", owner)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21Session) AddOwner(owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.AddOwner(&_MyTRC21.TransactOpts, owner)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) AddOwner(owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.AddOwner(&_MyTRC21.TransactOpts, owner)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Approve(&_MyTRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Approve(&_MyTRC21.TransactOpts, spender, value)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0xfe9d9303.
+//
+// Solidity: function burn(value uint256, data bytes) returns()
+func (_MyTRC21 *MyTRC21Transactor) Burn(opts *bind.TransactOpts, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "burn", value, data)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0xfe9d9303.
+//
+// Solidity: function burn(value uint256, data bytes) returns()
+func (_MyTRC21 *MyTRC21Session) Burn(value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Burn(&_MyTRC21.TransactOpts, value, data)
+}
+
+// Burn is a paid mutator transaction binding the contract method 0xfe9d9303.
+//
+// Solidity: function burn(value uint256, data bytes) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) Burn(value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Burn(&_MyTRC21.TransactOpts, value, data)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) ChangeRequirement(opts *bind.TransactOpts, _required *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "changeRequirement", _required)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MyTRC21 *MyTRC21Session) ChangeRequirement(_required *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ChangeRequirement(&_MyTRC21.TransactOpts, _required)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) ChangeRequirement(_required *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ChangeRequirement(&_MyTRC21.TransactOpts, _required)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) ConfirmTransaction(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "confirmTransaction", transactionId)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Session) ConfirmTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ConfirmTransaction(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) ConfirmTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ConfirmTransaction(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) ExecuteTransaction(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "executeTransaction", transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Session) ExecuteTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ExecuteTransaction(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) ExecuteTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ExecuteTransaction(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21Transactor) RemoveOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "removeOwner", owner)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21Session) RemoveOwner(owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.RemoveOwner(&_MyTRC21.TransactOpts, owner)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) RemoveOwner(owner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.RemoveOwner(&_MyTRC21.TransactOpts, owner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MyTRC21 *MyTRC21Transactor) ReplaceOwner(opts *bind.TransactOpts, owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "replaceOwner", owner, newOwner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MyTRC21 *MyTRC21Session) ReplaceOwner(owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ReplaceOwner(&_MyTRC21.TransactOpts, owner, newOwner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) ReplaceOwner(owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.ReplaceOwner(&_MyTRC21.TransactOpts, owner, newOwner)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) RevokeConfirmation(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "revokeConfirmation", transactionId)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21Session) RevokeConfirmation(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.RevokeConfirmation(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) RevokeConfirmation(transactionId *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.RevokeConfirmation(&_MyTRC21.TransactOpts, transactionId)
+}
+
+// SetDepositFee is a paid mutator transaction binding the contract method 0x490ae210.
+//
+// Solidity: function setDepositFee(depositFee uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) SetDepositFee(opts *bind.TransactOpts, depositFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "setDepositFee", depositFee)
+}
+
+// SetDepositFee is a paid mutator transaction binding the contract method 0x490ae210.
+//
+// Solidity: function setDepositFee(depositFee uint256) returns()
+func (_MyTRC21 *MyTRC21Session) SetDepositFee(depositFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetDepositFee(&_MyTRC21.TransactOpts, depositFee)
+}
+
+// SetDepositFee is a paid mutator transaction binding the contract method 0x490ae210.
+//
+// Solidity: function setDepositFee(depositFee uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) SetDepositFee(depositFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetDepositFee(&_MyTRC21.TransactOpts, depositFee)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) SetMinFee(opts *bind.TransactOpts, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "setMinFee", value)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_MyTRC21 *MyTRC21Session) SetMinFee(value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetMinFee(&_MyTRC21.TransactOpts, value)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) SetMinFee(value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetMinFee(&_MyTRC21.TransactOpts, value)
+}
+
+// SetWithdrawFee is a paid mutator transaction binding the contract method 0xb6ac642a.
+//
+// Solidity: function setWithdrawFee(withdrawFee uint256) returns()
+func (_MyTRC21 *MyTRC21Transactor) SetWithdrawFee(opts *bind.TransactOpts, withdrawFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "setWithdrawFee", withdrawFee)
+}
+
+// SetWithdrawFee is a paid mutator transaction binding the contract method 0xb6ac642a.
+//
+// Solidity: function setWithdrawFee(withdrawFee uint256) returns()
+func (_MyTRC21 *MyTRC21Session) SetWithdrawFee(withdrawFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetWithdrawFee(&_MyTRC21.TransactOpts, withdrawFee)
+}
+
+// SetWithdrawFee is a paid mutator transaction binding the contract method 0xb6ac642a.
+//
+// Solidity: function setWithdrawFee(withdrawFee uint256) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) SetWithdrawFee(withdrawFee *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SetWithdrawFee(&_MyTRC21.TransactOpts, withdrawFee)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MyTRC21 *MyTRC21Transactor) SubmitTransaction(opts *bind.TransactOpts, destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "submitTransaction", destination, value, data)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MyTRC21 *MyTRC21Session) SubmitTransaction(destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SubmitTransaction(&_MyTRC21.TransactOpts, destination, value, data)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MyTRC21 *MyTRC21TransactorSession) SubmitTransaction(destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MyTRC21.Contract.SubmitTransaction(&_MyTRC21.TransactOpts, destination, value, data)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Transfer(&_MyTRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Transfer(&_MyTRC21.TransactOpts, to, value)
+}
+
+// TransferContractIssuer is a paid mutator transaction binding the contract method 0xc28ce6ff.
+//
+// Solidity: function transferContractIssuer(newOwner address) returns()
+func (_MyTRC21 *MyTRC21Transactor) TransferContractIssuer(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "transferContractIssuer", newOwner)
+}
+
+// TransferContractIssuer is a paid mutator transaction binding the contract method 0xc28ce6ff.
+//
+// Solidity: function transferContractIssuer(newOwner address) returns()
+func (_MyTRC21 *MyTRC21Session) TransferContractIssuer(newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferContractIssuer(&_MyTRC21.TransactOpts, newOwner)
+}
+
+// TransferContractIssuer is a paid mutator transaction binding the contract method 0xc28ce6ff.
+//
+// Solidity: function transferContractIssuer(newOwner address) returns()
+func (_MyTRC21 *MyTRC21TransactorSession) TransferContractIssuer(newOwner common.Address) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferContractIssuer(&_MyTRC21.TransactOpts, newOwner)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferFrom(&_MyTRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferFrom(&_MyTRC21.TransactOpts, from, to, value)
+}
+
+// MyTRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the MyTRC21 contract.
+type MyTRC21ApprovalIterator struct {
+ Event *MyTRC21Approval // 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 *MyTRC21ApprovalIterator) 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(MyTRC21Approval)
+ 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(MyTRC21Approval)
+ 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 *MyTRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Approval represents a Approval event raised by the MyTRC21 contract.
+type MyTRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*MyTRC21ApprovalIterator, 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 := _MyTRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21ApprovalIterator{contract: _MyTRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *MyTRC21Approval, 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 := _MyTRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(MyTRC21Approval)
+ if err := _MyTRC21.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
+}
+
+// MyTRC21ConfirmationIterator is returned from FilterConfirmation and is used to iterate over the raw logs and unpacked data for Confirmation events raised by the MyTRC21 contract.
+type MyTRC21ConfirmationIterator struct {
+ Event *MyTRC21Confirmation // 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 *MyTRC21ConfirmationIterator) 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(MyTRC21Confirmation)
+ 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(MyTRC21Confirmation)
+ 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 *MyTRC21ConfirmationIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21ConfirmationIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Confirmation represents a Confirmation event raised by the MyTRC21 contract.
+type MyTRC21Confirmation struct {
+ Sender common.Address
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterConfirmation is a free log retrieval operation binding the contract event 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef.
+//
+// Solidity: event Confirmation(sender indexed address, transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterConfirmation(opts *bind.FilterOpts, sender []common.Address, transactionId []*big.Int) (*MyTRC21ConfirmationIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Confirmation", senderRule, transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21ConfirmationIterator{contract: _MyTRC21.contract, event: "Confirmation", logs: logs, sub: sub}, nil
+}
+
+// WatchConfirmation is a free log subscription operation binding the contract event 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef.
+//
+// Solidity: event Confirmation(sender indexed address, transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchConfirmation(opts *bind.WatchOpts, sink chan<- *MyTRC21Confirmation, sender []common.Address, transactionId []*big.Int) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Confirmation", senderRule, transactionIdRule)
+ 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(MyTRC21Confirmation)
+ if err := _MyTRC21.contract.UnpackLog(event, "Confirmation", 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
+}
+
+// MyTRC21ExecutionIterator is returned from FilterExecution and is used to iterate over the raw logs and unpacked data for Execution events raised by the MyTRC21 contract.
+type MyTRC21ExecutionIterator struct {
+ Event *MyTRC21Execution // 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 *MyTRC21ExecutionIterator) 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(MyTRC21Execution)
+ 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(MyTRC21Execution)
+ 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 *MyTRC21ExecutionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21ExecutionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Execution represents a Execution event raised by the MyTRC21 contract.
+type MyTRC21Execution struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExecution is a free log retrieval operation binding the contract event 0x33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed75.
+//
+// Solidity: event Execution(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterExecution(opts *bind.FilterOpts, transactionId []*big.Int) (*MyTRC21ExecutionIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Execution", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21ExecutionIterator{contract: _MyTRC21.contract, event: "Execution", logs: logs, sub: sub}, nil
+}
+
+// WatchExecution is a free log subscription operation binding the contract event 0x33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed75.
+//
+// Solidity: event Execution(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchExecution(opts *bind.WatchOpts, sink chan<- *MyTRC21Execution, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Execution", transactionIdRule)
+ 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(MyTRC21Execution)
+ if err := _MyTRC21.contract.UnpackLog(event, "Execution", 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
+}
+
+// MyTRC21ExecutionFailureIterator is returned from FilterExecutionFailure and is used to iterate over the raw logs and unpacked data for ExecutionFailure events raised by the MyTRC21 contract.
+type MyTRC21ExecutionFailureIterator struct {
+ Event *MyTRC21ExecutionFailure // 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 *MyTRC21ExecutionFailureIterator) 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(MyTRC21ExecutionFailure)
+ 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(MyTRC21ExecutionFailure)
+ 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 *MyTRC21ExecutionFailureIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21ExecutionFailureIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21ExecutionFailure represents a ExecutionFailure event raised by the MyTRC21 contract.
+type MyTRC21ExecutionFailure struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExecutionFailure is a free log retrieval operation binding the contract event 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236.
+//
+// Solidity: event ExecutionFailure(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterExecutionFailure(opts *bind.FilterOpts, transactionId []*big.Int) (*MyTRC21ExecutionFailureIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "ExecutionFailure", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21ExecutionFailureIterator{contract: _MyTRC21.contract, event: "ExecutionFailure", logs: logs, sub: sub}, nil
+}
+
+// WatchExecutionFailure is a free log subscription operation binding the contract event 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236.
+//
+// Solidity: event ExecutionFailure(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchExecutionFailure(opts *bind.WatchOpts, sink chan<- *MyTRC21ExecutionFailure, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "ExecutionFailure", transactionIdRule)
+ 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(MyTRC21ExecutionFailure)
+ if err := _MyTRC21.contract.UnpackLog(event, "ExecutionFailure", 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
+}
+
+// MyTRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the MyTRC21 contract.
+type MyTRC21FeeIterator struct {
+ Event *MyTRC21Fee // 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 *MyTRC21FeeIterator) 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(MyTRC21Fee)
+ 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(MyTRC21Fee)
+ 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 *MyTRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Fee represents a Fee event raised by the MyTRC21 contract.
+type MyTRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*MyTRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21FeeIterator{contract: _MyTRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *MyTRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(MyTRC21Fee)
+ if err := _MyTRC21.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
+}
+
+// MyTRC21OwnerAdditionIterator is returned from FilterOwnerAddition and is used to iterate over the raw logs and unpacked data for OwnerAddition events raised by the MyTRC21 contract.
+type MyTRC21OwnerAdditionIterator struct {
+ Event *MyTRC21OwnerAddition // 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 *MyTRC21OwnerAdditionIterator) 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(MyTRC21OwnerAddition)
+ 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(MyTRC21OwnerAddition)
+ 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 *MyTRC21OwnerAdditionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21OwnerAdditionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21OwnerAddition represents a OwnerAddition event raised by the MyTRC21 contract.
+type MyTRC21OwnerAddition struct {
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnerAddition is a free log retrieval operation binding the contract event 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d.
+//
+// Solidity: event OwnerAddition(owner indexed address)
+func (_MyTRC21 *MyTRC21Filterer) FilterOwnerAddition(opts *bind.FilterOpts, owner []common.Address) (*MyTRC21OwnerAdditionIterator, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "OwnerAddition", ownerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21OwnerAdditionIterator{contract: _MyTRC21.contract, event: "OwnerAddition", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnerAddition is a free log subscription operation binding the contract event 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d.
+//
+// Solidity: event OwnerAddition(owner indexed address)
+func (_MyTRC21 *MyTRC21Filterer) WatchOwnerAddition(opts *bind.WatchOpts, sink chan<- *MyTRC21OwnerAddition, owner []common.Address) (event.Subscription, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "OwnerAddition", ownerRule)
+ 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(MyTRC21OwnerAddition)
+ if err := _MyTRC21.contract.UnpackLog(event, "OwnerAddition", 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
+}
+
+// MyTRC21OwnerRemovalIterator is returned from FilterOwnerRemoval and is used to iterate over the raw logs and unpacked data for OwnerRemoval events raised by the MyTRC21 contract.
+type MyTRC21OwnerRemovalIterator struct {
+ Event *MyTRC21OwnerRemoval // 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 *MyTRC21OwnerRemovalIterator) 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(MyTRC21OwnerRemoval)
+ 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(MyTRC21OwnerRemoval)
+ 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 *MyTRC21OwnerRemovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21OwnerRemovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21OwnerRemoval represents a OwnerRemoval event raised by the MyTRC21 contract.
+type MyTRC21OwnerRemoval struct {
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnerRemoval is a free log retrieval operation binding the contract event 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90.
+//
+// Solidity: event OwnerRemoval(owner indexed address)
+func (_MyTRC21 *MyTRC21Filterer) FilterOwnerRemoval(opts *bind.FilterOpts, owner []common.Address) (*MyTRC21OwnerRemovalIterator, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "OwnerRemoval", ownerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21OwnerRemovalIterator{contract: _MyTRC21.contract, event: "OwnerRemoval", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnerRemoval is a free log subscription operation binding the contract event 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90.
+//
+// Solidity: event OwnerRemoval(owner indexed address)
+func (_MyTRC21 *MyTRC21Filterer) WatchOwnerRemoval(opts *bind.WatchOpts, sink chan<- *MyTRC21OwnerRemoval, owner []common.Address) (event.Subscription, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "OwnerRemoval", ownerRule)
+ 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(MyTRC21OwnerRemoval)
+ if err := _MyTRC21.contract.UnpackLog(event, "OwnerRemoval", 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
+}
+
+// MyTRC21RequirementChangeIterator is returned from FilterRequirementChange and is used to iterate over the raw logs and unpacked data for RequirementChange events raised by the MyTRC21 contract.
+type MyTRC21RequirementChangeIterator struct {
+ Event *MyTRC21RequirementChange // 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 *MyTRC21RequirementChangeIterator) 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(MyTRC21RequirementChange)
+ 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(MyTRC21RequirementChange)
+ 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 *MyTRC21RequirementChangeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21RequirementChangeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21RequirementChange represents a RequirementChange event raised by the MyTRC21 contract.
+type MyTRC21RequirementChange struct {
+ Required *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRequirementChange is a free log retrieval operation binding the contract event 0xa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a.
+//
+// Solidity: event RequirementChange(required uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterRequirementChange(opts *bind.FilterOpts) (*MyTRC21RequirementChangeIterator, error) {
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "RequirementChange")
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21RequirementChangeIterator{contract: _MyTRC21.contract, event: "RequirementChange", logs: logs, sub: sub}, nil
+}
+
+// WatchRequirementChange is a free log subscription operation binding the contract event 0xa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a.
+//
+// Solidity: event RequirementChange(required uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchRequirementChange(opts *bind.WatchOpts, sink chan<- *MyTRC21RequirementChange) (event.Subscription, error) {
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "RequirementChange")
+ 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(MyTRC21RequirementChange)
+ if err := _MyTRC21.contract.UnpackLog(event, "RequirementChange", 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
+}
+
+// MyTRC21RevocationIterator is returned from FilterRevocation and is used to iterate over the raw logs and unpacked data for Revocation events raised by the MyTRC21 contract.
+type MyTRC21RevocationIterator struct {
+ Event *MyTRC21Revocation // 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 *MyTRC21RevocationIterator) 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(MyTRC21Revocation)
+ 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(MyTRC21Revocation)
+ 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 *MyTRC21RevocationIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21RevocationIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Revocation represents a Revocation event raised by the MyTRC21 contract.
+type MyTRC21Revocation struct {
+ Sender common.Address
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRevocation is a free log retrieval operation binding the contract event 0xf6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9.
+//
+// Solidity: event Revocation(sender indexed address, transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterRevocation(opts *bind.FilterOpts, sender []common.Address, transactionId []*big.Int) (*MyTRC21RevocationIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Revocation", senderRule, transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21RevocationIterator{contract: _MyTRC21.contract, event: "Revocation", logs: logs, sub: sub}, nil
+}
+
+// WatchRevocation is a free log subscription operation binding the contract event 0xf6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9.
+//
+// Solidity: event Revocation(sender indexed address, transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchRevocation(opts *bind.WatchOpts, sink chan<- *MyTRC21Revocation, sender []common.Address, transactionId []*big.Int) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Revocation", senderRule, transactionIdRule)
+ 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(MyTRC21Revocation)
+ if err := _MyTRC21.contract.UnpackLog(event, "Revocation", 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
+}
+
+// MyTRC21SubmissionIterator is returned from FilterSubmission and is used to iterate over the raw logs and unpacked data for Submission events raised by the MyTRC21 contract.
+type MyTRC21SubmissionIterator struct {
+ Event *MyTRC21Submission // 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 *MyTRC21SubmissionIterator) 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(MyTRC21Submission)
+ 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(MyTRC21Submission)
+ 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 *MyTRC21SubmissionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21SubmissionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Submission represents a Submission event raised by the MyTRC21 contract.
+type MyTRC21Submission struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSubmission is a free log retrieval operation binding the contract event 0xc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e51.
+//
+// Solidity: event Submission(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterSubmission(opts *bind.FilterOpts, transactionId []*big.Int) (*MyTRC21SubmissionIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Submission", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21SubmissionIterator{contract: _MyTRC21.contract, event: "Submission", logs: logs, sub: sub}, nil
+}
+
+// WatchSubmission is a free log subscription operation binding the contract event 0xc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e51.
+//
+// Solidity: event Submission(transactionId indexed uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchSubmission(opts *bind.WatchOpts, sink chan<- *MyTRC21Submission, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Submission", transactionIdRule)
+ 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(MyTRC21Submission)
+ if err := _MyTRC21.contract.UnpackLog(event, "Submission", 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
+}
+
+// MyTRC21TokenBurnIterator is returned from FilterTokenBurn and is used to iterate over the raw logs and unpacked data for TokenBurn events raised by the MyTRC21 contract.
+type MyTRC21TokenBurnIterator struct {
+ Event *MyTRC21TokenBurn // 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 *MyTRC21TokenBurnIterator) 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(MyTRC21TokenBurn)
+ 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(MyTRC21TokenBurn)
+ 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 *MyTRC21TokenBurnIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21TokenBurnIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21TokenBurn represents a TokenBurn event raised by the MyTRC21 contract.
+type MyTRC21TokenBurn struct {
+ BurnID *big.Int
+ Burner common.Address
+ Value *big.Int
+ Data []byte
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTokenBurn is a free log retrieval operation binding the contract event 0x6905852b196f81e7e03058512a599446c358027fc943c1e193b6649a39379bb5.
+//
+// Solidity: event TokenBurn(burnID indexed uint256, burner indexed address, value uint256, data bytes)
+func (_MyTRC21 *MyTRC21Filterer) FilterTokenBurn(opts *bind.FilterOpts, burnID []*big.Int, burner []common.Address) (*MyTRC21TokenBurnIterator, error) {
+
+ var burnIDRule []interface{}
+ for _, burnIDItem := range burnID {
+ burnIDRule = append(burnIDRule, burnIDItem)
+ }
+ var burnerRule []interface{}
+ for _, burnerItem := range burner {
+ burnerRule = append(burnerRule, burnerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "TokenBurn", burnIDRule, burnerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21TokenBurnIterator{contract: _MyTRC21.contract, event: "TokenBurn", logs: logs, sub: sub}, nil
+}
+
+// WatchTokenBurn is a free log subscription operation binding the contract event 0x6905852b196f81e7e03058512a599446c358027fc943c1e193b6649a39379bb5.
+//
+// Solidity: event TokenBurn(burnID indexed uint256, burner indexed address, value uint256, data bytes)
+func (_MyTRC21 *MyTRC21Filterer) WatchTokenBurn(opts *bind.WatchOpts, sink chan<- *MyTRC21TokenBurn, burnID []*big.Int, burner []common.Address) (event.Subscription, error) {
+
+ var burnIDRule []interface{}
+ for _, burnIDItem := range burnID {
+ burnIDRule = append(burnIDRule, burnIDItem)
+ }
+ var burnerRule []interface{}
+ for _, burnerItem := range burner {
+ burnerRule = append(burnerRule, burnerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "TokenBurn", burnIDRule, burnerRule)
+ 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(MyTRC21TokenBurn)
+ if err := _MyTRC21.contract.UnpackLog(event, "TokenBurn", 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
+}
+
+// MyTRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the MyTRC21 contract.
+type MyTRC21TransferIterator struct {
+ Event *MyTRC21Transfer // 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 *MyTRC21TransferIterator) 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(MyTRC21Transfer)
+ 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(MyTRC21Transfer)
+ 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 *MyTRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Transfer represents a Transfer event raised by the MyTRC21 contract.
+type MyTRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MyTRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21TransferIterator{contract: _MyTRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *MyTRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(MyTRC21Transfer)
+ if err := _MyTRC21.contract.UnpackLog(event, "Transfer", 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
+}
+
+// TRC21ABI is the input ABI used to generate the binding from.
+const TRC21ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setMinFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\"},{\"name\":\"decimals\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// TRC21Bin is the compiled bytecode used for deploying new contracts.
+const TRC21Bin = `0x608060405234801561001057600080fd5b50604051610a2c380380610a2c83398101604090815281516020808401519284015191840180519094939093019261004e916005919086019061007f565b50815161006290600690602085019061007f565b506007805460ff191660ff929092169190911790555061011a9050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100c057805160ff19168380011785556100ed565b828001600101855582156100ed579182015b828111156100ed5782518255916020019190600101906100d2565b506100f99291506100fd565b5090565b61011791905b808211156100f95760008155600101610103565b90565b610903806101296000396000f3006080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100c9578063095ea7b314610153578063127e8e4d1461018b57806318160ddd146101b55780631d143848146101ca57806323b872dd146101fb57806324ec759014610225578063313ce5671461023a57806331ac99201461026557806370a082311461027f57806395d89b41146102a0578063a9059cbb146102b5578063dd62ed3e146102d9575b600080fd5b3480156100d557600080fd5b506100de610300565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610118578181015183820152602001610100565b50505050905090810190601f1680156101455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015f57600080fd5b50610177600160a060020a0360043516602435610396565b604080519115158252519081900360200190f35b34801561019757600080fd5b506101a3600435610450565b60408051918252519081900360200190f35b3480156101c157600080fd5b506101a361047c565b3480156101d657600080fd5b506101df610482565b60408051600160a060020a039092168252519081900360200190f35b34801561020757600080fd5b50610177600160a060020a0360043581169060243516604435610491565b34801561023157600080fd5b506101a36105d5565b34801561024657600080fd5b5061024f6105db565b6040805160ff9092168252519081900360200190f35b34801561027157600080fd5b5061027d6004356105e4565b005b34801561028b57600080fd5b506101a3600160a060020a0360043516610607565b3480156102ac57600080fd5b506100de610622565b3480156102c157600080fd5b50610177600160a060020a0360043516602435610683565b3480156102e557600080fd5b506101a3600160a060020a0360043581169060243516610757565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038c5780601f106103615761010080835404028352916020019161038c565b820191906000526020600020905b81548152906001019060200180831161036f57829003601f168201915b5050505050905090565b6000600160a060020a03831615156103ad57600080fd5b6001543360009081526020819052604090205410156103cb57600080fd5b336000818152600360209081526040808320600160a060020a038881168552925290912084905560025460015461040793929190911690610782565b604080518381529051600160a060020a0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b6001546000906104769061046a848463ffffffff61087416565b9063ffffffff6108a916565b92915050565b60045490565b600254600160a060020a031690565b6000806104a9600154846108a990919063ffffffff16565b600160a060020a0386166000908152602081905260409020549091508111156104d157600080fd5b600160a060020a038516600090815260036020908152604080832033845290915290205483111561050157600080fd5b600160a060020a0385166000908152600360209081526040808320338452909152902054610535908263ffffffff6108bb16565b600160a060020a0386166000908152600360209081526040808320338452909152902055610564858585610782565b600254600154610581918791600160a060020a0390911690610782565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4506001949350505050565b60015490565b60075460ff1690565b600254600160a060020a031633146105fb57600080fd5b610604816108d2565b50565b600160a060020a031660009081526020819052604090205490565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561038c5780601f106103615761010080835404028352916020019161038c565b600080600160a060020a038416151561069b57600080fd5b6001546106af90849063ffffffff6108a916565b336000908152602081905260409020549091508111156106ce57600080fd5b6106d9338585610782565b6000600154111561074b57600254600154610701913391600160a060020a0390911690610782565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a45b600191505b5092915050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600160a060020a0383166000908152602081905260409020548111156107a757600080fd5b600160a060020a03821615156107bc57600080fd5b600160a060020a0383166000908152602081905260409020546107e5908263ffffffff6108bb16565b600160a060020a03808516600090815260208190526040808220939093559084168152205461081a908263ffffffff6108a916565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000808315156108875760009150610750565b5082820282848281151561089757fe5b04146108a257600080fd5b9392505050565b6000828201838110156108a257600080fd5b600080838311156108cb57600080fd5b5050900390565b6001555600a165627a7a723058206c24d49045155ad83d904de717409715bdb93edbc379076a4a1d5f03d3ae00900029`
+
+// DeployTRC21 deploys a new Ethereum contract, binding an instance of TRC21 to it.
+func DeployTRC21(auth *bind.TransactOpts, backend bind.ContractBackend, name string, symbol string, decimals uint8) (common.Address, *types.Transaction, *TRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(TRC21Bin), backend, name, symbol, decimals)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &TRC21{TRC21Caller: TRC21Caller{contract: contract}, TRC21Transactor: TRC21Transactor{contract: contract}, TRC21Filterer: TRC21Filterer{contract: contract}}, nil
+}
+
+// TRC21 is an auto generated Go binding around an Ethereum contract.
+type TRC21 struct {
+ TRC21Caller // Read-only binding to the contract
+ TRC21Transactor // Write-only binding to the contract
+ TRC21Filterer // Log filterer for contract events
+}
+
+// TRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type TRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type TRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type TRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type TRC21Session struct {
+ Contract *TRC21 // 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
+}
+
+// TRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type TRC21CallerSession struct {
+ Contract *TRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// TRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type TRC21TransactorSession struct {
+ Contract *TRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// TRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type TRC21Raw struct {
+ Contract *TRC21 // Generic contract binding to access the raw methods on
+}
+
+// TRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type TRC21CallerRaw struct {
+ Contract *TRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// TRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type TRC21TransactorRaw struct {
+ Contract *TRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewTRC21 creates a new instance of TRC21, bound to a specific deployed contract.
+func NewTRC21(address common.Address, backend bind.ContractBackend) (*TRC21, error) {
+ contract, err := bindTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21{TRC21Caller: TRC21Caller{contract: contract}, TRC21Transactor: TRC21Transactor{contract: contract}, TRC21Filterer: TRC21Filterer{contract: contract}}, nil
+}
+
+// NewTRC21Caller creates a new read-only instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Caller(address common.Address, caller bind.ContractCaller) (*TRC21Caller, error) {
+ contract, err := bindTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Caller{contract: contract}, nil
+}
+
+// NewTRC21Transactor creates a new write-only instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*TRC21Transactor, error) {
+ contract, err := bindTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Transactor{contract: contract}, nil
+}
+
+// NewTRC21Filterer creates a new log filterer instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*TRC21Filterer, error) {
+ contract, err := bindTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Filterer{contract: contract}, nil
+}
+
+// bindTRC21 binds a generic wrapper to an already deployed contract.
+func bindTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21ABI))
+ 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 (_TRC21 *TRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21.Contract.TRC21Caller.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 (_TRC21 *TRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21.Contract.TRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21 *TRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21.Contract.TRC21Transactor.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 (_TRC21 *TRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21.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 (_TRC21 *TRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21 *TRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _TRC21.Contract.Allowance(&_TRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _TRC21.Contract.Allowance(&_TRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "balanceOf", owner)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21Session) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _TRC21.Contract.BalanceOf(&_TRC21.CallOpts, owner)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _TRC21.Contract.BalanceOf(&_TRC21.CallOpts, owner)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_TRC21 *TRC21Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+ var (
+ ret0 = new(uint8)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "decimals")
+ return *ret0, err
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_TRC21 *TRC21Session) Decimals() (uint8, error) {
+ return _TRC21.Contract.Decimals(&_TRC21.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_TRC21 *TRC21CallerSession) Decimals() (uint8, error) {
+ return _TRC21.Contract.Decimals(&_TRC21.CallOpts)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _TRC21.Contract.EstimateFee(&_TRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _TRC21.Contract.EstimateFee(&_TRC21.CallOpts, value)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21Session) Issuer() (common.Address, error) {
+ return _TRC21.Contract.Issuer(&_TRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21CallerSession) Issuer() (common.Address, error) {
+ return _TRC21.Contract.Issuer(&_TRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21Caller) MinFee(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "minFee")
+ return *ret0, err
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21Session) MinFee() (*big.Int, error) {
+ return _TRC21.Contract.MinFee(&_TRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) MinFee() (*big.Int, error) {
+ return _TRC21.Contract.MinFee(&_TRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_TRC21 *TRC21Caller) Name(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "name")
+ return *ret0, err
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_TRC21 *TRC21Session) Name() (string, error) {
+ return _TRC21.Contract.Name(&_TRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_TRC21 *TRC21CallerSession) Name() (string, error) {
+ return _TRC21.Contract.Name(&_TRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_TRC21 *TRC21Caller) Symbol(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "symbol")
+ return *ret0, err
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_TRC21 *TRC21Session) Symbol() (string, error) {
+ return _TRC21.Contract.Symbol(&_TRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_TRC21 *TRC21CallerSession) Symbol() (string, error) {
+ return _TRC21.Contract.Symbol(&_TRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21Session) TotalSupply() (*big.Int, error) {
+ return _TRC21.Contract.TotalSupply(&_TRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _TRC21.Contract.TotalSupply(&_TRC21.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Approve(&_TRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Approve(&_TRC21.TransactOpts, spender, value)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_TRC21 *TRC21Transactor) SetMinFee(opts *bind.TransactOpts, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "setMinFee", value)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_TRC21 *TRC21Session) SetMinFee(value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.SetMinFee(&_TRC21.TransactOpts, value)
+}
+
+// SetMinFee is a paid mutator transaction binding the contract method 0x31ac9920.
+//
+// Solidity: function setMinFee(value uint256) returns()
+func (_TRC21 *TRC21TransactorSession) SetMinFee(value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.SetMinFee(&_TRC21.TransactOpts, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Transfer(&_TRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Transfer(&_TRC21.TransactOpts, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.TransferFrom(&_TRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.TransferFrom(&_TRC21.TransactOpts, from, to, value)
+}
+
+// TRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the TRC21 contract.
+type TRC21ApprovalIterator struct {
+ Event *TRC21Approval // 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 *TRC21ApprovalIterator) 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(TRC21Approval)
+ 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(TRC21Approval)
+ 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 *TRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Approval represents a Approval event raised by the TRC21 contract.
+type TRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*TRC21ApprovalIterator, 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 := _TRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21ApprovalIterator{contract: _TRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *TRC21Approval, 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 := _TRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(TRC21Approval)
+ if err := _TRC21.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
+}
+
+// TRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the TRC21 contract.
+type TRC21FeeIterator struct {
+ Event *TRC21Fee // 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 *TRC21FeeIterator) 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(TRC21Fee)
+ 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(TRC21Fee)
+ 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 *TRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Fee represents a Fee event raised by the TRC21 contract.
+type TRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*TRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _TRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21FeeIterator{contract: _TRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *TRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _TRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(TRC21Fee)
+ if err := _TRC21.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
+}
+
+// TRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the TRC21 contract.
+type TRC21TransferIterator struct {
+ Event *TRC21Transfer // 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 *TRC21TransferIterator) 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(TRC21Transfer)
+ 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(TRC21Transfer)
+ 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 *TRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Transfer represents a Transfer event raised by the TRC21 contract.
+type TRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _TRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21TransferIterator{contract: _TRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *TRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _TRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(TRC21Transfer)
+ if err := _TRC21.contract.UnpackLog(event, "Transfer", 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
+}
diff --git a/contracts/XDCx/contract/TRC21Issuer.go b/contracts/XDCx/contract/TRC21Issuer.go
new file mode 100644
index 0000000000..9f2bff47ce
--- /dev/null
+++ b/contracts/XDCx/contract/TRC21Issuer.go
@@ -0,0 +1,775 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+import (
+ "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"
+ "math/big"
+ "strings"
+)
+
+// AbstractTokenTRC21ABI is the input ABI used to generate the binding from.
+const AbstractTokenTRC21ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// AbstractTokenTRC21Bin is the compiled bytecode used for deploying new contracts.
+const AbstractTokenTRC21Bin = `0x`
+
+// DeployAbstractTokenTRC21 deploys a new Ethereum contract, binding an instance of AbstractTokenTRC21 to it.
+func DeployAbstractTokenTRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *AbstractTokenTRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractTokenTRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(AbstractTokenTRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &AbstractTokenTRC21{AbstractTokenTRC21Caller: AbstractTokenTRC21Caller{contract: contract}, AbstractTokenTRC21Transactor: AbstractTokenTRC21Transactor{contract: contract}, AbstractTokenTRC21Filterer: AbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// AbstractTokenTRC21 is an auto generated Go binding around an Ethereum contract.
+type AbstractTokenTRC21 struct {
+ AbstractTokenTRC21Caller // Read-only binding to the contract
+ AbstractTokenTRC21Transactor // Write-only binding to the contract
+ AbstractTokenTRC21Filterer // Log filterer for contract events
+}
+
+// AbstractTokenTRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type AbstractTokenTRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type AbstractTokenTRC21Session struct {
+ Contract *AbstractTokenTRC21 // 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
+}
+
+// AbstractTokenTRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type AbstractTokenTRC21CallerSession struct {
+ Contract *AbstractTokenTRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// AbstractTokenTRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type AbstractTokenTRC21TransactorSession struct {
+ Contract *AbstractTokenTRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// AbstractTokenTRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type AbstractTokenTRC21Raw struct {
+ Contract *AbstractTokenTRC21 // Generic contract binding to access the raw methods on
+}
+
+// AbstractTokenTRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21CallerRaw struct {
+ Contract *AbstractTokenTRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// AbstractTokenTRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21TransactorRaw struct {
+ Contract *AbstractTokenTRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewAbstractTokenTRC21 creates a new instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21(address common.Address, backend bind.ContractBackend) (*AbstractTokenTRC21, error) {
+ contract, err := bindAbstractTokenTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21{AbstractTokenTRC21Caller: AbstractTokenTRC21Caller{contract: contract}, AbstractTokenTRC21Transactor: AbstractTokenTRC21Transactor{contract: contract}, AbstractTokenTRC21Filterer: AbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// NewAbstractTokenTRC21Caller creates a new read-only instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Caller(address common.Address, caller bind.ContractCaller) (*AbstractTokenTRC21Caller, error) {
+ contract, err := bindAbstractTokenTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Caller{contract: contract}, nil
+}
+
+// NewAbstractTokenTRC21Transactor creates a new write-only instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*AbstractTokenTRC21Transactor, error) {
+ contract, err := bindAbstractTokenTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Transactor{contract: contract}, nil
+}
+
+// NewAbstractTokenTRC21Filterer creates a new log filterer instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*AbstractTokenTRC21Filterer, error) {
+ contract, err := bindAbstractTokenTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Filterer{contract: contract}, nil
+}
+
+// bindAbstractTokenTRC21 binds a generic wrapper to an already deployed contract.
+func bindAbstractTokenTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractTokenTRC21ABI))
+ 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 (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Caller.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 (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Transactor.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 (_AbstractTokenTRC21 *AbstractTokenTRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractTokenTRC21.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 (_AbstractTokenTRC21 *AbstractTokenTRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractTokenTRC21 *AbstractTokenTRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _AbstractTokenTRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Session) Issuer() (common.Address, error) {
+ return _AbstractTokenTRC21.Contract.Issuer(&_AbstractTokenTRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21CallerSession) Issuer() (common.Address, error) {
+ return _AbstractTokenTRC21.Contract.Issuer(&_AbstractTokenTRC21.CallOpts)
+}
+
+// TRC21IssuerABI is the input ABI used to generate the binding from.
+const TRC21IssuerABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"minCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenCapacity\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"apply\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"charge\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Apply\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"supporter\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Charge\",\"type\":\"event\"}]"
+
+// TRC21IssuerBin is the compiled bytecode used for deploying new contracts.
+const TRC21IssuerBin = `0x608060405234801561001057600080fd5b506040516020806104578339810160405251600055610423806100346000396000f30060806040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa615b081146100715780638f3a981c146100985780639d63848a146100b9578063c6b32f341461011e578063fc6bd76a14610134575b600080fd5b34801561007d57600080fd5b50610086610148565b60408051918252519081900360200190f35b3480156100a457600080fd5b50610086600160a060020a036004351661014e565b3480156100c557600080fd5b506100ce610169565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561010a5781810151838201526020016100f2565b505050509050019250505060405180910390f35b610132600160a060020a03600435166101cb565b005b610132600160a060020a036004351661035d565b60005490565b600160a060020a031660009081526002602052604090205490565b606060018054806020026020016040519081016040528092919081815260200182805480156101c157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116101a3575b5050505050905090565b600081600160a060020a03811615156101e357600080fd5b6000543410156101f257600080fd5b82915033600160a060020a031682600160a060020a0316631d1438486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050506040513d602081101561028057600080fd5b5051600160a060020a03161461029557600080fd5b600180548082019091557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851690811790915560009081526002602052604090205461030390346103de565b600160a060020a0384166000818152600260209081526040918290209390935580513481529051919233927f2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d7169281900390910190a3505050565b600160a060020a038116600090815260026020526040902054610386903463ffffffff6103de16565b600160a060020a0382166000818152600260209081526040918290209390935580513481529051919233927f5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e069281900390910190a350565b6000828201838110156103f057600080fd5b93925050505600a165627a7a7230582005dc9504c7a156980fbaadfe03ffb20a475e65b947f9a8ef3e6d6beee52325a80029`
+
+// DeployTRC21Issuer deploys a new Ethereum contract, binding an instance of TRC21Issuer to it.
+func DeployTRC21Issuer(auth *bind.TransactOpts, backend bind.ContractBackend, value *big.Int) (common.Address, *types.Transaction, *TRC21Issuer, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21IssuerABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(TRC21IssuerBin), backend, value)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &TRC21Issuer{TRC21IssuerCaller: TRC21IssuerCaller{contract: contract}, TRC21IssuerTransactor: TRC21IssuerTransactor{contract: contract}, TRC21IssuerFilterer: TRC21IssuerFilterer{contract: contract}}, nil
+}
+
+// TRC21Issuer is an auto generated Go binding around an Ethereum contract.
+type TRC21Issuer struct {
+ TRC21IssuerCaller // Read-only binding to the contract
+ TRC21IssuerTransactor // Write-only binding to the contract
+ TRC21IssuerFilterer // Log filterer for contract events
+}
+
+// TRC21IssuerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type TRC21IssuerCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type TRC21IssuerTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type TRC21IssuerFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type TRC21IssuerSession struct {
+ Contract *TRC21Issuer // 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
+}
+
+// TRC21IssuerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type TRC21IssuerCallerSession struct {
+ Contract *TRC21IssuerCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// TRC21IssuerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type TRC21IssuerTransactorSession struct {
+ Contract *TRC21IssuerTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// TRC21IssuerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type TRC21IssuerRaw struct {
+ Contract *TRC21Issuer // Generic contract binding to access the raw methods on
+}
+
+// TRC21IssuerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type TRC21IssuerCallerRaw struct {
+ Contract *TRC21IssuerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// TRC21IssuerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type TRC21IssuerTransactorRaw struct {
+ Contract *TRC21IssuerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewTRC21Issuer creates a new instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21Issuer(address common.Address, backend bind.ContractBackend) (*TRC21Issuer, error) {
+ contract, err := bindTRC21Issuer(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Issuer{TRC21IssuerCaller: TRC21IssuerCaller{contract: contract}, TRC21IssuerTransactor: TRC21IssuerTransactor{contract: contract}, TRC21IssuerFilterer: TRC21IssuerFilterer{contract: contract}}, nil
+}
+
+// NewTRC21IssuerCaller creates a new read-only instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerCaller(address common.Address, caller bind.ContractCaller) (*TRC21IssuerCaller, error) {
+ contract, err := bindTRC21Issuer(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerCaller{contract: contract}, nil
+}
+
+// NewTRC21IssuerTransactor creates a new write-only instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerTransactor(address common.Address, transactor bind.ContractTransactor) (*TRC21IssuerTransactor, error) {
+ contract, err := bindTRC21Issuer(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerTransactor{contract: contract}, nil
+}
+
+// NewTRC21IssuerFilterer creates a new log filterer instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerFilterer(address common.Address, filterer bind.ContractFilterer) (*TRC21IssuerFilterer, error) {
+ contract, err := bindTRC21Issuer(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerFilterer{contract: contract}, nil
+}
+
+// bindTRC21Issuer binds a generic wrapper to an already deployed contract.
+func bindTRC21Issuer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21IssuerABI))
+ 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 (_TRC21Issuer *TRC21IssuerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21Issuer.Contract.TRC21IssuerCaller.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 (_TRC21Issuer *TRC21IssuerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.TRC21IssuerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21Issuer *TRC21IssuerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.TRC21IssuerTransactor.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 (_TRC21Issuer *TRC21IssuerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21Issuer.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 (_TRC21Issuer *TRC21IssuerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21Issuer *TRC21IssuerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCaller) GetTokenCapacity(opts *bind.CallOpts, token common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "getTokenCapacity", token)
+ return *ret0, err
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerSession) GetTokenCapacity(token common.Address) (*big.Int, error) {
+ return _TRC21Issuer.Contract.GetTokenCapacity(&_TRC21Issuer.CallOpts, token)
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCallerSession) GetTokenCapacity(token common.Address) (*big.Int, error) {
+ return _TRC21Issuer.Contract.GetTokenCapacity(&_TRC21Issuer.CallOpts, token)
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCaller) MinCap(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "minCap")
+ return *ret0, err
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerSession) MinCap() (*big.Int, error) {
+ return _TRC21Issuer.Contract.MinCap(&_TRC21Issuer.CallOpts)
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCallerSession) MinCap() (*big.Int, error) {
+ return _TRC21Issuer.Contract.MinCap(&_TRC21Issuer.CallOpts)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerCaller) Tokens(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "tokens")
+ return *ret0, err
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerSession) Tokens() ([]common.Address, error) {
+ return _TRC21Issuer.Contract.Tokens(&_TRC21Issuer.CallOpts)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerCallerSession) Tokens() ([]common.Address, error) {
+ return _TRC21Issuer.Contract.Tokens(&_TRC21Issuer.CallOpts)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactor) Apply(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.contract.Transact(opts, "apply", token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Apply(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactorSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Apply(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactor) Charge(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.contract.Transact(opts, "charge", token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerSession) Charge(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Charge(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactorSession) Charge(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Charge(&_TRC21Issuer.TransactOpts, token)
+}
+
+// TRC21IssuerApplyIterator is returned from FilterApply and is used to iterate over the raw logs and unpacked data for Apply events raised by the TRC21Issuer contract.
+type TRC21IssuerApplyIterator struct {
+ Event *TRC21IssuerApply // 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 *TRC21IssuerApplyIterator) 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(TRC21IssuerApply)
+ 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(TRC21IssuerApply)
+ 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 *TRC21IssuerApplyIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21IssuerApplyIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21IssuerApply represents a Apply event raised by the TRC21Issuer contract.
+type TRC21IssuerApply struct {
+ Issuer common.Address
+ Token common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApply is a free log retrieval operation binding the contract event 0x2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d716.
+//
+// Solidity: event Apply(issuer indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) FilterApply(opts *bind.FilterOpts, issuer []common.Address, token []common.Address) (*TRC21IssuerApplyIterator, 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 := _TRC21Issuer.contract.FilterLogs(opts, "Apply", issuerRule, tokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerApplyIterator{contract: _TRC21Issuer.contract, event: "Apply", logs: logs, sub: sub}, nil
+}
+
+// WatchApply is a free log subscription operation binding the contract event 0x2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d716.
+//
+// Solidity: event Apply(issuer indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) WatchApply(opts *bind.WatchOpts, sink chan<- *TRC21IssuerApply, 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 := _TRC21Issuer.contract.WatchLogs(opts, "Apply", 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(TRC21IssuerApply)
+ if err := _TRC21Issuer.contract.UnpackLog(event, "Apply", 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
+}
+
+// TRC21IssuerChargeIterator is returned from FilterCharge and is used to iterate over the raw logs and unpacked data for Charge events raised by the TRC21Issuer contract.
+type TRC21IssuerChargeIterator struct {
+ Event *TRC21IssuerCharge // 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 *TRC21IssuerChargeIterator) 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(TRC21IssuerCharge)
+ 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(TRC21IssuerCharge)
+ 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 *TRC21IssuerChargeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21IssuerChargeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21IssuerCharge represents a Charge event raised by the TRC21Issuer contract.
+type TRC21IssuerCharge 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(supporter indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) FilterCharge(opts *bind.FilterOpts, supporter []common.Address, token []common.Address) (*TRC21IssuerChargeIterator, 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 := _TRC21Issuer.contract.FilterLogs(opts, "Charge", supporterRule, tokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerChargeIterator{contract: _TRC21Issuer.contract, event: "Charge", logs: logs, sub: sub}, nil
+}
+
+// WatchCharge is a free log subscription operation binding the contract event 0x5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e06.
+//
+// Solidity: event Charge(supporter indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) WatchCharge(opts *bind.WatchOpts, sink chan<- *TRC21IssuerCharge, 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 := _TRC21Issuer.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(TRC21IssuerCharge)
+ if err := _TRC21Issuer.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
+}
diff --git a/contracts/XDCx/contract/XDCXListing.go b/contracts/XDCx/contract/XDCXListing.go
new file mode 100644
index 0000000000..b38269418f
--- /dev/null
+++ b/contracts/XDCx/contract/XDCXListing.go
@@ -0,0 +1,251 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+import (
+ "strings"
+
+ "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"
+)
+
+// XDCXListingABI is the input ABI used to generate the binding from.
+const XDCXListingABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"apply\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"}]"
+
+// XDCXListingBin is the compiled bytecode used for deploying new contracts.
+const XDCXListingBin = `0x608060405234801561001057600080fd5b506102be806100206000396000f3006080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639d63848a811461005b578063a3ff31b5146100c0578063c6b32f34146100f5575b600080fd5b34801561006757600080fd5b5061007061010b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156100ac578181015183820152602001610094565b505050509050019250505060405180910390f35b3480156100cc57600080fd5b506100e1600160a060020a036004351661016d565b604080519115158252519081900360200190f35b610109600160a060020a036004351661018b565b005b6060600080548060200260200160405190810160405280929190818152602001828054801561016357602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610145575b5050505050905090565b600160a060020a031660009081526001602052604090205460ff1690565b80600160a060020a03811615156101a157600080fd5b600160a060020a03811660009081526001602081905260409091205460ff16151514156101cd57600080fd5b683635c9adc5dea0000034146101e257600080fd5b6040516068903480156108fc02916000818181858888f1935050505015801561020f573d6000803e3d6000fd5b505060008054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039490941693841790556040805160208082018352838252948452919093529190209051815460ff19169015151790555600a165627a7a723058206d2dc0ce827743c25efa82f99e7830ade39d28e17f4d651573f89e0460a6626a0029`
+
+// DeployXDCXListing deploys a new Ethereum contract, binding an instance of XDCXListing to it.
+func DeployXDCXListing(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *XDCXListing, error) {
+ parsed, err := abi.JSON(strings.NewReader(XDCXListingABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCXListingBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &XDCXListing{XDCXListingCaller: XDCXListingCaller{contract: contract}, XDCXListingTransactor: XDCXListingTransactor{contract: contract}, XDCXListingFilterer: XDCXListingFilterer{contract: contract}}, nil
+}
+
+// XDCXListing is an auto generated Go binding around an Ethereum contract.
+type XDCXListing struct {
+ XDCXListingCaller // Read-only binding to the contract
+ XDCXListingTransactor // Write-only binding to the contract
+ XDCXListingFilterer // Log filterer for contract events
+}
+
+// XDCXListingCaller is an auto generated read-only Go binding around an Ethereum contract.
+type XDCXListingCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCXListingTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type XDCXListingTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCXListingFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type XDCXListingFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCXListingSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type XDCXListingSession struct {
+ Contract *XDCXListing // 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
+}
+
+// XDCXListingCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type XDCXListingCallerSession struct {
+ Contract *XDCXListingCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// XDCXListingTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type XDCXListingTransactorSession struct {
+ Contract *XDCXListingTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// XDCXListingRaw is an auto generated low-level Go binding around an Ethereum contract.
+type XDCXListingRaw struct {
+ Contract *XDCXListing // Generic contract binding to access the raw methods on
+}
+
+// XDCXListingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type XDCXListingCallerRaw struct {
+ Contract *XDCXListingCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// XDCXListingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type XDCXListingTransactorRaw struct {
+ Contract *XDCXListingTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewXDCXListing creates a new instance of XDCXListing, bound to a specific deployed contract.
+func NewXDCXListing(address common.Address, backend bind.ContractBackend) (*XDCXListing, error) {
+ contract, err := bindXDCXListing(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCXListing{XDCXListingCaller: XDCXListingCaller{contract: contract}, XDCXListingTransactor: XDCXListingTransactor{contract: contract}, XDCXListingFilterer: XDCXListingFilterer{contract: contract}}, nil
+}
+
+// NewXDCXListingCaller creates a new read-only instance of XDCXListing, bound to a specific deployed contract.
+func NewXDCXListingCaller(address common.Address, caller bind.ContractCaller) (*XDCXListingCaller, error) {
+ contract, err := bindXDCXListing(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCXListingCaller{contract: contract}, nil
+}
+
+// NewXDCXListingTransactor creates a new write-only instance of XDCXListing, bound to a specific deployed contract.
+func NewXDCXListingTransactor(address common.Address, transactor bind.ContractTransactor) (*XDCXListingTransactor, error) {
+ contract, err := bindXDCXListing(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCXListingTransactor{contract: contract}, nil
+}
+
+// NewXDCXListingFilterer creates a new log filterer instance of XDCXListing, bound to a specific deployed contract.
+func NewXDCXListingFilterer(address common.Address, filterer bind.ContractFilterer) (*XDCXListingFilterer, error) {
+ contract, err := bindXDCXListing(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCXListingFilterer{contract: contract}, nil
+}
+
+// bindXDCXListing binds a generic wrapper to an already deployed contract.
+func bindXDCXListing(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(XDCXListingABI))
+ 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 (_XDCXListing *XDCXListingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _XDCXListing.Contract.XDCXListingCaller.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 (_XDCXListing *XDCXListingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _XDCXListing.Contract.XDCXListingTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_XDCXListing *XDCXListingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _XDCXListing.Contract.XDCXListingTransactor.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 (_XDCXListing *XDCXListingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _XDCXListing.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 (_XDCXListing *XDCXListingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _XDCXListing.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_XDCXListing *XDCXListingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _XDCXListing.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus(token address) constant returns(bool)
+func (_XDCXListing *XDCXListingCaller) GetTokenStatus(opts *bind.CallOpts, token common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCXListing.contract.Call(opts, out, "getTokenStatus", token)
+ return *ret0, err
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus(token address) constant returns(bool)
+func (_XDCXListing *XDCXListingSession) GetTokenStatus(token common.Address) (bool, error) {
+ return _XDCXListing.Contract.GetTokenStatus(&_XDCXListing.CallOpts, token)
+}
+
+// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
+//
+// Solidity: function getTokenStatus(token address) constant returns(bool)
+func (_XDCXListing *XDCXListingCallerSession) GetTokenStatus(token common.Address) (bool, error) {
+ return _XDCXListing.Contract.GetTokenStatus(&_XDCXListing.CallOpts, token)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_XDCXListing *XDCXListingCaller) Tokens(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCXListing.contract.Call(opts, out, "tokens")
+ return *ret0, err
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_XDCXListing *XDCXListingSession) Tokens() ([]common.Address, error) {
+ return _XDCXListing.Contract.Tokens(&_XDCXListing.CallOpts)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_XDCXListing *XDCXListingCallerSession) Tokens() ([]common.Address, error) {
+ return _XDCXListing.Contract.Tokens(&_XDCXListing.CallOpts)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_XDCXListing *XDCXListingTransactor) Apply(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _XDCXListing.contract.Transact(opts, "apply", token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_XDCXListing *XDCXListingSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _XDCXListing.Contract.Apply(&_XDCXListing.TransactOpts, token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_XDCXListing *XDCXListingTransactorSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _XDCXListing.Contract.Apply(&_XDCXListing.TransactOpts, token)
+}
diff --git a/contracts/XDCx/lendingRelayerRegistration.go b/contracts/XDCx/lendingRelayerRegistration.go
new file mode 100644
index 0000000000..1031ead35a
--- /dev/null
+++ b/contracts/XDCx/lendingRelayerRegistration.go
@@ -0,0 +1,40 @@
+package XDCx
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/XDCx/contract"
+)
+
+type LendingRelayerRegistration struct {
+ *contract.LendingSession
+ contractBackend bind.ContractBackend
+}
+
+func NewLendingRelayerRegistration(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*LendingRelayerRegistration, error) {
+ smartContract, err := contract.NewLending(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &LendingRelayerRegistration{
+ &contract.LendingSession{
+ Contract: smartContract,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployLendingRelayerRegistration(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, relayerAddr common.Address, XDCxListtingAddr common.Address) (common.Address, *LendingRelayerRegistration, error) {
+ contractAddr, _, _, err := contract.DeployLending(transactOpts, contractBackend, relayerAddr, XDCxListtingAddr)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ smartContract, err := NewLendingRelayerRegistration(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, smartContract, nil
+}
diff --git a/contracts/XDCx/relayerRegistration.go b/contracts/XDCx/relayerRegistration.go
new file mode 100644
index 0000000000..ff3c5fe0e8
--- /dev/null
+++ b/contracts/XDCx/relayerRegistration.go
@@ -0,0 +1,42 @@
+package XDCx
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/XDCx/contract"
+)
+
+type RelayerRegistration struct {
+ *contract.RelayerRegistrationSession
+ contractBackend bind.ContractBackend
+}
+
+func NewRelayerRegistration(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*RelayerRegistration, error) {
+ smartContract, err := contract.NewRelayerRegistration(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &RelayerRegistration{
+ &contract.RelayerRegistrationSession{
+ Contract: smartContract,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployRelayerRegistration(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, XDCxListing common.Address, maxRelayers *big.Int, maxTokenList *big.Int, minDeposit *big.Int) (common.Address, *RelayerRegistration, error) {
+ contractAddr, _, _, err := contract.DeployRelayerRegistration(transactOpts, contractBackend, XDCxListing, maxRelayers, maxTokenList, minDeposit)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ smartContract, err := NewRelayerRegistration(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, smartContract, nil
+}
diff --git a/contracts/XDCx/simulation/constants.go b/contracts/XDCx/simulation/constants.go
new file mode 100644
index 0000000000..1ed557ed2d
--- /dev/null
+++ b/contracts/XDCx/simulation/constants.go
@@ -0,0 +1,75 @@
+package simulation
+
+import (
+ "math/big"
+ "os"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+var (
+ BaseXDC = big.NewInt(0).Mul(big.NewInt(10), big.NewInt(100000000000000000)) // 1 XDC
+ RpcEndpoint = "http://127.0.0.1:8501/"
+ MainKey, _ = crypto.HexToECDSA(os.Getenv("MAIN_ADDRESS_KEY"))
+ MainAddr = crypto.PubkeyToAddress(MainKey.PublicKey) //0x17F2beD710ba50Ed27aEa52fc4bD7Bda5ED4a037
+
+ // TRC21 Token
+ MinTRC21Apply = big.NewInt(0).Mul(big.NewInt(10), BaseXDC) // 10 XDC
+ TRC21TokenCap = big.NewInt(0).Mul(big.NewInt(1000000000000), BaseXDC)
+ TRC21TokenFee = big.NewInt(0)
+ XDCXListingFee = big.NewInt(0).Mul(big.NewInt(1000), BaseXDC) // 1000 XDC
+
+ // XDCX
+ MaxRelayers = big.NewInt(200)
+ MaxTokenList = big.NewInt(200)
+ MinDeposit = big.NewInt(0).Mul(big.NewInt(25000), BaseXDC) // 25000 XDC
+ CollateralDepositRate = big.NewInt(150)
+ CollateralLiquidationRate = big.NewInt(110)
+ CollateralRecallRate = big.NewInt(200)
+ TradeFee = uint16(10) // trade fee decimals 10^4
+ LendingTradeFee = uint16(100) // lending trade fee decimals 10^4
+ // 1m , 1d,7d,30d
+ Terms = []*big.Int{big.NewInt(60), big.NewInt(86400), big.NewInt(7 * 86400), big.NewInt(30 * 86400)}
+ RelayerCoinbaseKey, _ = crypto.HexToECDSA(os.Getenv("RELAYER_COINBASE_KEY")) //
+ RelayerCoinbaseAddr = crypto.PubkeyToAddress(RelayerCoinbaseKey.PublicKey) // 0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e
+
+ OwnerRelayerKey, _ = crypto.HexToECDSA(os.Getenv("RELAYER_OWNER_KEY"))
+ OwnerRelayerAddr = crypto.PubkeyToAddress(OwnerRelayerKey.PublicKey) //0x703c4b2bD70c169f5717101CaeE543299Fc946C7
+
+ XDCNative = common.HexToAddress("0x0000000000000000000000000000000000000001")
+
+ TokenNameList = []string{"BTC", "ETH", "XRP", "LTC", "BNB", "ADA", "ETC", "BCH", "EOS", "USDT"}
+ TeamAddresses = []common.Address{
+ common.HexToAddress("0x8fB1047e874d2e472cd08980FF8383053dd83102"), // MM team
+ common.HexToAddress("0x9ca1514E3Dc4059C29a1608AE3a3E3fd35900888"), // MM team
+ common.HexToAddress("0x15e08dE16f534c890828F2a0D935433aF5B3CE0C"), // CTO
+ common.HexToAddress("0xb68D825655F2fE14C32558cDf950b45beF18D218"), // DEX team
+ common.HexToAddress("0xF7349C253FF7747Df661296E0859c44e974fb52E"), // HaiDV
+ common.HexToAddress("0x9f6b8fDD3733B099A91B6D70CDC7963ebBbd2684"), // Can
+ common.HexToAddress("0x06605B28aab9835be75ca242a8aE58f2e15F2F45"), // Nien
+ common.HexToAddress("0x33c2E732ae7dce8B05F37B2ba0CFe14c980c4Dbe"), // Vu Pham
+ common.HexToAddress("0x16a73f3a64eca79e117258e66dfd7071cc8312a9"), // BTCXDC
+ common.HexToAddress("0xac177441ac2237b2f79ecff1b8f6bca39e27ef9f"), // ETHXDC
+ common.HexToAddress("0x4215250e55984c75bbce8ae639b86a6cad8ec126"), // XRPXDC
+ common.HexToAddress("0x6b70ca959814866dd5c426d63d47dde9cc6c32d2"), // LTCXDC
+ common.HexToAddress("0x33df079fe9b9cd7fb23a1085e4eaaa8eb6952cb3"), // BNBXDC
+ common.HexToAddress("0x3cab8292137804688714670640d19f9d7a60c472"), // ADAXDC
+ common.HexToAddress("0x9415d953d47c5f155cac9de7b24a756f352eafbf"), // ETCXDC
+ common.HexToAddress("0xe32d2e7c8e8809e45c8e2332830b48d9e231e3f2"), // BCHXDC
+ common.HexToAddress("0xf76ddbda664ea47088937e1cf9ff15036714dee3"), // EOSXDC
+ common.HexToAddress("0xc465ee82440dada9509feb235c7cd7d896acf13c"), // ETHBTC
+ common.HexToAddress("0xb95bdc136c579dc3fd2b2424a8e925a90228d2c2"), // XRPBTC
+ common.HexToAddress("0xe36c1842365595D44854eEcd64B11c8115E133EF"), // USDXDC
+ common.HexToAddress("0xaaC1959F6F0fb539F653409079Ec4146267B7555"), // BTCUSD
+ common.HexToAddress("0x726DA688e2e09f01A2e1aB4c10F25B7CEdD4a0f3"), // ETHUSD
+ common.HexToAddress("0xc70f010E8DB8bc436712A93D170C7c27Db1981Ea"), // rosetta-cli testing account
+ }
+
+ Required = big.NewInt(2)
+ Owners = []common.Address{
+ common.HexToAddress("0x244e17B2141288a6F00E79E8feC2341f827d156f"),
+ common.HexToAddress("0xd106159eC58BD2EAf5B62eF4e9cDb286170B0Bb9"),
+ common.HexToAddress("0x0197BE034Bf0Bd2b3adDC84366a5681Bb7545888"),
+ }
+)
diff --git a/contracts/XDCx/testnet/constants.go b/contracts/XDCx/testnet/constants.go
new file mode 100644
index 0000000000..2e1779f934
--- /dev/null
+++ b/contracts/XDCx/testnet/constants.go
@@ -0,0 +1,68 @@
+package testnet
+
+import (
+ "math/big"
+ "os"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
+)
+
+var (
+ BaseXDC = big.NewInt(0).Mul(big.NewInt(10), big.NewInt(100000000000000000)) // 1 XDC
+ RpcEndpoint = "http://127.0.0.1:8545/"
+ MainKey, _ = crypto.HexToECDSA(os.Getenv("MAIN_ADDRESS_KEY"))
+ MainAddr = crypto.PubkeyToAddress(MainKey.PublicKey) //0x17F2beD710ba50Ed27aEa52fc4bD7Bda5ED4a037
+
+ // TRC21 Token
+ MinTRC21Apply = big.NewInt(0).Mul(big.NewInt(10), BaseXDC) // 10 XDC
+ TRC21TokenCap = big.NewInt(0).Mul(big.NewInt(1000000000000), BaseXDC)
+ TRC21TokenFee = big.NewInt(0)
+ XDCXListingFee = big.NewInt(0).Mul(big.NewInt(1000), BaseXDC) // 1000 XDC
+
+ // XDCX
+ MaxRelayers = big.NewInt(200)
+ MaxTokenList = big.NewInt(200)
+ MinDeposit = big.NewInt(0).Mul(big.NewInt(25000), BaseXDC) // 25000 XDC
+ CollateralDepositRate = big.NewInt(150)
+ CollateralLiquidationRate = big.NewInt(110)
+ CollateralRecallRate = big.NewInt(200)
+ TradeFee = uint16(10) // trade fee decimals 10^4
+ LendingTradeFee = uint16(100) // lending trade fee decimals 10^4
+ // 1m , 1d,7d,30d
+ Terms = []*big.Int{big.NewInt(60), big.NewInt(86400), big.NewInt(7 * 86400), big.NewInt(30 * 86400)}
+ RelayerCoinbaseKey, _ = crypto.HexToECDSA(os.Getenv("RELAYER_COINBASE_KEY")) //
+ RelayerCoinbaseAddr = crypto.PubkeyToAddress(RelayerCoinbaseKey.PublicKey) // 0x0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e
+
+ OwnerRelayerKey, _ = crypto.HexToECDSA(os.Getenv("RELAYER_OWNER_KEY"))
+ OwnerRelayerAddr = crypto.PubkeyToAddress(OwnerRelayerKey.PublicKey) //0x703c4b2bD70c169f5717101CaeE543299Fc946C7
+
+ XDCNative = common.HexToAddress("0x0000000000000000000000000000000000000001")
+
+ TokenNameList = []string{"BTC", "ETH", "XRP", "LTC", "BNB", "ADA", "ETC", "BCH", "EOS", "USDT"}
+ TeamAddresses = []common.Address{
+ common.HexToAddress("0xE3584D2D430eF34FF9fEeCBEBE6E0f6980082F05"), // Test1
+ common.HexToAddress("0x16a73f3a64eca79e117258e66dfd7071cc8312a9"), // BTCXDC
+ common.HexToAddress("0xac177441ac2237b2f79ecff1b8f6bca39e27ef9f"), // ETHXDC
+ common.HexToAddress("0x4215250e55984c75bbce8ae639b86a6cad8ec126"), // XRPXDC
+ common.HexToAddress("0x6b70ca959814866dd5c426d63d47dde9cc6c32d2"), // LTCXDC
+ common.HexToAddress("0x33df079fe9b9cd7fb23a1085e4eaaa8eb6952cb3"), // BNBXDC
+ common.HexToAddress("0x3cab8292137804688714670640d19f9d7a60c472"), // ADAXDC
+ common.HexToAddress("0x9415d953d47c5f155cac9de7b24a756f352eafbf"), // ETCXDC
+ common.HexToAddress("0xe32d2e7c8e8809e45c8e2332830b48d9e231e3f2"), // BCHXDC
+ common.HexToAddress("0xf76ddbda664ea47088937e1cf9ff15036714dee3"), // EOSXDC
+ common.HexToAddress("0xc465ee82440dada9509feb235c7cd7d896acf13c"), // ETHBTC
+ common.HexToAddress("0xb95bdc136c579dc3fd2b2424a8e925a90228d2c2"), // XRPBTC
+ common.HexToAddress("0xe36c1842365595D44854eEcd64B11c8115E133EF"), // XDCUSDT
+ common.HexToAddress("0xaaC1959F6F0fb539F653409079Ec4146267B7555"), // BTCUSDT
+ common.HexToAddress("0x726DA688e2e09f01A2e1aB4c10F25B7CEdD4a0f3"), // ETHUSDT
+
+ }
+
+ Required = big.NewInt(2)
+ Owners = []common.Address{
+ common.HexToAddress("0x244e17B2141288a6F00E79E8feC2341f827d156f"),
+ common.HexToAddress("0xd106159eC58BD2EAf5B62eF4e9cDb286170B0Bb9"),
+ common.HexToAddress("0x0197BE034Bf0Bd2b3adDC84366a5681Bb7545888"),
+ }
+)
diff --git a/contracts/XDCx/trc21.go b/contracts/XDCx/trc21.go
new file mode 100644
index 0000000000..341d60e4f7
--- /dev/null
+++ b/contracts/XDCx/trc21.go
@@ -0,0 +1,41 @@
+package XDCx
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/XDCx/contract"
+ "math/big"
+)
+
+type MyTRC21 struct {
+ *contract.MyTRC21Session
+ contractBackend bind.ContractBackend
+}
+
+func NewTRC21(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*MyTRC21, error) {
+ smartContract, err := contract.NewMyTRC21(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &MyTRC21{
+ &contract.MyTRC21Session{
+ Contract: smartContract,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployTRC21(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, owners []common.Address, required *big.Int, name string, symbol string, decimals uint8, cap, fee, depositFee, withdrawFee *big.Int) (common.Address, *MyTRC21, error) {
+ contractAddr, _, _, err := contract.DeployMyTRC21(transactOpts, contractBackend, owners, required, name, symbol, decimals, cap, fee, depositFee, withdrawFee)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ smartContract, err := NewTRC21(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, smartContract, nil
+}
diff --git a/contracts/XDCx/trc21Issuer.go b/contracts/XDCx/trc21Issuer.go
new file mode 100644
index 0000000000..2ef1dba8d3
--- /dev/null
+++ b/contracts/XDCx/trc21Issuer.go
@@ -0,0 +1,41 @@
+package XDCx
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/XDCx/contract"
+ "math/big"
+)
+
+type TRC21Issuer struct {
+ *contract.TRC21IssuerSession
+ contractBackend bind.ContractBackend
+}
+
+func NewTRC21Issuer(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*TRC21Issuer, error) {
+ contractObject, err := contract.NewTRC21Issuer(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &TRC21Issuer{
+ &contract.TRC21IssuerSession{
+ Contract: contractObject,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployTRC21Issuer(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, minApply *big.Int) (common.Address, *TRC21Issuer, error) {
+ contractAddr, _, _, err := contract.DeployTRC21Issuer(transactOpts, contractBackend, minApply)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ contractObject, err := NewTRC21Issuer(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, contractObject, nil
+}
diff --git a/contracts/blocksigner/blocksigner.go b/contracts/blocksigner/blocksigner.go
index 998a22c5c8..e3f424fdae 100644
--- a/contracts/blocksigner/blocksigner.go
+++ b/contracts/blocksigner/blocksigner.go
@@ -1,5 +1,4 @@
// Copyright (c) 2018 XDPoSChain
-// Copyright 2024 The go-ethereum Authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
@@ -14,77 +13,45 @@
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see .
-// Package blocksigner provides the XDC Network block signer contract interface.
-// The block signer contract is deployed at address 0x0000000000000000000000000000000000000089
-// and records block signatures for reward distribution.
package blocksigner
import (
- "math/big"
-
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/blocksigner/contract"
+ "math/big"
)
-// ContractAddress is the block signer contract address on XDC Network
-var ContractAddress = common.HexToAddress("0x0000000000000000000000000000000000000089")
-
-// BlockSignerInfo contains information about a block signature
-type BlockSignerInfo struct {
- BlockNumber *big.Int
- BlockHash common.Hash
- Signer common.Address
+type BlockSigner struct {
+ *contract.BlockSignerSession
+ contractBackend bind.ContractBackend
}
-// SignMethodID is the method ID for sign(uint256,bytes32) function
-// keccak256("sign(uint256,bytes32)")[:4]
-var SignMethodID = []byte{0x44, 0x00, 0x8f, 0x05}
-
-// GetSignersMethodID is the method ID for getSigners(uint256) function
-// keccak256("getSigners(uint256)")[:4]
-var GetSignersMethodID = []byte{0xe7, 0xec, 0x6a, 0xef}
-
-// EncodeSign encodes the sign(uint256,bytes32) call
-func EncodeSign(blockNumber *big.Int, blockHash common.Hash) []byte {
- data := make([]byte, 4+64)
- copy(data[:4], SignMethodID)
-
- // Encode block number (uint256)
- blockNumBytes := blockNumber.Bytes()
- copy(data[4+32-len(blockNumBytes):4+32], blockNumBytes)
-
- // Encode block hash (bytes32)
- copy(data[4+32:], blockHash.Bytes())
-
- return data
-}
-
-// EncodeGetSigners encodes the getSigners(uint256) call
-func EncodeGetSigners(blockNumber *big.Int) []byte {
- data := make([]byte, 4+32)
- copy(data[:4], GetSignersMethodID)
-
- // Encode block number (uint256)
- blockNumBytes := blockNumber.Bytes()
- copy(data[4+32-len(blockNumBytes):4+32], blockNumBytes)
-
- return data
-}
-
-// DecodeSigners decodes a list of signer addresses from contract return data
-func DecodeSigners(data []byte) ([]common.Address, error) {
- if len(data) < 64 {
- return nil, nil
+func NewBlockSigner(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*BlockSigner, error) {
+ blockSigner, err := contract.NewBlockSigner(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
}
- // Skip offset (32 bytes) and get length
- length := new(big.Int).SetBytes(data[32:64]).Uint64()
- signers := make([]common.Address, 0, length)
-
- offset := 64
- for i := uint64(0); i < length && offset+32 <= len(data); i++ {
- var addr common.Address
- copy(addr[:], data[offset+12:offset+32])
- signers = append(signers, addr)
- offset += 32
- }
- return signers, nil
+
+ return &BlockSigner{
+ &contract.BlockSignerSession{
+ Contract: blockSigner,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployBlockSigner(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, epochNumber *big.Int) (common.Address, *BlockSigner, error) {
+ blockSignerAddr, _, _, err := contract.DeployBlockSigner(transactOpts, contractBackend, epochNumber)
+ if err != nil {
+ return blockSignerAddr, nil, err
+ }
+
+ blockSigner, err := NewBlockSigner(transactOpts, blockSignerAddr, contractBackend)
+ if err != nil {
+ return blockSignerAddr, nil, err
+ }
+
+ return blockSignerAddr, blockSigner, nil
}
diff --git a/contracts/blocksigner/contract/blocksigner.go b/contracts/blocksigner/contract/blocksigner.go
new file mode 100644
index 0000000000..9426df2ffc
--- /dev/null
+++ b/contracts/blocksigner/contract/blocksigner.go
@@ -0,0 +1,539 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// BlockSignerABI is the input ABI used to generate the binding from.
+const BlockSignerABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_blockHash\",\"type\":\"bytes32\"}],\"name\":\"sign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockHash\",\"type\":\"bytes32\"}],\"name\":\"getSigners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"epochNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_epochNumber\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_signer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_blockHash\",\"type\":\"bytes32\"}],\"name\":\"Sign\",\"type\":\"event\"}]"
+
+// BlockSignerBin is the compiled bytecode used for deploying new contracts.
+const BlockSignerBin = `0x6060604052341561000f57600080fd5b604051602080610386833981016040528080516002555050610350806100366000396000f3006060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e341eaa4811461005b578063e7ec6aef14610076578063f4145a83146100df575b600080fd5b341561006657600080fd5b610074600435602435610104565b005b341561008157600080fd5b61008c600435610227565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100cb5780820151838201526020016100b3565b505050509050019250505060405180910390f35b34156100ea57600080fd5b6100f26102ac565b60405190815260200160405180910390f35b438290101561011257600080fd5b600280546101289184910263ffffffff6102b216565b43111561013457600080fd5b600082815260016020819052604090912080549091810161015583826102c8565b5060009182526020808320919091018390558282528190526040902080546001810161018183826102c8565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19163373ffffffffffffffffffffffffffffffffffffffff8116919091179091557f62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f5490838360405173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091526040808301919091526060909101905180910390a15050565b61022f6102f1565b600082815260208181526040918290208054909290918281020190519081016040528092919081815260200182805480156102a057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610275575b50505050509050919050565b60025481565b6000828201838110156102c157fe5b9392505050565b8154818355818115116102ec576000838152602090206102ec918101908301610303565b505050565b60206040519081016040526000815290565b61032191905b8082111561031d5760008155600101610309565b5090565b905600a165627a7a72305820a8ceddaea8e4ae00991e2ae81c8c88e160dd8770f255523282c24c2df4c30ec70029`
+
+// DeployBlockSigner deploys a new Ethereum contract, binding an instance of BlockSigner to it.
+func DeployBlockSigner(auth *bind.TransactOpts, backend bind.ContractBackend, _epochNumber *big.Int) (common.Address, *types.Transaction, *BlockSigner, error) {
+ parsed, err := abi.JSON(strings.NewReader(BlockSignerABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(BlockSignerBin), backend, _epochNumber)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &BlockSigner{BlockSignerCaller: BlockSignerCaller{contract: contract}, BlockSignerTransactor: BlockSignerTransactor{contract: contract}, BlockSignerFilterer: BlockSignerFilterer{contract: contract}}, nil
+}
+
+// BlockSigner is an auto generated Go binding around an Ethereum contract.
+type BlockSigner struct {
+ BlockSignerCaller // Read-only binding to the contract
+ BlockSignerTransactor // Write-only binding to the contract
+ BlockSignerFilterer // Log filterer for contract events
+}
+
+// BlockSignerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type BlockSignerCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BlockSignerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type BlockSignerTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BlockSignerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type BlockSignerFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// BlockSignerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type BlockSignerSession struct {
+ Contract *BlockSigner // 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
+}
+
+// BlockSignerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type BlockSignerCallerSession struct {
+ Contract *BlockSignerCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// BlockSignerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type BlockSignerTransactorSession struct {
+ Contract *BlockSignerTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// BlockSignerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type BlockSignerRaw struct {
+ Contract *BlockSigner // Generic contract binding to access the raw methods on
+}
+
+// BlockSignerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type BlockSignerCallerRaw struct {
+ Contract *BlockSignerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// BlockSignerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type BlockSignerTransactorRaw struct {
+ Contract *BlockSignerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewBlockSigner creates a new instance of BlockSigner, bound to a specific deployed contract.
+func NewBlockSigner(address common.Address, backend bind.ContractBackend) (*BlockSigner, error) {
+ contract, err := bindBlockSigner(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &BlockSigner{BlockSignerCaller: BlockSignerCaller{contract: contract}, BlockSignerTransactor: BlockSignerTransactor{contract: contract}, BlockSignerFilterer: BlockSignerFilterer{contract: contract}}, nil
+}
+
+// NewBlockSignerCaller creates a new read-only instance of BlockSigner, bound to a specific deployed contract.
+func NewBlockSignerCaller(address common.Address, caller bind.ContractCaller) (*BlockSignerCaller, error) {
+ contract, err := bindBlockSigner(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BlockSignerCaller{contract: contract}, nil
+}
+
+// NewBlockSignerTransactor creates a new write-only instance of BlockSigner, bound to a specific deployed contract.
+func NewBlockSignerTransactor(address common.Address, transactor bind.ContractTransactor) (*BlockSignerTransactor, error) {
+ contract, err := bindBlockSigner(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &BlockSignerTransactor{contract: contract}, nil
+}
+
+// NewBlockSignerFilterer creates a new log filterer instance of BlockSigner, bound to a specific deployed contract.
+func NewBlockSignerFilterer(address common.Address, filterer bind.ContractFilterer) (*BlockSignerFilterer, error) {
+ contract, err := bindBlockSigner(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &BlockSignerFilterer{contract: contract}, nil
+}
+
+// bindBlockSigner binds a generic wrapper to an already deployed contract.
+func bindBlockSigner(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(BlockSignerABI))
+ 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 (_BlockSigner *BlockSignerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BlockSigner.Contract.BlockSignerCaller.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 (_BlockSigner *BlockSignerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BlockSigner.Contract.BlockSignerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_BlockSigner *BlockSignerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BlockSigner.Contract.BlockSignerTransactor.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 (_BlockSigner *BlockSignerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _BlockSigner.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 (_BlockSigner *BlockSignerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _BlockSigner.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_BlockSigner *BlockSignerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _BlockSigner.Contract.contract.Transact(opts, method, params...)
+}
+
+// EpochNumber is a free data retrieval call binding the contract method 0xf4145a83.
+//
+// Solidity: function epochNumber() constant returns(uint256)
+func (_BlockSigner *BlockSignerCaller) EpochNumber(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _BlockSigner.contract.Call(opts, out, "epochNumber")
+ return *ret0, err
+}
+
+// EpochNumber is a free data retrieval call binding the contract method 0xf4145a83.
+//
+// Solidity: function epochNumber() constant returns(uint256)
+func (_BlockSigner *BlockSignerSession) EpochNumber() (*big.Int, error) {
+ return _BlockSigner.Contract.EpochNumber(&_BlockSigner.CallOpts)
+}
+
+// EpochNumber is a free data retrieval call binding the contract method 0xf4145a83.
+//
+// Solidity: function epochNumber() constant returns(uint256)
+func (_BlockSigner *BlockSignerCallerSession) EpochNumber() (*big.Int, error) {
+ return _BlockSigner.Contract.EpochNumber(&_BlockSigner.CallOpts)
+}
+
+// GetSigners is a free data retrieval call binding the contract method 0xe7ec6aef.
+//
+// Solidity: function getSigners(_blockHash bytes32) constant returns(address[])
+func (_BlockSigner *BlockSignerCaller) GetSigners(opts *bind.CallOpts, _blockHash [32]byte) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _BlockSigner.contract.Call(opts, out, "getSigners", _blockHash)
+ return *ret0, err
+}
+
+// GetSigners is a free data retrieval call binding the contract method 0xe7ec6aef.
+//
+// Solidity: function getSigners(_blockHash bytes32) constant returns(address[])
+func (_BlockSigner *BlockSignerSession) GetSigners(_blockHash [32]byte) ([]common.Address, error) {
+ return _BlockSigner.Contract.GetSigners(&_BlockSigner.CallOpts, _blockHash)
+}
+
+// GetSigners is a free data retrieval call binding the contract method 0xe7ec6aef.
+//
+// Solidity: function getSigners(_blockHash bytes32) constant returns(address[])
+func (_BlockSigner *BlockSignerCallerSession) GetSigners(_blockHash [32]byte) ([]common.Address, error) {
+ return _BlockSigner.Contract.GetSigners(&_BlockSigner.CallOpts, _blockHash)
+}
+
+// Sign is a paid mutator transaction binding the contract method 0xe341eaa4.
+//
+// Solidity: function sign(_blockNumber uint256, _blockHash bytes32) returns()
+func (_BlockSigner *BlockSignerTransactor) Sign(opts *bind.TransactOpts, _blockNumber *big.Int, _blockHash [32]byte) (*types.Transaction, error) {
+ return _BlockSigner.contract.Transact(opts, "sign", _blockNumber, _blockHash)
+}
+
+// Sign is a paid mutator transaction binding the contract method 0xe341eaa4.
+//
+// Solidity: function sign(_blockNumber uint256, _blockHash bytes32) returns()
+func (_BlockSigner *BlockSignerSession) Sign(_blockNumber *big.Int, _blockHash [32]byte) (*types.Transaction, error) {
+ return _BlockSigner.Contract.Sign(&_BlockSigner.TransactOpts, _blockNumber, _blockHash)
+}
+
+// Sign is a paid mutator transaction binding the contract method 0xe341eaa4.
+//
+// Solidity: function sign(_blockNumber uint256, _blockHash bytes32) returns()
+func (_BlockSigner *BlockSignerTransactorSession) Sign(_blockNumber *big.Int, _blockHash [32]byte) (*types.Transaction, error) {
+ return _BlockSigner.Contract.Sign(&_BlockSigner.TransactOpts, _blockNumber, _blockHash)
+}
+
+// BlockSignerSignIterator is returned from FilterSign and is used to iterate over the raw logs and unpacked data for Sign events raised by the BlockSigner contract.
+type BlockSignerSignIterator struct {
+ Event *BlockSignerSign // 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 *BlockSignerSignIterator) 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(BlockSignerSign)
+ 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(BlockSignerSign)
+ 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 *BlockSignerSignIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *BlockSignerSignIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// BlockSignerSign represents a Sign event raised by the BlockSigner contract.
+type BlockSignerSign struct {
+ Signer common.Address
+ BlockNumber *big.Int
+ BlockHash [32]byte
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSign is a free log retrieval operation binding the contract event 0x62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f54.
+//
+// Solidity: event Sign(_signer address, _blockNumber uint256, _blockHash bytes32)
+func (_BlockSigner *BlockSignerFilterer) FilterSign(opts *bind.FilterOpts) (*BlockSignerSignIterator, error) {
+
+ logs, sub, err := _BlockSigner.contract.FilterLogs(opts, "Sign")
+ if err != nil {
+ return nil, err
+ }
+ return &BlockSignerSignIterator{contract: _BlockSigner.contract, event: "Sign", logs: logs, sub: sub}, nil
+}
+
+// WatchSign is a free log subscription operation binding the contract event 0x62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f54.
+//
+// Solidity: event Sign(_signer address, _blockNumber uint256, _blockHash bytes32)
+func (_BlockSigner *BlockSignerFilterer) WatchSign(opts *bind.WatchOpts, sink chan<- *BlockSignerSign) (event.Subscription, error) {
+
+ logs, sub, err := _BlockSigner.contract.WatchLogs(opts, "Sign")
+ 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(BlockSignerSign)
+ if err := _BlockSigner.contract.UnpackLog(event, "Sign", 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
+}
+
+// SafeMathABI is the input ABI used to generate the binding from.
+const SafeMathABI = "[]"
+
+// SafeMathBin is the compiled bytecode used for deploying new contracts.
+const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029`
+
+// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it.
+func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// SafeMath is an auto generated Go binding around an Ethereum contract.
+type SafeMath struct {
+ SafeMathCaller // Read-only binding to the contract
+ SafeMathTransactor // Write-only binding to the contract
+ SafeMathFilterer // Log filterer for contract events
+}
+
+// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SafeMathCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SafeMathTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SafeMathFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SafeMathSession struct {
+ Contract *SafeMath // 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
+}
+
+// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SafeMathCallerSession struct {
+ Contract *SafeMathCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SafeMathTransactorSession struct {
+ Contract *SafeMathTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SafeMathRaw struct {
+ Contract *SafeMath // Generic contract binding to access the raw methods on
+}
+
+// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SafeMathCallerRaw struct {
+ Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SafeMathTransactorRaw struct {
+ Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) {
+ contract, err := bindSafeMath(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) {
+ contract, err := bindSafeMath(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathCaller{contract: contract}, nil
+}
+
+// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) {
+ contract, err := bindSafeMath(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathTransactor{contract: contract}, nil
+}
+
+// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) {
+ contract, err := bindSafeMath(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathFilterer{contract: contract}, nil
+}
+
+// bindSafeMath binds a generic wrapper to an already deployed contract.
+func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ 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 (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.Contract.SafeMathCaller.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 (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.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 (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.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 (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transact(opts, method, params...)
+}
diff --git a/contracts/multisigwallet/contract/multisigwallet.go b/contracts/multisigwallet/contract/multisigwallet.go
new file mode 100644
index 0000000000..f03cda712d
--- /dev/null
+++ b/contracts/multisigwallet/contract/multisigwallet.go
@@ -0,0 +1,1924 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// MultiSigWalletABI is the input ABI used to generate the binding from.
+const MultiSigWalletABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}]"
+
+// MultiSigWalletBin is the compiled bytecode used for deploying new contracts.
+const MultiSigWalletBin = `0x606060405234156200001057600080fd5b6040516200174f3803806200174f83398101604052808051820191906020018051915060009050825182603282111580156200004c5750818111155b80156200005857508015155b80156200006457508115155b15156200007057600080fd5b600092505b84518310156200014157600260008685815181106200009057fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205460ff16158015620000e35750848381518110620000cd57fe5b90602001906020020151600160a060020a031615155b1515620000ef57600080fd5b6001600260008786815181106200010257fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790556001929092019162000075565b60038580516200015692916020019062000168565b50505060049190915550620001fe9050565b828054828255906000526020600020908101928215620001c2579160200282015b82811115620001c25782518254600160a060020a031916600160a060020a03919091161782556020929092019160019091019062000189565b50620001d0929150620001d4565b5090565b620001fb91905b80821115620001d0578054600160a060020a0319168155600101620001db565b90565b611541806200020e6000396000f30060606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029`
+
+// DeployMultiSigWallet deploys a new Ethereum contract, binding an instance of MultiSigWallet to it.
+func DeployMultiSigWallet(auth *bind.TransactOpts, backend bind.ContractBackend, _owners []common.Address, _required *big.Int) (common.Address, *types.Transaction, *MultiSigWallet, error) {
+ parsed, err := abi.JSON(strings.NewReader(MultiSigWalletABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(MultiSigWalletBin), backend, _owners, _required)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &MultiSigWallet{MultiSigWalletCaller: MultiSigWalletCaller{contract: contract}, MultiSigWalletTransactor: MultiSigWalletTransactor{contract: contract}, MultiSigWalletFilterer: MultiSigWalletFilterer{contract: contract}}, nil
+}
+
+// MultiSigWallet is an auto generated Go binding around an Ethereum contract.
+type MultiSigWallet struct {
+ MultiSigWalletCaller // Read-only binding to the contract
+ MultiSigWalletTransactor // Write-only binding to the contract
+ MultiSigWalletFilterer // Log filterer for contract events
+}
+
+// MultiSigWalletCaller is an auto generated read-only Go binding around an Ethereum contract.
+type MultiSigWalletCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MultiSigWalletTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type MultiSigWalletTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MultiSigWalletFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type MultiSigWalletFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MultiSigWalletSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type MultiSigWalletSession struct {
+ Contract *MultiSigWallet // 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
+}
+
+// MultiSigWalletCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type MultiSigWalletCallerSession struct {
+ Contract *MultiSigWalletCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// MultiSigWalletTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type MultiSigWalletTransactorSession struct {
+ Contract *MultiSigWalletTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// MultiSigWalletRaw is an auto generated low-level Go binding around an Ethereum contract.
+type MultiSigWalletRaw struct {
+ Contract *MultiSigWallet // Generic contract binding to access the raw methods on
+}
+
+// MultiSigWalletCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type MultiSigWalletCallerRaw struct {
+ Contract *MultiSigWalletCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// MultiSigWalletTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type MultiSigWalletTransactorRaw struct {
+ Contract *MultiSigWalletTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewMultiSigWallet creates a new instance of MultiSigWallet, bound to a specific deployed contract.
+func NewMultiSigWallet(address common.Address, backend bind.ContractBackend) (*MultiSigWallet, error) {
+ contract, err := bindMultiSigWallet(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWallet{MultiSigWalletCaller: MultiSigWalletCaller{contract: contract}, MultiSigWalletTransactor: MultiSigWalletTransactor{contract: contract}, MultiSigWalletFilterer: MultiSigWalletFilterer{contract: contract}}, nil
+}
+
+// NewMultiSigWalletCaller creates a new read-only instance of MultiSigWallet, bound to a specific deployed contract.
+func NewMultiSigWalletCaller(address common.Address, caller bind.ContractCaller) (*MultiSigWalletCaller, error) {
+ contract, err := bindMultiSigWallet(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletCaller{contract: contract}, nil
+}
+
+// NewMultiSigWalletTransactor creates a new write-only instance of MultiSigWallet, bound to a specific deployed contract.
+func NewMultiSigWalletTransactor(address common.Address, transactor bind.ContractTransactor) (*MultiSigWalletTransactor, error) {
+ contract, err := bindMultiSigWallet(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletTransactor{contract: contract}, nil
+}
+
+// NewMultiSigWalletFilterer creates a new log filterer instance of MultiSigWallet, bound to a specific deployed contract.
+func NewMultiSigWalletFilterer(address common.Address, filterer bind.ContractFilterer) (*MultiSigWalletFilterer, error) {
+ contract, err := bindMultiSigWallet(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletFilterer{contract: contract}, nil
+}
+
+// bindMultiSigWallet binds a generic wrapper to an already deployed contract.
+func bindMultiSigWallet(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(MultiSigWalletABI))
+ 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 (_MultiSigWallet *MultiSigWalletRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MultiSigWallet.Contract.MultiSigWalletCaller.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 (_MultiSigWallet *MultiSigWalletRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.MultiSigWalletTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MultiSigWallet *MultiSigWalletRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.MultiSigWalletTransactor.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 (_MultiSigWallet *MultiSigWalletCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MultiSigWallet.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 (_MultiSigWallet *MultiSigWalletTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MultiSigWallet *MultiSigWalletTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.contract.Transact(opts, method, params...)
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCaller) MAXOWNERCOUNT(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "MAX_OWNER_COUNT")
+ return *ret0, err
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletSession) MAXOWNERCOUNT() (*big.Int, error) {
+ return _MultiSigWallet.Contract.MAXOWNERCOUNT(&_MultiSigWallet.CallOpts)
+}
+
+// MAXOWNERCOUNT is a free data retrieval call binding the contract method 0xd74f8edd.
+//
+// Solidity: function MAX_OWNER_COUNT() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCallerSession) MAXOWNERCOUNT() (*big.Int, error) {
+ return _MultiSigWallet.Contract.MAXOWNERCOUNT(&_MultiSigWallet.CallOpts)
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCaller) Confirmations(opts *bind.CallOpts, arg0 *big.Int, arg1 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "confirmations", arg0, arg1)
+ return *ret0, err
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletSession) Confirmations(arg0 *big.Int, arg1 common.Address) (bool, error) {
+ return _MultiSigWallet.Contract.Confirmations(&_MultiSigWallet.CallOpts, arg0, arg1)
+}
+
+// Confirmations is a free data retrieval call binding the contract method 0x3411c81c.
+//
+// Solidity: function confirmations( uint256, address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCallerSession) Confirmations(arg0 *big.Int, arg1 common.Address) (bool, error) {
+ return _MultiSigWallet.Contract.Confirmations(&_MultiSigWallet.CallOpts, arg0, arg1)
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletCaller) GetConfirmationCount(opts *bind.CallOpts, transactionId *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "getConfirmationCount", transactionId)
+ return *ret0, err
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletSession) GetConfirmationCount(transactionId *big.Int) (*big.Int, error) {
+ return _MultiSigWallet.Contract.GetConfirmationCount(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// GetConfirmationCount is a free data retrieval call binding the contract method 0x8b51d13f.
+//
+// Solidity: function getConfirmationCount(transactionId uint256) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletCallerSession) GetConfirmationCount(transactionId *big.Int) (*big.Int, error) {
+ return _MultiSigWallet.Contract.GetConfirmationCount(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MultiSigWallet *MultiSigWalletCaller) GetConfirmations(opts *bind.CallOpts, transactionId *big.Int) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "getConfirmations", transactionId)
+ return *ret0, err
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MultiSigWallet *MultiSigWalletSession) GetConfirmations(transactionId *big.Int) ([]common.Address, error) {
+ return _MultiSigWallet.Contract.GetConfirmations(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// GetConfirmations is a free data retrieval call binding the contract method 0xb5dc40c3.
+//
+// Solidity: function getConfirmations(transactionId uint256) constant returns(_confirmations address[])
+func (_MultiSigWallet *MultiSigWalletCallerSession) GetConfirmations(transactionId *big.Int) ([]common.Address, error) {
+ return _MultiSigWallet.Contract.GetConfirmations(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MultiSigWallet *MultiSigWalletCaller) GetOwners(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "getOwners")
+ return *ret0, err
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MultiSigWallet *MultiSigWalletSession) GetOwners() ([]common.Address, error) {
+ return _MultiSigWallet.Contract.GetOwners(&_MultiSigWallet.CallOpts)
+}
+
+// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b.
+//
+// Solidity: function getOwners() constant returns(address[])
+func (_MultiSigWallet *MultiSigWalletCallerSession) GetOwners() ([]common.Address, error) {
+ return _MultiSigWallet.Contract.GetOwners(&_MultiSigWallet.CallOpts)
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletCaller) GetTransactionCount(opts *bind.CallOpts, pending bool, executed bool) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "getTransactionCount", pending, executed)
+ return *ret0, err
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletSession) GetTransactionCount(pending bool, executed bool) (*big.Int, error) {
+ return _MultiSigWallet.Contract.GetTransactionCount(&_MultiSigWallet.CallOpts, pending, executed)
+}
+
+// GetTransactionCount is a free data retrieval call binding the contract method 0x54741525.
+//
+// Solidity: function getTransactionCount(pending bool, executed bool) constant returns(count uint256)
+func (_MultiSigWallet *MultiSigWalletCallerSession) GetTransactionCount(pending bool, executed bool) (*big.Int, error) {
+ return _MultiSigWallet.Contract.GetTransactionCount(&_MultiSigWallet.CallOpts, pending, executed)
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MultiSigWallet *MultiSigWalletCaller) GetTransactionIds(opts *bind.CallOpts, from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ var (
+ ret0 = new([]*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "getTransactionIds", from, to, pending, executed)
+ return *ret0, err
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MultiSigWallet *MultiSigWalletSession) GetTransactionIds(from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ return _MultiSigWallet.Contract.GetTransactionIds(&_MultiSigWallet.CallOpts, from, to, pending, executed)
+}
+
+// GetTransactionIds is a free data retrieval call binding the contract method 0xa8abe69a.
+//
+// Solidity: function getTransactionIds(from uint256, to uint256, pending bool, executed bool) constant returns(_transactionIds uint256[])
+func (_MultiSigWallet *MultiSigWalletCallerSession) GetTransactionIds(from *big.Int, to *big.Int, pending bool, executed bool) ([]*big.Int, error) {
+ return _MultiSigWallet.Contract.GetTransactionIds(&_MultiSigWallet.CallOpts, from, to, pending, executed)
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCaller) IsConfirmed(opts *bind.CallOpts, transactionId *big.Int) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "isConfirmed", transactionId)
+ return *ret0, err
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletSession) IsConfirmed(transactionId *big.Int) (bool, error) {
+ return _MultiSigWallet.Contract.IsConfirmed(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// IsConfirmed is a free data retrieval call binding the contract method 0x784547a7.
+//
+// Solidity: function isConfirmed(transactionId uint256) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCallerSession) IsConfirmed(transactionId *big.Int) (bool, error) {
+ return _MultiSigWallet.Contract.IsConfirmed(&_MultiSigWallet.CallOpts, transactionId)
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCaller) IsOwner(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "isOwner", arg0)
+ return *ret0, err
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletSession) IsOwner(arg0 common.Address) (bool, error) {
+ return _MultiSigWallet.Contract.IsOwner(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e.
+//
+// Solidity: function isOwner( address) constant returns(bool)
+func (_MultiSigWallet *MultiSigWalletCallerSession) IsOwner(arg0 common.Address) (bool, error) {
+ return _MultiSigWallet.Contract.IsOwner(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MultiSigWallet *MultiSigWalletCaller) Owners(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "owners", arg0)
+ return *ret0, err
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MultiSigWallet *MultiSigWalletSession) Owners(arg0 *big.Int) (common.Address, error) {
+ return _MultiSigWallet.Contract.Owners(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_MultiSigWallet *MultiSigWalletCallerSession) Owners(arg0 *big.Int) (common.Address, error) {
+ return _MultiSigWallet.Contract.Owners(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCaller) Required(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "required")
+ return *ret0, err
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletSession) Required() (*big.Int, error) {
+ return _MultiSigWallet.Contract.Required(&_MultiSigWallet.CallOpts)
+}
+
+// Required is a free data retrieval call binding the contract method 0xdc8452cd.
+//
+// Solidity: function required() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCallerSession) Required() (*big.Int, error) {
+ return _MultiSigWallet.Contract.Required(&_MultiSigWallet.CallOpts)
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCaller) TransactionCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "transactionCount")
+ return *ret0, err
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletSession) TransactionCount() (*big.Int, error) {
+ return _MultiSigWallet.Contract.TransactionCount(&_MultiSigWallet.CallOpts)
+}
+
+// TransactionCount is a free data retrieval call binding the contract method 0xb77bf600.
+//
+// Solidity: function transactionCount() constant returns(uint256)
+func (_MultiSigWallet *MultiSigWalletCallerSession) TransactionCount() (*big.Int, error) {
+ return _MultiSigWallet.Contract.TransactionCount(&_MultiSigWallet.CallOpts)
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MultiSigWallet *MultiSigWalletCaller) Transactions(opts *bind.CallOpts, arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ ret := new(struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+ })
+ out := &[]interface{}{
+ ret,
+ }
+ err := _MultiSigWallet.contract.Call(opts, out, "transactions", arg0)
+ return *ret, err
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MultiSigWallet *MultiSigWalletSession) Transactions(arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ return _MultiSigWallet.Contract.Transactions(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// Transactions is a free data retrieval call binding the contract method 0x9ace38c2.
+//
+// Solidity: function transactions( uint256) constant returns(destination address, value uint256, data bytes, executed bool)
+func (_MultiSigWallet *MultiSigWalletCallerSession) Transactions(arg0 *big.Int) (struct {
+ Destination common.Address
+ Value *big.Int
+ Data []byte
+ Executed bool
+}, error) {
+ return _MultiSigWallet.Contract.Transactions(&_MultiSigWallet.CallOpts, arg0)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) AddOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "addOwner", owner)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletSession) AddOwner(owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.AddOwner(&_MultiSigWallet.TransactOpts, owner)
+}
+
+// AddOwner is a paid mutator transaction binding the contract method 0x7065cb48.
+//
+// Solidity: function addOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) AddOwner(owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.AddOwner(&_MultiSigWallet.TransactOpts, owner)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) ChangeRequirement(opts *bind.TransactOpts, _required *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "changeRequirement", _required)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MultiSigWallet *MultiSigWalletSession) ChangeRequirement(_required *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ChangeRequirement(&_MultiSigWallet.TransactOpts, _required)
+}
+
+// ChangeRequirement is a paid mutator transaction binding the contract method 0xba51a6df.
+//
+// Solidity: function changeRequirement(_required uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) ChangeRequirement(_required *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ChangeRequirement(&_MultiSigWallet.TransactOpts, _required)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) ConfirmTransaction(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "confirmTransaction", transactionId)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletSession) ConfirmTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ConfirmTransaction(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// ConfirmTransaction is a paid mutator transaction binding the contract method 0xc01a8c84.
+//
+// Solidity: function confirmTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) ConfirmTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ConfirmTransaction(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) ExecuteTransaction(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "executeTransaction", transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletSession) ExecuteTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ExecuteTransaction(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// ExecuteTransaction is a paid mutator transaction binding the contract method 0xee22610b.
+//
+// Solidity: function executeTransaction(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) ExecuteTransaction(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ExecuteTransaction(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) RemoveOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "removeOwner", owner)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletSession) RemoveOwner(owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.RemoveOwner(&_MultiSigWallet.TransactOpts, owner)
+}
+
+// RemoveOwner is a paid mutator transaction binding the contract method 0x173825d9.
+//
+// Solidity: function removeOwner(owner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) RemoveOwner(owner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.RemoveOwner(&_MultiSigWallet.TransactOpts, owner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) ReplaceOwner(opts *bind.TransactOpts, owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "replaceOwner", owner, newOwner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MultiSigWallet *MultiSigWalletSession) ReplaceOwner(owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ReplaceOwner(&_MultiSigWallet.TransactOpts, owner, newOwner)
+}
+
+// ReplaceOwner is a paid mutator transaction binding the contract method 0xe20056e6.
+//
+// Solidity: function replaceOwner(owner address, newOwner address) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) ReplaceOwner(owner common.Address, newOwner common.Address) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.ReplaceOwner(&_MultiSigWallet.TransactOpts, owner, newOwner)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactor) RevokeConfirmation(opts *bind.TransactOpts, transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "revokeConfirmation", transactionId)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletSession) RevokeConfirmation(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.RevokeConfirmation(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// RevokeConfirmation is a paid mutator transaction binding the contract method 0x20ea8d86.
+//
+// Solidity: function revokeConfirmation(transactionId uint256) returns()
+func (_MultiSigWallet *MultiSigWalletTransactorSession) RevokeConfirmation(transactionId *big.Int) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.RevokeConfirmation(&_MultiSigWallet.TransactOpts, transactionId)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MultiSigWallet *MultiSigWalletTransactor) SubmitTransaction(opts *bind.TransactOpts, destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MultiSigWallet.contract.Transact(opts, "submitTransaction", destination, value, data)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MultiSigWallet *MultiSigWalletSession) SubmitTransaction(destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.SubmitTransaction(&_MultiSigWallet.TransactOpts, destination, value, data)
+}
+
+// SubmitTransaction is a paid mutator transaction binding the contract method 0xc6427474.
+//
+// Solidity: function submitTransaction(destination address, value uint256, data bytes) returns(transactionId uint256)
+func (_MultiSigWallet *MultiSigWalletTransactorSession) SubmitTransaction(destination common.Address, value *big.Int, data []byte) (*types.Transaction, error) {
+ return _MultiSigWallet.Contract.SubmitTransaction(&_MultiSigWallet.TransactOpts, destination, value, data)
+}
+
+// MultiSigWalletConfirmationIterator is returned from FilterConfirmation and is used to iterate over the raw logs and unpacked data for Confirmation events raised by the MultiSigWallet contract.
+type MultiSigWalletConfirmationIterator struct {
+ Event *MultiSigWalletConfirmation // 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 *MultiSigWalletConfirmationIterator) 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(MultiSigWalletConfirmation)
+ 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(MultiSigWalletConfirmation)
+ 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 *MultiSigWalletConfirmationIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletConfirmationIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletConfirmation represents a Confirmation event raised by the MultiSigWallet contract.
+type MultiSigWalletConfirmation struct {
+ Sender common.Address
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterConfirmation is a free log retrieval operation binding the contract event 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef.
+//
+// Solidity: event Confirmation(sender indexed address, transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterConfirmation(opts *bind.FilterOpts, sender []common.Address, transactionId []*big.Int) (*MultiSigWalletConfirmationIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "Confirmation", senderRule, transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletConfirmationIterator{contract: _MultiSigWallet.contract, event: "Confirmation", logs: logs, sub: sub}, nil
+}
+
+// WatchConfirmation is a free log subscription operation binding the contract event 0x4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef.
+//
+// Solidity: event Confirmation(sender indexed address, transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchConfirmation(opts *bind.WatchOpts, sink chan<- *MultiSigWalletConfirmation, sender []common.Address, transactionId []*big.Int) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "Confirmation", senderRule, transactionIdRule)
+ 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(MultiSigWalletConfirmation)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "Confirmation", 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
+}
+
+// MultiSigWalletDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the MultiSigWallet contract.
+type MultiSigWalletDepositIterator struct {
+ Event *MultiSigWalletDeposit // 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 *MultiSigWalletDepositIterator) 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(MultiSigWalletDeposit)
+ 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(MultiSigWalletDeposit)
+ 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 *MultiSigWalletDepositIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletDepositIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletDeposit represents a Deposit event raised by the MultiSigWallet contract.
+type MultiSigWalletDeposit struct {
+ Sender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterDeposit is a free log retrieval operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
+//
+// Solidity: event Deposit(sender indexed address, value uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterDeposit(opts *bind.FilterOpts, sender []common.Address) (*MultiSigWalletDepositIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "Deposit", senderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletDepositIterator{contract: _MultiSigWallet.contract, event: "Deposit", logs: logs, sub: sub}, nil
+}
+
+// WatchDeposit is a free log subscription operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
+//
+// Solidity: event Deposit(sender indexed address, value uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *MultiSigWalletDeposit, sender []common.Address) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "Deposit", senderRule)
+ 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(MultiSigWalletDeposit)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "Deposit", 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
+}
+
+// MultiSigWalletExecutionIterator is returned from FilterExecution and is used to iterate over the raw logs and unpacked data for Execution events raised by the MultiSigWallet contract.
+type MultiSigWalletExecutionIterator struct {
+ Event *MultiSigWalletExecution // 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 *MultiSigWalletExecutionIterator) 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(MultiSigWalletExecution)
+ 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(MultiSigWalletExecution)
+ 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 *MultiSigWalletExecutionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletExecutionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletExecution represents a Execution event raised by the MultiSigWallet contract.
+type MultiSigWalletExecution struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExecution is a free log retrieval operation binding the contract event 0x33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed75.
+//
+// Solidity: event Execution(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterExecution(opts *bind.FilterOpts, transactionId []*big.Int) (*MultiSigWalletExecutionIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "Execution", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletExecutionIterator{contract: _MultiSigWallet.contract, event: "Execution", logs: logs, sub: sub}, nil
+}
+
+// WatchExecution is a free log subscription operation binding the contract event 0x33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed75.
+//
+// Solidity: event Execution(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchExecution(opts *bind.WatchOpts, sink chan<- *MultiSigWalletExecution, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "Execution", transactionIdRule)
+ 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(MultiSigWalletExecution)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "Execution", 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
+}
+
+// MultiSigWalletExecutionFailureIterator is returned from FilterExecutionFailure and is used to iterate over the raw logs and unpacked data for ExecutionFailure events raised by the MultiSigWallet contract.
+type MultiSigWalletExecutionFailureIterator struct {
+ Event *MultiSigWalletExecutionFailure // 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 *MultiSigWalletExecutionFailureIterator) 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(MultiSigWalletExecutionFailure)
+ 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(MultiSigWalletExecutionFailure)
+ 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 *MultiSigWalletExecutionFailureIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletExecutionFailureIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletExecutionFailure represents a ExecutionFailure event raised by the MultiSigWallet contract.
+type MultiSigWalletExecutionFailure struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterExecutionFailure is a free log retrieval operation binding the contract event 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236.
+//
+// Solidity: event ExecutionFailure(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterExecutionFailure(opts *bind.FilterOpts, transactionId []*big.Int) (*MultiSigWalletExecutionFailureIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "ExecutionFailure", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletExecutionFailureIterator{contract: _MultiSigWallet.contract, event: "ExecutionFailure", logs: logs, sub: sub}, nil
+}
+
+// WatchExecutionFailure is a free log subscription operation binding the contract event 0x526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b79236.
+//
+// Solidity: event ExecutionFailure(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchExecutionFailure(opts *bind.WatchOpts, sink chan<- *MultiSigWalletExecutionFailure, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "ExecutionFailure", transactionIdRule)
+ 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(MultiSigWalletExecutionFailure)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "ExecutionFailure", 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
+}
+
+// MultiSigWalletOwnerAdditionIterator is returned from FilterOwnerAddition and is used to iterate over the raw logs and unpacked data for OwnerAddition events raised by the MultiSigWallet contract.
+type MultiSigWalletOwnerAdditionIterator struct {
+ Event *MultiSigWalletOwnerAddition // 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 *MultiSigWalletOwnerAdditionIterator) 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(MultiSigWalletOwnerAddition)
+ 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(MultiSigWalletOwnerAddition)
+ 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 *MultiSigWalletOwnerAdditionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletOwnerAdditionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletOwnerAddition represents a OwnerAddition event raised by the MultiSigWallet contract.
+type MultiSigWalletOwnerAddition struct {
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnerAddition is a free log retrieval operation binding the contract event 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d.
+//
+// Solidity: event OwnerAddition(owner indexed address)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterOwnerAddition(opts *bind.FilterOpts, owner []common.Address) (*MultiSigWalletOwnerAdditionIterator, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "OwnerAddition", ownerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletOwnerAdditionIterator{contract: _MultiSigWallet.contract, event: "OwnerAddition", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnerAddition is a free log subscription operation binding the contract event 0xf39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d.
+//
+// Solidity: event OwnerAddition(owner indexed address)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchOwnerAddition(opts *bind.WatchOpts, sink chan<- *MultiSigWalletOwnerAddition, owner []common.Address) (event.Subscription, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "OwnerAddition", ownerRule)
+ 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(MultiSigWalletOwnerAddition)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "OwnerAddition", 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
+}
+
+// MultiSigWalletOwnerRemovalIterator is returned from FilterOwnerRemoval and is used to iterate over the raw logs and unpacked data for OwnerRemoval events raised by the MultiSigWallet contract.
+type MultiSigWalletOwnerRemovalIterator struct {
+ Event *MultiSigWalletOwnerRemoval // 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 *MultiSigWalletOwnerRemovalIterator) 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(MultiSigWalletOwnerRemoval)
+ 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(MultiSigWalletOwnerRemoval)
+ 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 *MultiSigWalletOwnerRemovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletOwnerRemovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletOwnerRemoval represents a OwnerRemoval event raised by the MultiSigWallet contract.
+type MultiSigWalletOwnerRemoval struct {
+ Owner common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterOwnerRemoval is a free log retrieval operation binding the contract event 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90.
+//
+// Solidity: event OwnerRemoval(owner indexed address)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterOwnerRemoval(opts *bind.FilterOpts, owner []common.Address) (*MultiSigWalletOwnerRemovalIterator, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "OwnerRemoval", ownerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletOwnerRemovalIterator{contract: _MultiSigWallet.contract, event: "OwnerRemoval", logs: logs, sub: sub}, nil
+}
+
+// WatchOwnerRemoval is a free log subscription operation binding the contract event 0x8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90.
+//
+// Solidity: event OwnerRemoval(owner indexed address)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchOwnerRemoval(opts *bind.WatchOpts, sink chan<- *MultiSigWalletOwnerRemoval, owner []common.Address) (event.Subscription, error) {
+
+ var ownerRule []interface{}
+ for _, ownerItem := range owner {
+ ownerRule = append(ownerRule, ownerItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "OwnerRemoval", ownerRule)
+ 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(MultiSigWalletOwnerRemoval)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "OwnerRemoval", 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
+}
+
+// MultiSigWalletRequirementChangeIterator is returned from FilterRequirementChange and is used to iterate over the raw logs and unpacked data for RequirementChange events raised by the MultiSigWallet contract.
+type MultiSigWalletRequirementChangeIterator struct {
+ Event *MultiSigWalletRequirementChange // 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 *MultiSigWalletRequirementChangeIterator) 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(MultiSigWalletRequirementChange)
+ 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(MultiSigWalletRequirementChange)
+ 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 *MultiSigWalletRequirementChangeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletRequirementChangeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletRequirementChange represents a RequirementChange event raised by the MultiSigWallet contract.
+type MultiSigWalletRequirementChange struct {
+ Required *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRequirementChange is a free log retrieval operation binding the contract event 0xa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a.
+//
+// Solidity: event RequirementChange(required uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterRequirementChange(opts *bind.FilterOpts) (*MultiSigWalletRequirementChangeIterator, error) {
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "RequirementChange")
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletRequirementChangeIterator{contract: _MultiSigWallet.contract, event: "RequirementChange", logs: logs, sub: sub}, nil
+}
+
+// WatchRequirementChange is a free log subscription operation binding the contract event 0xa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a.
+//
+// Solidity: event RequirementChange(required uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchRequirementChange(opts *bind.WatchOpts, sink chan<- *MultiSigWalletRequirementChange) (event.Subscription, error) {
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "RequirementChange")
+ 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(MultiSigWalletRequirementChange)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "RequirementChange", 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
+}
+
+// MultiSigWalletRevocationIterator is returned from FilterRevocation and is used to iterate over the raw logs and unpacked data for Revocation events raised by the MultiSigWallet contract.
+type MultiSigWalletRevocationIterator struct {
+ Event *MultiSigWalletRevocation // 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 *MultiSigWalletRevocationIterator) 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(MultiSigWalletRevocation)
+ 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(MultiSigWalletRevocation)
+ 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 *MultiSigWalletRevocationIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletRevocationIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletRevocation represents a Revocation event raised by the MultiSigWallet contract.
+type MultiSigWalletRevocation struct {
+ Sender common.Address
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterRevocation is a free log retrieval operation binding the contract event 0xf6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9.
+//
+// Solidity: event Revocation(sender indexed address, transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterRevocation(opts *bind.FilterOpts, sender []common.Address, transactionId []*big.Int) (*MultiSigWalletRevocationIterator, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "Revocation", senderRule, transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletRevocationIterator{contract: _MultiSigWallet.contract, event: "Revocation", logs: logs, sub: sub}, nil
+}
+
+// WatchRevocation is a free log subscription operation binding the contract event 0xf6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9.
+//
+// Solidity: event Revocation(sender indexed address, transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchRevocation(opts *bind.WatchOpts, sink chan<- *MultiSigWalletRevocation, sender []common.Address, transactionId []*big.Int) (event.Subscription, error) {
+
+ var senderRule []interface{}
+ for _, senderItem := range sender {
+ senderRule = append(senderRule, senderItem)
+ }
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "Revocation", senderRule, transactionIdRule)
+ 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(MultiSigWalletRevocation)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "Revocation", 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
+}
+
+// MultiSigWalletSubmissionIterator is returned from FilterSubmission and is used to iterate over the raw logs and unpacked data for Submission events raised by the MultiSigWallet contract.
+type MultiSigWalletSubmissionIterator struct {
+ Event *MultiSigWalletSubmission // 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 *MultiSigWalletSubmissionIterator) 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(MultiSigWalletSubmission)
+ 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(MultiSigWalletSubmission)
+ 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 *MultiSigWalletSubmissionIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MultiSigWalletSubmissionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MultiSigWalletSubmission represents a Submission event raised by the MultiSigWallet contract.
+type MultiSigWalletSubmission struct {
+ TransactionId *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterSubmission is a free log retrieval operation binding the contract event 0xc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e51.
+//
+// Solidity: event Submission(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) FilterSubmission(opts *bind.FilterOpts, transactionId []*big.Int) (*MultiSigWalletSubmissionIterator, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.FilterLogs(opts, "Submission", transactionIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MultiSigWalletSubmissionIterator{contract: _MultiSigWallet.contract, event: "Submission", logs: logs, sub: sub}, nil
+}
+
+// WatchSubmission is a free log subscription operation binding the contract event 0xc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e51.
+//
+// Solidity: event Submission(transactionId indexed uint256)
+func (_MultiSigWallet *MultiSigWalletFilterer) WatchSubmission(opts *bind.WatchOpts, sink chan<- *MultiSigWalletSubmission, transactionId []*big.Int) (event.Subscription, error) {
+
+ var transactionIdRule []interface{}
+ for _, transactionIdItem := range transactionId {
+ transactionIdRule = append(transactionIdRule, transactionIdItem)
+ }
+
+ logs, sub, err := _MultiSigWallet.contract.WatchLogs(opts, "Submission", transactionIdRule)
+ 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(MultiSigWalletSubmission)
+ if err := _MultiSigWallet.contract.UnpackLog(event, "Submission", 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
+}
diff --git a/contracts/multisigwallet/multisigwallet.go b/contracts/multisigwallet/multisigwallet.go
new file mode 100644
index 0000000000..55eac82c13
--- /dev/null
+++ b/contracts/multisigwallet/multisigwallet.go
@@ -0,0 +1,57 @@
+// Copyright (c) 2018 XDPoSChain
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program. If not, see .
+
+package multisigwallet
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/multisigwallet/contract"
+ "math/big"
+)
+
+type MultiSigWallet struct {
+ *contract.MultiSigWalletSession
+ contractBackend bind.ContractBackend
+}
+
+func NewMultiSigWallet(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*MultiSigWallet, error) {
+ blockSigner, err := contract.NewMultiSigWallet(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &MultiSigWallet{
+ &contract.MultiSigWalletSession{
+ Contract: blockSigner,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployMultiSigWallet(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, _owners []common.Address, _required *big.Int) (common.Address, *MultiSigWallet, error) {
+ blockSignerAddr, _, _, err := contract.DeployMultiSigWallet(transactOpts, contractBackend, _owners, _required)
+ if err != nil {
+ return blockSignerAddr, nil, err
+ }
+
+ blockSigner, err := NewMultiSigWallet(transactOpts, blockSignerAddr, contractBackend)
+ if err != nil {
+ return blockSignerAddr, nil, err
+ }
+
+ return blockSignerAddr, blockSigner, nil
+}
diff --git a/contracts/trc21issuer/contract/TRC21.go b/contracts/trc21issuer/contract/TRC21.go
new file mode 100644
index 0000000000..4687bd1f34
--- /dev/null
+++ b/contracts/trc21issuer/contract/TRC21.go
@@ -0,0 +1,2525 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// ITRC21ABI is the input ABI used to generate the binding from.
+const ITRC21ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// ITRC21Bin is the compiled bytecode used for deploying new contracts.
+const ITRC21Bin = `0x`
+
+// DeployITRC21 deploys a new Ethereum contract, binding an instance of ITRC21 to it.
+func DeployITRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ITRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(ITRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ITRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ITRC21{ITRC21Caller: ITRC21Caller{contract: contract}, ITRC21Transactor: ITRC21Transactor{contract: contract}, ITRC21Filterer: ITRC21Filterer{contract: contract}}, nil
+}
+
+// ITRC21 is an auto generated Go binding around an Ethereum contract.
+type ITRC21 struct {
+ ITRC21Caller // Read-only binding to the contract
+ ITRC21Transactor // Write-only binding to the contract
+ ITRC21Filterer // Log filterer for contract events
+}
+
+// ITRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type ITRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type ITRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type ITRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// ITRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type ITRC21Session struct {
+ Contract *ITRC21 // 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
+}
+
+// ITRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type ITRC21CallerSession struct {
+ Contract *ITRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// ITRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type ITRC21TransactorSession struct {
+ Contract *ITRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// ITRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type ITRC21Raw struct {
+ Contract *ITRC21 // Generic contract binding to access the raw methods on
+}
+
+// ITRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type ITRC21CallerRaw struct {
+ Contract *ITRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// ITRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type ITRC21TransactorRaw struct {
+ Contract *ITRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewITRC21 creates a new instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21(address common.Address, backend bind.ContractBackend) (*ITRC21, error) {
+ contract, err := bindITRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21{ITRC21Caller: ITRC21Caller{contract: contract}, ITRC21Transactor: ITRC21Transactor{contract: contract}, ITRC21Filterer: ITRC21Filterer{contract: contract}}, nil
+}
+
+// NewITRC21Caller creates a new read-only instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Caller(address common.Address, caller bind.ContractCaller) (*ITRC21Caller, error) {
+ contract, err := bindITRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Caller{contract: contract}, nil
+}
+
+// NewITRC21Transactor creates a new write-only instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*ITRC21Transactor, error) {
+ contract, err := bindITRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Transactor{contract: contract}, nil
+}
+
+// NewITRC21Filterer creates a new log filterer instance of ITRC21, bound to a specific deployed contract.
+func NewITRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*ITRC21Filterer, error) {
+ contract, err := bindITRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21Filterer{contract: contract}, nil
+}
+
+// bindITRC21 binds a generic wrapper to an already deployed contract.
+func bindITRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(ITRC21ABI))
+ 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 (_ITRC21 *ITRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ITRC21.Contract.ITRC21Caller.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 (_ITRC21 *ITRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ITRC21.Contract.ITRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ITRC21 *ITRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ITRC21.Contract.ITRC21Transactor.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 (_ITRC21 *ITRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ITRC21.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 (_ITRC21 *ITRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ITRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_ITRC21 *ITRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ITRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.Allowance(&_ITRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.Allowance(&_ITRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) BalanceOf(opts *bind.CallOpts, who common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "balanceOf", who)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) BalanceOf(who common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.BalanceOf(&_ITRC21.CallOpts, who)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(who address) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) BalanceOf(who common.Address) (*big.Int, error) {
+ return _ITRC21.Contract.BalanceOf(&_ITRC21.CallOpts, who)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _ITRC21.Contract.EstimateFee(&_ITRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _ITRC21.Contract.EstimateFee(&_ITRC21.CallOpts, value)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _ITRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21Session) TotalSupply() (*big.Int, error) {
+ return _ITRC21.Contract.TotalSupply(&_ITRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_ITRC21 *ITRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _ITRC21.Contract.TotalSupply(&_ITRC21.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Approve(&_ITRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Approve(&_ITRC21.TransactOpts, spender, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Transfer(&_ITRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.Transfer(&_ITRC21.TransactOpts, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.TransferFrom(&_ITRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_ITRC21 *ITRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _ITRC21.Contract.TransferFrom(&_ITRC21.TransactOpts, from, to, value)
+}
+
+// ITRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the ITRC21 contract.
+type ITRC21ApprovalIterator struct {
+ Event *ITRC21Approval // 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 *ITRC21ApprovalIterator) 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(ITRC21Approval)
+ 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(ITRC21Approval)
+ 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 *ITRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Approval represents a Approval event raised by the ITRC21 contract.
+type ITRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*ITRC21ApprovalIterator, 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 := _ITRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21ApprovalIterator{contract: _ITRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *ITRC21Approval, 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 := _ITRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(ITRC21Approval)
+ if err := _ITRC21.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
+}
+
+// ITRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the ITRC21 contract.
+type ITRC21FeeIterator struct {
+ Event *ITRC21Fee // 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 *ITRC21FeeIterator) 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(ITRC21Fee)
+ 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(ITRC21Fee)
+ 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 *ITRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Fee represents a Fee event raised by the ITRC21 contract.
+type ITRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*ITRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21FeeIterator{contract: _ITRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *ITRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(ITRC21Fee)
+ if err := _ITRC21.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
+}
+
+// ITRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ITRC21 contract.
+type ITRC21TransferIterator struct {
+ Event *ITRC21Transfer // 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 *ITRC21TransferIterator) 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(ITRC21Transfer)
+ 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(ITRC21Transfer)
+ 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 *ITRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *ITRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// ITRC21Transfer represents a Transfer event raised by the ITRC21 contract.
+type ITRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ITRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ITRC21TransferIterator{contract: _ITRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_ITRC21 *ITRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ITRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _ITRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(ITRC21Transfer)
+ if err := _ITRC21.contract.UnpackLog(event, "Transfer", 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
+}
+
+// MyTRC21ABI is the input ABI used to generate the binding from.
+const MyTRC21ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\"},{\"name\":\"decimals\",\"type\":\"uint8\"},{\"name\":\"cap\",\"type\":\"uint256\"},{\"name\":\"minFee\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// MyTRC21Bin is the compiled bytecode used for deploying new contracts.
+const MyTRC21Bin = `0x60806040523480156200001157600080fd5b5060405162000b3138038062000b3183398101604090815281516020808401519284015160608501516080860151938601805190969590950194919390929091620000639160059190880190620001e7565b50835162000079906006906020870190620001e7565b506007805460ff191660ff85161790556200009e3383640100000000620000d1810204565b620000b23364010000000062000190810204565b620000c681640100000000620001c8810204565b50505050506200028c565b600160a060020a0382161515620000e757600080fd5b60045462000104908264010000000062000842620001cd82021704565b600455600160a060020a0382166000908152602081905260409020546200013a908264010000000062000842620001cd82021704565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600160a060020a0381161515620001a657600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600155565b600082820183811015620001e057600080fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200022a57805160ff19168380011785556200025a565b828001600101855582156200025a579182015b828111156200025a5782518255916020019190600101906200023d565b50620002689291506200026c565b5090565b6200028991905b8082111562000268576000815560010162000273565b90565b610895806200029c6000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063095ea7b314610148578063127e8e4d1461018057806318160ddd146101aa5780631d143848146101bf57806323b872dd146101f057806324ec75901461021a578063313ce5671461022f57806370a082311461025a57806395d89b411461027b578063a9059cbb14610290578063dd62ed3e146102b4575b600080fd5b3480156100ca57600080fd5b506100d36102db565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016c600160a060020a0360043516602435610371565b604080519115158252519081900360200190f35b34801561018c57600080fd5b5061019860043561042b565b60408051918252519081900360200190f35b3480156101b657600080fd5b50610198610457565b3480156101cb57600080fd5b506101d461045d565b60408051600160a060020a039092168252519081900360200190f35b3480156101fc57600080fd5b5061016c600160a060020a036004358116906024351660443561046c565b34801561022657600080fd5b506101986105ac565b34801561023b57600080fd5b506102446105b2565b6040805160ff9092168252519081900360200190f35b34801561026657600080fd5b50610198600160a060020a03600435166105bb565b34801561028757600080fd5b506100d36105d6565b34801561029c57600080fd5b5061016c600160a060020a0360043516602435610637565b3480156102c057600080fd5b50610198600160a060020a03600435811690602435166106f0565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103675780601f1061033c57610100808354040283529160200191610367565b820191906000526020600020905b81548152906001019060200180831161034a57829003601f168201915b5050505050905090565b6000600160a060020a038316151561038857600080fd5b6001543360009081526020819052604090205410156103a657600080fd5b336000818152600360209081526040808320600160a060020a03888116855292529091208490556002546001546103e29392919091169061071b565b604080518381529051600160a060020a0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b60015460009061045190610445848463ffffffff61080d16565b9063ffffffff61084216565b92915050565b60045490565b600254600160a060020a031690565b6000806104846001548461084290919063ffffffff16565b9050600160a060020a038416151561049b57600080fd5b808311156104a857600080fd5b600160a060020a03851660009081526003602090815260408083203384529091529020548111156104d857600080fd5b600160a060020a038516600090815260036020908152604080832033845290915290205461050c908263ffffffff61085416565b600160a060020a038616600090815260036020908152604080832033845290915290205561053b85858561071b565b600254600154610558918791600160a060020a039091169061071b565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4506001949350505050565b60015490565b60075460ff1690565b600160a060020a031660009081526020819052604090205490565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103675780601f1061033c57610100808354040283529160200191610367565b60008061064f6001548461084290919063ffffffff16565b9050600160a060020a038416151561066657600080fd5b8083111561067357600080fd5b61067e33858561071b565b60025460015461069b913391600160a060020a039091169061071b565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4600191505b5092915050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600160a060020a03831660009081526020819052604090205481111561074057600080fd5b600160a060020a038216151561075557600080fd5b600160a060020a03831660009081526020819052604090205461077e908263ffffffff61085416565b600160a060020a0380851660009081526020819052604080822093909355908416815220546107b3908263ffffffff61084216565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008083151561082057600091506106e9565b5082820282848281151561083057fe5b041461083b57600080fd5b9392505050565b60008282018381101561083b57600080fd5b60008282111561086357600080fd5b509003905600a165627a7a72305820fafa860f05b0db36e3b8067a75d9068ddc0c82bea68b125e228ef1a02a3a62140029`
+
+// DeployMyTRC21 deploys a new Ethereum contract, binding an instance of MyTRC21 to it.
+func DeployMyTRC21(auth *bind.TransactOpts, backend bind.ContractBackend, name string, symbol string, decimals uint8, cap *big.Int, minFee *big.Int) (common.Address, *types.Transaction, *MyTRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(MyTRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(MyTRC21Bin), backend, name, symbol, decimals, cap, minFee)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &MyTRC21{MyTRC21Caller: MyTRC21Caller{contract: contract}, MyTRC21Transactor: MyTRC21Transactor{contract: contract}, MyTRC21Filterer: MyTRC21Filterer{contract: contract}}, nil
+}
+
+// MyTRC21 is an auto generated Go binding around an Ethereum contract.
+type MyTRC21 struct {
+ MyTRC21Caller // Read-only binding to the contract
+ MyTRC21Transactor // Write-only binding to the contract
+ MyTRC21Filterer // Log filterer for contract events
+}
+
+// MyTRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type MyTRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type MyTRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type MyTRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// MyTRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type MyTRC21Session struct {
+ Contract *MyTRC21 // 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
+}
+
+// MyTRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type MyTRC21CallerSession struct {
+ Contract *MyTRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// MyTRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type MyTRC21TransactorSession struct {
+ Contract *MyTRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// MyTRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type MyTRC21Raw struct {
+ Contract *MyTRC21 // Generic contract binding to access the raw methods on
+}
+
+// MyTRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type MyTRC21CallerRaw struct {
+ Contract *MyTRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// MyTRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type MyTRC21TransactorRaw struct {
+ Contract *MyTRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewMyTRC21 creates a new instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21(address common.Address, backend bind.ContractBackend) (*MyTRC21, error) {
+ contract, err := bindMyTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21{MyTRC21Caller: MyTRC21Caller{contract: contract}, MyTRC21Transactor: MyTRC21Transactor{contract: contract}, MyTRC21Filterer: MyTRC21Filterer{contract: contract}}, nil
+}
+
+// NewMyTRC21Caller creates a new read-only instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Caller(address common.Address, caller bind.ContractCaller) (*MyTRC21Caller, error) {
+ contract, err := bindMyTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Caller{contract: contract}, nil
+}
+
+// NewMyTRC21Transactor creates a new write-only instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*MyTRC21Transactor, error) {
+ contract, err := bindMyTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Transactor{contract: contract}, nil
+}
+
+// NewMyTRC21Filterer creates a new log filterer instance of MyTRC21, bound to a specific deployed contract.
+func NewMyTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*MyTRC21Filterer, error) {
+ contract, err := bindMyTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21Filterer{contract: contract}, nil
+}
+
+// bindMyTRC21 binds a generic wrapper to an already deployed contract.
+func bindMyTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(MyTRC21ABI))
+ 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 (_MyTRC21 *MyTRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MyTRC21.Contract.MyTRC21Caller.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 (_MyTRC21 *MyTRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MyTRC21.Contract.MyTRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MyTRC21 *MyTRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MyTRC21.Contract.MyTRC21Transactor.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 (_MyTRC21 *MyTRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _MyTRC21.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 (_MyTRC21 *MyTRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _MyTRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_MyTRC21 *MyTRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _MyTRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.Allowance(&_MyTRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.Allowance(&_MyTRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "balanceOf", owner)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.BalanceOf(&_MyTRC21.CallOpts, owner)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _MyTRC21.Contract.BalanceOf(&_MyTRC21.CallOpts, owner)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21Caller) Decimals(opts *bind.CallOpts) (uint8, error) {
+ var (
+ ret0 = new(uint8)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "decimals")
+ return *ret0, err
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21Session) Decimals() (uint8, error) {
+ return _MyTRC21.Contract.Decimals(&_MyTRC21.CallOpts)
+}
+
+// Decimals is a free data retrieval call binding the contract method 0x313ce567.
+//
+// Solidity: function decimals() constant returns(uint8)
+func (_MyTRC21 *MyTRC21CallerSession) Decimals() (uint8, error) {
+ return _MyTRC21.Contract.Decimals(&_MyTRC21.CallOpts)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.EstimateFee(&_MyTRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _MyTRC21.Contract.EstimateFee(&_MyTRC21.CallOpts, value)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21Session) Issuer() (common.Address, error) {
+ return _MyTRC21.Contract.Issuer(&_MyTRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_MyTRC21 *MyTRC21CallerSession) Issuer() (common.Address, error) {
+ return _MyTRC21.Contract.Issuer(&_MyTRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) MinFee(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "minFee")
+ return *ret0, err
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) MinFee() (*big.Int, error) {
+ return _MyTRC21.Contract.MinFee(&_MyTRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) MinFee() (*big.Int, error) {
+ return _MyTRC21.Contract.MinFee(&_MyTRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21Caller) Name(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "name")
+ return *ret0, err
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21Session) Name() (string, error) {
+ return _MyTRC21.Contract.Name(&_MyTRC21.CallOpts)
+}
+
+// Name is a free data retrieval call binding the contract method 0x06fdde03.
+//
+// Solidity: function name() constant returns(string)
+func (_MyTRC21 *MyTRC21CallerSession) Name() (string, error) {
+ return _MyTRC21.Contract.Name(&_MyTRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21Caller) Symbol(opts *bind.CallOpts) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "symbol")
+ return *ret0, err
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21Session) Symbol() (string, error) {
+ return _MyTRC21.Contract.Symbol(&_MyTRC21.CallOpts)
+}
+
+// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
+//
+// Solidity: function symbol() constant returns(string)
+func (_MyTRC21 *MyTRC21CallerSession) Symbol() (string, error) {
+ return _MyTRC21.Contract.Symbol(&_MyTRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _MyTRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21Session) TotalSupply() (*big.Int, error) {
+ return _MyTRC21.Contract.TotalSupply(&_MyTRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_MyTRC21 *MyTRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _MyTRC21.Contract.TotalSupply(&_MyTRC21.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Approve(&_MyTRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Approve(&_MyTRC21.TransactOpts, spender, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Transfer(&_MyTRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.Transfer(&_MyTRC21.TransactOpts, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferFrom(&_MyTRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_MyTRC21 *MyTRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _MyTRC21.Contract.TransferFrom(&_MyTRC21.TransactOpts, from, to, value)
+}
+
+// MyTRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the MyTRC21 contract.
+type MyTRC21ApprovalIterator struct {
+ Event *MyTRC21Approval // 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 *MyTRC21ApprovalIterator) 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(MyTRC21Approval)
+ 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(MyTRC21Approval)
+ 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 *MyTRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Approval represents a Approval event raised by the MyTRC21 contract.
+type MyTRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*MyTRC21ApprovalIterator, 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 := _MyTRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21ApprovalIterator{contract: _MyTRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *MyTRC21Approval, 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 := _MyTRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(MyTRC21Approval)
+ if err := _MyTRC21.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
+}
+
+// MyTRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the MyTRC21 contract.
+type MyTRC21FeeIterator struct {
+ Event *MyTRC21Fee // 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 *MyTRC21FeeIterator) 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(MyTRC21Fee)
+ 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(MyTRC21Fee)
+ 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 *MyTRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Fee represents a Fee event raised by the MyTRC21 contract.
+type MyTRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*MyTRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21FeeIterator{contract: _MyTRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *MyTRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(MyTRC21Fee)
+ if err := _MyTRC21.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
+}
+
+// MyTRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the MyTRC21 contract.
+type MyTRC21TransferIterator struct {
+ Event *MyTRC21Transfer // 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 *MyTRC21TransferIterator) 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(MyTRC21Transfer)
+ 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(MyTRC21Transfer)
+ 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 *MyTRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *MyTRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// MyTRC21Transfer represents a Transfer event raised by the MyTRC21 contract.
+type MyTRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MyTRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &MyTRC21TransferIterator{contract: _MyTRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_MyTRC21 *MyTRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *MyTRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _MyTRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(MyTRC21Transfer)
+ if err := _MyTRC21.contract.UnpackLog(event, "Transfer", 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
+}
+
+// TRC21ABI is the input ABI used to generate the binding from.
+const TRC21ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"estimateFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"from\",\"type\":\"address\"},{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"to\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Fee\",\"type\":\"event\"}]"
+
+// TRC21Bin is the compiled bytecode used for deploying new contracts.
+const TRC21Bin = `0x608060405234801561001057600080fd5b506106aa806100206000396000f3006080604052600436106100985763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461009d578063127e8e4d146100d557806318160ddd146100ff5780631d1438481461011457806323b872dd1461014557806324ec75901461016f57806370a0823114610184578063a9059cbb146101a5578063dd62ed3e146101c9575b600080fd5b3480156100a957600080fd5b506100c1600160a060020a03600435166024356101f0565b604080519115158252519081900360200190f35b3480156100e157600080fd5b506100ed6004356102aa565b60408051918252519081900360200190f35b34801561010b57600080fd5b506100ed6102d6565b34801561012057600080fd5b506101296102dc565b60408051600160a060020a039092168252519081900360200190f35b34801561015157600080fd5b506100c1600160a060020a03600435811690602435166044356102eb565b34801561017b57600080fd5b506100ed61042b565b34801561019057600080fd5b506100ed600160a060020a0360043516610431565b3480156101b157600080fd5b506100c1600160a060020a036004351660243561044c565b3480156101d557600080fd5b506100ed600160a060020a0360043581169060243516610505565b6000600160a060020a038316151561020757600080fd5b60015433600090815260208190526040902054101561022557600080fd5b336000818152600360209081526040808320600160a060020a038881168552925290912084905560025460015461026193929190911690610530565b604080518381529051600160a060020a0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b6001546000906102d0906102c4848463ffffffff61062216565b9063ffffffff61065716565b92915050565b60045490565b600254600160a060020a031690565b6000806103036001548461065790919063ffffffff16565b9050600160a060020a038416151561031a57600080fd5b8083111561032757600080fd5b600160a060020a038516600090815260036020908152604080832033845290915290205481111561035757600080fd5b600160a060020a038516600090815260036020908152604080832033845290915290205461038b908263ffffffff61066916565b600160a060020a03861660009081526003602090815260408083203384529091529020556103ba858585610530565b6002546001546103d7918791600160a060020a0390911690610530565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4506001949350505050565b60015490565b600160a060020a031660009081526020819052604090205490565b6000806104646001548461065790919063ffffffff16565b9050600160a060020a038416151561047b57600080fd5b8083111561048857600080fd5b610493338585610530565b6002546001546104b0913391600160a060020a0390911690610530565b6002546001546040805191825251600160a060020a039283169287169133917ffcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd999181900360200190a4600191505b5092915050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600160a060020a03831660009081526020819052604090205481111561055557600080fd5b600160a060020a038216151561056a57600080fd5b600160a060020a038316600090815260208190526040902054610593908263ffffffff61066916565b600160a060020a0380851660009081526020819052604080822093909355908416815220546105c8908263ffffffff61065716565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008083151561063557600091506104fe565b5082820282848281151561064557fe5b041461065057600080fd5b9392505050565b60008282018381101561065057600080fd5b60008282111561067857600080fd5b509003905600a165627a7a72305820a40ecfbb2241cf25b0b2e3e120bec997e2d61dc709b4b92c70939c9b604b417f0029`
+
+// DeployTRC21 deploys a new Ethereum contract, binding an instance of TRC21 to it.
+func DeployTRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *TRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(TRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &TRC21{TRC21Caller: TRC21Caller{contract: contract}, TRC21Transactor: TRC21Transactor{contract: contract}, TRC21Filterer: TRC21Filterer{contract: contract}}, nil
+}
+
+// TRC21 is an auto generated Go binding around an Ethereum contract.
+type TRC21 struct {
+ TRC21Caller // Read-only binding to the contract
+ TRC21Transactor // Write-only binding to the contract
+ TRC21Filterer // Log filterer for contract events
+}
+
+// TRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type TRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type TRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type TRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type TRC21Session struct {
+ Contract *TRC21 // 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
+}
+
+// TRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type TRC21CallerSession struct {
+ Contract *TRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// TRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type TRC21TransactorSession struct {
+ Contract *TRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// TRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type TRC21Raw struct {
+ Contract *TRC21 // Generic contract binding to access the raw methods on
+}
+
+// TRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type TRC21CallerRaw struct {
+ Contract *TRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// TRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type TRC21TransactorRaw struct {
+ Contract *TRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewTRC21 creates a new instance of TRC21, bound to a specific deployed contract.
+func NewTRC21(address common.Address, backend bind.ContractBackend) (*TRC21, error) {
+ contract, err := bindTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21{TRC21Caller: TRC21Caller{contract: contract}, TRC21Transactor: TRC21Transactor{contract: contract}, TRC21Filterer: TRC21Filterer{contract: contract}}, nil
+}
+
+// NewTRC21Caller creates a new read-only instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Caller(address common.Address, caller bind.ContractCaller) (*TRC21Caller, error) {
+ contract, err := bindTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Caller{contract: contract}, nil
+}
+
+// NewTRC21Transactor creates a new write-only instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*TRC21Transactor, error) {
+ contract, err := bindTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Transactor{contract: contract}, nil
+}
+
+// NewTRC21Filterer creates a new log filterer instance of TRC21, bound to a specific deployed contract.
+func NewTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*TRC21Filterer, error) {
+ contract, err := bindTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Filterer{contract: contract}, nil
+}
+
+// bindTRC21 binds a generic wrapper to an already deployed contract.
+func bindTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21ABI))
+ 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 (_TRC21 *TRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21.Contract.TRC21Caller.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 (_TRC21 *TRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21.Contract.TRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21 *TRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21.Contract.TRC21Transactor.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 (_TRC21 *TRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21.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 (_TRC21 *TRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21 *TRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21Caller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "allowance", owner, spender)
+ return *ret0, err
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21Session) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _TRC21.Contract.Allowance(&_TRC21.CallOpts, owner, spender)
+}
+
+// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
+//
+// Solidity: function allowance(owner address, spender address) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) Allowance(owner common.Address, spender common.Address) (*big.Int, error) {
+ return _TRC21.Contract.Allowance(&_TRC21.CallOpts, owner, spender)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21Caller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "balanceOf", owner)
+ return *ret0, err
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21Session) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _TRC21.Contract.BalanceOf(&_TRC21.CallOpts, owner)
+}
+
+// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
+//
+// Solidity: function balanceOf(owner address) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
+ return _TRC21.Contract.BalanceOf(&_TRC21.CallOpts, owner)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21Caller) EstimateFee(opts *bind.CallOpts, value *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "estimateFee", value)
+ return *ret0, err
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21Session) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _TRC21.Contract.EstimateFee(&_TRC21.CallOpts, value)
+}
+
+// EstimateFee is a free data retrieval call binding the contract method 0x127e8e4d.
+//
+// Solidity: function estimateFee(value uint256) constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) EstimateFee(value *big.Int) (*big.Int, error) {
+ return _TRC21.Contract.EstimateFee(&_TRC21.CallOpts, value)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21Session) Issuer() (common.Address, error) {
+ return _TRC21.Contract.Issuer(&_TRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_TRC21 *TRC21CallerSession) Issuer() (common.Address, error) {
+ return _TRC21.Contract.Issuer(&_TRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21Caller) MinFee(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "minFee")
+ return *ret0, err
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21Session) MinFee() (*big.Int, error) {
+ return _TRC21.Contract.MinFee(&_TRC21.CallOpts)
+}
+
+// MinFee is a free data retrieval call binding the contract method 0x24ec7590.
+//
+// Solidity: function minFee() constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) MinFee() (*big.Int, error) {
+ return _TRC21.Contract.MinFee(&_TRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21Caller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21.contract.Call(opts, out, "totalSupply")
+ return *ret0, err
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21Session) TotalSupply() (*big.Int, error) {
+ return _TRC21.Contract.TotalSupply(&_TRC21.CallOpts)
+}
+
+// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
+//
+// Solidity: function totalSupply() constant returns(uint256)
+func (_TRC21 *TRC21CallerSession) TotalSupply() (*big.Int, error) {
+ return _TRC21.Contract.TotalSupply(&_TRC21.CallOpts)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) Approve(opts *bind.TransactOpts, spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "approve", spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Approve(&_TRC21.TransactOpts, spender, value)
+}
+
+// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
+//
+// Solidity: function approve(spender address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) Approve(spender common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Approve(&_TRC21.TransactOpts, spender, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) Transfer(opts *bind.TransactOpts, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "transfer", to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Transfer(&_TRC21.TransactOpts, to, value)
+}
+
+// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
+//
+// Solidity: function transfer(to address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) Transfer(to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.Transfer(&_TRC21.TransactOpts, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Transactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.contract.Transact(opts, "transferFrom", from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21Session) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.TransferFrom(&_TRC21.TransactOpts, from, to, value)
+}
+
+// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
+//
+// Solidity: function transferFrom(from address, to address, value uint256) returns(bool)
+func (_TRC21 *TRC21TransactorSession) TransferFrom(from common.Address, to common.Address, value *big.Int) (*types.Transaction, error) {
+ return _TRC21.Contract.TransferFrom(&_TRC21.TransactOpts, from, to, value)
+}
+
+// TRC21ApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the TRC21 contract.
+type TRC21ApprovalIterator struct {
+ Event *TRC21Approval // 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 *TRC21ApprovalIterator) 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(TRC21Approval)
+ 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(TRC21Approval)
+ 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 *TRC21ApprovalIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21ApprovalIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Approval represents a Approval event raised by the TRC21 contract.
+type TRC21Approval struct {
+ Owner common.Address
+ Spender common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*TRC21ApprovalIterator, 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 := _TRC21.contract.FilterLogs(opts, "Approval", ownerRule, spenderRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21ApprovalIterator{contract: _TRC21.contract, event: "Approval", logs: logs, sub: sub}, nil
+}
+
+// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
+//
+// Solidity: event Approval(owner indexed address, spender indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *TRC21Approval, 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 := _TRC21.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:
+ // New log arrived, parse the event and forward to the user
+ event := new(TRC21Approval)
+ if err := _TRC21.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
+}
+
+// TRC21FeeIterator is returned from FilterFee and is used to iterate over the raw logs and unpacked data for Fee events raised by the TRC21 contract.
+type TRC21FeeIterator struct {
+ Event *TRC21Fee // 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 *TRC21FeeIterator) 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(TRC21Fee)
+ 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(TRC21Fee)
+ 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 *TRC21FeeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21FeeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Fee represents a Fee event raised by the TRC21 contract.
+type TRC21Fee struct {
+ From common.Address
+ To 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(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterFee(opts *bind.FilterOpts, from []common.Address, to []common.Address, issuer []common.Address) (*TRC21FeeIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _TRC21.contract.FilterLogs(opts, "Fee", fromRule, toRule, issuerRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21FeeIterator{contract: _TRC21.contract, event: "Fee", logs: logs, sub: sub}, nil
+}
+
+// WatchFee is a free log subscription operation binding the contract event 0xfcf5b3276434181e3c48bd3fe569b8939808f11e845d4b963693b9d7dbd6dd99.
+//
+// Solidity: event Fee(from indexed address, to indexed address, issuer indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchFee(opts *bind.WatchOpts, sink chan<- *TRC21Fee, from []common.Address, to []common.Address, issuer []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+ var issuerRule []interface{}
+ for _, issuerItem := range issuer {
+ issuerRule = append(issuerRule, issuerItem)
+ }
+
+ logs, sub, err := _TRC21.contract.WatchLogs(opts, "Fee", fromRule, toRule, 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(TRC21Fee)
+ if err := _TRC21.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
+}
+
+// TRC21TransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the TRC21 contract.
+type TRC21TransferIterator struct {
+ Event *TRC21Transfer // 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 *TRC21TransferIterator) 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(TRC21Transfer)
+ 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(TRC21Transfer)
+ 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 *TRC21TransferIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21TransferIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21Transfer represents a Transfer event raised by the TRC21 contract.
+type TRC21Transfer struct {
+ From common.Address
+ To common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TRC21TransferIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _TRC21.contract.FilterLogs(opts, "Transfer", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21TransferIterator{contract: _TRC21.contract, event: "Transfer", logs: logs, sub: sub}, nil
+}
+
+// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
+//
+// Solidity: event Transfer(from indexed address, to indexed address, value uint256)
+func (_TRC21 *TRC21Filterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *TRC21Transfer, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+ var toRule []interface{}
+ for _, toItem := range to {
+ toRule = append(toRule, toItem)
+ }
+
+ logs, sub, err := _TRC21.contract.WatchLogs(opts, "Transfer", fromRule, toRule)
+ 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(TRC21Transfer)
+ if err := _TRC21.contract.UnpackLog(event, "Transfer", 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
+}
diff --git a/contracts/trc21issuer/contract/TRC21Issuer.go b/contracts/trc21issuer/contract/TRC21Issuer.go
new file mode 100644
index 0000000000..b5ce55facc
--- /dev/null
+++ b/contracts/trc21issuer/contract/TRC21Issuer.go
@@ -0,0 +1,776 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// AbstractTokenTRC21ABI is the input ABI used to generate the binding from.
+const AbstractTokenTRC21ABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"issuer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
+
+// AbstractTokenTRC21Bin is the compiled bytecode used for deploying new contracts.
+const AbstractTokenTRC21Bin = `0x`
+
+// DeployAbstractTokenTRC21 deploys a new Ethereum contract, binding an instance of AbstractTokenTRC21 to it.
+func DeployAbstractTokenTRC21(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *AbstractTokenTRC21, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractTokenTRC21ABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(AbstractTokenTRC21Bin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &AbstractTokenTRC21{AbstractTokenTRC21Caller: AbstractTokenTRC21Caller{contract: contract}, AbstractTokenTRC21Transactor: AbstractTokenTRC21Transactor{contract: contract}, AbstractTokenTRC21Filterer: AbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// AbstractTokenTRC21 is an auto generated Go binding around an Ethereum contract.
+type AbstractTokenTRC21 struct {
+ AbstractTokenTRC21Caller // Read-only binding to the contract
+ AbstractTokenTRC21Transactor // Write-only binding to the contract
+ AbstractTokenTRC21Filterer // Log filterer for contract events
+}
+
+// AbstractTokenTRC21Caller is an auto generated read-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21Caller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Transactor is an auto generated write-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21Transactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type AbstractTokenTRC21Filterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// AbstractTokenTRC21Session is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type AbstractTokenTRC21Session struct {
+ Contract *AbstractTokenTRC21 // 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
+}
+
+// AbstractTokenTRC21CallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type AbstractTokenTRC21CallerSession struct {
+ Contract *AbstractTokenTRC21Caller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// AbstractTokenTRC21TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type AbstractTokenTRC21TransactorSession struct {
+ Contract *AbstractTokenTRC21Transactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// AbstractTokenTRC21Raw is an auto generated low-level Go binding around an Ethereum contract.
+type AbstractTokenTRC21Raw struct {
+ Contract *AbstractTokenTRC21 // Generic contract binding to access the raw methods on
+}
+
+// AbstractTokenTRC21CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21CallerRaw struct {
+ Contract *AbstractTokenTRC21Caller // Generic read-only contract binding to access the raw methods on
+}
+
+// AbstractTokenTRC21TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type AbstractTokenTRC21TransactorRaw struct {
+ Contract *AbstractTokenTRC21Transactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewAbstractTokenTRC21 creates a new instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21(address common.Address, backend bind.ContractBackend) (*AbstractTokenTRC21, error) {
+ contract, err := bindAbstractTokenTRC21(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21{AbstractTokenTRC21Caller: AbstractTokenTRC21Caller{contract: contract}, AbstractTokenTRC21Transactor: AbstractTokenTRC21Transactor{contract: contract}, AbstractTokenTRC21Filterer: AbstractTokenTRC21Filterer{contract: contract}}, nil
+}
+
+// NewAbstractTokenTRC21Caller creates a new read-only instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Caller(address common.Address, caller bind.ContractCaller) (*AbstractTokenTRC21Caller, error) {
+ contract, err := bindAbstractTokenTRC21(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Caller{contract: contract}, nil
+}
+
+// NewAbstractTokenTRC21Transactor creates a new write-only instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Transactor(address common.Address, transactor bind.ContractTransactor) (*AbstractTokenTRC21Transactor, error) {
+ contract, err := bindAbstractTokenTRC21(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Transactor{contract: contract}, nil
+}
+
+// NewAbstractTokenTRC21Filterer creates a new log filterer instance of AbstractTokenTRC21, bound to a specific deployed contract.
+func NewAbstractTokenTRC21Filterer(address common.Address, filterer bind.ContractFilterer) (*AbstractTokenTRC21Filterer, error) {
+ contract, err := bindAbstractTokenTRC21(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &AbstractTokenTRC21Filterer{contract: contract}, nil
+}
+
+// bindAbstractTokenTRC21 binds a generic wrapper to an already deployed contract.
+func bindAbstractTokenTRC21(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(AbstractTokenTRC21ABI))
+ 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 (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Caller.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 (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Transactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.AbstractTokenTRC21Transactor.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 (_AbstractTokenTRC21 *AbstractTokenTRC21CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _AbstractTokenTRC21.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 (_AbstractTokenTRC21 *AbstractTokenTRC21TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_AbstractTokenTRC21 *AbstractTokenTRC21TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _AbstractTokenTRC21.Contract.contract.Transact(opts, method, params...)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Caller) Issuer(opts *bind.CallOpts) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _AbstractTokenTRC21.contract.Call(opts, out, "issuer")
+ return *ret0, err
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21Session) Issuer() (common.Address, error) {
+ return _AbstractTokenTRC21.Contract.Issuer(&_AbstractTokenTRC21.CallOpts)
+}
+
+// Issuer is a free data retrieval call binding the contract method 0x1d143848.
+//
+// Solidity: function issuer() constant returns(address)
+func (_AbstractTokenTRC21 *AbstractTokenTRC21CallerSession) Issuer() (common.Address, error) {
+ return _AbstractTokenTRC21.Contract.Issuer(&_AbstractTokenTRC21.CallOpts)
+}
+
+// TRC21IssuerABI is the input ABI used to generate the binding from.
+const TRC21IssuerABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"minCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenCapacity\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"apply\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"token\",\"type\":\"address\"}],\"name\":\"charge\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"issuer\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Apply\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"supporter\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Charge\",\"type\":\"event\"}]"
+
+// TRC21IssuerBin is the compiled bytecode used for deploying new contracts.
+const TRC21IssuerBin = `0x608060405234801561001057600080fd5b5060405160208061047d8339810160405251600055610449806100346000396000f30060806040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fa615b081146100715780638f3a981c146100985780639d63848a146100b9578063c6b32f341461011e578063fc6bd76a14610134575b600080fd5b34801561007d57600080fd5b50610086610148565b60408051918252519081900360200190f35b3480156100a457600080fd5b50610086600160a060020a036004351661014e565b3480156100c557600080fd5b506100ce610169565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561010a5781810151838201526020016100f2565b505050509050019250505060405180910390f35b610132600160a060020a03600435166101cb565b005b610132600160a060020a036004351661035d565b60005490565b600160a060020a031660009081526002602052604090205490565b606060018054806020026020016040519081016040528092919081815260200182805480156101c157602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116101a3575b5050505050905090565b600081600160a060020a03811615156101e357600080fd5b6000543410156101f257600080fd5b82915033600160a060020a031682600160a060020a0316631d1438486040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050506040513d602081101561028057600080fd5b5051600160a060020a03161461029557600080fd5b600180548082019091557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600260205260409020546103039034610404565b600160a060020a0384166000818152600260209081526040918290209390935580513481529051919233927f2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d7169281900390910190a3505050565b80600160a060020a038116151561037357600080fd5b60005434101561038257600080fd5b600160a060020a0382166000908152600260205260409020546103ab903463ffffffff61040416565b600160a060020a0383166000818152600260209081526040918290209390935580513481529051919233927f5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e069281900390910190a35050565b60008282018381101561041657600080fd5b93925050505600a165627a7a7230582017d25c61c6dd745630f85ec71140358aef38c084b91e940943bb4a15314b5e660029`
+
+// DeployTRC21Issuer deploys a new Ethereum contract, binding an instance of TRC21Issuer to it.
+func DeployTRC21Issuer(auth *bind.TransactOpts, backend bind.ContractBackend, value *big.Int) (common.Address, *types.Transaction, *TRC21Issuer, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21IssuerABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(TRC21IssuerBin), backend, value)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &TRC21Issuer{TRC21IssuerCaller: TRC21IssuerCaller{contract: contract}, TRC21IssuerTransactor: TRC21IssuerTransactor{contract: contract}, TRC21IssuerFilterer: TRC21IssuerFilterer{contract: contract}}, nil
+}
+
+// TRC21Issuer is an auto generated Go binding around an Ethereum contract.
+type TRC21Issuer struct {
+ TRC21IssuerCaller // Read-only binding to the contract
+ TRC21IssuerTransactor // Write-only binding to the contract
+ TRC21IssuerFilterer // Log filterer for contract events
+}
+
+// TRC21IssuerCaller is an auto generated read-only Go binding around an Ethereum contract.
+type TRC21IssuerCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type TRC21IssuerTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type TRC21IssuerFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// TRC21IssuerSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type TRC21IssuerSession struct {
+ Contract *TRC21Issuer // 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
+}
+
+// TRC21IssuerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type TRC21IssuerCallerSession struct {
+ Contract *TRC21IssuerCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// TRC21IssuerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type TRC21IssuerTransactorSession struct {
+ Contract *TRC21IssuerTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// TRC21IssuerRaw is an auto generated low-level Go binding around an Ethereum contract.
+type TRC21IssuerRaw struct {
+ Contract *TRC21Issuer // Generic contract binding to access the raw methods on
+}
+
+// TRC21IssuerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type TRC21IssuerCallerRaw struct {
+ Contract *TRC21IssuerCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// TRC21IssuerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type TRC21IssuerTransactorRaw struct {
+ Contract *TRC21IssuerTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewTRC21Issuer creates a new instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21Issuer(address common.Address, backend bind.ContractBackend) (*TRC21Issuer, error) {
+ contract, err := bindTRC21Issuer(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21Issuer{TRC21IssuerCaller: TRC21IssuerCaller{contract: contract}, TRC21IssuerTransactor: TRC21IssuerTransactor{contract: contract}, TRC21IssuerFilterer: TRC21IssuerFilterer{contract: contract}}, nil
+}
+
+// NewTRC21IssuerCaller creates a new read-only instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerCaller(address common.Address, caller bind.ContractCaller) (*TRC21IssuerCaller, error) {
+ contract, err := bindTRC21Issuer(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerCaller{contract: contract}, nil
+}
+
+// NewTRC21IssuerTransactor creates a new write-only instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerTransactor(address common.Address, transactor bind.ContractTransactor) (*TRC21IssuerTransactor, error) {
+ contract, err := bindTRC21Issuer(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerTransactor{contract: contract}, nil
+}
+
+// NewTRC21IssuerFilterer creates a new log filterer instance of TRC21Issuer, bound to a specific deployed contract.
+func NewTRC21IssuerFilterer(address common.Address, filterer bind.ContractFilterer) (*TRC21IssuerFilterer, error) {
+ contract, err := bindTRC21Issuer(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerFilterer{contract: contract}, nil
+}
+
+// bindTRC21Issuer binds a generic wrapper to an already deployed contract.
+func bindTRC21Issuer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(TRC21IssuerABI))
+ 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 (_TRC21Issuer *TRC21IssuerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21Issuer.Contract.TRC21IssuerCaller.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 (_TRC21Issuer *TRC21IssuerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.TRC21IssuerTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21Issuer *TRC21IssuerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.TRC21IssuerTransactor.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 (_TRC21Issuer *TRC21IssuerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _TRC21Issuer.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 (_TRC21Issuer *TRC21IssuerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_TRC21Issuer *TRC21IssuerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.contract.Transact(opts, method, params...)
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCaller) GetTokenCapacity(opts *bind.CallOpts, token common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "getTokenCapacity", token)
+ return *ret0, err
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerSession) GetTokenCapacity(token common.Address) (*big.Int, error) {
+ return _TRC21Issuer.Contract.GetTokenCapacity(&_TRC21Issuer.CallOpts, token)
+}
+
+// GetTokenCapacity is a free data retrieval call binding the contract method 0x8f3a981c.
+//
+// Solidity: function getTokenCapacity(token address) constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCallerSession) GetTokenCapacity(token common.Address) (*big.Int, error) {
+ return _TRC21Issuer.Contract.GetTokenCapacity(&_TRC21Issuer.CallOpts, token)
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCaller) MinCap(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "minCap")
+ return *ret0, err
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerSession) MinCap() (*big.Int, error) {
+ return _TRC21Issuer.Contract.MinCap(&_TRC21Issuer.CallOpts)
+}
+
+// MinCap is a free data retrieval call binding the contract method 0x3fa615b0.
+//
+// Solidity: function minCap() constant returns(uint256)
+func (_TRC21Issuer *TRC21IssuerCallerSession) MinCap() (*big.Int, error) {
+ return _TRC21Issuer.Contract.MinCap(&_TRC21Issuer.CallOpts)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerCaller) Tokens(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _TRC21Issuer.contract.Call(opts, out, "tokens")
+ return *ret0, err
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerSession) Tokens() ([]common.Address, error) {
+ return _TRC21Issuer.Contract.Tokens(&_TRC21Issuer.CallOpts)
+}
+
+// Tokens is a free data retrieval call binding the contract method 0x9d63848a.
+//
+// Solidity: function tokens() constant returns(address[])
+func (_TRC21Issuer *TRC21IssuerCallerSession) Tokens() ([]common.Address, error) {
+ return _TRC21Issuer.Contract.Tokens(&_TRC21Issuer.CallOpts)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactor) Apply(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.contract.Transact(opts, "apply", token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Apply(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Apply is a paid mutator transaction binding the contract method 0xc6b32f34.
+//
+// Solidity: function apply(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactorSession) Apply(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Apply(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactor) Charge(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.contract.Transact(opts, "charge", token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerSession) Charge(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Charge(&_TRC21Issuer.TransactOpts, token)
+}
+
+// Charge is a paid mutator transaction binding the contract method 0xfc6bd76a.
+//
+// Solidity: function charge(token address) returns()
+func (_TRC21Issuer *TRC21IssuerTransactorSession) Charge(token common.Address) (*types.Transaction, error) {
+ return _TRC21Issuer.Contract.Charge(&_TRC21Issuer.TransactOpts, token)
+}
+
+// TRC21IssuerApplyIterator is returned from FilterApply and is used to iterate over the raw logs and unpacked data for Apply events raised by the TRC21Issuer contract.
+type TRC21IssuerApplyIterator struct {
+ Event *TRC21IssuerApply // 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 *TRC21IssuerApplyIterator) 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(TRC21IssuerApply)
+ 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(TRC21IssuerApply)
+ 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 *TRC21IssuerApplyIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21IssuerApplyIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21IssuerApply represents a Apply event raised by the TRC21Issuer contract.
+type TRC21IssuerApply struct {
+ Issuer common.Address
+ Token common.Address
+ Value *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterApply is a free log retrieval operation binding the contract event 0x2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d716.
+//
+// Solidity: event Apply(issuer indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) FilterApply(opts *bind.FilterOpts, issuer []common.Address, token []common.Address) (*TRC21IssuerApplyIterator, 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 := _TRC21Issuer.contract.FilterLogs(opts, "Apply", issuerRule, tokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerApplyIterator{contract: _TRC21Issuer.contract, event: "Apply", logs: logs, sub: sub}, nil
+}
+
+// WatchApply is a free log subscription operation binding the contract event 0x2d485624158277d5113a56388c3abf5c20e3511dd112123ba376d16b21e4d716.
+//
+// Solidity: event Apply(issuer indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) WatchApply(opts *bind.WatchOpts, sink chan<- *TRC21IssuerApply, 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 := _TRC21Issuer.contract.WatchLogs(opts, "Apply", 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(TRC21IssuerApply)
+ if err := _TRC21Issuer.contract.UnpackLog(event, "Apply", 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
+}
+
+// TRC21IssuerChargeIterator is returned from FilterCharge and is used to iterate over the raw logs and unpacked data for Charge events raised by the TRC21Issuer contract.
+type TRC21IssuerChargeIterator struct {
+ Event *TRC21IssuerCharge // 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 *TRC21IssuerChargeIterator) 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(TRC21IssuerCharge)
+ 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(TRC21IssuerCharge)
+ 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 *TRC21IssuerChargeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *TRC21IssuerChargeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// TRC21IssuerCharge represents a Charge event raised by the TRC21Issuer contract.
+type TRC21IssuerCharge 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(supporter indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) FilterCharge(opts *bind.FilterOpts, supporter []common.Address, token []common.Address) (*TRC21IssuerChargeIterator, 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 := _TRC21Issuer.contract.FilterLogs(opts, "Charge", supporterRule, tokenRule)
+ if err != nil {
+ return nil, err
+ }
+ return &TRC21IssuerChargeIterator{contract: _TRC21Issuer.contract, event: "Charge", logs: logs, sub: sub}, nil
+}
+
+// WatchCharge is a free log subscription operation binding the contract event 0x5cffac866325fd9b2a8ea8df2f110a0058313b279402d15ae28dd324a2282e06.
+//
+// Solidity: event Charge(supporter indexed address, token indexed address, value uint256)
+func (_TRC21Issuer *TRC21IssuerFilterer) WatchCharge(opts *bind.WatchOpts, sink chan<- *TRC21IssuerCharge, 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 := _TRC21Issuer.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(TRC21IssuerCharge)
+ if err := _TRC21Issuer.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
+}
diff --git a/contracts/trc21issuer/trc21.go b/contracts/trc21issuer/trc21.go
new file mode 100644
index 0000000000..2004de9801
--- /dev/null
+++ b/contracts/trc21issuer/trc21.go
@@ -0,0 +1,41 @@
+package trc21issuer
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/trc21issuer/contract"
+ "math/big"
+)
+
+type MyTRC21 struct {
+ *contract.MyTRC21Session
+ contractBackend bind.ContractBackend
+}
+
+func NewTRC21(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*MyTRC21, error) {
+ smartContract, err := contract.NewMyTRC21(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &MyTRC21{
+ &contract.MyTRC21Session{
+ Contract: smartContract,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployTRC21(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, name string, symbol string, decimals uint8, cap, fee *big.Int) (common.Address, *MyTRC21, error) {
+ contractAddr, _, _, err := contract.DeployMyTRC21(transactOpts, contractBackend, name, symbol, decimals, cap, fee)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ smartContract, err := NewTRC21(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, smartContract, nil
+}
diff --git a/contracts/trc21issuer/trc21issuer.go b/contracts/trc21issuer/trc21issuer.go
new file mode 100644
index 0000000000..0d5d5b6dfe
--- /dev/null
+++ b/contracts/trc21issuer/trc21issuer.go
@@ -0,0 +1,41 @@
+package trc21issuer
+
+import (
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/contracts/trc21issuer/contract"
+ "math/big"
+)
+
+type TRC21Issuer struct {
+ *contract.TRC21IssuerSession
+ contractBackend bind.ContractBackend
+}
+
+func NewTRC21Issuer(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*TRC21Issuer, error) {
+ contractObject, err := contract.NewTRC21Issuer(contractAddr, contractBackend)
+ if err != nil {
+ return nil, err
+ }
+
+ return &TRC21Issuer{
+ &contract.TRC21IssuerSession{
+ Contract: contractObject,
+ TransactOpts: *transactOpts,
+ },
+ contractBackend,
+ }, nil
+}
+
+func DeployTRC21Issuer(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, minApply *big.Int) (common.Address, *TRC21Issuer, error) {
+ contractAddr, _, _, err := contract.DeployTRC21Issuer(transactOpts, contractBackend, minApply)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+ contractObject, err := NewTRC21Issuer(transactOpts, contractAddr, contractBackend)
+ if err != nil {
+ return contractAddr, nil, err
+ }
+
+ return contractAddr, contractObject, nil
+}
diff --git a/contracts/utils.go b/contracts/utils.go
index 23c5bcd212..ee0183ee61 100644
--- a/contracts/utils.go
+++ b/contracts/utils.go
@@ -21,7 +21,7 @@ import (
"crypto/cipher"
cryptoRand "crypto/rand"
"encoding/base64"
- "fmt"
+ "errors"
"io"
"math/big"
"math/rand"
@@ -30,9 +30,9 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/consensus/XDPoS/utils"
+ "github.com/ethereum/go-ethereum/contracts/blocksigner/contract"
randomizeContract "github.com/ethereum/go-ethereum/contracts/randomize/contract"
+ "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
)
@@ -42,6 +42,7 @@ const (
extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal
)
+// RewardLog represents the reward info for logging
type RewardLog struct {
Sign uint64 `json:"sign"`
Reward *big.Int `json:"reward"`
@@ -81,7 +82,7 @@ func BuildTxSecretRandomize(nonce uint64, randomizeAddr common.Address, epocNumb
return tx, nil
}
-// Send opening to randomize SMC.
+// Send opening key into randomize smartcontract.
func BuildTxOpeningRandomize(nonce uint64, randomizeAddr common.Address, randomizeKey []byte) (*types.Transaction, error) {
data := common.Hex2Bytes(common.HexSetOpening)
inputData := append(data, randomizeKey...)
@@ -90,175 +91,7 @@ func BuildTxOpeningRandomize(nonce uint64, randomizeAddr common.Address, randomi
return tx, nil
}
-// Get random from randomize contract.
-func GetRandomizeFromContract(client bind.ContractBackend, addrMasternode common.Address) (int64, error) {
- randomize, err := randomizeContract.NewXDCRandomize(common.RandomizeSMCBinary, client)
- if err != nil {
- log.Error("Fail to get instance of randomize", "error", err)
- }
- opts := new(bind.CallOpts)
- secrets, err := randomize.GetSecret(opts, addrMasternode)
- if err != nil {
- log.Error("Fail get secrets from randomize", "error", err)
- }
- opening, err := randomize.GetOpening(opts, addrMasternode)
- if err != nil {
- log.Error("Fail get opening from randomize", "error", err)
- }
-
- return DecryptRandomizeFromSecretsAndOpening(secrets, opening)
-}
-
-// Generate m2 listing from randomize array.
-func GenM2FromRandomize(randomizes []int64, lenSigners int64) ([]int64, error) {
- blockValidator := NewSlice(int64(0), lenSigners, 1)
- randIndexs := make([]int64, lenSigners)
- total := int64(0)
- var temp int64 = 0
- for _, j := range randomizes {
- total += j
- }
- rand.Seed(total)
- for i := len(blockValidator) - 1; i >= 0; i-- {
- blockLength := len(blockValidator) - 1
- if blockLength <= 1 {
- blockLength = 1
- }
- randomIndex := int64(rand.Intn(blockLength))
- temp = blockValidator[randomIndex]
- blockValidator[randomIndex] = blockValidator[i]
- blockValidator[i] = temp
- blockValidator = append(blockValidator[:i], blockValidator[i+1:]...)
- randIndexs[i] = temp
- }
-
- return randIndexs, nil
-}
-
-// Get validators from m2 array integer.
-func BuildValidatorFromM2(listM2 []int64) []byte {
- var validatorBytes []byte
- for _, numberM2 := range listM2 {
- // Convert number to byte.
- m2Byte := common.LeftPadBytes([]byte(fmt.Sprintf("%d", numberM2)), utils.M2ByteLength)
- validatorBytes = append(validatorBytes, m2Byte...)
- }
-
- return validatorBytes
-}
-
-// Decode validator hex string.
-func DecodeValidatorsHexData(validatorsStr string) ([]int64, error) {
- validatorsByte, err := hexutil.Decode(validatorsStr)
- if err != nil {
- return nil, err
- }
-
- return utils.ExtractValidatorsFromBytes(validatorsByte), nil
-}
-
-// Decrypt randomize from secrets and opening.
-func DecryptRandomizeFromSecretsAndOpening(secrets [][32]byte, opening [32]byte) (int64, error) {
- var random int64
- if len(secrets) > 0 {
- for _, secret := range secrets {
- trimSecret := bytes.TrimLeft(secret[:], "\x00")
- decryptSecret := Decrypt(opening[:], string(trimSecret))
- if isInt(decryptSecret) {
- intNumber, err := strconv.Atoi(decryptSecret)
- if err != nil {
- log.Error("Can not convert string to integer", "error", err)
- return -1, err
- }
- random = int64(intNumber)
- }
- }
- }
-
- return random, nil
-}
-
-// Dynamic generate array sequence of numbers.
-func NewSlice(start int64, end int64, step int64) []int64 {
- s := make([]int64, end-start)
- for i := range s {
- s[i] = start
- start += step
- }
-
- return s
-}
-
-// Shuffle array.
-func Shuffle(slice []int64) []int64 {
- newSlice := make([]int64, len(slice))
- copy(newSlice, slice)
-
- for i := 0; i < len(slice)-1; i++ {
- rand.Seed(time.Now().UnixNano())
- randIndex := rand.Intn(len(newSlice))
- x := newSlice[i]
- newSlice[i] = newSlice[randIndex]
- newSlice[randIndex] = x
- }
-
- return newSlice
-}
-
-// encrypt string to base64 crypto using AES
-func Encrypt(key []byte, text string) string {
- plaintext := []byte(text)
-
- block, err := aes.NewCipher(key)
- if err != nil {
- log.Error("Fail to encrypt", "err", err)
- return ""
- }
-
- // The IV needs to be unique, but not secure. Therefore it's common to
- // include it at the beginning of the ciphertext.
- ciphertext := make([]byte, aes.BlockSize+len(plaintext))
- iv := ciphertext[:aes.BlockSize]
- if _, err := io.ReadFull(cryptoRand.Reader, iv); err != nil {
- log.Error("Fail to encrypt iv", "err", err)
- return ""
- }
-
- stream := cipher.NewCFBEncrypter(block, iv)
- stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
-
- // convert to base64
- return base64.URLEncoding.EncodeToString(ciphertext)
-}
-
-// decrypt from base64 to decrypted string
-func Decrypt(key []byte, cryptoText string) string {
- ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)
-
- block, err := aes.NewCipher(key)
- if err != nil {
- log.Error("Fail to decrypt", "err", err)
- return ""
- }
-
- // The IV needs to be unique, but not secure. Therefore it's common to
- // include it at the beginning of the ciphertext.
- if len(ciphertext) < aes.BlockSize {
- log.Error("ciphertext too short")
- return ""
- }
- iv := ciphertext[:aes.BlockSize]
- ciphertext = ciphertext[aes.BlockSize:]
-
- stream := cipher.NewCFBDecrypter(block, iv)
-
- // XORKeyStream can work in-place if the two arguments are the same.
- stream.XORKeyStream(ciphertext, ciphertext)
-
- return string(ciphertext[:])
-}
-
-// Generate random string.
+// RandStringByte generates a random string of specified length
func RandStringByte(n int) []byte {
letterBytes := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
b := make([]byte, n)
@@ -269,11 +102,223 @@ func RandStringByte(n int) []byte {
return b
}
-// Helper function check string is numeric.
-func isInt(strNumber string) bool {
- if _, err := strconv.Atoi(strNumber); err == nil {
- return true
- } else {
+// Encrypt encrypts the plaintext using AES
+func Encrypt(key []byte, text string) string {
+ plaintext := []byte(text)
+
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ log.Error("Fail to encrypt", "error", err)
+ return ""
+ }
+
+ ciphertext := make([]byte, aes.BlockSize+len(plaintext))
+ iv := ciphertext[:aes.BlockSize]
+ if _, err := io.ReadFull(cryptoRand.Reader, iv); err != nil {
+ log.Error("Fail to encrypt iv", "error", err)
+ return ""
+ }
+
+ stream := cipher.NewCFBEncrypter(block, iv)
+ stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
+
+ return base64.URLEncoding.EncodeToString(ciphertext)
+}
+
+// Decrypt decrypts ciphertext using AES
+func Decrypt(key []byte, cryptoText string) string {
+ ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)
+
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ log.Error("Fail to decrypt", "error", err)
+ return ""
+ }
+
+ if len(ciphertext) < aes.BlockSize {
+ log.Error("Ciphertext too short")
+ return ""
+ }
+ iv := ciphertext[:aes.BlockSize]
+ ciphertext = ciphertext[aes.BlockSize:]
+
+ stream := cipher.NewCFBDecrypter(block, iv)
+ stream.XORKeyStream(ciphertext, ciphertext)
+
+ return string(ciphertext)
+}
+
+// GetSignersFromContract returns the list of signers from the block signer contract
+func GetSignersFromContract(statedb *state.StateDB, block *types.Block) ([]common.Address, error) {
+ return state.GetSigners(statedb, block), nil
+}
+
+// GetRandomizeFromContract returns random number from contract
+func GetRandomizeFromContract(client bind.ContractBackend, addr common.Address) (int64, error) {
+ randomize, err := randomizeContract.NewXDCRandomize(common.RandomizeSMCBinary, client)
+ if err != nil {
+ return 0, err
+ }
+ opts := new(bind.CallOpts)
+ secrets, err := randomize.GetSecret(opts, addr)
+ if err != nil {
+ return 0, err
+ }
+ // Since there could be multiple secrets (array), we just use first one
+ if len(secrets) == 0 {
+ return 0, errors.New("no secrets found")
+ }
+ // Decrypt the secret to get the random number
+ opening, err := randomize.GetOpening(opts, addr)
+ if err != nil {
+ return 0, err
+ }
+ if len(opening) == 0 {
+ return 0, errors.New("no opening found")
+ }
+
+ // Decrypt secret with opening key
+ decrypted := Decrypt(opening[:], string(secrets[0][:]))
+ result, err := strconv.ParseInt(decrypted, 10, 64)
+ if err != nil {
+ // If can't parse, return a pseudo-random based on address
+ return int64(addr.Big().Int64() % 100), nil
+ }
+ return result, nil
+}
+
+// GenM2FromRandomize generates M2 validator list from random numbers
+func GenM2FromRandomize(candidates []int64, lenSigners int64) ([]int64, error) {
+ if len(candidates) == 0 {
+ return nil, errors.New("empty candidates")
+ }
+
+ // Create a copy of candidates for shuffling
+ m2 := make([]int64, len(candidates))
+ copy(m2, candidates)
+
+ // Fisher-Yates shuffle using candidates as seeds
+ for i := len(m2) - 1; i > 0; i-- {
+ seed := candidates[i%len(candidates)]
+ j := int(seed) % (i + 1)
+ if j < 0 {
+ j = -j
+ }
+ m2[i], m2[j] = m2[j], m2[i]
+ }
+
+ return m2, nil
+}
+
+// BuildValidatorFromM2 builds validator bytes from M2 list
+func BuildValidatorFromM2(m2 []int64) []byte {
+ var validators []byte
+ for _, v := range m2 {
+ validators = append(validators, byte(v))
+ }
+ return validators
+}
+
+// GetBlockSigners returns signers who signed a specific block
+func GetBlockSigners(client bind.ContractBackend, blockHash common.Hash) ([]common.Address, error) {
+ blockSigners, err := contract.NewBlockSigner(common.BlockSignersBinary, client)
+ if err != nil {
+ return nil, err
+ }
+ opts := &bind.CallOpts{}
+ addrs, err := blockSigners.GetSigners(opts, blockHash)
+ if err != nil {
+ return nil, err
+ }
+ return addrs, nil
+}
+
+// ExtractAddressFromBytes extracts addresses from a byte slice
+func ExtractAddressFromBytes(penaltiesBytes []byte) []common.Address {
+ var addresses []common.Address
+ if len(penaltiesBytes) == 0 {
+ return addresses
+ }
+ // Each address is 20 bytes
+ addressLen := common.AddressLength
+ for i := 0; i+addressLen <= len(penaltiesBytes); i += addressLen {
+ addresses = append(addresses, common.BytesToAddress(penaltiesBytes[i:i+addressLen]))
+ }
+ return addresses
+}
+
+// CalculateRewardForSigner calculates rewards for signers
+func CalculateRewardForSigner(chainReward *big.Int, signers map[common.Address]*RewardLog, totalSigner uint64) (map[common.Address]*big.Int, error) {
+ rewardSigners := make(map[common.Address]*big.Int)
+
+ if totalSigner == 0 {
+ return rewardSigners, nil
+ }
+
+ rewardPerSign := new(big.Int).Div(chainReward, big.NewInt(int64(totalSigner)))
+
+ for addr, rLog := range signers {
+ reward := new(big.Int).Mul(rewardPerSign, big.NewInt(int64(rLog.Sign)))
+ rewardSigners[addr] = reward
+ }
+
+ return rewardSigners, nil
+}
+
+// CalculateRewardForHolders calculates rewards for token holders
+func CalculateRewardForHolders(foundationWalletAddr common.Address, statedb *state.StateDB, signer common.Address, calcReward *big.Int, blockNumber uint64) (map[common.Address]*big.Int, error) {
+ rewards := make(map[common.Address]*big.Int)
+
+ // Simple distribution: foundation gets foundation percent, signer gets rest
+ foundationReward := new(big.Int).Mul(calcReward, big.NewInt(int64(common.RewardFoundationPercent)))
+ foundationReward.Div(foundationReward, big.NewInt(100))
+
+ signerReward := new(big.Int).Sub(calcReward, foundationReward)
+
+ if foundationWalletAddr != (common.Address{}) {
+ rewards[foundationWalletAddr] = foundationReward
+ }
+ rewards[signer] = signerReward
+
+ return rewards, nil
+}
+
+// DecodeExtraFields decodes extra data fields from header
+func DecodeExtraFields(extra []byte) (common.Address, []byte, error) {
+ if len(extra) < extraVanity {
+ return common.Address{}, nil, errors.New("extra-data too short")
+ }
+
+ // Extract vanity
+ vanity := extra[:extraVanity]
+
+ // Extract signer
+ if len(extra) < extraVanity+extraSeal {
+ return common.Address{}, vanity, errors.New("missing signature")
+ }
+
+ signature := extra[len(extra)-extraSeal:]
+ _ = signature // Would be used to recover signer
+
+ return common.Address{}, vanity, nil
+}
+
+// CompareSignersLists compares two lists of signers
+func CompareSignersLists(list1, list2 []common.Address) bool {
+ if len(list1) != len(list2) {
return false
}
+
+ for i := range list1 {
+ if list1[i] != list2[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
+// BytesEqual compares two byte slices
+func BytesEqual(a, b []byte) bool {
+ return bytes.Equal(a, b)
}
diff --git a/contracts/utils_test.go b/contracts/utils_test.go
new file mode 100644
index 0000000000..89f7c0c75d
--- /dev/null
+++ b/contracts/utils_test.go
@@ -0,0 +1,212 @@
+// Copyright (c) 2018 XDPoSChain
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program. If not, see .
+
+package contracts
+
+import (
+ "bytes"
+ "context"
+ "crypto/ecdsa"
+ "math/big"
+ "math/rand"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/XDPoS/utils"
+ "github.com/ethereum/go-ethereum/contracts/blocksigner"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+var (
+ acc1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a")
+ acc2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee")
+ acc3Key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ acc4Key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee04aefe388d1e14474d32c45c72ce7b7a")
+ acc1Addr = crypto.PubkeyToAddress(acc1Key.PublicKey)
+ acc2Addr = crypto.PubkeyToAddress(acc2Key.PublicKey)
+ acc3Addr = crypto.PubkeyToAddress(acc3Key.PublicKey)
+ acc4Addr = crypto.PubkeyToAddress(acc4Key.PublicKey)
+)
+
+func getCommonBackend() *backends.SimulatedBackend {
+ genesis := types.GenesisAlloc{acc1Addr: {Balance: big.NewInt(1000000000000)}}
+ backend := backends.NewXDCSimulatedBackend(genesis, 10000000, params.TestXDPoSMockChainConfig)
+ backend.Commit()
+
+ return backend
+}
+
+func TestSendTxSign(t *testing.T) {
+ accounts := []common.Address{acc2Addr, acc3Addr, acc4Addr}
+ keys := []*ecdsa.PrivateKey{acc2Key, acc3Key, acc4Key}
+ backend := getCommonBackend()
+ signer := types.HomesteadSigner{}
+ ctx := context.Background()
+
+ transactOpts := bind.NewKeyedTransactor(acc1Key)
+ blockSignerAddr, blockSigner, err := blocksigner.DeployBlockSigner(transactOpts, backend, big.NewInt(99))
+ if err != nil {
+ t.Fatalf("Can't get block signer: %v", err)
+ }
+ backend.Commit()
+
+ nonces := make(map[*ecdsa.PrivateKey]int)
+ oldBlocks := make(map[common.Hash]common.Address)
+
+ signTx := func(ctx context.Context, backend *backends.SimulatedBackend, signer types.HomesteadSigner, nonces map[*ecdsa.PrivateKey]int, accKey *ecdsa.PrivateKey, blockNumber *big.Int, blockHash common.Hash) *types.Transaction {
+ tx, _ := types.SignTx(CreateTxSign(blockNumber, blockHash, uint64(nonces[accKey]), blockSignerAddr), signer, accKey)
+ backend.SendTransaction(ctx, tx)
+ backend.Commit()
+ nonces[accKey]++
+
+ return tx
+ }
+
+ // Tx sign for signer.
+ signCount := int64(0)
+ blockHashes := make([]common.Hash, 10)
+ for i := int64(0); i < 10; i++ {
+ blockHash := randomHash()
+ blockHashes[i] = blockHash
+ randIndex := rand.Intn(len(keys))
+ accKey := keys[randIndex]
+ signTx(ctx, backend, signer, nonces, accKey, new(big.Int).SetInt64(i), blockHash)
+ oldBlocks[blockHash] = accounts[randIndex]
+ signCount++
+
+ // Tx sign for validators.
+ for _, key := range keys {
+ if key != accKey {
+ signTx(ctx, backend, signer, nonces, key, new(big.Int).SetInt64(i), blockHash)
+ signCount++
+ }
+ }
+ }
+
+ for _, blockHash := range blockHashes {
+ signers, err := blockSigner.GetSigners(blockHash)
+ if err != nil {
+ t.Fatalf("Can't get signers: %v", err)
+ }
+
+ if signers[0] != oldBlocks[blockHash] {
+ t.Errorf("Tx sign for block signer not match %v - %v", signers[0].String(), oldBlocks[blockHash].String())
+ }
+
+ if len(signers) != len(keys) {
+ t.Error("Tx sign for block validators not match")
+ }
+ }
+}
+
+// Generate random string.
+func randomHash() common.Hash {
+ letterBytes := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
+ var b common.Hash
+ for i := range b {
+ rand.Seed(time.Now().UnixNano())
+ b[i] = letterBytes[rand.Intn(len(letterBytes))]
+ }
+ return b
+}
+
+// Unit test for get random position of masternodes.
+func TestRandomMasterNode(t *testing.T) {
+ oldSlice := NewSlice(0, 10, 1)
+ newSlice := Shuffle(oldSlice)
+ for _, newNumber := range newSlice {
+ for i, oldNumber := range oldSlice {
+ if oldNumber == newNumber {
+ // Delete find element.
+ oldSlice = append(oldSlice[:i], oldSlice[i+1:]...)
+ }
+ }
+ }
+ if len(oldSlice) != 0 {
+ t.Errorf("Test generate random masternode fail %v - %v", oldSlice, newSlice)
+ }
+}
+
+func TestEncryptDecrypt(t *testing.T) {
+ //byteInteger := common.LeftPadBytes([]byte(new(big.Int).SetInt64(4).String()), 32)
+ randomByte := RandStringByte(32)
+ encrypt := Encrypt(randomByte, new(big.Int).SetInt64(4).String())
+ decrypt := Decrypt(randomByte, encrypt)
+ t.Log("Encrypt", encrypt, "Test", string(randomByte), "Decrypt", decrypt, "trim", string(bytes.TrimLeft([]byte(decrypt), "\x00")))
+}
+
+func isArrayEqual(a [][]int64, b [][]int64) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i, vs := range a {
+ for j, v := range vs {
+ if v != b[i][j] {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// Unit test for
+func TestGenM2FromRandomize(t *testing.T) {
+ var a []int64
+ for i := 0; i <= 10; i++ {
+ rand.Seed(time.Now().UTC().UnixNano())
+ a = append(a, int64(rand.Intn(9999)))
+ }
+ b, err := GenM2FromRandomize(a, common.MaxMasternodes)
+ t.Log("randomize", b, "len", len(b))
+ if err != nil {
+ t.Error("Fail to test gen m2 for randomize.", err)
+ }
+ // Test Permutation Without Fixed-point.
+ M1List := NewSlice(int64(0), common.MaxMasternodes, 1)
+ for i, m1 := range M1List {
+ if m1 == b[i] {
+ t.Errorf("Error check Permutation Without Fixed-point %v - %v - %v", i, b[i], a)
+ }
+ }
+}
+
+// Unit test for validator m2.
+func TestBuildValidatorFromM2(t *testing.T) {
+ a := []int64{84, 58, 27, 96, 127, 60, 136, 20, 121, 31, 87, 85, 40, 120, 149, 109, 141, 145, 11, 110, 147, 35, 76, 46, 34, 108, 72, 103, 102, 12, 23, 47, 70, 86, 125, 112, 128, 13, 130, 98, 126, 62, 132, 111, 134, 6, 106, 67, 24, 91, 101, 50, 94, 43, 77, 73, 129, 71, 51, 10, 92, 29, 80, 95, 33, 100, 124, 75, 38, 133, 79, 83, 61, 36, 122, 99, 16, 28, 18, 116, 140, 97, 119, 82, 148, 48, 56, 32, 93, 107, 69, 68, 123, 81, 22, 137, 25, 115, 44, 8, 42, 131, 143, 17, 55, 89, 9, 15, 19, 59, 146, 54, 5, 30, 41, 144, 117, 1, 104, 49, 105, 45, 88, 78, 74, 135, 0, 21, 57, 3, 66, 52, 63, 138, 4, 114, 37, 118, 14, 2, 26, 7, 65, 139, 39, 64, 90, 142, 53, 113}
+ b := BuildValidatorFromM2(a)
+ c := utils.ExtractValidatorsFromBytes(b)
+ if !isArrayEqual([][]int64{a}, [][]int64{c}) {
+ t.Errorf("Fail to get m2 result %v", b)
+ }
+}
+
+// Unit test for decode validator string data.
+func TestDecodeValidatorsHexData(t *testing.T) {
+ a := "0x000000310000003000000032000000310000003000000032000000310000003000000032000000310000003000000031000000320000003000000031000000320000003000000031000000320000003000000030000000310000003200000030000000310000003200000030000000310000003200000030000000300000003100000032000000300000003100000032000000300000003100000032000000300000003200000030000000310000003200000030000000310000003200000030000000310000003000000030"
+ b, err := DecodeValidatorsHexData(a)
+ if err != nil {
+ t.Error("Fail to decode validator from hex string", err)
+ }
+ c := []int64{1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 2, 0, 1, 2, 0, 1, 2, 0, 1, 0, 0}
+ if !isArrayEqual([][]int64{b}, [][]int64{c}) {
+ t.Errorf("Fail to get m2 result %v", b)
+ }
+ t.Log("b", b)
+}
diff --git a/contracts/validator/contract/validator.go b/contracts/validator/contract/validator.go
new file mode 100644
index 0000000000..ff1a6db421
--- /dev/null
+++ b/contracts/validator/contract/validator.go
@@ -0,0 +1,2050 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package contract
+
+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"
+)
+
+// SafeMathABI is the input ABI used to generate the binding from.
+const SafeMathABI = "[]"
+
+// SafeMathBin is the compiled bytecode used for deploying new contracts.
+const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146060604052600080fd00a165627a7a72305820b9407d48ebc7efee5c9f08b3b3a957df2939281f5913225e8c1291f069b900490029`
+
+// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it.
+func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// SafeMath is an auto generated Go binding around an Ethereum contract.
+type SafeMath struct {
+ SafeMathCaller // Read-only binding to the contract
+ SafeMathTransactor // Write-only binding to the contract
+ SafeMathFilterer // Log filterer for contract events
+}
+
+// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract.
+type SafeMathCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type SafeMathTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type SafeMathFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// SafeMathSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type SafeMathSession struct {
+ Contract *SafeMath // 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
+}
+
+// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type SafeMathCallerSession struct {
+ Contract *SafeMathCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type SafeMathTransactorSession struct {
+ Contract *SafeMathTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract.
+type SafeMathRaw struct {
+ Contract *SafeMath // Generic contract binding to access the raw methods on
+}
+
+// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type SafeMathCallerRaw struct {
+ Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type SafeMathTransactorRaw struct {
+ Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) {
+ contract, err := bindSafeMath(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
+}
+
+// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) {
+ contract, err := bindSafeMath(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathCaller{contract: contract}, nil
+}
+
+// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) {
+ contract, err := bindSafeMath(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathTransactor{contract: contract}, nil
+}
+
+// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract.
+func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) {
+ contract, err := bindSafeMath(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &SafeMathFilterer{contract: contract}, nil
+}
+
+// bindSafeMath binds a generic wrapper to an already deployed contract.
+func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
+ 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 (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.Contract.SafeMathCaller.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 (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.SafeMathTransactor.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 (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _SafeMath.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 (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _SafeMath.Contract.contract.Transact(opts, method, params...)
+}
+
+// XDCValidatorABI is the input ABI used to generate the binding from.
+const XDCValidatorABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"propose\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"unvote\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getCandidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ownerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasVotedInvalid\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"}],\"name\":\"getWithdrawCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ownerToCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getVoters\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWithdrawBlockNumbers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getLatestKYC\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"candidates\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"invalidPercent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"KYCString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"invalidKYCCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"voterWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"getCandidateOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"getHashCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maxValidatorNumber\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"candidateWithdrawDelay\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"isCandidate\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minCandidateCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwnerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_invalidCandidate\",\"type\":\"address\"}],\"name\":\"voteInvalidKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"kychash\",\"type\":\"string\"}],\"name\":\"uploadKYC\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minVoterCap\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_candidates\",\"type\":\"address[]\"},{\"name\":\"_caps\",\"type\":\"uint256[]\"},{\"name\":\"_firstOwner\",\"type\":\"address\"},{\"name\":\"_minCandidateCap\",\"type\":\"uint256\"},{\"name\":\"_minVoterCap\",\"type\":\"uint256\"},{\"name\":\"_maxValidatorNumber\",\"type\":\"uint256\"},{\"name\":\"_candidateWithdrawDelay\",\"type\":\"uint256\"},{\"name\":\"_voterWithdrawDelay\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Vote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_voter\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Unvote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Propose\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_candidate\",\"type\":\"address\"}],\"name\":\"Resign\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"_cap\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"kycHash\",\"type\":\"string\"}],\"name\":\"UploadedKYC\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_masternodeOwner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_masternodes\",\"type\":\"address[]\"}],\"name\":\"InvalidatedNode\",\"type\":\"event\"}]"
+
+// XDCValidatorBin is the compiled bytecode used for deploying new contracts.
+const XDCValidatorBin = `606060405260006009556000600a5534156200001a57600080fd5b60405162003dcc38038062003dcc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050600085600b8190555084600c8190555083600d8190555082600e8190555081600f81905550885160098190555060078054806001018281620000bd9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a60008154809291906001019190505550600090505b8851811015620004e25760088054806001018281620001439190620004f1565b916000526020600020900160008b848151811015156200015f57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052808873ffffffffffffffffffffffffffffffffffffffff1681526020016001151581526020018983815181101515620001ea57fe5b90602001906020020151815250600160008b848151811015156200020a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050600260008a83815181101515620002d557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816200032d9190620004f1565b9160005260206000209001600089909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281620003cf9190620004f1565b916000526020600020900160008b84815181101515620003eb57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600b54600160008b848151811015156200044c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808060010191505062000123565b50505050505050505062000548565b8154818355818115116200051b578183600052602060002091820191016200051a919062000520565b5b505050565b6200054591905b808211156200054157600081600090555060010162000527565b5090565b90565b61387480620005586000396000f300606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029`
+
+// DeployXDCValidator deploys a new Ethereum contract, binding an instance of XDCValidator to it.
+func DeployXDCValidator(auth *bind.TransactOpts, backend bind.ContractBackend, _candidates []common.Address, _caps []*big.Int, _firstOwner common.Address, _minCandidateCap *big.Int, _minVoterCap *big.Int, _maxValidatorNumber *big.Int, _candidateWithdrawDelay *big.Int, _voterWithdrawDelay *big.Int) (common.Address, *types.Transaction, *XDCValidator, error) {
+ parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI))
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(XDCValidatorBin), backend, _candidates, _caps, _firstOwner, _minCandidateCap, _minVoterCap, _maxValidatorNumber, _candidateWithdrawDelay, _voterWithdrawDelay)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil
+}
+
+// XDCValidator is an auto generated Go binding around an Ethereum contract.
+type XDCValidator struct {
+ XDCValidatorCaller // Read-only binding to the contract
+ XDCValidatorTransactor // Write-only binding to the contract
+ XDCValidatorFilterer // Log filterer for contract events
+}
+
+// XDCValidatorCaller is an auto generated read-only Go binding around an Ethereum contract.
+type XDCValidatorCaller struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCValidatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
+type XDCValidatorTransactor struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCValidatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
+type XDCValidatorFilterer struct {
+ contract *bind.BoundContract // Generic contract wrapper for the low level calls
+}
+
+// XDCValidatorSession is an auto generated Go binding around an Ethereum contract,
+// with pre-set call and transact options.
+type XDCValidatorSession struct {
+ Contract *XDCValidator // 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
+}
+
+// XDCValidatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
+// with pre-set call options.
+type XDCValidatorCallerSession struct {
+ Contract *XDCValidatorCaller // Generic contract caller binding to set the session for
+ CallOpts bind.CallOpts // Call options to use throughout this session
+}
+
+// XDCValidatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
+// with pre-set transact options.
+type XDCValidatorTransactorSession struct {
+ Contract *XDCValidatorTransactor // Generic contract transactor binding to set the session for
+ TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
+}
+
+// XDCValidatorRaw is an auto generated low-level Go binding around an Ethereum contract.
+type XDCValidatorRaw struct {
+ Contract *XDCValidator // Generic contract binding to access the raw methods on
+}
+
+// XDCValidatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
+type XDCValidatorCallerRaw struct {
+ Contract *XDCValidatorCaller // Generic read-only contract binding to access the raw methods on
+}
+
+// XDCValidatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
+type XDCValidatorTransactorRaw struct {
+ Contract *XDCValidatorTransactor // Generic write-only contract binding to access the raw methods on
+}
+
+// NewXDCValidator creates a new instance of XDCValidator, bound to a specific deployed contract.
+func NewXDCValidator(address common.Address, backend bind.ContractBackend) (*XDCValidator, error) {
+ contract, err := bindXDCValidator(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidator{XDCValidatorCaller: XDCValidatorCaller{contract: contract}, XDCValidatorTransactor: XDCValidatorTransactor{contract: contract}, XDCValidatorFilterer: XDCValidatorFilterer{contract: contract}}, nil
+}
+
+// NewXDCValidatorCaller creates a new read-only instance of XDCValidator, bound to a specific deployed contract.
+func NewXDCValidatorCaller(address common.Address, caller bind.ContractCaller) (*XDCValidatorCaller, error) {
+ contract, err := bindXDCValidator(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorCaller{contract: contract}, nil
+}
+
+// NewXDCValidatorTransactor creates a new write-only instance of XDCValidator, bound to a specific deployed contract.
+func NewXDCValidatorTransactor(address common.Address, transactor bind.ContractTransactor) (*XDCValidatorTransactor, error) {
+ contract, err := bindXDCValidator(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorTransactor{contract: contract}, nil
+}
+
+// NewXDCValidatorFilterer creates a new log filterer instance of XDCValidator, bound to a specific deployed contract.
+func NewXDCValidatorFilterer(address common.Address, filterer bind.ContractFilterer) (*XDCValidatorFilterer, error) {
+ contract, err := bindXDCValidator(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorFilterer{contract: contract}, nil
+}
+
+// bindXDCValidator binds a generic wrapper to an already deployed contract.
+func bindXDCValidator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := abi.JSON(strings.NewReader(XDCValidatorABI))
+ 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 (_XDCValidator *XDCValidatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _XDCValidator.Contract.XDCValidatorCaller.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 (_XDCValidator *XDCValidatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _XDCValidator.Contract.XDCValidatorTransactor.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_XDCValidator *XDCValidatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _XDCValidator.Contract.XDCValidatorTransactor.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 (_XDCValidator *XDCValidatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _XDCValidator.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 (_XDCValidator *XDCValidatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _XDCValidator.Contract.contract.Transfer(opts)
+}
+
+// Transact invokes the (paid) contract method with params as input values.
+func (_XDCValidator *XDCValidatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _XDCValidator.Contract.contract.Transact(opts, method, params...)
+}
+
+// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc.
+//
+// Solidity: function KYCString( address, uint256) constant returns(string)
+func (_XDCValidator *XDCValidatorCaller) KYCString(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "KYCString", arg0, arg1)
+ return *ret0, err
+}
+
+// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc.
+//
+// Solidity: function KYCString( address, uint256) constant returns(string)
+func (_XDCValidator *XDCValidatorSession) KYCString(arg0 common.Address, arg1 *big.Int) (string, error) {
+ return _XDCValidator.Contract.KYCString(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// KYCString is a free data retrieval call binding the contract method 0x5b9cd8cc.
+//
+// Solidity: function KYCString( address, uint256) constant returns(string)
+func (_XDCValidator *XDCValidatorCallerSession) KYCString(arg0 common.Address, arg1 *big.Int) (string, error) {
+ return _XDCValidator.Contract.KYCString(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3.
+//
+// Solidity: function candidateCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) CandidateCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "candidateCount")
+ return *ret0, err
+}
+
+// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3.
+//
+// Solidity: function candidateCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) CandidateCount() (*big.Int, error) {
+ return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts)
+}
+
+// CandidateCount is a free data retrieval call binding the contract method 0xa9a981a3.
+//
+// Solidity: function candidateCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) CandidateCount() (*big.Int, error) {
+ return _XDCValidator.Contract.CandidateCount(&_XDCValidator.CallOpts)
+}
+
+// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767.
+//
+// Solidity: function candidateWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) CandidateWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "candidateWithdrawDelay")
+ return *ret0, err
+}
+
+// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767.
+//
+// Solidity: function candidateWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) CandidateWithdrawDelay() (*big.Int, error) {
+ return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts)
+}
+
+// CandidateWithdrawDelay is a free data retrieval call binding the contract method 0xd161c767.
+//
+// Solidity: function candidateWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) CandidateWithdrawDelay() (*big.Int, error) {
+ return _XDCValidator.Contract.CandidateWithdrawDelay(&_XDCValidator.CallOpts)
+}
+
+// Candidates is a free data retrieval call binding the contract method 0x3477ee2e.
+//
+// Solidity: function candidates( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCaller) Candidates(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "candidates", arg0)
+ return *ret0, err
+}
+
+// Candidates is a free data retrieval call binding the contract method 0x3477ee2e.
+//
+// Solidity: function candidates( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorSession) Candidates(arg0 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0)
+}
+
+// Candidates is a free data retrieval call binding the contract method 0x3477ee2e.
+//
+// Solidity: function candidates( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCallerSession) Candidates(arg0 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.Candidates(&_XDCValidator.CallOpts, arg0)
+}
+
+// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f.
+//
+// Solidity: function getCandidateCap(_candidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) GetCandidateCap(opts *bind.CallOpts, _candidate common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getCandidateCap", _candidate)
+ return *ret0, err
+}
+
+// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f.
+//
+// Solidity: function getCandidateCap(_candidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetCandidateCap is a free data retrieval call binding the contract method 0x58e7525f.
+//
+// Solidity: function getCandidateCap(_candidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) GetCandidateCap(_candidate common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetCandidateCap(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd.
+//
+// Solidity: function getCandidateOwner(_candidate address) constant returns(address)
+func (_XDCValidator *XDCValidatorCaller) GetCandidateOwner(opts *bind.CallOpts, _candidate common.Address) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getCandidateOwner", _candidate)
+ return *ret0, err
+}
+
+// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd.
+//
+// Solidity: function getCandidateOwner(_candidate address) constant returns(address)
+func (_XDCValidator *XDCValidatorSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) {
+ return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetCandidateOwner is a free data retrieval call binding the contract method 0xb642facd.
+//
+// Solidity: function getCandidateOwner(_candidate address) constant returns(address)
+func (_XDCValidator *XDCValidatorCallerSession) GetCandidateOwner(_candidate common.Address) (common.Address, error) {
+ return _XDCValidator.Contract.GetCandidateOwner(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce.
+//
+// Solidity: function getCandidates() constant returns(address[])
+func (_XDCValidator *XDCValidatorCaller) GetCandidates(opts *bind.CallOpts) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getCandidates")
+ return *ret0, err
+}
+
+// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce.
+//
+// Solidity: function getCandidates() constant returns(address[])
+func (_XDCValidator *XDCValidatorSession) GetCandidates() ([]common.Address, error) {
+ return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts)
+}
+
+// GetCandidates is a free data retrieval call binding the contract method 0x06a49fce.
+//
+// Solidity: function getCandidates() constant returns(address[])
+func (_XDCValidator *XDCValidatorCallerSession) GetCandidates() ([]common.Address, error) {
+ return _XDCValidator.Contract.GetCandidates(&_XDCValidator.CallOpts)
+}
+
+// GetHashCount is a free data retrieval call binding the contract method 0xc45607df.
+//
+// Solidity: function getHashCount(_address address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) GetHashCount(opts *bind.CallOpts, _address common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getHashCount", _address)
+ return *ret0, err
+}
+
+// GetHashCount is a free data retrieval call binding the contract method 0xc45607df.
+//
+// Solidity: function getHashCount(_address address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) GetHashCount(_address common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address)
+}
+
+// GetHashCount is a free data retrieval call binding the contract method 0xc45607df.
+//
+// Solidity: function getHashCount(_address address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) GetHashCount(_address common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetHashCount(&_XDCValidator.CallOpts, _address)
+}
+
+// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652.
+//
+// Solidity: function getLatestKYC(_address address) constant returns(string)
+func (_XDCValidator *XDCValidatorCaller) GetLatestKYC(opts *bind.CallOpts, _address common.Address) (string, error) {
+ var (
+ ret0 = new(string)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getLatestKYC", _address)
+ return *ret0, err
+}
+
+// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652.
+//
+// Solidity: function getLatestKYC(_address address) constant returns(string)
+func (_XDCValidator *XDCValidatorSession) GetLatestKYC(_address common.Address) (string, error) {
+ return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address)
+}
+
+// GetLatestKYC is a free data retrieval call binding the contract method 0x32658652.
+//
+// Solidity: function getLatestKYC(_address address) constant returns(string)
+func (_XDCValidator *XDCValidatorCallerSession) GetLatestKYC(_address common.Address) (string, error) {
+ return _XDCValidator.Contract.GetLatestKYC(&_XDCValidator.CallOpts, _address)
+}
+
+// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a.
+//
+// Solidity: function getOwnerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) GetOwnerCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getOwnerCount")
+ return *ret0, err
+}
+
+// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a.
+//
+// Solidity: function getOwnerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) GetOwnerCount() (*big.Int, error) {
+ return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts)
+}
+
+// GetOwnerCount is a free data retrieval call binding the contract method 0xef18374a.
+//
+// Solidity: function getOwnerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) GetOwnerCount() (*big.Int, error) {
+ return _XDCValidator.Contract.GetOwnerCount(&_XDCValidator.CallOpts)
+}
+
+// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872.
+//
+// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) GetVoterCap(opts *bind.CallOpts, _candidate common.Address, _voter common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getVoterCap", _candidate, _voter)
+ return *ret0, err
+}
+
+// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872.
+//
+// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter)
+}
+
+// GetVoterCap is a free data retrieval call binding the contract method 0x302b6872.
+//
+// Solidity: function getVoterCap(_candidate address, _voter address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) GetVoterCap(_candidate common.Address, _voter common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.GetVoterCap(&_XDCValidator.CallOpts, _candidate, _voter)
+}
+
+// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04.
+//
+// Solidity: function getVoters(_candidate address) constant returns(address[])
+func (_XDCValidator *XDCValidatorCaller) GetVoters(opts *bind.CallOpts, _candidate common.Address) ([]common.Address, error) {
+ var (
+ ret0 = new([]common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getVoters", _candidate)
+ return *ret0, err
+}
+
+// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04.
+//
+// Solidity: function getVoters(_candidate address) constant returns(address[])
+func (_XDCValidator *XDCValidatorSession) GetVoters(_candidate common.Address) ([]common.Address, error) {
+ return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetVoters is a free data retrieval call binding the contract method 0x2d15cc04.
+//
+// Solidity: function getVoters(_candidate address) constant returns(address[])
+func (_XDCValidator *XDCValidatorCallerSession) GetVoters(_candidate common.Address) ([]common.Address, error) {
+ return _XDCValidator.Contract.GetVoters(&_XDCValidator.CallOpts, _candidate)
+}
+
+// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba.
+//
+// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[])
+func (_XDCValidator *XDCValidatorCaller) GetWithdrawBlockNumbers(opts *bind.CallOpts) ([]*big.Int, error) {
+ var (
+ ret0 = new([]*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getWithdrawBlockNumbers")
+ return *ret0, err
+}
+
+// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba.
+//
+// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[])
+func (_XDCValidator *XDCValidatorSession) GetWithdrawBlockNumbers() ([]*big.Int, error) {
+ return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts)
+}
+
+// GetWithdrawBlockNumbers is a free data retrieval call binding the contract method 0x2f9c4bba.
+//
+// Solidity: function getWithdrawBlockNumbers() constant returns(uint256[])
+func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawBlockNumbers() ([]*big.Int, error) {
+ return _XDCValidator.Contract.GetWithdrawBlockNumbers(&_XDCValidator.CallOpts)
+}
+
+// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68.
+//
+// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) GetWithdrawCap(opts *bind.CallOpts, _blockNumber *big.Int) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "getWithdrawCap", _blockNumber)
+ return *ret0, err
+}
+
+// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68.
+//
+// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) {
+ return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber)
+}
+
+// GetWithdrawCap is a free data retrieval call binding the contract method 0x15febd68.
+//
+// Solidity: function getWithdrawCap(_blockNumber uint256) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) GetWithdrawCap(_blockNumber *big.Int) (*big.Int, error) {
+ return _XDCValidator.Contract.GetWithdrawCap(&_XDCValidator.CallOpts, _blockNumber)
+}
+
+// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8.
+//
+// Solidity: function hasVotedInvalid( address, address) constant returns(bool)
+func (_XDCValidator *XDCValidatorCaller) HasVotedInvalid(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "hasVotedInvalid", arg0, arg1)
+ return *ret0, err
+}
+
+// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8.
+//
+// Solidity: function hasVotedInvalid( address, address) constant returns(bool)
+func (_XDCValidator *XDCValidatorSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) {
+ return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// HasVotedInvalid is a free data retrieval call binding the contract method 0x0e3e4fb8.
+//
+// Solidity: function hasVotedInvalid( address, address) constant returns(bool)
+func (_XDCValidator *XDCValidatorCallerSession) HasVotedInvalid(arg0 common.Address, arg1 common.Address) (bool, error) {
+ return _XDCValidator.Contract.HasVotedInvalid(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38.
+//
+// Solidity: function invalidKYCCount( address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) InvalidKYCCount(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "invalidKYCCount", arg0)
+ return *ret0, err
+}
+
+// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38.
+//
+// Solidity: function invalidKYCCount( address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0)
+}
+
+// InvalidKYCCount is a free data retrieval call binding the contract method 0x72e44a38.
+//
+// Solidity: function invalidKYCCount( address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) InvalidKYCCount(arg0 common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.InvalidKYCCount(&_XDCValidator.CallOpts, arg0)
+}
+
+// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27.
+//
+// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) InvalidPercent(opts *bind.CallOpts, _invalidCandidate common.Address) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "invalidPercent", _invalidCandidate)
+ return *ret0, err
+}
+
+// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27.
+//
+// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate)
+}
+
+// InvalidPercent is a free data retrieval call binding the contract method 0x5b860d27.
+//
+// Solidity: function invalidPercent(_invalidCandidate address) constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) InvalidPercent(_invalidCandidate common.Address) (*big.Int, error) {
+ return _XDCValidator.Contract.InvalidPercent(&_XDCValidator.CallOpts, _invalidCandidate)
+}
+
+// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93.
+//
+// Solidity: function isCandidate(_candidate address) constant returns(bool)
+func (_XDCValidator *XDCValidatorCaller) IsCandidate(opts *bind.CallOpts, _candidate common.Address) (bool, error) {
+ var (
+ ret0 = new(bool)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "isCandidate", _candidate)
+ return *ret0, err
+}
+
+// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93.
+//
+// Solidity: function isCandidate(_candidate address) constant returns(bool)
+func (_XDCValidator *XDCValidatorSession) IsCandidate(_candidate common.Address) (bool, error) {
+ return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate)
+}
+
+// IsCandidate is a free data retrieval call binding the contract method 0xd51b9e93.
+//
+// Solidity: function isCandidate(_candidate address) constant returns(bool)
+func (_XDCValidator *XDCValidatorCallerSession) IsCandidate(_candidate common.Address) (bool, error) {
+ return _XDCValidator.Contract.IsCandidate(&_XDCValidator.CallOpts, _candidate)
+}
+
+// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4.
+//
+// Solidity: function maxValidatorNumber() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) MaxValidatorNumber(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "maxValidatorNumber")
+ return *ret0, err
+}
+
+// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4.
+//
+// Solidity: function maxValidatorNumber() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) MaxValidatorNumber() (*big.Int, error) {
+ return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts)
+}
+
+// MaxValidatorNumber is a free data retrieval call binding the contract method 0xd09f1ab4.
+//
+// Solidity: function maxValidatorNumber() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) MaxValidatorNumber() (*big.Int, error) {
+ return _XDCValidator.Contract.MaxValidatorNumber(&_XDCValidator.CallOpts)
+}
+
+// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff.
+//
+// Solidity: function minCandidateCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) MinCandidateCap(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "minCandidateCap")
+ return *ret0, err
+}
+
+// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff.
+//
+// Solidity: function minCandidateCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) MinCandidateCap() (*big.Int, error) {
+ return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts)
+}
+
+// MinCandidateCap is a free data retrieval call binding the contract method 0xd55b7dff.
+//
+// Solidity: function minCandidateCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) MinCandidateCap() (*big.Int, error) {
+ return _XDCValidator.Contract.MinCandidateCap(&_XDCValidator.CallOpts)
+}
+
+// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5.
+//
+// Solidity: function minVoterCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) MinVoterCap(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "minVoterCap")
+ return *ret0, err
+}
+
+// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5.
+//
+// Solidity: function minVoterCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) MinVoterCap() (*big.Int, error) {
+ return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts)
+}
+
+// MinVoterCap is a free data retrieval call binding the contract method 0xf8ac9dd5.
+//
+// Solidity: function minVoterCap() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) MinVoterCap() (*big.Int, error) {
+ return _XDCValidator.Contract.MinVoterCap(&_XDCValidator.CallOpts)
+}
+
+// OwnerCount is a free data retrieval call binding the contract method 0x0db02622.
+//
+// Solidity: function ownerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) OwnerCount(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "ownerCount")
+ return *ret0, err
+}
+
+// OwnerCount is a free data retrieval call binding the contract method 0x0db02622.
+//
+// Solidity: function ownerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) OwnerCount() (*big.Int, error) {
+ return _XDCValidator.Contract.OwnerCount(&_XDCValidator.CallOpts)
+}
+
+// OwnerCount is a free data retrieval call binding the contract method 0x0db02622.
+//
+// Solidity: function ownerCount() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) OwnerCount() (*big.Int, error) {
+ return _XDCValidator.Contract.OwnerCount(&_XDCValidator.CallOpts)
+}
+
+// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1.
+//
+// Solidity: function ownerToCandidate( address, uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCaller) OwnerToCandidate(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "ownerToCandidate", arg0, arg1)
+ return *ret0, err
+}
+
+// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1.
+//
+// Solidity: function ownerToCandidate( address, uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// OwnerToCandidate is a free data retrieval call binding the contract method 0x2a3640b1.
+//
+// Solidity: function ownerToCandidate( address, uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCallerSession) OwnerToCandidate(arg0 common.Address, arg1 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.OwnerToCandidate(&_XDCValidator.CallOpts, arg0, arg1)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCaller) Owners(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
+ var (
+ ret0 = new(common.Address)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "owners", arg0)
+ return *ret0, err
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorSession) Owners(arg0 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0)
+}
+
+// Owners is a free data retrieval call binding the contract method 0x025e7c27.
+//
+// Solidity: function owners( uint256) constant returns(address)
+func (_XDCValidator *XDCValidatorCallerSession) Owners(arg0 *big.Int) (common.Address, error) {
+ return _XDCValidator.Contract.Owners(&_XDCValidator.CallOpts, arg0)
+}
+
+// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e.
+//
+// Solidity: function voterWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCaller) VoterWithdrawDelay(opts *bind.CallOpts) (*big.Int, error) {
+ var (
+ ret0 = new(*big.Int)
+ )
+ out := &[]interface{}{
+ ret0,
+ }
+ err := _XDCValidator.contract.Call(opts, out, "voterWithdrawDelay")
+ return *ret0, err
+}
+
+// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e.
+//
+// Solidity: function voterWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorSession) VoterWithdrawDelay() (*big.Int, error) {
+ return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts)
+}
+
+// VoterWithdrawDelay is a free data retrieval call binding the contract method 0xa9ff959e.
+//
+// Solidity: function voterWithdrawDelay() constant returns(uint256)
+func (_XDCValidator *XDCValidatorCallerSession) VoterWithdrawDelay() (*big.Int, error) {
+ return _XDCValidator.Contract.VoterWithdrawDelay(&_XDCValidator.CallOpts)
+}
+
+// Propose is a paid mutator transaction binding the contract method 0x01267951.
+//
+// Solidity: function propose(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactor) Propose(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "propose", _candidate)
+}
+
+// Propose is a paid mutator transaction binding the contract method 0x01267951.
+//
+// Solidity: function propose(_candidate address) returns()
+func (_XDCValidator *XDCValidatorSession) Propose(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// Propose is a paid mutator transaction binding the contract method 0x01267951.
+//
+// Solidity: function propose(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) Propose(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Propose(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactor) Resign(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "resign", _candidate)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(_candidate address) returns()
+func (_XDCValidator *XDCValidatorSession) Resign(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
+//
+// Solidity: function resign(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) Resign(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Resign(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2.
+//
+// Solidity: function unvote(_candidate address, _cap uint256) returns()
+func (_XDCValidator *XDCValidatorTransactor) Unvote(opts *bind.TransactOpts, _candidate common.Address, _cap *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "unvote", _candidate, _cap)
+}
+
+// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2.
+//
+// Solidity: function unvote(_candidate address, _cap uint256) returns()
+func (_XDCValidator *XDCValidatorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap)
+}
+
+// Unvote is a paid mutator transaction binding the contract method 0x02aa9be2.
+//
+// Solidity: function unvote(_candidate address, _cap uint256) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) Unvote(_candidate common.Address, _cap *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Unvote(&_XDCValidator.TransactOpts, _candidate, _cap)
+}
+
+// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125.
+//
+// Solidity: function uploadKYC(kychash string) returns()
+func (_XDCValidator *XDCValidatorTransactor) UploadKYC(opts *bind.TransactOpts, kychash string) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "uploadKYC", kychash)
+}
+
+// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125.
+//
+// Solidity: function uploadKYC(kychash string) returns()
+func (_XDCValidator *XDCValidatorSession) UploadKYC(kychash string) (*types.Transaction, error) {
+ return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash)
+}
+
+// UploadKYC is a paid mutator transaction binding the contract method 0xf5c95125.
+//
+// Solidity: function uploadKYC(kychash string) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) UploadKYC(kychash string) (*types.Transaction, error) {
+ return _XDCValidator.Contract.UploadKYC(&_XDCValidator.TransactOpts, kychash)
+}
+
+// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea.
+//
+// Solidity: function vote(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactor) Vote(opts *bind.TransactOpts, _candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "vote", _candidate)
+}
+
+// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea.
+//
+// Solidity: function vote(_candidate address) returns()
+func (_XDCValidator *XDCValidatorSession) Vote(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// Vote is a paid mutator transaction binding the contract method 0x6dd7d8ea.
+//
+// Solidity: function vote(_candidate address) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) Vote(_candidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Vote(&_XDCValidator.TransactOpts, _candidate)
+}
+
+// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d.
+//
+// Solidity: function voteInvalidKYC(_invalidCandidate address) returns()
+func (_XDCValidator *XDCValidatorTransactor) VoteInvalidKYC(opts *bind.TransactOpts, _invalidCandidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "voteInvalidKYC", _invalidCandidate)
+}
+
+// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d.
+//
+// Solidity: function voteInvalidKYC(_invalidCandidate address) returns()
+func (_XDCValidator *XDCValidatorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate)
+}
+
+// VoteInvalidKYC is a paid mutator transaction binding the contract method 0xf2ee3c7d.
+//
+// Solidity: function voteInvalidKYC(_invalidCandidate address) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) VoteInvalidKYC(_invalidCandidate common.Address) (*types.Transaction, error) {
+ return _XDCValidator.Contract.VoteInvalidKYC(&_XDCValidator.TransactOpts, _invalidCandidate)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70.
+//
+// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns()
+func (_XDCValidator *XDCValidatorTransactor) Withdraw(opts *bind.TransactOpts, _blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.contract.Transact(opts, "withdraw", _blockNumber, _index)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70.
+//
+// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns()
+func (_XDCValidator *XDCValidatorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index)
+}
+
+// Withdraw is a paid mutator transaction binding the contract method 0x441a3e70.
+//
+// Solidity: function withdraw(_blockNumber uint256, _index uint256) returns()
+func (_XDCValidator *XDCValidatorTransactorSession) Withdraw(_blockNumber *big.Int, _index *big.Int) (*types.Transaction, error) {
+ return _XDCValidator.Contract.Withdraw(&_XDCValidator.TransactOpts, _blockNumber, _index)
+}
+
+// XDCValidatorInvalidatedNodeIterator is returned from FilterInvalidatedNode and is used to iterate over the raw logs and unpacked data for InvalidatedNode events raised by the XDCValidator contract.
+type XDCValidatorInvalidatedNodeIterator struct {
+ Event *XDCValidatorInvalidatedNode // 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 *XDCValidatorInvalidatedNodeIterator) 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(XDCValidatorInvalidatedNode)
+ 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(XDCValidatorInvalidatedNode)
+ 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 *XDCValidatorInvalidatedNodeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorInvalidatedNodeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorInvalidatedNode represents a InvalidatedNode event raised by the XDCValidator contract.
+type XDCValidatorInvalidatedNode struct {
+ MasternodeOwner common.Address
+ Masternodes []common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterInvalidatedNode is a free log retrieval operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e.
+//
+// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[])
+func (_XDCValidator *XDCValidatorFilterer) FilterInvalidatedNode(opts *bind.FilterOpts) (*XDCValidatorInvalidatedNodeIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "InvalidatedNode")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorInvalidatedNodeIterator{contract: _XDCValidator.contract, event: "InvalidatedNode", logs: logs, sub: sub}, nil
+}
+
+// WatchInvalidatedNode is a free log subscription operation binding the contract event 0xe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e.
+//
+// Solidity: event InvalidatedNode(_masternodeOwner address, _masternodes address[])
+func (_XDCValidator *XDCValidatorFilterer) WatchInvalidatedNode(opts *bind.WatchOpts, sink chan<- *XDCValidatorInvalidatedNode) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "InvalidatedNode")
+ 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(XDCValidatorInvalidatedNode)
+ if err := _XDCValidator.contract.UnpackLog(event, "InvalidatedNode", 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
+}
+
+// XDCValidatorProposeIterator is returned from FilterPropose and is used to iterate over the raw logs and unpacked data for Propose events raised by the XDCValidator contract.
+type XDCValidatorProposeIterator struct {
+ Event *XDCValidatorPropose // 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 *XDCValidatorProposeIterator) 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(XDCValidatorPropose)
+ 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(XDCValidatorPropose)
+ 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 *XDCValidatorProposeIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorProposeIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorPropose represents a Propose event raised by the XDCValidator contract.
+type XDCValidatorPropose struct {
+ Owner common.Address
+ Candidate common.Address
+ Cap *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterPropose is a free log retrieval operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1.
+//
+// Solidity: event Propose(_owner address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) FilterPropose(opts *bind.FilterOpts) (*XDCValidatorProposeIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Propose")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorProposeIterator{contract: _XDCValidator.contract, event: "Propose", logs: logs, sub: sub}, nil
+}
+
+// WatchPropose is a free log subscription operation binding the contract event 0x7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1.
+//
+// Solidity: event Propose(_owner address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) WatchPropose(opts *bind.WatchOpts, sink chan<- *XDCValidatorPropose) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Propose")
+ 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(XDCValidatorPropose)
+ if err := _XDCValidator.contract.UnpackLog(event, "Propose", 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
+}
+
+// XDCValidatorResignIterator is returned from FilterResign and is used to iterate over the raw logs and unpacked data for Resign events raised by the XDCValidator contract.
+type XDCValidatorResignIterator struct {
+ Event *XDCValidatorResign // 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 *XDCValidatorResignIterator) 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(XDCValidatorResign)
+ 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(XDCValidatorResign)
+ 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 *XDCValidatorResignIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorResignIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorResign represents a Resign event raised by the XDCValidator contract.
+type XDCValidatorResign struct {
+ Owner common.Address
+ Candidate common.Address
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterResign is a free log retrieval operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3.
+//
+// Solidity: event Resign(_owner address, _candidate address)
+func (_XDCValidator *XDCValidatorFilterer) FilterResign(opts *bind.FilterOpts) (*XDCValidatorResignIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Resign")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorResignIterator{contract: _XDCValidator.contract, event: "Resign", logs: logs, sub: sub}, nil
+}
+
+// WatchResign is a free log subscription operation binding the contract event 0x4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d3.
+//
+// Solidity: event Resign(_owner address, _candidate address)
+func (_XDCValidator *XDCValidatorFilterer) WatchResign(opts *bind.WatchOpts, sink chan<- *XDCValidatorResign) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Resign")
+ 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(XDCValidatorResign)
+ if err := _XDCValidator.contract.UnpackLog(event, "Resign", 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
+}
+
+// XDCValidatorUnvoteIterator is returned from FilterUnvote and is used to iterate over the raw logs and unpacked data for Unvote events raised by the XDCValidator contract.
+type XDCValidatorUnvoteIterator struct {
+ Event *XDCValidatorUnvote // 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 *XDCValidatorUnvoteIterator) 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(XDCValidatorUnvote)
+ 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(XDCValidatorUnvote)
+ 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 *XDCValidatorUnvoteIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorUnvoteIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorUnvote represents a Unvote event raised by the XDCValidator contract.
+type XDCValidatorUnvote struct {
+ Voter common.Address
+ Candidate common.Address
+ Cap *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUnvote is a free log retrieval operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2.
+//
+// Solidity: event Unvote(_voter address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) FilterUnvote(opts *bind.FilterOpts) (*XDCValidatorUnvoteIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Unvote")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorUnvoteIterator{contract: _XDCValidator.contract, event: "Unvote", logs: logs, sub: sub}, nil
+}
+
+// WatchUnvote is a free log subscription operation binding the contract event 0xaa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2.
+//
+// Solidity: event Unvote(_voter address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) WatchUnvote(opts *bind.WatchOpts, sink chan<- *XDCValidatorUnvote) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Unvote")
+ 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(XDCValidatorUnvote)
+ if err := _XDCValidator.contract.UnpackLog(event, "Unvote", 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
+}
+
+// XDCValidatorUploadedKYCIterator is returned from FilterUploadedKYC and is used to iterate over the raw logs and unpacked data for UploadedKYC events raised by the XDCValidator contract.
+type XDCValidatorUploadedKYCIterator struct {
+ Event *XDCValidatorUploadedKYC // 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 *XDCValidatorUploadedKYCIterator) 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(XDCValidatorUploadedKYC)
+ 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(XDCValidatorUploadedKYC)
+ 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 *XDCValidatorUploadedKYCIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorUploadedKYCIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorUploadedKYC represents a UploadedKYC event raised by the XDCValidator contract.
+type XDCValidatorUploadedKYC struct {
+ Owner common.Address
+ KycHash string
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterUploadedKYC is a free log retrieval operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a.
+//
+// Solidity: event UploadedKYC(_owner address, kycHash string)
+func (_XDCValidator *XDCValidatorFilterer) FilterUploadedKYC(opts *bind.FilterOpts) (*XDCValidatorUploadedKYCIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "UploadedKYC")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorUploadedKYCIterator{contract: _XDCValidator.contract, event: "UploadedKYC", logs: logs, sub: sub}, nil
+}
+
+// WatchUploadedKYC is a free log subscription operation binding the contract event 0x949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a.
+//
+// Solidity: event UploadedKYC(_owner address, kycHash string)
+func (_XDCValidator *XDCValidatorFilterer) WatchUploadedKYC(opts *bind.WatchOpts, sink chan<- *XDCValidatorUploadedKYC) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "UploadedKYC")
+ 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(XDCValidatorUploadedKYC)
+ if err := _XDCValidator.contract.UnpackLog(event, "UploadedKYC", 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
+}
+
+// XDCValidatorVoteIterator is returned from FilterVote and is used to iterate over the raw logs and unpacked data for Vote events raised by the XDCValidator contract.
+type XDCValidatorVoteIterator struct {
+ Event *XDCValidatorVote // 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 *XDCValidatorVoteIterator) 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(XDCValidatorVote)
+ 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(XDCValidatorVote)
+ 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 *XDCValidatorVoteIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorVoteIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorVote represents a Vote event raised by the XDCValidator contract.
+type XDCValidatorVote struct {
+ Voter common.Address
+ Candidate common.Address
+ Cap *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterVote is a free log retrieval operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc.
+//
+// Solidity: event Vote(_voter address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) FilterVote(opts *bind.FilterOpts) (*XDCValidatorVoteIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Vote")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorVoteIterator{contract: _XDCValidator.contract, event: "Vote", logs: logs, sub: sub}, nil
+}
+
+// WatchVote is a free log subscription operation binding the contract event 0x66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc.
+//
+// Solidity: event Vote(_voter address, _candidate address, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) WatchVote(opts *bind.WatchOpts, sink chan<- *XDCValidatorVote) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Vote")
+ 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(XDCValidatorVote)
+ if err := _XDCValidator.contract.UnpackLog(event, "Vote", 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
+}
+
+// XDCValidatorWithdrawIterator is returned from FilterWithdraw and is used to iterate over the raw logs and unpacked data for Withdraw events raised by the XDCValidator contract.
+type XDCValidatorWithdrawIterator struct {
+ Event *XDCValidatorWithdraw // 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 *XDCValidatorWithdrawIterator) 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(XDCValidatorWithdraw)
+ 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(XDCValidatorWithdraw)
+ 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 *XDCValidatorWithdrawIterator) Error() error {
+ return it.fail
+}
+
+// Close terminates the iteration process, releasing any pending underlying
+// resources.
+func (it *XDCValidatorWithdrawIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+// XDCValidatorWithdraw represents a Withdraw event raised by the XDCValidator contract.
+type XDCValidatorWithdraw struct {
+ Owner common.Address
+ BlockNumber *big.Int
+ Cap *big.Int
+ Raw types.Log // Blockchain specific contextual infos
+}
+
+// FilterWithdraw is a free log retrieval operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568.
+//
+// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) FilterWithdraw(opts *bind.FilterOpts) (*XDCValidatorWithdrawIterator, error) {
+
+ logs, sub, err := _XDCValidator.contract.FilterLogs(opts, "Withdraw")
+ if err != nil {
+ return nil, err
+ }
+ return &XDCValidatorWithdrawIterator{contract: _XDCValidator.contract, event: "Withdraw", logs: logs, sub: sub}, nil
+}
+
+// WatchWithdraw is a free log subscription operation binding the contract event 0xf279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568.
+//
+// Solidity: event Withdraw(_owner address, _blockNumber uint256, _cap uint256)
+func (_XDCValidator *XDCValidatorFilterer) WatchWithdraw(opts *bind.WatchOpts, sink chan<- *XDCValidatorWithdraw) (event.Subscription, error) {
+
+ logs, sub, err := _XDCValidator.contract.WatchLogs(opts, "Withdraw")
+ 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(XDCValidatorWithdraw)
+ if err := _XDCValidator.contract.UnpackLog(event, "Withdraw", 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
+}
diff --git a/docker/XDPoSChain/entrypoint.sh b/docker/XDPoSChain/entrypoint.sh
new file mode 100755
index 0000000000..d080d1fb79
--- /dev/null
+++ b/docker/XDPoSChain/entrypoint.sh
@@ -0,0 +1,196 @@
+#!/bin/sh
+
+# vars from docker env
+# - IDENTITY (default to empty)
+# - PASSWORD (default to empty)
+# - PRIVATE_KEY (default to empty)
+# - BOOTNODES (default to empty)
+# - EXTIP (default to empty)
+# - VERBOSITY (default to 3)
+# - MAXPEERS (default to 25)
+# - SYNC_MODE (default to 'full')
+# - NETWORK_ID (default to '89')
+# - WS_SECRET (default to empty)
+# - NETSTATS_HOST (default to 'netstats-server:3000')
+# - NETSTATS_PORT (default to 'netstats-server:3000')
+
+# constants
+DATA_DIR="data"
+KEYSTORE_DIR="keystore"
+
+# variables
+genesisPath=""
+params=""
+accountsCount=$(
+ XDC account list --datadir $DATA_DIR --keystore $KEYSTORE_DIR \
+ 2> /dev/null \
+ | wc -l
+)
+
+# file to env
+for env in IDENTITY PASSWORD PRIVATE_KEY BOOTNODES WS_SECRET NETSTATS_HOST \
+ NETSTATS_PORT EXTIP SYNC_MODE NETWORK_ID ANNOUNCE_TXS STORE_REWARD DEBUG_MODE MAXPEERS; do
+ file=$(eval echo "\$${env}_FILE")
+ if [[ -f $file ]] && [[ ! -z $file ]]; then
+ echo "Replacing $env by $file"
+ export $env=$(cat $file)
+ elif [[ "$env" == "BOOTNODES" ]] && [[ ! -z $file ]]; then
+ echo "Bootnodes file is not available. Waiting for it to be provisioned..."
+ while true ; do
+ if [[ -f $file ]] && [[ $(grep -e enode $file) ]]; then
+ echo "Fount bootnode file."
+ break
+ fi
+ echo "Still no bootnodes file, sleeping..."
+ sleep 5
+ done
+ export $env=$(cat $file)
+ fi
+done
+
+# networkid
+if [[ ! -z $NETWORK_ID ]]; then
+ case $NETWORK_ID in
+ 88 )
+ genesisPath="mainnet.json"
+ ;;
+ 89 )
+ genesisPath="testnet.json"
+ params="$params --apothem --gcmode archive --http-api db,eth,net,web3,debug,XDPoS"
+ ;;
+ 90 )
+ genesisPath="devnet.json"
+ ;;
+ * )
+ echo "network id not supported"
+ ;;
+ esac
+ params="$params --networkid $NETWORK_ID"
+fi
+
+# custom genesis path
+if [[ ! -z $GENESIS_PATH ]]; then
+ genesisPath="$GENESIS_PATH"
+fi
+
+# data dir
+if [[ ! -d $DATA_DIR/XDC ]]; then
+ echo "No blockchain data, creating genesis block."
+ XDC init $genesisPath --datadir $DATA_DIR 2> /dev/null
+fi
+
+# identity
+if [[ -z $IDENTITY ]]; then
+ IDENTITY="unnamed_$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6)"
+fi
+
+# password file
+if [[ ! -f ./password ]]; then
+ if [[ ! -z $PASSWORD ]]; then
+ echo "Password env is set. Writing into file."
+ echo "$PASSWORD" > ./password
+ else
+ echo "No password set (or empty), generating a new one"
+ $(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32} > password)
+ fi
+fi
+
+# private key
+if [[ $accountsCount -le 0 ]]; then
+ echo "No accounts found"
+ if [[ ! -z $PRIVATE_KEY ]]; then
+ echo "Creating account from private key"
+ echo "$PRIVATE_KEY" > ./private_key
+ XDC account import ./private_key \
+ --datadir $DATA_DIR \
+ --keystore $KEYSTORE_DIR \
+ --password ./password
+ rm ./private_key
+ else
+ echo "Creating new account"
+ XDC account new \
+ --datadir $DATA_DIR \
+ --keystore $KEYSTORE_DIR \
+ --password ./password
+ fi
+fi
+account=$(
+ XDC account list --datadir $DATA_DIR --keystore $KEYSTORE_DIR \
+ 2> /dev/null \
+ | head -n 1 \
+ | cut -d"{" -f 2 | cut -d"}" -f 1
+)
+echo "Using account $account"
+params="$params --unlock $account"
+
+# bootnodes
+if [[ ! -z $BOOTNODES ]]; then
+ params="$params --bootnodes $BOOTNODES"
+fi
+
+# extip
+if [[ ! -z $EXTIP ]]; then
+ params="$params --nat extip:${EXTIP}"
+fi
+
+# syncmode
+if [[ ! -z $SYNC_MODE ]]; then
+ params="$params --syncmode ${SYNC_MODE}"
+fi
+
+# netstats
+if [[ ! -z $WS_SECRET ]]; then
+ echo "Will report to netstats server ${NETSTATS_HOST}:${NETSTATS_PORT}"
+ params="$params --ethstats ${IDENTITY}:${WS_SECRET}@${NETSTATS_HOST}:${NETSTATS_PORT}"
+else
+ echo "WS_SECRET not set, will not report to netstats server."
+fi
+
+# annonce txs
+if [[ ! -z $ANNOUNCE_TXS ]]; then
+ params="$params --announce-txs"
+fi
+
+# store reward
+if [[ ! -z $STORE_REWARD ]]; then
+ params="$params --store-reward"
+fi
+
+# debug mode
+if [[ ! -z $DEBUG_MODE ]]; then
+ params="$params --gcmode archive --http-api db,eth,net,web3,debug,XDPoS"
+fi
+
+# maxpeers
+if [[ -z $MAXPEERS ]]; then
+ MAXPEERS=25
+fi
+
+# dump
+echo "dump: $IDENTITY $account $BOOTNODES"
+
+set -x
+
+exec XDC $params \
+ --verbosity $VERBOSITY \
+ --datadir $DATA_DIR \
+ --keystore $KEYSTORE_DIR \
+ --identity $IDENTITY \
+ --maxpeers $MAXPEERS \
+ --password ./password \
+ --port 30303 \
+ --txpool-globalqueue 5000 \
+ --txpool-globalslots 5000 \
+ --http \
+ --http-corsdomain "*" \
+ --http-addr 0.0.0.0 \
+ --http-port 8545 \
+ --http-vhosts "*" \
+ --ws \
+ --ws-addr 0.0.0.0 \
+ --ws-port 8546 \
+ --ws-origins "*" \
+ --mine \
+ --gasprice "250000000" \
+ --miner-gaslimit "84000000" \
+ "$@"
diff --git a/docker/bootnode/bootnodes/bootnodes b/docker/bootnode/bootnodes/bootnodes
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docker/bootnode/entrypoint.sh b/docker/bootnode/entrypoint.sh
new file mode 100755
index 0000000000..e5f8ef40d8
--- /dev/null
+++ b/docker/bootnode/entrypoint.sh
@@ -0,0 +1,24 @@
+#!/bin/sh -x
+
+# file to env
+for env in PRIVATE_KEY; do
+ file=$(eval echo "\$${env}_FILE")
+ if [[ -f $file ]] && [[ ! -z $file ]]; then
+ echo "Replacing $env by $file"
+ export $env=$(cat $file)
+ fi
+done
+
+# private key
+if [[ ! -z "$PRIVATE_KEY" ]]; then
+ echo "$PRIVATE_KEY" > bootnode.key
+elif [[ ! -f ./bootnode.key ]]; then
+ bootnode -genkey bootnode.key
+fi
+
+# dump address
+address="enode://$(bootnode -nodekey bootnode.key -writeaddress)@[$(hostname -i)]:30301"
+
+echo "$address" > ./bootnodes/bootnodes
+
+exec bootnode "$@"
diff --git a/eth/hooks/hooks.go b/eth/hooks/hooks.go
new file mode 100644
index 0000000000..c6249a411d
--- /dev/null
+++ b/eth/hooks/hooks.go
@@ -0,0 +1,36 @@
+// Package hooks provides consensus hooks for XDPoS engine integration
+// Note: The full hook implementations (engine_v1_hooks.go, engine_v2_hooks.go)
+// require the complete XDPoS engine with EngineV1/EngineV2 support.
+// These stubs are provided for compatibility.
+
+package hooks
+
+import (
+ "github.com/ethereum/go-ethereum/consensus/XDPoS"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+// AttachConsensusV1Hooks attaches V1 consensus hooks to XDPoS engine
+// Note: This is a stub - full implementation requires EngineV1 support
+func AttachConsensusV1Hooks(adaptor *XDPoS.XDPoS, bc *core.BlockChain, chainConfig *params.ChainConfig) {
+ // V1 hooks are not implemented in this simplified version
+ // Full implementation would hook into:
+ // - HookPenalty: Scan for bad masternodes
+ // - HookPenaltyTIPSigning: Handle TIP signing penalties
+ // - HookValidator: Prepare validators at checkpoint
+ // - HookVerifyMNs: Verify masternode set
+ // - HookGetSignersFromContract: Get signers from contract
+ // - HookReward: Calculate masternode rewards
+}
+
+// AttachConsensusV2Hooks attaches V2 consensus hooks to XDPoS engine
+// Note: This is a stub - full implementation requires EngineV2 support
+func AttachConsensusV2Hooks(adaptor *XDPoS.XDPoS, bc *core.BlockChain, chainConfig *params.ChainConfig) {
+ // V2 hooks are not implemented in this simplified version
+ // Full implementation would hook into:
+ // - HookPenalty: V2 penalty handling
+ // - HookValidator: V2 validator preparation
+ // - HookVerifyMNs: V2 masternode verification
+ // - HookReward: V2 reward calculation
+}
diff --git a/eth/util/util.go b/eth/util/util.go
new file mode 100644
index 0000000000..8fab137ee1
--- /dev/null
+++ b/eth/util/util.go
@@ -0,0 +1,53 @@
+package util
+
+import (
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/consensus"
+)
+
+// RewardInflation calculates reward inflation based on block number and blocks per year
+func RewardInflation(chain consensus.ChainReader, chainReward *big.Int, number uint64, blockPerYear uint64) *big.Int {
+ // Check if halving should be disabled (for newer chains)
+ // For now, use the halving schedule
+ if blockPerYear*2 <= number && number < blockPerYear*5 {
+ chainReward.Div(chainReward, new(big.Int).SetUint64(2))
+ }
+ if blockPerYear*5 <= number {
+ chainReward.Div(chainReward, new(big.Int).SetUint64(4))
+ }
+
+ return chainReward
+}
+
+// RewardHalving computes the reward for Masternode/Protector/Observer based on epoch total reward, supply after halving is enabled, and epoch after halving is enabled
+// The sequence is a geometric sequence in order to make supply be limited
+func RewardHalving(epochRewardSingle *big.Int, epochRewardTotal *big.Int, halvingSupply *big.Int, epochSinceHalving uint64) *big.Int {
+ rt := new(big.Float).SetInt(epochRewardTotal)
+ hs := new(big.Float).SetInt(halvingSupply)
+ // zero cause Quo panic so return early
+ // or epoch reward > halving supply, return early
+ if halvingSupply.BitLen() == 0 || epochRewardTotal.Cmp(halvingSupply) > 0 {
+ return big.NewInt(0)
+ }
+ quo := new(big.Float).Quo(rt, hs)
+ // base = 1- reward/supply
+ base := new(big.Float).Sub(big.NewFloat(1), quo)
+ r := new(big.Float).SetInt(epochRewardSingle)
+ result := new(big.Float).Mul(r, FloatPower(base, epochSinceHalving))
+ resultInt, _ := result.Int(nil)
+ return resultInt
+}
+
+// FloatPower calculates base^exp for big.Float
+func FloatPower(base *big.Float, exp uint64) *big.Float {
+ result := big.NewFloat(1)
+ for exp > 0 {
+ if exp%2 == 1 {
+ result.Mul(result, base)
+ }
+ base.Mul(base, base)
+ exp >>= 1 // same as: exp = exp / 2
+ }
+ return result
+}
diff --git a/genesis/XDCxnet.json b/genesis/XDCxnet.json
new file mode 100644
index 0000000000..0589ae198b
--- /dev/null
+++ b/genesis/XDCxnet.json
@@ -0,0 +1,208 @@
+{
+ "config": {
+ "chainId": 99,
+ "homesteadBlock": 1,
+ "eip150Block": 2,
+ "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "eip155Block": 3,
+ "eip158Block": 3,
+ "byzantiumBlock": 4,
+ "XDPoS": {
+ "period": 2,
+ "epoch": 900,
+ "reward": 250,
+ "rewardCheckpoint": 30,
+ "gap": 10,
+ "foudationWalletAddr": "0x0000000000000000000000000000000000000068"
+ }
+ },
+ "nonce": "0x0",
+ "timestamp": "0x5d1ae350",
+ "extraData": "0x000000000000000000000000000000000000000000000000000000000000000031b249fe6f267aa2396eb2dc36e9c79351d97ec5c1fb51153703188faebc7c0981a4036456041290cc53324be54915f32521abb5a3648bf811abbc8ae1fa8074d5fef05e7e33fb189dffcd89b1a8ba60f99805b536609cc03acbb2604dfac11e9e54a448fc5571921c6d3672e13b58ea23dea534f2b35fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit": "0x47b760",
+ "difficulty": "0x1",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "0x0000000000000000000000000000000000000000",
+ "alloc": {
+ "0000000000000000000000000000000000000000": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000001": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000068": {
+ "balance": "0xd3c21bcecceda10000000"
+ },
+ "0000000000000000000000000000000000000088": {
+ "code": "0x6060604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301267951811461011657806302aa9be21461012c57806306a49fce1461014e57806315febd68146101b45780632d15cc04146101dc5780632f9c4bba146101fb578063302b68721461020e5780633477ee2e14610233578063441a3e701461026557806358e7525f1461027e5780636dd7d8ea1461029d578063a9a981a3146102b1578063a9ff959e146102c4578063ae6e43f5146102d7578063b642facd146102f6578063d09f1ab414610315578063d161c76714610328578063d51b9e931461033b578063d55b7dff1461036e578063f8ac9dd514610381575b600080fd5b61012a600160a060020a0360043516610394565b005b341561013757600080fd5b61012a600160a060020a0360043516602435610616565b341561015957600080fd5b610161610849565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156101a0578082015183820152602001610188565b505050509050019250505060405180910390f35b34156101bf57600080fd5b6101ca6004356108b2565b60405190815260200160405180910390f35b34156101e757600080fd5b610161600160a060020a03600435166108d6565b341561020657600080fd5b610161610963565b341561021957600080fd5b6101ca600160a060020a03600435811690602435166109e5565b341561023e57600080fd5b610249600435610a14565b604051600160a060020a03909116815260200160405180910390f35b341561027057600080fd5b61012a600435602435610a3c565b341561028957600080fd5b6101ca600160a060020a0360043516610ba3565b61012a600160a060020a0360043516610bc2565b34156102bc57600080fd5b6101ca610d7f565b34156102cf57600080fd5b6101ca610d85565b34156102e257600080fd5b61012a600160a060020a0360043516610d8b565b341561030157600080fd5b610249600160a060020a0360043516611022565b341561032057600080fd5b6101ca611040565b341561033357600080fd5b6101ca611046565b341561034657600080fd5b61035a600160a060020a036004351661104c565b604051901515815260200160405180910390f35b341561037957600080fd5b6101ca611071565b341561038c57600080fd5b6101ca611077565b6005546000903410156103a657600080fd5b600160a060020a038216600090815260016020526040902054829060a060020a900460ff16156103d557600080fd5b600160a060020a03831660009081526001602081905260409091200154610402903463ffffffff61107d16565b91506003805480600101828161041891906110a5565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905560606040519081016040908152600160a060020a0333811683526001602080850182905283850187905291871660009081529152208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03919091161781556020820151815490151560a060020a0274ff0000000000000000000000000000000000000000199091161781556040820151600191820155600160a060020a03808616600090815260209283526040808220339093168252600290920190925290205461051d91503463ffffffff61107d16565b600160a060020a038085166000908152600160208181526040808420339095168452600290940190529190209190915560045461055f9163ffffffff61107d16565b600455600160a060020a038316600090815260026020526040902080546001810161058a83826110a5565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff191633600160a060020a038116919091179091557f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1908434604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b600160a060020a0380831660009081526001602090815260408083203390941683526002909301905290812054839083908190101561065457600080fd5b600160a060020a03828116600090815260016020526040902054338216911614156106c257600554600160a060020a0380841660009081526001602090815260408083203390941683526002909301905220546106b7908363ffffffff61109316565b10156106c257600080fd5b600160a060020a038516600090815260016020819052604090912001546106ef908563ffffffff61109316565b600160a060020a038087166000908152600160208181526040808420928301959095553390931682526002019091522054610730908563ffffffff61109316565b600160a060020a03808716600090815260016020908152604080832033909416835260029093019052205560095461076e904363ffffffff61107d16565b600160a060020a0333166000908152602081815260408083208484529091529020549093506107a3908563ffffffff61107d16565b600160a060020a03331660008181526020818152604080832088845280835290832094909455918152905260019081018054909181016107e383826110a5565b5060009182526020909120018390557faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050505050565b6108516110ce565b60038054806020026020016040519081016040528092919081815260200182805480156108a757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610889575b505050505090505b90565b33600160a060020a0316600090815260208181526040808320938352929052205490565b6108de6110ce565b6002600083600160a060020a0316600160a060020a0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561095757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610939575b50505050509050919050565b61096b6110ce565b60008033600160a060020a0316600160a060020a031681526020019081526020016000206001018054806020026020016040519081016040528092919081815260200182805480156108a757602002820191906000526020600020905b8154815260200190600101908083116109c8575050505050905090565b600160a060020a0391821660009081526001602090815260408083209390941682526002909201909152205490565b6003805482908110610a2257fe5b600091825260209091200154600160a060020a0316905081565b60008282828211610a4c57600080fd5b4382901015610a5a57600080fd5b600160a060020a03331660009081526020818152604080832085845290915281205411610a8657600080fd5b600160a060020a0333166000908152602081905260409020600101805483919083908110610ab057fe5b60009182526020909120015414610ac657600080fd5b600160a060020a03331660008181526020818152604080832089845280835290832080549084905593835291905260010180549194509085908110610b0757fe5b6000918252602082200155600160a060020a03331683156108fc0284604051600060405180830381858888f193505050501515610b4357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5683386856040518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a15050505050565b600160a060020a03166000908152600160208190526040909120015490565b600654341015610bd157600080fd5b600160a060020a038116600090815260016020526040902054819060a060020a900460ff161515610c0157600080fd5b600160a060020a03821660009081526001602081905260409091200154610c2e903463ffffffff61107d16565b600160a060020a0380841660009081526001602081815260408084209283019590955533909316825260020190915220541515610cc057600160a060020a0382166000908152600260205260409020805460018101610c8d83826110a5565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff191633600160a060020a03161790555b600160a060020a038083166000908152600160209081526040808320339094168352600290930190522054610cfb903463ffffffff61107d16565b600160a060020a03808416600090815260016020908152604080832033948516845260020190915290819020929092557f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc918490349051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a15050565b60045481565b60095481565b600160a060020a038181166000908152600160205260408120549091829182918591338216911614610dbc57600080fd5b600160a060020a038516600090815260016020526040902054859060a060020a900460ff161515610dec57600080fd5b600160a060020a0386166000908152600160208190526040909120805474ff000000000000000000000000000000000000000019169055600454610e359163ffffffff61109316565b600455600094505b600354851015610ebf5785600160a060020a0316600386815481101515610e6057fe5b600091825260209091200154600160a060020a03161415610eb4576003805486908110610e8957fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19169055610ebf565b600190940193610e3d565b600160a060020a03808716600081815260016020818152604080842033909616845260028601825283205493909252908190529190910154909450610f0a908563ffffffff61109316565b600160a060020a0380881660009081526001602081815260408084209283019590955533909316825260020190915290812055600854610f50904363ffffffff61107d16565b600160a060020a033316600090815260208181526040808320848452909152902054909350610f85908563ffffffff61107d16565b600160a060020a0333166000818152602081815260408083208884528083529083209490945591815290526001908101805490918101610fc583826110a5565b5060009182526020909120018390557f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051600160a060020a039283168152911660208201526040908101905180910390a1505050505050565b600160a060020a039081166000908152600160205260409020541690565b60075481565b60085481565b600160a060020a031660009081526001602052604090205460a060020a900460ff1690565b60055481565b60065481565b60008282018381101561108c57fe5b9392505050565b60008282111561109f57fe5b50900390565b8154818355818115116110c9576000838152602090206110c99181019083016110e0565b505050565b60206040519081016040526000815290565b6108af91905b808211156110fa57600081556001016110e6565b50905600a165627a7a72305820555de7c5131842a4fccb258fccd95ae1539019bb744b4253893b37fed1b3d8e90029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000006",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000006",
+ "0x0000000000000000000000000000000000000000000000000000000000000005": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000000000000000000000000000008ac7230489e80000",
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000096",
+ "0x0000000000000000000000000000000000000000000000000000000000000008": "0x000000000000000000000000000000000000000000000000000000000013c680",
+ "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000015180",
+ "0x026993bba202119b8a8475bf9f364d83622f52af5ac4adbfb65ae8a937a51888": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0x026993bba202119b8a8475bf9f364d83622f52af5ac4adbfb65ae8a937a51889": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x02c8f9fcf8c8e9c24ab57213a541d13709892b4c2c4e76fa4801ab0b47a3de93": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x2f492f3d0162ccf543077b97392111a722da3095746e15563ca1c0278a61ca80": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0x454d7309b7c605e9c051902073ddda41a8a575bb63133583184cf26707d5ebef": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x479e9a968bc60fcb858c1ae081e9b0526f79a57fac882f9e0e31b987d7c150a4": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x49a9a5095ffa80943af1180153a119a85c696770198fbb6978d95c35c5115bf3": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0x49a9a5095ffa80943af1180153a119a85c696770198fbb6978d95c35c5115bf4": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x649651d0a7a4c293a92b9cd4468065f4ee86af8ec73672e0f5e1ee619441d278": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x89970b0538c9c118cf09441e16a6817c276586c44f11225a89993ed0e4c90974": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x9a13581db7a1f7f76e59ef1a233790f63fbf572e16e9606240951c689851e526": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xa6f8841c2a332a93df4ea59f6666ff29dcb9d2ef767b3048364c5a957bee4615": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xa6f8841c2a332a93df4ea59f6666ff29dcb9d2ef767b3048364c5a957bee4616": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xa93d6b4d95ea11483b1dacea74dcd49c1f468a4d903098c5a7778cbfa16d3e82": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xa9907cb1f2306f984e2f762c663fa522ed88cb863174e47f093283aa8a10cb91": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xabe8de74f095912ab7d4cdfad144c3648788f7d3916758aecc632fb36c345f6c": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xb45f3ed5c0a6c68562cb23d8e4b5e0aecafed8d20e17e5b52154d40af94ec106": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xbcf7057463997dcd72a546d32bf6d71674f0500d24b06dbe9b4f439976ffabeb": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xbe13c299d2ab6c8f476edb2db4b4e11724f5806662dd0f2bc314827a61815d50": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x00000000000000000000000031b249fe6f267aa2396eb2dc36e9c79351d97ec5",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x000000000000000000000000c1fb51153703188faebc7c0981a4036456041290",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d": "0x000000000000000000000000cc53324be54915f32521abb5a3648bf811abbc8a",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e": "0x000000000000000000000000e1fa8074d5fef05e7e33fb189dffcd89b1a8ba60",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f": "0x000000000000000000000000f99805b536609cc03acbb2604dfac11e9e54a448",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f860": "0x000000000000000000000000fc5571921c6d3672e13b58ea23dea534f2b35fa0",
+ "0xc9ef92b3a11fbab7796865d443badc1742bd9373a12c7437b8416fa2bf1a4eab": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xc9ef92b3a11fbab7796865d443badc1742bd9373a12c7437b8416fa2bf1a4eac": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xe0086ec10170327ab071c250c8b2f6927b5f2b360a345fedc7c50fa4a898c1f5": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xe3909aca1910df9389cc798ae3ad4714f9ca29c5001ca9522e8bfb50b9717746": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xe567220c5c63cb2175e08d26bc3c0e702f3f6c43d6ff26acd157bdaf74150573": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xe9dabded787038ffda12167841517949314f5707279536e33628132da48286ee": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xe9dabded787038ffda12167841517949314f5707279536e33628132da48286ef": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xec578984de09d7a8bf7946136a35864519b0943ece376f32680119b20b861896": "0x000000000000000000000000487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xf9df09e7f7bec28074f250bd606c5c97634337476ab298454fecf041fc1fbab1": "0x000000000000000000000001487d62d33467c4842c5e54eb370837e4e88bba0f",
+ "0xf9df09e7f7bec28074f250bd606c5c97634337476ab298454fecf041fc1fbab2": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xfdcf00ef27a55e91d9ce6390e76c82d16874bbfcfa749582823363fcfeeedce7": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ },
+ "balance": "0x3f870857a3e0e3800000"
+ },
+ "0000000000000000000000000000000000000089": {
+ "code": "0x6060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e341eaa4811461005b578063e7ec6aef14610076578063f4145a83146100df575b600080fd5b341561006657600080fd5b610074600435602435610104565b005b341561008157600080fd5b61008c600435610227565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100cb5780820151838201526020016100b3565b505050509050019250505060405180910390f35b34156100ea57600080fd5b6100f26102ac565b60405190815260200160405180910390f35b438290101561011257600080fd5b600280546101289184910263ffffffff6102b216565b43111561013457600080fd5b600082815260016020819052604090912080549091810161015583826102c8565b5060009182526020808320919091018390558282528190526040902080546001810161018183826102c8565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19163373ffffffffffffffffffffffffffffffffffffffff8116919091179091557f62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f5490838360405173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091526040808301919091526060909101905180910390a15050565b61022f6102f1565b600082815260208181526040918290208054909290918281020190519081016040528092919081815260200182805480156102a057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610275575b50505050509050919050565b60025481565b6000828201838110156102c157fe5b9392505050565b8154818355818115116102ec576000838152602090206102ec918101908301610303565b505050565b60206040519081016040526000815290565b61032191905b8082111561031d5760008155600101610309565b5090565b905600a165627a7a72305820a8ceddaea8e4ae00991e2ae81c8c88e160dd8770f255523282c24c2df4c30ec70029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000384"
+ },
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000090": {
+ "code": "0x6060604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663284180fc811461006657806334d38600146100d8578063d442d6cc14610129578063e11f5ba21461015a575b600080fd5b341561007157600080fd5b610085600160a060020a0360043516610170565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100c45780820151838201526020016100ac565b505050509050019250505060405180910390f35b34156100e357600080fd5b61012760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506101f395505050505050565b005b341561013457600080fd5b610148600160a060020a0360043516610243565b60405190815260200160405180910390f35b341561016557600080fd5b61012760043561025e565b61017861028e565b60008083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156101e757602002820191906000526020600020905b815481526001909101906020018083116101d2575b50505050509050919050565b610384430661032081101561020757600080fd5b610352811061021557600080fd5b600160a060020a033316600090815260208190526040902082805161023e9291602001906102a0565b505050565b600160a060020a031660009081526001602052604090205490565b610384430661035281101561027257600080fd5b50600160a060020a033316600090815260016020526040902055565b60206040519081016040526000815290565b8280548282559060005260206000209081019282156102dd579160200282015b828111156102dd57825182556020909201916001909101906102c0565b506102e99291506102ed565b5090565b61030791905b808211156102e957600081556001016102f3565b905600a165627a7a7230582034991c8dc4001fc254f3ba2811c05d2e7d29bee3908946ca56d1545b2c852de20029",
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000099": {
+ "code": "0x60606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x02c8f9fcf8c8e9c24ab57213a541d13709892b4c2c4e76fa4801ab0b47a3de93": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x000000000000000000000000f99805b536609cc03acbb2604dfac11e9e54a448",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x00000000000000000000000031b249fe6f267aa2396eb2dc36e9c79351d97ec5",
+ "0xfdcf00ef27a55e91d9ce6390e76c82d16874bbfcfa749582823363fcfeeedce7": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ },
+ "balance": "0x9ad924559f742a8800000"
+ },
+ "31b249fe6f267aa2396eb2dc36e9c79351d97ec5": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "c1fb51153703188faebc7c0981a4036456041290": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "cc53324be54915f32521abb5a3648bf811abbc8a": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "e1fa8074d5fef05e7e33fb189dffcd89b1a8ba60": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "f99805b536609cc03acbb2604dfac11e9e54a448": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "fc5571921c6d3672e13b58ea23dea534f2b35fa0": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "17F2beD710ba50Ed27aEa52fc4bD7Bda5ED4a037": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "0D3ab14BBaD3D99F4203bd7a11aCB94882050E7e": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "703c4b2bD70c169f5717101CaeE543299Fc946C7": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "b68D825655F2fE14C32558cDf950b45beF18D218": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "8fB1047e874d2e472cd08980FF8383053dd83102": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "9ca1514E3Dc4059C29a1608AE3a3E3fd35900888": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "15e08dE16f534c890828F2a0D935433aF5B3CE0C": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "f7349C253FF7747Df661296E0859c44e974fb52E": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "06605B28aab9835be75ca242a8aE58f2e15F2F45": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "9f6b8fDD3733B099A91B6D70CDC7963ebBbd2684": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "33c2E732ae7dce8B05F37B2ba0CFe14c980c4Dbe": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "16a73f3a64eca79e117258e66dfd7071cc8312a9": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "ac177441ac2237b2f79ecff1b8f6bca39e27ef9f": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "4215250e55984c75bbce8ae639b86a6cad8ec126": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "6b70ca959814866dd5c426d63d47dde9cc6c32d2": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "33df079fe9b9cd7fb23a1085e4eaaa8eb6952cb3": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "3cab8292137804688714670640d19f9d7a60c472": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "9415d953d47c5f155cac9de7b24a756f352eafbf": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "e32d2e7c8e8809e45c8e2332830b48d9e231e3f2": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "f76ddbda664ea47088937e1cf9ff15036714dee3": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "c465ee82440dada9509feb235c7cd7d896acf13c": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "b95bdc136c579dc3fd2b2424a8e925a90228d2c2": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "e36c1842365595D44854eEcd64B11c8115E133EF": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "aaC1959F6F0fb539F653409079Ec4146267B7555": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "726DA688e2e09f01A2e1aB4c10F25B7CEdD4a0f3": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ },
+ "c70f010E8DB8bc436712A93D170C7c27Db1981Ea": {
+ "balance": "0x0c9f2c9cd04674edea40000000"
+ }
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
+}
diff --git a/genesis/devnet.json b/genesis/devnet.json
new file mode 100644
index 0000000000..ee67134682
--- /dev/null
+++ b/genesis/devnet.json
@@ -0,0 +1,279 @@
+{
+ "config": {
+ "chainId": 551,
+ "homesteadBlock": 0,
+ "eip150Block": 0,
+ "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "eip155Block": 0,
+ "eip158Block": 0,
+ "byzantiumBlock": 0,
+ "eip1559Block": 32400,
+ "XDPoS": {
+ "period": 2,
+ "epoch": 900,
+ "reward": 10,
+ "rewardCheckpoint": 900,
+ "gap": 450,
+ "foudationWalletAddr": "0xde5b54e8e7b585153add32f472e8d545e5d42a82",
+ "SkipV1Validation": false,
+ "v2": {
+ "switchBlock": 0,
+ "config": {
+ "maxMasternodes": 108,
+ "switchRound": 0,
+ "minePeriod": 2,
+ "timeoutSyncThreshold": 3,
+ "timeoutPeriod": 10,
+ "certificateThreshold": 0.667
+ },
+ "allConfigs": {
+ "0": {
+ "maxMasternodes": 108,
+ "switchRound": 0,
+ "minePeriod": 2,
+ "timeoutSyncThreshold": 3,
+ "timeoutPeriod": 10,
+ "certificateThreshold": 0.667
+ }
+ },
+ "SkipV2Validation": false
+ }
+ }
+ },
+ "nonce": "0x0",
+ "timestamp": "0x6771d3f2",
+ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000311bdf9066246e68559816e7f636435867f824ef442a44a6fc20f5b8dfa8b304d7137581f7e6bef347318441696e9ae962633c16e04d53935272639d537fc89618edae86950e12687a612e15c4786b8473898cc3c5beca5841306b26fdb4e30411392a6a74826141342a4dc33a1045cefa4182b6212ec0317bc30fbeb7208192d1474b5f87ffbc056de43c11888c073313b36cf03cf1f739f39443551ff12bbe8d993351c0e2db739f9bcbfdeda94d73b50b16d3a242960b7ca1937e826bda6c397df74d9f9ab01aa89af636787499e81362e815e36f28763eac120babebf5a6cbe6113780cbe489e3eb0db882381aebaf81190100d82f41ad2c95898195c7a47dc59115bb5ec85408683795da2f604a5c0464868eabfcb6da489a1b4304f49aafaec938c7adc48539470624e1f9c75ce33e568d8fa3ace90497ee0c60dc921eefea93e384a6ccaaf28e33790a2d1b2625bf964dfc087e2622b02b0bb78713e872c02796ef64c8f10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit": "0x47b760",
+ "difficulty": "0x1",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "0x0000000000000000000000000000000000000000",
+ "alloc": {
+ "0000000000000000000000000000000000000000": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000001": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000068": {
+ "balance": "0xd3c21bcecceda10000000"
+ },
+ "0000000000000000000000000000000000000088": {
+ "code": "0x606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x000000000000000000000000000000000000000000000000000000000000000b": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x000000000000000000000000000000000000000000000000000000000000000c": "0x00000000000000000000000000000000000000000000054b40b1f852bda00000",
+ "0x000000000000000000000000000000000000000000000000000000000000000d": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x000000000000000000000000000000000000000000000000000000000000000e": "0x000000000000000000000000000000000000000000000000000000000013c680",
+ "0x000000000000000000000000000000000000000000000000000000000000000f": "0x0000000000000000000000000000000000000000000000000000000000069780",
+ "0x030c4482e31df0bec3a61ba9044822c841d3be0a21a4a43d22ffabb19a238030": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x03857c1c3036c8068aecc274ccdef26c09d6bc8d7323c3b0af04944281aea3c5": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x04606a03b4103377c3cc40f7d070c9672b8c34f833337c95acd6cc3b9ef873be": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x04606a03b4103377c3cc40f7d070c9672b8c34f833337c95acd6cc3b9ef873bf": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x0f0a4bf138332e4dee2840995f18ef3f4e7ce9800a43298cd303f652f37e2760": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x0f77b98b641f695810840536460aceac3aa93db4b69360cb1e825fc50a01cbf8": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x125b08b20a070fdff51220f22ab5783fe8553385c29d73595065987e274ae2ba": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x125b08b20a070fdff51220f22ab5783fe8553385c29d73595065987e274ae2bb": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x141b2f299c67c202a3f56d8c761ef8412df00a99dc4d7df7132fea8b618710fb": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x15e82e9588701aace370d9b0ae88a15878117328c72679be3a43f1fde5480b52": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x19474e4e22de9b7e74a0e935e50e07474f1922fca9ca508d627a1753b89a04c0": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x1a53676945466c0303c4763ecd9fe35b640c62214817fc1cd445cd2df311d75e": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x1acfc824f6e62266e1ddfd5296eb428cb6235e11eb419042440ee2cd234f5064": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x206df8c61c26c41c2f5d8628f9b0af634f51cea5204c2860beac8743b789d8f9": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x213528a16906ba2c7ae2d13a88332596a8f7dba04445edce4dd35851adc6270b": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x217e08ed8a88d1aa61780ebbfa2433d8ee93fe281a28caa61609ffd7feb6ff48": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x217e08ed8a88d1aa61780ebbfa2433d8ee93fe281a28caa61609ffd7feb6ff49": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x2bbcd29309cdf0c2e0fb87eb0912eda2715ff0d0800356af3b13b1877fc96294": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x2ea8dbac375e20907f0f6064477fb65f425b25387bc4af4a9fa0d909542ad6ec": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x2f46cce9be56b195a997053b94333e3e8608e77a9049008a7867ece9434d7490": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x32f30f989a9121096e27b0ceff2143dfd8ad0a279e39b2dbdd4720d758b1235e": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x334998a4166b71bbee90c9a5395d45b437458344b336983ce195ac15c4cabf41": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x37bbbe931ce8669c7360584cc0c8719480098d88b382fa5147ab6070f6a995e9": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x383c8c93b8864dd3dd80dcce451bff3ccecfe0ef316daeffc3429e8c734ca219": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x424c760de55550140740213338215fb5e72732d77ff28c6fcdce25cc0da4b4df": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x42b4293dae5548c9e2c405a2d603c1b7c254591f10e1a19d475c9573a806ddbf": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x4315dd31061c8b8e85c5b7d9df3c6dda7f6e48ad32c7bd25549115df18f68eb7": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x433573bf8c109958dcd2a79e075574b3fa76ee1309194d6985ec9eb993cfc4a8": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x433573bf8c109958dcd2a79e075574b3fa76ee1309194d6985ec9eb993cfc4a9": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x471f33d3408681a476d422388b3e426fc8fd1f4db2b3cf07127fc0430da13d5a": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x48ddfeab6816c7d8ea504eaceba35584eed68f73e8bca46561c49f828945d870": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x4bcc08cdec386d590e3c1b686244142bf6e504749f55207aea8cba6292b4a05c": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930991": "0x000000000000000000000000311bdf9066246e68559816e7f636435867f824ef",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930992": "0x000000000000000000000000442a44a6fc20f5b8dfa8b304d7137581f7e6bef3",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930993": "0x00000000000000000000000047318441696e9ae962633c16e04d53935272639d",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930994": "0x000000000000000000000000537fc89618edae86950e12687a612e15c4786b84",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930995": "0x00000000000000000000000073898cc3c5beca5841306b26fdb4e30411392a6a",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930996": "0x00000000000000000000000074826141342a4dc33a1045cefa4182b6212ec031",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930997": "0x0000000000000000000000007bc30fbeb7208192d1474b5f87ffbc056de43c11",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930998": "0x000000000000000000000000888c073313b36cf03cf1f739f39443551ff12bbe",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab930999": "0x0000000000000000000000008d993351c0e2db739f9bcbfdeda94d73b50b16d3",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099a": "0x000000000000000000000000a242960b7ca1937e826bda6c397df74d9f9ab01a",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099b": "0x000000000000000000000000a89af636787499e81362e815e36f28763eac120b",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099c": "0x000000000000000000000000abebf5a6cbe6113780cbe489e3eb0db882381aeb",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099d": "0x000000000000000000000000af81190100d82f41ad2c95898195c7a47dc59115",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099e": "0x000000000000000000000000bb5ec85408683795da2f604a5c0464868eabfcb6",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab93099f": "0x000000000000000000000000da489a1b4304f49aafaec938c7adc48539470624",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab9309a0": "0x000000000000000000000000e1f9c75ce33e568d8fa3ace90497ee0c60dc921e",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab9309a1": "0x000000000000000000000000efea93e384a6ccaaf28e33790a2d1b2625bf964d",
+ "0x4d08b2b0194071b50be4200cf623b02a2489a2090e82dca38562a22eab9309a2": "0x000000000000000000000000fc087e2622b02b0bb78713e872c02796ef64c8f1",
+ "0x4df12e1188de9c93b847240eddba997020037c5f8010088c71c6f497ea6865ab": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x5479b436a6706e20dbebc992f8b75e09f5ef33b9bfc92f6eb52af893bc9f3ef5": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x5a72b959cac93391bff267c6c91f4da4895e3f8769bb512241703807da099182": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x6528b6895a372dd9abf5c9b1e2d763877056e06dcadeefb947482c05a58f1a46": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x6528b6895a372dd9abf5c9b1e2d763877056e06dcadeefb947482c05a58f1a47": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x690ae50193386ef0c1f3aecb62d156ec48e51576b8faca760d2e782148d2685a": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x69dc30401af3a46fb5caf938fefd3bb163e08eed5018359c7ce99b0a6ac5bcad": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x6f24e27f6bf706ecff22e1cc7232c2b995103d66093d2976eeaa6ced126c7cf3": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x724b5bbb48fc97209628eb6b34adb8dd3cd583180ac721afdf706c4c57bbc253": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x76dfe65765497bb6461c122d3715541832ddc6bed4af9859d0afcafd98e85d3d": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x78131ffee5eb0b7466641acad70a5e37f247a658acd6910a0e0159013272500f": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x78131ffee5eb0b7466641acad70a5e37f247a658acd6910a0e01590132725010": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x7860877d0fdf5b8349b69cf151013101002a515fc77b7d9ac9deea724189b49d": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x78f000d26dc5cb7bb6625ad3bbdeb559c2237595558ca062c170e72b826dcaa8": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x7c5e55320fbb9389307827678ad755ae9bbff14bc2f0b7311e273ea6f816b5e6": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x850302252de9a45ae306fefaef8c0b466423440d4916233feb535a91f5c13884": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x850302252de9a45ae306fefaef8c0b466423440d4916233feb535a91f5c13885": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0x8f6c89a2950c399a6bd26ec8e4f8342cef555205270052553492ac8caab48637": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x92174186dda351528a078fccba50a5ff5332041fd6f861d5ba9f30d9e7416b01": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x927695b4feff242034e5b416f50ee8f8804c7c79d682e9b504e1d7ad0376d415": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x9428e90ccbc254697b04337e1bfa9ed42a163a0530cac6ed589ff0e86db639ff": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x979ead4e6ad3f623d00d4c31505cce1a654a543281a073df41b8429781a4700a": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0x979ead4e6ad3f623d00d4c31505cce1a654a543281a073df41b8429781a4700b": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xa0654653e606a2b16e75ace42178d92a333f7bd8fd554600cd8c0dda8959a747": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xa0654653e606a2b16e75ace42178d92a333f7bd8fd554600cd8c0dda8959a748": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xa16feed71a191c25a16b840899c1130128bae680b9fb5afedfad18ee25baa3cc": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xa16feed71a191c25a16b840899c1130128bae680b9fb5afedfad18ee25baa3cd": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xa40e19ad57e57cf5498a358191ef21a46727990f0833f60ef287bb2512f473b2": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xadd3379ca12eb6e907655b06c632df1dfb1d3810478f04657d0eb1f2514ada7d": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xb07bd76227cbb5a5e93cd5635ab731faceb120715f763221afde9bf9c66d93e1": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xb7a1ebae33d313df562db52e6a17cc25a4fc71072bc8f38e28cca51dca772d2f": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xb7a1ebae33d313df562db52e6a17cc25a4fc71072bc8f38e28cca51dca772d30": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xbd072001a6fd52f3f36f5c32bd3ba9c4ffd3e427ab5661fb687b4b37342e32da": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xbe19bdb2daf84051554e5f7b28c240f2394dfdc01ed9931b1d2270301ce6197a": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xbe5c577780cc5cb207d59bca6035e982dd13627ef17edb6a67300e707c7ab194": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xbe5c577780cc5cb207d59bca6035e982dd13627ef17edb6a67300e707c7ab195": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xd6b02d8d4bab22276f46bd01c273377c92e6ebf28cab145c363c2ad13651ab01": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xd6b02d8d4bab22276f46bd01c273377c92e6ebf28cab145c363c2ad13651ab02": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xd6e5468fdf7c0709dc80d32848fc6c62d31a193138d0962e6edc92694d422212": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xd71673afb2d4fa2bfb83c3892943b95ad4701e2fd78801199c07446743897d39": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xd71673afb2d4fa2bfb83c3892943b95ad4701e2fd78801199c07446743897d3a": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xd9c5f37af5366d29a8e3839d99c1dbe7d1b1e3f1e2f5a3ac117401809b0d2501": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xd9c5f37af5366d29a8e3839d99c1dbe7d1b1e3f1e2f5a3ac117401809b0d2502": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xd9cfd15c4a9619e16321f9e4042a566871512a8c0375122ca56a91ed5dfaa5e2": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xd9cfd15c4a9619e16321f9e4042a566871512a8c0375122ca56a91ed5dfaa5e3": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xd9d4d93f562d5dc8184de584a08046769c25c10f1cebee1617c95d9212c093ec": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xe0d37705568ac8274db84c0b672ef9a5b02459e4607af2736a98b235c5342cf9": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xe20533b9acd093b6b21eda56a3ad045315f0999f910d7ccada9ec110917d3dc2": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xe6920aeacdafc0d4f7573369e69a8a79eaee08f9d9f620e22831ee53d8de618c": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xe6a03f7a1a989ef0b5a97e8964334cc7ddb72a67de4c24b5f891847210a9db11": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xe6a03f7a1a989ef0b5a97e8964334cc7ddb72a67de4c24b5f891847210a9db12": "0x000000000000000000000000000000000000000000000a968163f0a57b400000",
+ "0xea2b7d5c8733427922e04399ac310174bb0431233be39c6a708646879c299ed9": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3": "0x000000000000000000000000311bdf9066246e68559816e7f636435867f824ef",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4": "0x000000000000000000000000442a44a6fc20f5b8dfa8b304d7137581f7e6bef3",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5": "0x00000000000000000000000047318441696e9ae962633c16e04d53935272639d",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6": "0x000000000000000000000000537fc89618edae86950e12687a612e15c4786b84",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee7": "0x00000000000000000000000073898cc3c5beca5841306b26fdb4e30411392a6a",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee8": "0x00000000000000000000000074826141342a4dc33a1045cefa4182b6212ec031",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee9": "0x0000000000000000000000007bc30fbeb7208192d1474b5f87ffbc056de43c11",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eea": "0x000000000000000000000000888c073313b36cf03cf1f739f39443551ff12bbe",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eeb": "0x0000000000000000000000008d993351c0e2db739f9bcbfdeda94d73b50b16d3",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eec": "0x000000000000000000000000a242960b7ca1937e826bda6c397df74d9f9ab01a",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eed": "0x000000000000000000000000a89af636787499e81362e815e36f28763eac120b",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eee": "0x000000000000000000000000abebf5a6cbe6113780cbe489e3eb0db882381aeb",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eef": "0x000000000000000000000000af81190100d82f41ad2c95898195c7a47dc59115",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ef0": "0x000000000000000000000000bb5ec85408683795da2f604a5c0464868eabfcb6",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ef1": "0x000000000000000000000000da489a1b4304f49aafaec938c7adc48539470624",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ef2": "0x000000000000000000000000e1f9c75ce33e568d8fa3ace90497ee0c60dc921e",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ef3": "0x000000000000000000000000efea93e384a6ccaaf28e33790a2d1b2625bf964d",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ef4": "0x000000000000000000000000fc087e2622b02b0bb78713e872c02796ef64c8f1",
+ "0xf511943a3baf5478bbcb2a8fc05b1bd215ad2612dcea88999bb647d8a1bc497b": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xf6c2c7fc452bd777ae6315a05df702a9c84c84319642f738c02d7265e7b03519": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xf7c5c70c003782446997bfaca3df73d3f4529e5610bd8f00aa705bd9f2b7bea5": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xfb99b5de22d1e4ca0e5857616be3d3df0df3f371c6dae7e7c3df24980cae362b": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xfd6dda287eb8b2e65f6136280e7f54c250f820b79064da60c2f09859788892b6": "0x000000000000000000000000de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xfdc6e9ef6103a34656ae73183b1f07e0d09db52b8500c3d560707c8f426d61b7": "0x000000000000000000000001de5b54e8e7b585153add32f472e8d545e5d42a82",
+ "0xfdc6e9ef6103a34656ae73183b1f07e0d09db52b8500c3d560707c8f426d61b8": "0x000000000000000000000000000000000000000000000a968163f0a57b400000"
+ },
+ "balance": "0xbe951906eba2aa800000"
+ },
+ "0000000000000000000000000000000000000089": {
+ "code": "0x6060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e341eaa4811461005b578063e7ec6aef14610076578063f4145a83146100df575b600080fd5b341561006657600080fd5b610074600435602435610104565b005b341561008157600080fd5b61008c600435610227565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100cb5780820151838201526020016100b3565b505050509050019250505060405180910390f35b34156100ea57600080fd5b6100f26102ac565b60405190815260200160405180910390f35b438290101561011257600080fd5b600280546101289184910263ffffffff6102b216565b43111561013457600080fd5b600082815260016020819052604090912080549091810161015583826102c8565b5060009182526020808320919091018390558282528190526040902080546001810161018183826102c8565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19163373ffffffffffffffffffffffffffffffffffffffff8116919091179091557f62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f5490838360405173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091526040808301919091526060909101905180910390a15050565b61022f6102f1565b600082815260208181526040918290208054909290918281020190519081016040528092919081815260200182805480156102a057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610275575b50505050509050919050565b60025481565b6000828201838110156102c157fe5b9392505050565b8154818355818115116102ec576000838152602090206102ec918101908301610303565b505050565b60206040519081016040526000815290565b61032191905b8082111561031d5760008155600101610309565b5090565b905600a165627a7a72305820a8ceddaea8e4ae00991e2ae81c8c88e160dd8770f255523282c24c2df4c30ec70029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000384"
+ },
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000090": {
+ "code": "0x6060604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663284180fc811461006657806334d38600146100d8578063d442d6cc14610129578063e11f5ba21461015a575b600080fd5b341561007157600080fd5b610085600160a060020a0360043516610170565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100c45780820151838201526020016100ac565b505050509050019250505060405180910390f35b34156100e357600080fd5b61012760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506101f395505050505050565b005b341561013457600080fd5b610148600160a060020a0360043516610243565b60405190815260200160405180910390f35b341561016557600080fd5b61012760043561025e565b61017861028e565b60008083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156101e757602002820191906000526020600020905b815481526001909101906020018083116101d2575b50505050509050919050565b610384430661032081101561020757600080fd5b610352811061021557600080fd5b600160a060020a033316600090815260208190526040902082805161023e9291602001906102a0565b505050565b600160a060020a031660009081526001602052604090205490565b610384430661035281101561027257600080fd5b50600160a060020a033316600090815260016020526040902055565b60206040519081016040526000815290565b8280548282559060005260206000209081019282156102dd579160200282015b828111156102dd57825182556020909201916001909101906102c0565b506102e99291506102ed565b5090565b61030791905b808211156102e957600081556001016102f3565b905600a165627a7a7230582034991c8dc4001fc254f3ba2811c05d2e7d29bee3908946ca56d1545b2c852de20029",
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000099": {
+ "balance": "0x92e8434aaaf80e1800000"
+ },
+ "311bdf9066246e68559816e7f636435867f824ef": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "442a44a6fc20f5b8dfa8b304d7137581f7e6bef3": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "47318441696e9ae962633c16e04d53935272639d": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "537fc89618edae86950e12687a612e15c4786b84": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "73898cc3c5beca5841306b26fdb4e30411392a6a": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "74826141342a4dc33a1045cefa4182b6212ec031": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "7bc30fbeb7208192d1474b5f87ffbc056de43c11": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "888c073313b36cf03cf1f739f39443551ff12bbe": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "8d993351c0e2db739f9bcbfdeda94d73b50b16d3": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "a242960b7ca1937e826bda6c397df74d9f9ab01a": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "a89af636787499e81362e815e36f28763eac120b": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "abebf5a6cbe6113780cbe489e3eb0db882381aeb": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "af81190100d82f41ad2c95898195c7a47dc59115": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "bb5ec85408683795da2f604a5c0464868eabfcb6": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "da489a1b4304f49aafaec938c7adc48539470624": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "de5b54e8e7b585153add32f472e8d545e5d42a82": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "e1f9c75ce33e568d8fa3ace90497ee0c60dc921e": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "efea93e384a6ccaaf28e33790a2d1b2625bf964d": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ },
+ "fc087e2622b02b0bb78713e872c02796ef64c8f1": {
+ "balance": "0x200000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "baseFeePerGas": null
+}
diff --git a/genesis/genesis.go b/genesis/genesis.go
new file mode 100644
index 0000000000..94dead3029
--- /dev/null
+++ b/genesis/genesis.go
@@ -0,0 +1,14 @@
+package genesis
+
+import (
+ _ "embed"
+)
+
+//go:embed mainnet.json
+var MainnetGenesis []byte
+
+//go:embed testnet.json
+var TestnetGenesis []byte
+
+//go:embed devnet.json
+var DevnetGenesis []byte
diff --git a/genesis/mainnet.json b/genesis/mainnet.json
new file mode 100644
index 0000000000..e7540bd00b
--- /dev/null
+++ b/genesis/mainnet.json
@@ -0,0 +1,113 @@
+{
+ "config": {
+ "chainId": 50,
+ "homesteadBlock": 1,
+ "eip150Block": 2,
+ "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "eip155Block": 3,
+ "eip158Block": 3,
+ "byzantiumBlock": 4,
+ "XDPoS": {
+ "period": 2,
+ "epoch": 900,
+ "reward": 5000,
+ "rewardCheckpoint": 900,
+ "gap": 450,
+ "foudationWalletAddr": "xdc92a289fe95a85c53b8d0d113cbaef0c1ec98ac65"
+ }
+ },
+ "nonce": "0x0",
+ "timestamp": "0x5cefae27",
+ "extraData": "0x000000000000000000000000000000000000000000000000000000000000000025c65b4b379ac37cf78357c4915f73677022eaffc7d49d0a2cf198deebd6ce581af465944ec8b2bbcfccdea1006a5cfa7d9484b5b293b46964c265c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit": "0x47b760",
+ "difficulty": "0x1",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "xdc0000000000000000000000000000000000000000",
+ "alloc": {
+ "0000000000000000000000000000000000000000": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000001": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000088": {
+ "code": "0x606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x000000000000000000000000000000000000000000000000000000000000000b": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x000000000000000000000000000000000000000000000000000000000000000c": "0x00000000000000000000000000000000000000000000054b40b1f852bda00000",
+ "0x000000000000000000000000000000000000000000000000000000000000000d": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x000000000000000000000000000000000000000000000000000000000000000e": "0x000000000000000000000000000000000000000000000000000000000013c680",
+ "0x000000000000000000000000000000000000000000000000000000000000000f": "0x0000000000000000000000000000000000000000000000000000000000069780",
+ "0x1cb68bf63bb3b55abf504ef789bb06e8b2b266a334ca39892e163225a47b8267": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x2c6b8fd5b2b39958a7e5a98eebf2c1c31122e89c7961ce1025e69a3d3f07fd20": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3639e2dfabac2c6baff147abd66f76b8e526e974a9a2a14163169aa03d2f8d4b": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x473ba2a6d1aa200b3118a8abc51fe248a479e882e6c655ae014d9c66fbc181ed": "0x00000000000000000000000025c65b4b379ac37cf78357c4915f73677022eaff",
+ "0x473ba2a6d1aa200b3118a8abc51fe248a479e882e6c655ae014d9c66fbc181ee": "0x000000000000000000000000c7d49d0a2cf198deebd6ce581af465944ec8b2bb",
+ "0x473ba2a6d1aa200b3118a8abc51fe248a479e882e6c655ae014d9c66fbc181ef": "0x000000000000000000000000cfccdea1006a5cfa7d9484b5b293b46964c265c0",
+ "0x53dbb2c13e64ef254df4bb7c7b541e84dd24870927f98f151db88daa464fb4dc": "0x000000000000000000000000381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0x67a3292220e327ce969d100d7e4d83dd4b05efa763a5e4cdb04e0c0107736472": "0x000000000000000000000001381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0x67a3292220e327ce969d100d7e4d83dd4b05efa763a5e4cdb04e0c0107736473": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x78dfe8da08db00fe2cd4ddbd11f9cb7e4245ce35275d7734678593942034e181": "0x000000000000000000000001381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0x78dfe8da08db00fe2cd4ddbd11f9cb7e4245ce35275d7734678593942034e182": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x90e333b6971c3ecd09a0da09b031d63cdd2dc213d199a66955a8bf7df8a8142d": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688": "0x000000000000000000000000381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0xac80bed7555f6f181a34915490d97d0bfe2c0e116d1c73b34523ca0d9749955c": "0x000000000000000000000000381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0xae7e2a864ae923819e93a9f6183bc7ca0dcee93a0759238acd92344ad3216228": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xb375859c4c97d60e8a699586dc5dd215f38f99e40430bb9261f085ee694ffb2c": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xd5d5b62da76a3a9f2df0e9276cbaf8973a778bf41f7f4942e06243f195493e99": "0x000000000000000000000000381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0xec8699f61c2c8bbdbc66463590788e526c60046dda98e8c70df1fb756050baa4": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3": "0x00000000000000000000000025c65b4b379ac37cf78357c4915f73677022eaff",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4": "0x000000000000000000000000c7d49d0a2cf198deebd6ce581af465944ec8b2bb",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5": "0x000000000000000000000000cfccdea1006a5cfa7d9484b5b293b46964c265c0",
+ "0xf4dd36495f675c407ac8f8d6dd8cc40162c854dba3ce4ce8919af34d0b1ed47c": "0x000000000000000000000001381047523972c9fdc3aa343e0b96900a8e2fa765",
+ "0xf4dd36495f675c407ac8f8d6dd8cc40162c854dba3ce4ce8919af34d0b1ed47d": "0x000000000000000000000000000000000000000000084595161401484a000000"
+ },
+ "balance": "0x18d0bf423c03d8de000000"
+ },
+ "0000000000000000000000000000000000000089": {
+ "code": "0x6060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e341eaa4811461005b578063e7ec6aef14610076578063f4145a83146100df575b600080fd5b341561006657600080fd5b610074600435602435610104565b005b341561008157600080fd5b61008c600435610227565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100cb5780820151838201526020016100b3565b505050509050019250505060405180910390f35b34156100ea57600080fd5b6100f26102ac565b60405190815260200160405180910390f35b438290101561011257600080fd5b600280546101289184910263ffffffff6102b216565b43111561013457600080fd5b600082815260016020819052604090912080549091810161015583826102c8565b5060009182526020808320919091018390558282528190526040902080546001810161018183826102c8565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19163373ffffffffffffffffffffffffffffffffffffffff8116919091179091557f62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f5490838360405173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091526040808301919091526060909101905180910390a15050565b61022f6102f1565b600082815260208181526040918290208054909290918281020190519081016040528092919081815260200182805480156102a057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610275575b50505050509050919050565b60025481565b6000828201838110156102c157fe5b9392505050565b8154818355818115116102ec576000838152602090206102ec918101908301610303565b505050565b60206040519081016040526000815290565b61032191905b8082111561031d5760008155600101610309565b5090565b905600a165627a7a72305820a8ceddaea8e4ae00991e2ae81c8c88e160dd8770f255523282c24c2df4c30ec70029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000384"
+ },
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000090": {
+ "code": "0x6060604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663284180fc811461006657806334d38600146100d8578063d442d6cc14610129578063e11f5ba21461015a575b600080fd5b341561007157600080fd5b610085600160a060020a0360043516610170565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100c45780820151838201526020016100ac565b505050509050019250505060405180910390f35b34156100e357600080fd5b61012760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506101f395505050505050565b005b341561013457600080fd5b610148600160a060020a0360043516610243565b60405190815260200160405180910390f35b341561016557600080fd5b61012760043561025e565b61017861028e565b60008083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156101e757602002820191906000526020600020905b815481526001909101906020018083116101d2575b50505050509050919050565b610384430661032081101561020757600080fd5b610352811061021557600080fd5b600160a060020a033316600090815260208190526040902082805161023e9291602001906102a0565b505050565b600160a060020a031660009081526001602052604090205490565b610384430661035281101561027257600080fd5b50600160a060020a033316600090815260016020526040902055565b60206040519081016040526000815290565b8280548282559060005260206000209081019282156102dd579160200282015b828111156102dd57825182556020909201916001909101906102c0565b506102e99291506102ed565b5090565b61030791905b808211156102e957600081556001016102f3565b905600a165627a7a7230582034991c8dc4001fc254f3ba2811c05d2e7d29bee3908946ca56d1545b2c852de20029",
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000099": {
+ "code": "0x60606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x78b26c076ef10b04070ffc86c9b244b91eb38d2b654f4e2e617edf56d2d830d8": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x0000000000000000000000006aaf1ac2c2afdd2bca4fea2dc471d467781418c3",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x000000000000000000000000c476ce3240bb44e36746f74001d8a0d62bc917f6",
+ "0xc420d2a03bcba1d1b98a4b32ba6d074d885b5a5f366e4de6b9a7fd70184950cd": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ },
+ "balance": "0x0"
+ },
+ "54d4369719bf06b194c32f8be57e2605dd5b59e5": {
+ "balance": "0x7912752226cec5131e000000"
+ },
+ "746249c61f5832c5eed53172776b460491bdcd5c": {
+ "code": "0x60606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x53a74cb8e1409f2fa6885f50a9cd170366c9e7e52c8ca5e4c8268ec2e66088e0": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xb689ca06605d85e946f5fb4cd76cafa04abd8cd4d1cd4e2e8a559464b7f2b8ca": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x000000000000000000000000ca97040ea64b0eb127370b92f6941e9d0cb87134",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x000000000000000000000000d1c8103106710ba08b5596c0ed115b508c879c74"
+ },
+ "balance": "0x0"
+ }
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
+}
\ No newline at end of file
diff --git a/genesis/testnet.json b/genesis/testnet.json
new file mode 100644
index 0000000000..6f643f78e9
--- /dev/null
+++ b/genesis/testnet.json
@@ -0,0 +1,142 @@
+{
+ "config": {
+ "chainId": 51,
+ "homesteadBlock": 1,
+ "eip150Block": 2,
+ "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "eip155Block": 3,
+ "eip158Block": 3,
+ "byzantiumBlock": 4,
+ "eip1559Block": 71550000,
+ "XDPoS": {
+ "period": 2,
+ "epoch": 900,
+ "reward": 5000,
+ "rewardCheckpoint": 900,
+ "gap": 450,
+ "foudationWalletAddr": "xdc746249c61f5832c5eed53172776b460491bdcd5c"
+ }
+ },
+ "nonce": "0x0",
+ "timestamp": "0x5d02164f",
+ "extraData": "0x00000000000000000000000000000000000000000000000000000000000000003ea0a3555f9b1de983572bff6444aeb1899ec58c4f7900282f3d371d585ab1361205b0940ab1789c942a5885a8844ee5587c8ac5e371fc39ffe618960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit": "0x47b760",
+ "difficulty": "0x1",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "xdc0000000000000000000000000000000000000000",
+ "alloc": {
+ "0000000000000000000000000000000000000000": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000001": {
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000088": {
+ "code": "0x606060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063012679511461019b578063025e7c27146101c957806302aa9be21461022c57806306a49fce1461026e5780630db02622146102d85780630e3e4fb81461030157806315febd68146103715780632a3640b1146103a85780632d15cc041461042a5780632f9c4bba146104b8578063302b687214610522578063326586521461058e5780633477ee2e14610640578063441a3e70146106a357806358e7525f146106cf5780635b860d271461071c5780635b9cd8cc146107695780636dd7d8ea1461082457806372e44a3814610852578063a9a981a31461089f578063a9ff959e146108c8578063ae6e43f5146108f1578063b642facd1461092a578063c45607df146109a3578063d09f1ab4146109f0578063d161c76714610a19578063d51b9e9314610a42578063d55b7dff14610a93578063ef18374a14610abc578063f2ee3c7d14610ae5578063f5c9512514610b1e578063f8ac9dd514610b4c575b600080fd5b6101c7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b75565b005b34156101d457600080fd5b6101ea60048080359060200190919050506111fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023757600080fd5b61026c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123b565b005b341561027957600080fd5b610281611796565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102c45780820151818401526020810190506102a9565b505050509050019250505060405180910390f35b34156102e357600080fd5b6102eb61182a565b6040518082815260200191505060405180910390f35b341561030c57600080fd5b610357600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611830565b604051808215151515815260200191505060405180910390f35b341561037c57600080fd5b610392600480803590602001909190505061185f565b6040518082815260200191505060405180910390f35b34156103b357600080fd5b6103e8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506118bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043557600080fd5b610461600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611909565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104a4578082015181840152602081019050610489565b505050509050019250505060405180910390f35b34156104c357600080fd5b6104cb6119dc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561050e5780820151818401526020810190506104f3565b505050509050019250505060405180910390f35b341561052d57600080fd5b610578600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a79565b6040518082815260200191505060405180910390f35b341561059957600080fd5b6105c5600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b03565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106055780820151818401526020810190506105ea565b50505050905090810190601f1680156106325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561064b57600080fd5b6106616004808035906020019091905050611da2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106ae57600080fd5b6106cd6004808035906020019091908035906020019091905050611de1565b005b34156106da57600080fd5b610706600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061208d565b6040518082815260200191505060405180910390f35b341561072757600080fd5b610753600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120d9565b6040518082815260200191505060405180910390f35b341561077457600080fd5b6107a9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506121a1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e95780820151818401526020810190506107ce565b50505050905090810190601f1680156108165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610850600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061226a565b005b341561085d57600080fd5b610889600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612653565b6040518082815260200191505060405180910390f35b34156108aa57600080fd5b6108b261266b565b6040518082815260200191505060405180910390f35b34156108d357600080fd5b6108db612671565b6040518082815260200191505060405180910390f35b34156108fc57600080fd5b610928600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612677565b005b341561093557600080fd5b610961600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ae57600080fd5b6109da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ca2565b6040518082815260200191505060405180910390f35b34156109fb57600080fd5b610a03612cee565b6040518082815260200191505060405180910390f35b3415610a2457600080fd5b610a2c612cf4565b6040518082815260200191505060405180910390f35b3415610a4d57600080fd5b610a79600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612cfa565b604051808215151515815260200191505060405180910390f35b3415610a9e57600080fd5b610aa6612d53565b6040518082815260200191505060405180910390f35b3415610ac757600080fd5b610acf612d59565b6040518082815260200191505060405180910390f35b3415610af057600080fd5b610b1c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d63565b005b3415610b2957600080fd5b610b4a600480803590602001908201803590602001919091929050506134f1565b005b3415610b5757600080fd5b610b5f6135f0565b6040518082815260200191505060405180910390f35b6000600b543410151515610b8857600080fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050141580610c1c57506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050115b1515610c2757600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151515610c8457600080fd5b610cd934600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b915060088054806001018281610cef919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506060604051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200183815250600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050610eb834600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5160016009546135f690919063ffffffff16565b6009819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905014156110185760078054806001018281610fb6919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600a600081548092919060010191905055505b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611069919061362d565b9160005260206000209001600085909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611109919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f7635f1d87b47fba9f2b09e56eb4be75cca030e0cb179c1602ac9261d39a8f5c1338434604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60078181548110151561120b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000828280600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156112cd57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140657600b546113f882600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b1015151561140557600080fd5b5b61145b84600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061153384600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461361490919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115cb43600f546135f690919063ffffffff16565b9250611632846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010180548060010182816116db9190613659565b9160005260206000209001600085909190915055507faa0e554f781c3c3b2be110a0557f260f11af9a8aa2c64bc1e7a31dbb21e32fa2338686604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050505050565b61179e613685565b600880548060200260200160405190810160405280929190818152602001828054801561182057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116117d6575b5050505050905090565b600a5481565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000838152602001908152602001600020549050919050565b6006602052816000526040600020818154811015156118d657fe5b90600052602060002090016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611911613685565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119d057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611986575b50505050509050919050565b6119e4613699565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015611a6f57602002820191906000526020600020905b815481526020019060010190808311611a5b575b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b0b6136ad565b611b1482612cfa565b15611c655760036000611b2684612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160036000611b6f86612c36565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611bba57fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c595780601f10611c2e57610100808354040283529160200191611c59565b820191906000526020600020905b815481529060010190602001808311611c3c57829003601f168201915b50505050509050611d9d565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003815481101515611cf657fe5b90600052602060002090018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b505050505090505b919050565b600881815481101515611db157fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282600082111515611df457600080fd5b814310151515611e0357600080fd5b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600084815260200190815260200160002054111515611e6457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010182815481101515611eb357fe5b906000526020600020900154141515611ecb57600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008681526020019081526020016000205492506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020600090556000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010184815481101515611fc457fe5b9060005260206000209001600090553373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050151561201357600080fd5b7ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568338685604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008082600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561213857600080fd5b61214184612c36565b915061214b612d59565b6064600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561219757fe5b0492505050919050565b6003602052816000526040600020818154811015156121bc57fe5b9060005260206000209001600091509150508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122625780601f1061223757610100808354040283529160200191612262565b820191906000526020600020905b81548152906001019060200180831161224557829003601f168201915b505050505081565b600c54341015151561227b57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1615156122d757600080fd5b61232c34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561249b57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480600101828161244b919061362d565b9160005260206000209001600033909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b61252d34600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135f690919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f66a9138482c99e9baf08860110ef332cc0c23b4a199a53593d8db0fc8f96fbfc338334604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b60046020528060005260406000206000915090505481565b60095481565b600f5481565b6000806000833373ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561271957600080fd5b84600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff16151561277557600080fd5b6000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160146101000a81548160ff0219169083151502179055506127e6600160095461361490919063ffffffff16565b600981905550600094505b6008805490508510156128bb578573ffffffffffffffffffffffffffffffffffffffff1660088681548110151561282457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128ae5760088581548110151561287b57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556128bb565b84806001019550506127f1565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054935061299284600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461361490919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612a7243600e546135f690919063ffffffff16565b9250612ad9846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000868152602001908152602001600020546135f690919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000858152602001908152602001600020819055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054806001018281612b829190613659565b9160005260206000209001600085909190915055507f4edf3e325d0063213a39f9085522994a1c44bea5f39e7d63ef61260a1e58c6d33387604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600d5481565b600e5481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff169050919050565b600b5481565b6000600a54905090565b600080612d6e613685565b600080600033600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612dcf57600080fd5b87600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff161515612e2b57600080fd5b612e3433612c36565b9750612e3f89612c36565b9650600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612ed757600080fd5b6001600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550604b612fc4612d59565b6064600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540281151561301057fe5b041015156134e65760016008805490500360405180591061302e5750595b9080825280602002602001820160405250955060009450600093505b600880549050841015613357578673ffffffffffffffffffffffffffffffffffffffff166130b160088681548110151561308057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612c36565b73ffffffffffffffffffffffffffffffffffffffff16141561334a576130e3600160095461361490919063ffffffff16565b6009819055506008848154811015156130f857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868680600101975081518110151561313857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060088481548110151561318357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160006008868154811015156131c457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549060ff021916905560018201600090555050600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006132bb91906136c1565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061330691906136e2565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555b838060010194505061304a565b600092505b600780549050831015613439578673ffffffffffffffffffffffffffffffffffffffff1660078481548110151561338f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561342c576007838154811015156133e657fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a6000815480929190600190039190505550613439565b828060010193505061335c565b7fe18d61a5bf4aa2ab40afc88aa9039d27ae17ff4ec1c65f5f414df6f02ce8b35e8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b838110156134d15780820151818401526020810190506134b6565b50505050905001935050505060405180910390a15b505050505050505050565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816135429190613703565b91600052602060002090016000848490919290919250919061356592919061372f565b50507f949360d814b28a3b393a68909efe1fee120ee09cac30f360a0f80ab5415a611a338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437820191505094505050505060405180910390a15050565b600c5481565b600080828401905083811015151561360a57fe5b8091505092915050565b600082821115151561362257fe5b818303905092915050565b8154818355818115116136545781836000526020600020918201910161365391906137af565b5b505050565b8154818355818115116136805781836000526020600020918201910161367f91906137af565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906136df91906137d4565b50565b508054600082559060005260206000209081019061370091906137af565b50565b81548183558181151161372a5781836000526020600020918201910161372991906137d4565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377057803560ff191683800117855561379e565b8280016001018555821561379e579182015b8281111561379d578235825591602001919060010190613782565b5b5090506137ab91906137af565b5090565b6137d191905b808211156137cd5760008160009055506001016137b5565b5090565b90565b6137fd91905b808211156137f957600081816137f09190613800565b506001016137da565b5090565b90565b50805460018160011615610100020316600290046000825580601f106138265750613845565b601f01602090049060005260206000209081019061384491906137af565b5b505600a165627a7a72305820f5bbb127b52ce86c873faef85cff176563476a5e49a3d88eaa9a06a8f432c9080029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0x0000000000000000000000000000000000000000000000000000000000000009": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0x000000000000000000000000000000000000000000000000000000000000000a": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x000000000000000000000000000000000000000000000000000000000000000b": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x000000000000000000000000000000000000000000000000000000000000000c": "0x00000000000000000000000000000000000000000000054b40b1f852bda00000",
+ "0x000000000000000000000000000000000000000000000000000000000000000d": "0x0000000000000000000000000000000000000000000000000000000000000012",
+ "0x000000000000000000000000000000000000000000000000000000000000000e": "0x000000000000000000000000000000000000000000000000000000000013c680",
+ "0x000000000000000000000000000000000000000000000000000000000000000f": "0x0000000000000000000000000000000000000000000000000000000000069780",
+ "0x09fc3df44a245ec28768518fb63309d9e12db561eaec408952fddc4ff42fc7ca": "0x000000000000000000000000a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0x0bf1ba111e6cd6ef515b709fb01626b1b684849c7c86334117e4e244d9398c50": "0x0000000000000000000000003ea0a3555f9b1de983572bff6444aeb1899ec58c",
+ "0x0bf1ba111e6cd6ef515b709fb01626b1b684849c7c86334117e4e244d9398c51": "0x0000000000000000000000004f7900282f3d371d585ab1361205b0940ab1789c",
+ "0x0bf1ba111e6cd6ef515b709fb01626b1b684849c7c86334117e4e244d9398c52": "0x000000000000000000000000942a5885a8844ee5587c8ac5e371fc39ffe61896",
+ "0x13c888c9562eb81ccff6d596e621669d194f6656ddfa86cf29bccb5c96b4d841": "0x0000000000000000000000000000000000000000000000000000000000000003",
+ "0x24ee73b4a2483f83e0887c9042498ae071a6d279e16a7630589cc15fefae6a12": "0x000000000000000000000001a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0x24ee73b4a2483f83e0887c9042498ae071a6d279e16a7630589cc15fefae6a13": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x2a5e4044c6b73b0e935aa29d68f1e9d861cb7b22a0230606752a0bc2b54b32e1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x4ae354c2223c243669c7584859f2da59d546f6bb535e96d10c69fe54a2c7db21": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x638c8d45c0309321b2c1ec0596dae8b32bc8743197a1de62bed5ae2a7f29ab07": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x7255e757c72d18a66cd7a49e068b1c888cf13249eb5e6cf7c863b5c964fad035": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0x862cbde24894ee8bc8de0c30714e8e5c84b301f622ba6e47c99d40a93dc46000": "0x000000000000000000000001a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0x862cbde24894ee8bc8de0c30714e8e5c84b301f622ba6e47c99d40a93dc46001": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688": "0x000000000000000000000000a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0xa89068bea7f13f3884c78535548e42254e66ecf0177669c379a91e2f6622f802": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xdc81fadff555cf59bd93411af8f17d64aadf882a703279b21c0df50b36f4192e": "0x000000000000000000000001a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0xdc81fadff555cf59bd93411af8f17d64aadf882a703279b21c0df50b36f4192f": "0x000000000000000000000000000000000000000000084595161401484a000000",
+ "0xe1dcb2218e498dab1fa43398f33a0d96770cf83baeefa7719271ccd121f16b1f": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xe50a63d300df7437f442d7436e95f8b440155156d1bcade02b197f0e10f70820": "0x000000000000000000000000a65010026b83368ca05df6e8b467985d6de3eac5",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3": "0x0000000000000000000000003ea0a3555f9b1de983572bff6444aeb1899ec58c",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4": "0x0000000000000000000000004f7900282f3d371d585ab1361205b0940ab1789c",
+ "0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5": "0x000000000000000000000000942a5885a8844ee5587c8ac5e371fc39ffe61896",
+ "0xfb0211a1cba0819417a7cffd5aee1c4d097141b54cabbfc40d342a062225bbb0": "0x000000000000000000000000a65010026b83368ca05df6e8b467985d6de3eac5"
+ },
+ "balance": "0x18d0bf423c03d8de000000"
+ },
+ "0000000000000000000000000000000000000089": {
+ "code": "0x6060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663e341eaa4811461005b578063e7ec6aef14610076578063f4145a83146100df575b600080fd5b341561006657600080fd5b610074600435602435610104565b005b341561008157600080fd5b61008c600435610227565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100cb5780820151838201526020016100b3565b505050509050019250505060405180910390f35b34156100ea57600080fd5b6100f26102ac565b60405190815260200160405180910390f35b438290101561011257600080fd5b600280546101289184910263ffffffff6102b216565b43111561013457600080fd5b600082815260016020819052604090912080549091810161015583826102c8565b5060009182526020808320919091018390558282528190526040902080546001810161018183826102c8565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19163373ffffffffffffffffffffffffffffffffffffffff8116919091179091557f62855fa22e051687c32ac285857751f6d3f2c100c72756d8d30cb7ecb1f64f5490838360405173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091526040808301919091526060909101905180910390a15050565b61022f6102f1565b600082815260208181526040918290208054909290918281020190519081016040528092919081815260200182805480156102a057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610275575b50505050509050919050565b60025481565b6000828201838110156102c157fe5b9392505050565b8154818355818115116102ec576000838152602090206102ec918101908301610303565b505050565b60206040519081016040526000815290565b61032191905b8082111561031d5760008155600101610309565b5090565b905600a165627a7a72305820a8ceddaea8e4ae00991e2ae81c8c88e160dd8770f255523282c24c2df4c30ec70029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000384"
+ },
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000090": {
+ "code": "0x6060604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663284180fc811461006657806334d38600146100d8578063d442d6cc14610129578063e11f5ba21461015a575b600080fd5b341561007157600080fd5b610085600160a060020a0360043516610170565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156100c45780820151838201526020016100ac565b505050509050019250505060405180910390f35b34156100e357600080fd5b61012760046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496506101f395505050505050565b005b341561013457600080fd5b610148600160a060020a0360043516610243565b60405190815260200160405180910390f35b341561016557600080fd5b61012760043561025e565b61017861028e565b60008083600160a060020a0316600160a060020a031681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156101e757602002820191906000526020600020905b815481526001909101906020018083116101d2575b50505050509050919050565b610384430661032081101561020757600080fd5b610352811061021557600080fd5b600160a060020a033316600090815260208190526040902082805161023e9291602001906102a0565b505050565b600160a060020a031660009081526001602052604090205490565b610384430661035281101561027257600080fd5b50600160a060020a033316600090815260016020526040902055565b60206040519081016040526000815290565b8280548282559060005260206000209081019282156102dd579160200282015b828111156102dd57825182556020909201916001909101906102c0565b506102e99291506102ed565b5090565b61030791905b808211156102e957600081556001016102f3565b905600a165627a7a7230582034991c8dc4001fc254f3ba2811c05d2e7d29bee3908946ca56d1545b2c852de20029",
+ "balance": "0x0"
+ },
+ "0000000000000000000000000000000000000099": {
+ "code": "0x60606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x7a881172b7b2603e247ba4a8d390719620d828c9d9ba1523e51ba8f30d3fd442": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x0000000000000000000000004398241671b3dd484fe3213a4fb7511f30e7d7c0",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x000000000000000000000000065551f0dcac6f00cae11192d462db709be3758c",
+ "0xd2e0325b95fe0a1ddff80581b1bb02b05395a338c96f3fc485b185a9d0cd841f": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ },
+ "balance": "0x0"
+ },
+ "065551f0dcac6f00cae11192d462db709be3758c": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "38b20a2594939531373efcd2e6aa54d03fc534be": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "42e694adfd403152cd9cad82a62fb6cd403f150a": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "4398241671b3dd484fe3213a4fb7511f30e7d7c0": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "4e37f91e3bc69725326af96facf85c14128b07ed": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "664c4a7b15d91b07c468162f535909114c038b91": {
+ "balance": "0x7912752226cec5131e000000"
+ },
+ "746249c61f5832c5eed53172776b460491bdcd5c": {
+ "code": "0x60606040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c278114610165578063173825d91461019757806320ea8d86146101b65780632f54bf6e146101cc5780633411c81c146101ff57806354741525146102215780637065cb4814610250578063784547a71461026f5780638b51d13f146102855780639ace38c21461029b578063a0e67e2b14610349578063a8abe69a146103af578063b5dc40c3146103d2578063b77bf600146103e8578063ba51a6df146103fb578063c01a8c8414610411578063c642747414610427578063d74f8edd1461048c578063dc8452cd1461049f578063e20056e6146104b2578063ee22610b146104d7575b60003411156101635733600160a060020a03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3460405190815260200160405180910390a25b005b341561017057600080fd5b61017b6004356104ed565b604051600160a060020a03909116815260200160405180910390f35b34156101a257600080fd5b610163600160a060020a0360043516610515565b34156101c157600080fd5b6101636004356106aa565b34156101d757600080fd5b6101eb600160a060020a0360043516610788565b604051901515815260200160405180910390f35b341561020a57600080fd5b6101eb600435600160a060020a036024351661079d565b341561022c57600080fd5b61023e600435151560243515156107bd565b60405190815260200160405180910390f35b341561025b57600080fd5b610163600160a060020a0360043516610829565b341561027a57600080fd5b6101eb600435610965565b341561029057600080fd5b61023e6004356109e9565b34156102a657600080fd5b6102b1600435610a58565b604051600160a060020a038516815260208101849052811515606082015260806040820181815290820184818151815260200191508051906020019080838360005b8381101561030b5780820151838201526020016102f3565b50505050905090810190601f1680156103385780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561035457600080fd5b61035c610b36565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561039b578082015183820152602001610383565b505050509050019250505060405180910390f35b34156103ba57600080fd5b61035c60043560243560443515156064351515610b9f565b34156103dd57600080fd5b61035c600435610cc7565b34156103f357600080fd5b61023e610e2b565b341561040657600080fd5b610163600435610e31565b341561041c57600080fd5b610163600435610ec4565b341561043257600080fd5b61023e60048035600160a060020a03169060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610fb295505050505050565b341561049757600080fd5b61023e610fd1565b34156104aa57600080fd5b61023e610fd6565b34156104bd57600080fd5b610163600160a060020a0360043581169060243516610fdc565b34156104e257600080fd5b61016360043561118a565b60038054829081106104fb57fe5b600091825260209091200154600160a060020a0316905081565b600030600160a060020a031633600160a060020a031614151561053757600080fd5b600160a060020a038216600090815260026020526040902054829060ff16151561056057600080fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156106435782600160a060020a03166003838154811015156105aa57fe5b600091825260209091200154600160a060020a03161415610638576003805460001981019081106105d757fe5b60009182526020909120015460038054600160a060020a0390921691849081106105fd57fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055610643565b600190910190610583565b6003805460001901906106569082611442565b50600354600454111561066f5760035461066f90610e31565b82600160a060020a03167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600160a060020a03811660009081526002602052604090205460ff1615156106d257600080fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff16151561070757600080fd5b600084815260208190526040902060030154849060ff161561072857600080fd5b6000858152600160209081526040808320600160a060020a033316808552925291829020805460ff1916905586917ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e9905160405180910390a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b600554811015610822578380156107ea575060008181526020819052604090206003015460ff16155b8061080e575082801561080e575060008181526020819052604090206003015460ff165b1561081a576001820191505b6001016107c1565b5092915050565b30600160a060020a031633600160a060020a031614151561084957600080fd5b600160a060020a038116600090815260026020526040902054819060ff161561087157600080fd5b81600160a060020a038116151561088757600080fd5b600380549050600101600454603282111580156108a45750818111155b80156108af57508015155b80156108ba57508115155b15156108c557600080fd5b600160a060020a0385166000908152600260205260409020805460ff1916600190811790915560038054909181016108fd8382611442565b506000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0387169081179091557ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600080805b6003548110156109e2576000848152600160205260408120600380549192918490811061099357fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff16156109c7576001820191505b6004548214156109da57600192506109e2565b60010161096a565b5050919050565b6000805b600354811015610a525760008381526001602052604081206003805491929184908110610a1657fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610a4a576001820191505b6001016109ed565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a9004600160a060020a031690806001015490806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050506003909301549192505060ff1684565b610b3e61146b565b6003805480602002602001604051908101604052809291908181526020018280548015610b9457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b76575b505050505090505b90565b610ba761146b565b610baf61146b565b600080600554604051805910610bc25750595b9080825280602002602001820160405250925060009150600090505b600554811015610c5757858015610c07575060008181526020819052604090206003015460ff16155b80610c2b5750848015610c2b575060008181526020819052604090206003015460ff165b15610c4f5780838381518110610c3d57fe5b60209081029091010152600191909101905b600101610bde565b878703604051805910610c675750595b908082528060200260200182016040525093508790505b86811015610cbc57828181518110610c9257fe5b906020019060200201518489830381518110610caa57fe5b60209081029091010152600101610c7e565b505050949350505050565b610ccf61146b565b610cd761146b565b6003546000908190604051805910610cec5750595b9080825280602002602001820160405250925060009150600090505b600354811015610db45760008581526001602052604081206003805491929184908110610d3157fe5b6000918252602080832090910154600160a060020a0316835282019290925260400190205460ff1615610dac576003805482908110610d6c57fe5b600091825260209091200154600160a060020a0316838381518110610d8d57fe5b600160a060020a03909216602092830290910190910152600191909101905b600101610d08565b81604051805910610dc25750595b90808252806020026020018201604052509350600090505b81811015610e2357828181518110610dee57fe5b90602001906020020151848281518110610e0457fe5b600160a060020a03909216602092830290910190910152600101610dda565b505050919050565b60055481565b30600160a060020a031633600160a060020a0316141515610e5157600080fd5b6003548160328211801590610e665750818111155b8015610e7157508015155b8015610e7c57508115155b1515610e8757600080fd5b60048390557fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a8360405190815260200160405180910390a1505050565b33600160a060020a03811660009081526002602052604090205460ff161515610eec57600080fd5b6000828152602081905260409020548290600160a060020a03161515610f1157600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615610f4557600080fd5b6000858152600160208181526040808420600160a060020a033316808652925292839020805460ff191690921790915586917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef905160405180910390a3610fab8561118a565b5050505050565b6000610fbf848484611345565b9050610fca81610ec4565b9392505050565b603281565b60045481565b600030600160a060020a031633600160a060020a0316141515610ffe57600080fd5b600160a060020a038316600090815260026020526040902054839060ff16151561102757600080fd5b600160a060020a038316600090815260026020526040902054839060ff161561104f57600080fd5b600092505b6003548310156110e85784600160a060020a031660038481548110151561107757fe5b600091825260209091200154600160a060020a031614156110dd57836003848154811015156110a257fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790556110e8565b600190920191611054565b600160a060020a03808616600081815260026020526040808220805460ff199081169091559388168252908190208054909316600117909255907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90905160405180910390a283600160a060020a03167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b33600160a060020a03811660009081526002602052604081205490919060ff1615156111b557600080fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff1615156111ea57600080fd5b600085815260208190526040902060030154859060ff161561120b57600080fd5b61121486610965565b1561133d576000868152602081905260409081902060038101805460ff19166001908117909155815490820154919750600160a060020a03169160028801905180828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505091505060006040518083038185875af1925050501561130357857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a261133d565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260038501805460ff191690555b505050505050565b600083600160a060020a038116151561135d57600080fd5b600554915060806040519081016040908152600160a060020a0387168252602080830187905281830186905260006060840181905285815290819052208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002019080516113e892916020019061147d565b506060820151600391909101805460ff191691151591909117905550600580546001019055817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611466576000838152602090206114669181019083016114fb565b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114be57805160ff19168380011785556114eb565b828001600101855582156114eb579182015b828111156114eb5782518255916020019190600101906114d0565b506114f79291506114fb565b5090565b610b9c91905b808211156114f757600081556001016115015600a165627a7a72305820d42d65ce3cd184b1c0e98ae5fe9841a03ddd21c504e98c38f8d89df83b2b6be60029",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x7a881172b7b2603e247ba4a8d390719620d828c9d9ba1523e51ba8f30d3fd442": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "0x000000000000000000000000065551f0dcac6f00cae11192d462db709be3758c",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c": "0x0000000000000000000000004398241671b3dd484fe3213a4fb7511f30e7d7c0",
+ "0xd2e0325b95fe0a1ddff80581b1bb02b05395a338c96f3fc485b185a9d0cd841f": "0x0000000000000000000000000000000000000000000000000000000000000001"
+ },
+ "balance": "0x0"
+ },
+ "7aa125338be075260e77c6a66a56c90a5dec4c58": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "9a3787688fd210ec8f8d0224c6c50b8178d75bc0": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "a65010026b83368ca05df6e8b467985d6de3eac5": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ "03c0d9bc556BE68870B96976e81D32ebb49d335D": {
+ "balance": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ }
+
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
+}