Commit e7204109 authored by 贾浩@五瓣科技's avatar 贾浩@五瓣科技

update

parents
.idea
.DS_Store
.vscode
build
./log
ca.crt
\ No newline at end of file
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod tidy && go build -v -o /tmp/api ./cmd/api && go build -v -o /tmp/sync ./cmd/server
FROM alpine:latest
WORKDIR /app
COPY ./config.toml .
COPY --from=builder /tmp/server /usr/bin/server
COPY --from=builder /tmp/sync /usr/bin/sync
EXPOSE 8080
\ No newline at end of file
.PHONY: default all clean dev sync server
GOBIN = $(shell pwd)/build/bin
default: all
all: server sync
server:
go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ ./cmd/server
sync:
go build $(BUILD_FLAGS) -v -o=${GOBIN}/$@ ./cmd/sync
docker:
docker build -t caduceus/contract_backend:latest -f Dockerfile .
package main
import (
"contract_backend/config"
"contract_backend/dao"
"contract_backend/server"
"flag"
"io"
"os"
log "github.com/sirupsen/logrus"
)
func initLog() {
file, _ := os.OpenFile("log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
mw := io.MultiWriter(os.Stdout, file)
log.SetOutput(mw)
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
}
func main() {
initLog()
flag.Parse()
cfg, err := config.New()
if err != nil {
panic(err)
}
da, err := dao.New(cfg)
if err != nil {
panic(err)
}
if cfg.Debug {
log.SetLevel(log.DebugLevel)
}
server.StartServer(cfg, da)
}
package main
import (
"contract_backend/config"
"contract_backend/dao"
monitor "contract_backend/monitor_task"
"flag"
"io"
"os"
log "github.com/sirupsen/logrus"
)
func initLog() {
file, _ := os.OpenFile("log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
mw := io.MultiWriter(os.Stdout, file)
log.SetOutput(mw)
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
}
func main() {
initLog()
flag.Parse()
cfg, err := config.New()
if err != nil {
panic(err)
}
da, err := dao.New(cfg)
if err != nil {
panic(err)
}
if cfg.Debug {
log.SetLevel(log.DebugLevel)
}
m := monitor.NewMonitor(cfg, da)
m.Start()
}
debug = true
[pgsql]
host = "aws-0-ap-northeast-1.pooler.supabase.com"
port = 5432
user = "postgres.vbxtvjffhsirnyxjcuku"
password = "igFIRs1WmA1VLR4o"
database = "postgres"
max_conn = 5
max_idle_conn = 2
enable_log = true
cert_file = "ca.crt"
[server]
listen = "0.0.0.0:8080"
[chain]
rpc = "https://opbnb-testnet-rpc.bnbchain.org"
user_contract = "0xb50e74F8903bb72b3bFf13c37CcC9114336102D1"
executor_contract = "0x7A47D1E515B448A5C18d12A5f603a1fd5C814B34"
x_private_key = "xprv9xwX8JDK1LBoHbfUiif8tmaj5dTGEnrYrDat8RUNowmbz2hCD8N1wydNao1TBhgTzvF1gojUwekF4J28BNo4mCVW81BY3XUwDCQhscSMaC3"
gas_sender_private_key = "2322e0021df509399321fa934e5869f914f7f82a1e366a29559d4a50bf1afa82" # 0x213EE93Ca7069C587e1a6ce5240B4A5eaD9Dd633
executor_private_key = "61acb7bf51fac4c34767ab0c8faa2205d01d006f41051d86cb284a1e2d1e6f2a"
model_price = 10
\ No newline at end of file
package config
import (
"flag"
"github.com/BurntSushi/toml"
)
type Config struct {
Debug bool `toml:"debug"`
PGSQL PGSQLConfig `toml:"pgsql"`
Server ServerConfig `toml:"server"`
Chain ChainConfig `toml:"chain"`
}
type ChainConfig struct {
RPC string `toml:"rpc"`
UserContract string `toml:"user_contract"`
ExecutorContract string `toml:"executor_contract"`
XPrivateKey string `toml:"x_private_key"`
GasSenderPrivateKey string `toml:"gas_sender_private_key"`
ExecutorPrivateKey string `toml:"executor_private_key"`
ModelPrice int `toml:"model_price"`
}
type PGSQLConfig struct {
Host string `toml:"host"`
Port int `toml:"port"`
User string `toml:"user"`
Password string `toml:"password"`
Database string `toml:"database"`
MaxConn int `toml:"max_conn"`
MaxIdleConn int `toml:"max_idle_conn"`
EnableLog bool `toml:"enable_log"`
CertFile string `toml:"cert_file"`
}
type ServerConfig struct {
Listen string `toml:"listen"`
}
var confPath = flag.String("c", "config.toml", "config file path")
func New() (config *Config, err error) {
config = new(Config)
_, err = toml.DecodeFile(*confPath, config)
return
}
package constant
const (
InvalidParam = "invalid param"
InternalError = "internal error"
)
const (
TxStatusPending = 2
TxStatusSuccess = 3
TxStatusFailed = 4
TxStatusRevert = 5
TxStatusUnknown = 6
)
[
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "executeId",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "clusterId",
"type": "uint256"
}
],
"name": "FailExecute",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "string",
"name": "executeId",
"type": "string"
},
{
"indexed": true,
"internalType": "string",
"name": "userId",
"type": "string"
},
{
"indexed": true,
"internalType": "string",
"name": "appId",
"type": "string"
},
{
"indexed": false,
"internalType": "string[]",
"name": "modelIds",
"type": "string[]"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
}
],
"name": "StartExecute",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "executeId",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "clusterId",
"type": "uint256"
}
],
"name": "SuccessExecute",
"type": "event"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "string",
"name": "_userId",
"type": "string"
},
{
"internalType": "string",
"name": "_appId",
"type": "string"
},
{
"internalType": "string[]",
"name": "_modelIds",
"type": "string[]"
},
{
"internalType": "uint256",
"name": "_price",
"type": "uint256"
}
],
"name": "executeByUserId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "string",
"name": "_clusterId",
"type": "string"
}
],
"name": "failExecuteByClusterId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "failExecuteByTokenId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "string",
"name": "_userId",
"type": "string"
},
{
"internalType": "string",
"name": "_appId",
"type": "string"
},
{
"internalType": "string[]",
"name": "_modelIds",
"type": "string[]"
},
{
"internalType": "uint256",
"name": "_price",
"type": "uint256"
}
],
"name": "startExecuteByUserId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "string",
"name": "_clusterId",
"type": "string"
}
],
"name": "successExecuteByComputeId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_executeId",
"type": "string"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "successExecuteByTokenId",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]
\ No newline at end of file
[
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "string",
"name": "userId",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "loginTime",
"type": "uint256"
}
],
"name": "Login",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "addr",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "string",
"name": "userId",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "userInviter",
"type": "string"
},
{
"indexed": false,
"internalType": "string",
"name": "userName",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "registerTime",
"type": "uint256"
}
],
"name": "Register",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "balance",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_userId",
"type": "string"
}
],
"name": "getBalances",
"outputs": [
{
"internalType": "string[]",
"name": "_symbols",
"type": "string[]"
},
{
"internalType": "string[]",
"name": "_names",
"type": "string[]"
},
{
"internalType": "uint256[]",
"name": "_balances",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getOwnedUsers",
"outputs": [
{
"internalType": "string[]",
"name": "_userIds",
"type": "string[]"
},
{
"internalType": "string[]",
"name": "_userNames",
"type": "string[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_user",
"type": "string"
}
],
"name": "getOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_userId",
"type": "string"
},
{
"internalType": "string",
"name": "_inviter",
"type": "string"
}
],
"name": "login",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address payable",
"name": "_user",
"type": "address"
},
{
"internalType": "string",
"name": "_userId",
"type": "string"
},
{
"internalType": "string",
"name": "_inviter",
"type": "string"
}
],
"name": "loginByServer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_user",
"type": "string"
}
],
"name": "userIdToTokenId",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_user",
"type": "uint256"
}
],
"name": "userInviter",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
]
\ No newline at end of file
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
package aon_executor
import (
"errors"
"math/big"
"strings"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
)
// Reference imports to suppress errors if they are not otherwise used.
var (
_ = errors.New
_ = big.NewInt
_ = strings.NewReader
_ = ethereum.NotFound
_ = bind.Bind
_ = common.Big1
_ = types.BloomLookup
_ = event.NewSubscription
_ = abi.ConvertType
)
// AonExecutorMetaData contains all meta data concerning the AonExecutor contract.
var AonExecutorMetaData = &bind.MetaData{
ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"executeId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"clusterId\",\"type\":\"uint256\"}],\"name\":\"FailExecute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"executeId\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"userId\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"appId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"modelIds\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"StartExecute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"executeId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"clusterId\",\"type\":\"uint256\"}],\"name\":\"SuccessExecute\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_userId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_appId\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"_modelIds\",\"type\":\"string[]\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"executeByUserId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_clusterId\",\"type\":\"string\"}],\"name\":\"failExecuteByClusterId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"failExecuteByTokenId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_userId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_appId\",\"type\":\"string\"},{\"internalType\":\"string[]\",\"name\":\"_modelIds\",\"type\":\"string[]\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"startExecuteByUserId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_clusterId\",\"type\":\"string\"}],\"name\":\"successExecuteByComputeId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_executeId\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"successExecuteByTokenId\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
}
// AonExecutorABI is the input ABI used to generate the binding from.
// Deprecated: Use AonExecutorMetaData.ABI instead.
var AonExecutorABI = AonExecutorMetaData.ABI
// AonExecutor is an auto generated Go binding around an Ethereum contract.
type AonExecutor struct {
AonExecutorCaller // Read-only binding to the contract
AonExecutorTransactor // Write-only binding to the contract
AonExecutorFilterer // Log filterer for contract events
}
// AonExecutorCaller is an auto generated read-only Go binding around an Ethereum contract.
type AonExecutorCaller struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonExecutorTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AonExecutorTransactor struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonExecutorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AonExecutorFilterer struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonExecutorSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AonExecutorSession struct {
Contract *AonExecutor // 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
}
// AonExecutorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AonExecutorCallerSession struct {
Contract *AonExecutorCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
}
// AonExecutorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AonExecutorTransactorSession struct {
Contract *AonExecutorTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
// AonExecutorRaw is an auto generated low-level Go binding around an Ethereum contract.
type AonExecutorRaw struct {
Contract *AonExecutor // Generic contract binding to access the raw methods on
}
// AonExecutorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AonExecutorCallerRaw struct {
Contract *AonExecutorCaller // Generic read-only contract binding to access the raw methods on
}
// AonExecutorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AonExecutorTransactorRaw struct {
Contract *AonExecutorTransactor // Generic write-only contract binding to access the raw methods on
}
// NewAonExecutor creates a new instance of AonExecutor, bound to a specific deployed contract.
func NewAonExecutor(address common.Address, backend bind.ContractBackend) (*AonExecutor, error) {
contract, err := bindAonExecutor(address, backend, backend, backend)
if err != nil {
return nil, err
}
return &AonExecutor{AonExecutorCaller: AonExecutorCaller{contract: contract}, AonExecutorTransactor: AonExecutorTransactor{contract: contract}, AonExecutorFilterer: AonExecutorFilterer{contract: contract}}, nil
}
// NewAonExecutorCaller creates a new read-only instance of AonExecutor, bound to a specific deployed contract.
func NewAonExecutorCaller(address common.Address, caller bind.ContractCaller) (*AonExecutorCaller, error) {
contract, err := bindAonExecutor(address, caller, nil, nil)
if err != nil {
return nil, err
}
return &AonExecutorCaller{contract: contract}, nil
}
// NewAonExecutorTransactor creates a new write-only instance of AonExecutor, bound to a specific deployed contract.
func NewAonExecutorTransactor(address common.Address, transactor bind.ContractTransactor) (*AonExecutorTransactor, error) {
contract, err := bindAonExecutor(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &AonExecutorTransactor{contract: contract}, nil
}
// NewAonExecutorFilterer creates a new log filterer instance of AonExecutor, bound to a specific deployed contract.
func NewAonExecutorFilterer(address common.Address, filterer bind.ContractFilterer) (*AonExecutorFilterer, error) {
contract, err := bindAonExecutor(address, nil, nil, filterer)
if err != nil {
return nil, err
}
return &AonExecutorFilterer{contract: contract}, nil
}
// bindAonExecutor binds a generic wrapper to an already deployed contract.
func bindAonExecutor(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := AonExecutorMetaData.GetAbi()
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 (_AonExecutor *AonExecutorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _AonExecutor.Contract.AonExecutorCaller.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 (_AonExecutor *AonExecutorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _AonExecutor.Contract.AonExecutorTransactor.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_AonExecutor *AonExecutorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _AonExecutor.Contract.AonExecutorTransactor.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 (_AonExecutor *AonExecutorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _AonExecutor.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 (_AonExecutor *AonExecutorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _AonExecutor.Contract.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_AonExecutor *AonExecutorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _AonExecutor.Contract.contract.Transact(opts, method, params...)
}
// ExecuteByUserId is a paid mutator transaction binding the contract method 0x17ad88ee.
//
// Solidity: function executeByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorTransactor) ExecuteByUserId(opts *bind.TransactOpts, _executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "executeByUserId", _executeId, _userId, _appId, _modelIds, _price)
}
// ExecuteByUserId is a paid mutator transaction binding the contract method 0x17ad88ee.
//
// Solidity: function executeByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorSession) ExecuteByUserId(_executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.ExecuteByUserId(&_AonExecutor.TransactOpts, _executeId, _userId, _appId, _modelIds, _price)
}
// ExecuteByUserId is a paid mutator transaction binding the contract method 0x17ad88ee.
//
// Solidity: function executeByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) ExecuteByUserId(_executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.ExecuteByUserId(&_AonExecutor.TransactOpts, _executeId, _userId, _appId, _modelIds, _price)
}
// FailExecuteByClusterId is a paid mutator transaction binding the contract method 0x2314efc1.
//
// Solidity: function failExecuteByClusterId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorTransactor) FailExecuteByClusterId(opts *bind.TransactOpts, _executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "failExecuteByClusterId", _executeId, _clusterId)
}
// FailExecuteByClusterId is a paid mutator transaction binding the contract method 0x2314efc1.
//
// Solidity: function failExecuteByClusterId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorSession) FailExecuteByClusterId(_executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.Contract.FailExecuteByClusterId(&_AonExecutor.TransactOpts, _executeId, _clusterId)
}
// FailExecuteByClusterId is a paid mutator transaction binding the contract method 0x2314efc1.
//
// Solidity: function failExecuteByClusterId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) FailExecuteByClusterId(_executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.Contract.FailExecuteByClusterId(&_AonExecutor.TransactOpts, _executeId, _clusterId)
}
// FailExecuteByTokenId is a paid mutator transaction binding the contract method 0x74dd06b3.
//
// Solidity: function failExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorTransactor) FailExecuteByTokenId(opts *bind.TransactOpts, _executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "failExecuteByTokenId", _executeId, _tokenId)
}
// FailExecuteByTokenId is a paid mutator transaction binding the contract method 0x74dd06b3.
//
// Solidity: function failExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorSession) FailExecuteByTokenId(_executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.FailExecuteByTokenId(&_AonExecutor.TransactOpts, _executeId, _tokenId)
}
// FailExecuteByTokenId is a paid mutator transaction binding the contract method 0x74dd06b3.
//
// Solidity: function failExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) FailExecuteByTokenId(_executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.FailExecuteByTokenId(&_AonExecutor.TransactOpts, _executeId, _tokenId)
}
// StartExecuteByUserId is a paid mutator transaction binding the contract method 0xefd68cbd.
//
// Solidity: function startExecuteByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorTransactor) StartExecuteByUserId(opts *bind.TransactOpts, _executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "startExecuteByUserId", _executeId, _userId, _appId, _modelIds, _price)
}
// StartExecuteByUserId is a paid mutator transaction binding the contract method 0xefd68cbd.
//
// Solidity: function startExecuteByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorSession) StartExecuteByUserId(_executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.StartExecuteByUserId(&_AonExecutor.TransactOpts, _executeId, _userId, _appId, _modelIds, _price)
}
// StartExecuteByUserId is a paid mutator transaction binding the contract method 0xefd68cbd.
//
// Solidity: function startExecuteByUserId(string _executeId, string _userId, string _appId, string[] _modelIds, uint256 _price) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) StartExecuteByUserId(_executeId string, _userId string, _appId string, _modelIds []string, _price *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.StartExecuteByUserId(&_AonExecutor.TransactOpts, _executeId, _userId, _appId, _modelIds, _price)
}
// SuccessExecuteByComputeId is a paid mutator transaction binding the contract method 0x97dd7d2f.
//
// Solidity: function successExecuteByComputeId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorTransactor) SuccessExecuteByComputeId(opts *bind.TransactOpts, _executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "successExecuteByComputeId", _executeId, _clusterId)
}
// SuccessExecuteByComputeId is a paid mutator transaction binding the contract method 0x97dd7d2f.
//
// Solidity: function successExecuteByComputeId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorSession) SuccessExecuteByComputeId(_executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.Contract.SuccessExecuteByComputeId(&_AonExecutor.TransactOpts, _executeId, _clusterId)
}
// SuccessExecuteByComputeId is a paid mutator transaction binding the contract method 0x97dd7d2f.
//
// Solidity: function successExecuteByComputeId(string _executeId, string _clusterId) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) SuccessExecuteByComputeId(_executeId string, _clusterId string) (*types.Transaction, error) {
return _AonExecutor.Contract.SuccessExecuteByComputeId(&_AonExecutor.TransactOpts, _executeId, _clusterId)
}
// SuccessExecuteByTokenId is a paid mutator transaction binding the contract method 0xe0e30578.
//
// Solidity: function successExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorTransactor) SuccessExecuteByTokenId(opts *bind.TransactOpts, _executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.contract.Transact(opts, "successExecuteByTokenId", _executeId, _tokenId)
}
// SuccessExecuteByTokenId is a paid mutator transaction binding the contract method 0xe0e30578.
//
// Solidity: function successExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorSession) SuccessExecuteByTokenId(_executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.SuccessExecuteByTokenId(&_AonExecutor.TransactOpts, _executeId, _tokenId)
}
// SuccessExecuteByTokenId is a paid mutator transaction binding the contract method 0xe0e30578.
//
// Solidity: function successExecuteByTokenId(string _executeId, uint256 _tokenId) returns(bool)
func (_AonExecutor *AonExecutorTransactorSession) SuccessExecuteByTokenId(_executeId string, _tokenId *big.Int) (*types.Transaction, error) {
return _AonExecutor.Contract.SuccessExecuteByTokenId(&_AonExecutor.TransactOpts, _executeId, _tokenId)
}
// AonExecutorFailExecuteIterator is returned from FilterFailExecute and is used to iterate over the raw logs and unpacked data for FailExecute events raised by the AonExecutor contract.
type AonExecutorFailExecuteIterator struct {
Event *AonExecutorFailExecute // 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 *AonExecutorFailExecuteIterator) 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(AonExecutorFailExecute)
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(AonExecutorFailExecute)
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 *AonExecutorFailExecuteIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonExecutorFailExecuteIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonExecutorFailExecute represents a FailExecute event raised by the AonExecutor contract.
type AonExecutorFailExecute struct {
ExecuteId string
ClusterId *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterFailExecute is a free log retrieval operation binding the contract event 0x9af0f6445eed16dc3dde9f497dcdaa728c7de2e52a0a8de540d768fe0f92b0e1.
//
// Solidity: event FailExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) FilterFailExecute(opts *bind.FilterOpts) (*AonExecutorFailExecuteIterator, error) {
logs, sub, err := _AonExecutor.contract.FilterLogs(opts, "FailExecute")
if err != nil {
return nil, err
}
return &AonExecutorFailExecuteIterator{contract: _AonExecutor.contract, event: "FailExecute", logs: logs, sub: sub}, nil
}
// WatchFailExecute is a free log subscription operation binding the contract event 0x9af0f6445eed16dc3dde9f497dcdaa728c7de2e52a0a8de540d768fe0f92b0e1.
//
// Solidity: event FailExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) WatchFailExecute(opts *bind.WatchOpts, sink chan<- *AonExecutorFailExecute) (event.Subscription, error) {
logs, sub, err := _AonExecutor.contract.WatchLogs(opts, "FailExecute")
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(AonExecutorFailExecute)
if err := _AonExecutor.contract.UnpackLog(event, "FailExecute", 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
}
// ParseFailExecute is a log parse operation binding the contract event 0x9af0f6445eed16dc3dde9f497dcdaa728c7de2e52a0a8de540d768fe0f92b0e1.
//
// Solidity: event FailExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) ParseFailExecute(log types.Log) (*AonExecutorFailExecute, error) {
event := new(AonExecutorFailExecute)
if err := _AonExecutor.contract.UnpackLog(event, "FailExecute", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonExecutorStartExecuteIterator is returned from FilterStartExecute and is used to iterate over the raw logs and unpacked data for StartExecute events raised by the AonExecutor contract.
type AonExecutorStartExecuteIterator struct {
Event *AonExecutorStartExecute // 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 *AonExecutorStartExecuteIterator) 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(AonExecutorStartExecute)
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(AonExecutorStartExecute)
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 *AonExecutorStartExecuteIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonExecutorStartExecuteIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonExecutorStartExecute represents a StartExecute event raised by the AonExecutor contract.
type AonExecutorStartExecute struct {
ExecuteId common.Hash
UserId common.Hash
AppId common.Hash
ModelIds []string
Price *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterStartExecute is a free log retrieval operation binding the contract event 0xe2e69e28fe6cc2df467044e71ecf48c75a3af80be767a83bff742cbf5e3cdf62.
//
// Solidity: event StartExecute(string indexed executeId, string indexed userId, string indexed appId, string[] modelIds, uint256 price)
func (_AonExecutor *AonExecutorFilterer) FilterStartExecute(opts *bind.FilterOpts, executeId []string, userId []string, appId []string) (*AonExecutorStartExecuteIterator, error) {
var executeIdRule []interface{}
for _, executeIdItem := range executeId {
executeIdRule = append(executeIdRule, executeIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
var appIdRule []interface{}
for _, appIdItem := range appId {
appIdRule = append(appIdRule, appIdItem)
}
logs, sub, err := _AonExecutor.contract.FilterLogs(opts, "StartExecute", executeIdRule, userIdRule, appIdRule)
if err != nil {
return nil, err
}
return &AonExecutorStartExecuteIterator{contract: _AonExecutor.contract, event: "StartExecute", logs: logs, sub: sub}, nil
}
// WatchStartExecute is a free log subscription operation binding the contract event 0xe2e69e28fe6cc2df467044e71ecf48c75a3af80be767a83bff742cbf5e3cdf62.
//
// Solidity: event StartExecute(string indexed executeId, string indexed userId, string indexed appId, string[] modelIds, uint256 price)
func (_AonExecutor *AonExecutorFilterer) WatchStartExecute(opts *bind.WatchOpts, sink chan<- *AonExecutorStartExecute, executeId []string, userId []string, appId []string) (event.Subscription, error) {
var executeIdRule []interface{}
for _, executeIdItem := range executeId {
executeIdRule = append(executeIdRule, executeIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
var appIdRule []interface{}
for _, appIdItem := range appId {
appIdRule = append(appIdRule, appIdItem)
}
logs, sub, err := _AonExecutor.contract.WatchLogs(opts, "StartExecute", executeIdRule, userIdRule, appIdRule)
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(AonExecutorStartExecute)
if err := _AonExecutor.contract.UnpackLog(event, "StartExecute", 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
}
// ParseStartExecute is a log parse operation binding the contract event 0xe2e69e28fe6cc2df467044e71ecf48c75a3af80be767a83bff742cbf5e3cdf62.
//
// Solidity: event StartExecute(string indexed executeId, string indexed userId, string indexed appId, string[] modelIds, uint256 price)
func (_AonExecutor *AonExecutorFilterer) ParseStartExecute(log types.Log) (*AonExecutorStartExecute, error) {
event := new(AonExecutorStartExecute)
if err := _AonExecutor.contract.UnpackLog(event, "StartExecute", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonExecutorSuccessExecuteIterator is returned from FilterSuccessExecute and is used to iterate over the raw logs and unpacked data for SuccessExecute events raised by the AonExecutor contract.
type AonExecutorSuccessExecuteIterator struct {
Event *AonExecutorSuccessExecute // 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 *AonExecutorSuccessExecuteIterator) 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(AonExecutorSuccessExecute)
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(AonExecutorSuccessExecute)
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 *AonExecutorSuccessExecuteIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonExecutorSuccessExecuteIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonExecutorSuccessExecute represents a SuccessExecute event raised by the AonExecutor contract.
type AonExecutorSuccessExecute struct {
ExecuteId string
ClusterId *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterSuccessExecute is a free log retrieval operation binding the contract event 0xe56c82af956ad479f27c9a7e40e204898dd4d2f6bc0bfc0382332afc3fd2fa5c.
//
// Solidity: event SuccessExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) FilterSuccessExecute(opts *bind.FilterOpts) (*AonExecutorSuccessExecuteIterator, error) {
logs, sub, err := _AonExecutor.contract.FilterLogs(opts, "SuccessExecute")
if err != nil {
return nil, err
}
return &AonExecutorSuccessExecuteIterator{contract: _AonExecutor.contract, event: "SuccessExecute", logs: logs, sub: sub}, nil
}
// WatchSuccessExecute is a free log subscription operation binding the contract event 0xe56c82af956ad479f27c9a7e40e204898dd4d2f6bc0bfc0382332afc3fd2fa5c.
//
// Solidity: event SuccessExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) WatchSuccessExecute(opts *bind.WatchOpts, sink chan<- *AonExecutorSuccessExecute) (event.Subscription, error) {
logs, sub, err := _AonExecutor.contract.WatchLogs(opts, "SuccessExecute")
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(AonExecutorSuccessExecute)
if err := _AonExecutor.contract.UnpackLog(event, "SuccessExecute", 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
}
// ParseSuccessExecute is a log parse operation binding the contract event 0xe56c82af956ad479f27c9a7e40e204898dd4d2f6bc0bfc0382332afc3fd2fa5c.
//
// Solidity: event SuccessExecute(string executeId, uint256 clusterId)
func (_AonExecutor *AonExecutorFilterer) ParseSuccessExecute(log types.Log) (*AonExecutorSuccessExecute, error) {
event := new(AonExecutorSuccessExecute)
if err := _AonExecutor.contract.UnpackLog(event, "SuccessExecute", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
package aon_user
import (
"errors"
"math/big"
"strings"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
)
// Reference imports to suppress errors if they are not otherwise used.
var (
_ = errors.New
_ = big.NewInt
_ = strings.NewReader
_ = ethereum.NotFound
_ = bind.Bind
_ = common.Big1
_ = types.BloomLookup
_ = event.NewSubscription
_ = abi.ConvertType
)
// AonUserMetaData contains all meta data concerning the AonUser contract.
var AonUserMetaData = &bind.MetaData{
ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"userId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"loginTime\",\"type\":\"uint256\"}],\"name\":\"Login\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"userId\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"userInviter\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"userName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"registerTime\",\"type\":\"uint256\"}],\"name\":\"Register\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_userId\",\"type\":\"string\"}],\"name\":\"getBalances\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"_symbols\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"_names\",\"type\":\"string[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwnedUsers\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"_userIds\",\"type\":\"string[]\"},{\"internalType\":\"string[]\",\"name\":\"_userNames\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_user\",\"type\":\"string\"}],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_userId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_inviter\",\"type\":\"string\"}],\"name\":\"login\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_userId\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_inviter\",\"type\":\"string\"}],\"name\":\"loginByServer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_user\",\"type\":\"string\"}],\"name\":\"userIdToTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_user\",\"type\":\"uint256\"}],\"name\":\"userInviter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
}
// AonUserABI is the input ABI used to generate the binding from.
// Deprecated: Use AonUserMetaData.ABI instead.
var AonUserABI = AonUserMetaData.ABI
// AonUser is an auto generated Go binding around an Ethereum contract.
type AonUser struct {
AonUserCaller // Read-only binding to the contract
AonUserTransactor // Write-only binding to the contract
AonUserFilterer // Log filterer for contract events
}
// AonUserCaller is an auto generated read-only Go binding around an Ethereum contract.
type AonUserCaller struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonUserTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AonUserTransactor struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonUserFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AonUserFilterer struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// AonUserSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AonUserSession struct {
Contract *AonUser // 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
}
// AonUserCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AonUserCallerSession struct {
Contract *AonUserCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
}
// AonUserTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AonUserTransactorSession struct {
Contract *AonUserTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
// AonUserRaw is an auto generated low-level Go binding around an Ethereum contract.
type AonUserRaw struct {
Contract *AonUser // Generic contract binding to access the raw methods on
}
// AonUserCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AonUserCallerRaw struct {
Contract *AonUserCaller // Generic read-only contract binding to access the raw methods on
}
// AonUserTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AonUserTransactorRaw struct {
Contract *AonUserTransactor // Generic write-only contract binding to access the raw methods on
}
// NewAonUser creates a new instance of AonUser, bound to a specific deployed contract.
func NewAonUser(address common.Address, backend bind.ContractBackend) (*AonUser, error) {
contract, err := bindAonUser(address, backend, backend, backend)
if err != nil {
return nil, err
}
return &AonUser{AonUserCaller: AonUserCaller{contract: contract}, AonUserTransactor: AonUserTransactor{contract: contract}, AonUserFilterer: AonUserFilterer{contract: contract}}, nil
}
// NewAonUserCaller creates a new read-only instance of AonUser, bound to a specific deployed contract.
func NewAonUserCaller(address common.Address, caller bind.ContractCaller) (*AonUserCaller, error) {
contract, err := bindAonUser(address, caller, nil, nil)
if err != nil {
return nil, err
}
return &AonUserCaller{contract: contract}, nil
}
// NewAonUserTransactor creates a new write-only instance of AonUser, bound to a specific deployed contract.
func NewAonUserTransactor(address common.Address, transactor bind.ContractTransactor) (*AonUserTransactor, error) {
contract, err := bindAonUser(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &AonUserTransactor{contract: contract}, nil
}
// NewAonUserFilterer creates a new log filterer instance of AonUser, bound to a specific deployed contract.
func NewAonUserFilterer(address common.Address, filterer bind.ContractFilterer) (*AonUserFilterer, error) {
contract, err := bindAonUser(address, nil, nil, filterer)
if err != nil {
return nil, err
}
return &AonUserFilterer{contract: contract}, nil
}
// bindAonUser binds a generic wrapper to an already deployed contract.
func bindAonUser(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := AonUserMetaData.GetAbi()
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 (_AonUser *AonUserRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _AonUser.Contract.AonUserCaller.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 (_AonUser *AonUserRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _AonUser.Contract.AonUserTransactor.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_AonUser *AonUserRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _AonUser.Contract.AonUserTransactor.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 (_AonUser *AonUserCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _AonUser.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 (_AonUser *AonUserTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _AonUser.Contract.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_AonUser *AonUserTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _AonUser.Contract.contract.Transact(opts, method, params...)
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address owner) view returns(uint256 balance)
func (_AonUser *AonUserCaller) BalanceOf(opts *bind.CallOpts, owner common.Address) (*big.Int, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "balanceOf", owner)
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address owner) view returns(uint256 balance)
func (_AonUser *AonUserSession) BalanceOf(owner common.Address) (*big.Int, error) {
return _AonUser.Contract.BalanceOf(&_AonUser.CallOpts, owner)
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address owner) view returns(uint256 balance)
func (_AonUser *AonUserCallerSession) BalanceOf(owner common.Address) (*big.Int, error) {
return _AonUser.Contract.BalanceOf(&_AonUser.CallOpts, owner)
}
// GetApproved is a free data retrieval call binding the contract method 0x081812fc.
//
// Solidity: function getApproved(uint256 tokenId) view returns(address operator)
func (_AonUser *AonUserCaller) GetApproved(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "getApproved", tokenId)
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// GetApproved is a free data retrieval call binding the contract method 0x081812fc.
//
// Solidity: function getApproved(uint256 tokenId) view returns(address operator)
func (_AonUser *AonUserSession) GetApproved(tokenId *big.Int) (common.Address, error) {
return _AonUser.Contract.GetApproved(&_AonUser.CallOpts, tokenId)
}
// GetApproved is a free data retrieval call binding the contract method 0x081812fc.
//
// Solidity: function getApproved(uint256 tokenId) view returns(address operator)
func (_AonUser *AonUserCallerSession) GetApproved(tokenId *big.Int) (common.Address, error) {
return _AonUser.Contract.GetApproved(&_AonUser.CallOpts, tokenId)
}
// GetBalances is a free data retrieval call binding the contract method 0x08ad600e.
//
// Solidity: function getBalances(string _userId) view returns(string[] _symbols, string[] _names, uint256[] _balances)
func (_AonUser *AonUserCaller) GetBalances(opts *bind.CallOpts, _userId string) (struct {
Symbols []string
Names []string
Balances []*big.Int
}, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "getBalances", _userId)
outstruct := new(struct {
Symbols []string
Names []string
Balances []*big.Int
})
if err != nil {
return *outstruct, err
}
outstruct.Symbols = *abi.ConvertType(out[0], new([]string)).(*[]string)
outstruct.Names = *abi.ConvertType(out[1], new([]string)).(*[]string)
outstruct.Balances = *abi.ConvertType(out[2], new([]*big.Int)).(*[]*big.Int)
return *outstruct, err
}
// GetBalances is a free data retrieval call binding the contract method 0x08ad600e.
//
// Solidity: function getBalances(string _userId) view returns(string[] _symbols, string[] _names, uint256[] _balances)
func (_AonUser *AonUserSession) GetBalances(_userId string) (struct {
Symbols []string
Names []string
Balances []*big.Int
}, error) {
return _AonUser.Contract.GetBalances(&_AonUser.CallOpts, _userId)
}
// GetBalances is a free data retrieval call binding the contract method 0x08ad600e.
//
// Solidity: function getBalances(string _userId) view returns(string[] _symbols, string[] _names, uint256[] _balances)
func (_AonUser *AonUserCallerSession) GetBalances(_userId string) (struct {
Symbols []string
Names []string
Balances []*big.Int
}, error) {
return _AonUser.Contract.GetBalances(&_AonUser.CallOpts, _userId)
}
// GetOwnedUsers is a free data retrieval call binding the contract method 0x98d24e88.
//
// Solidity: function getOwnedUsers() view returns(string[] _userIds, string[] _userNames)
func (_AonUser *AonUserCaller) GetOwnedUsers(opts *bind.CallOpts) (struct {
UserIds []string
UserNames []string
}, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "getOwnedUsers")
outstruct := new(struct {
UserIds []string
UserNames []string
})
if err != nil {
return *outstruct, err
}
outstruct.UserIds = *abi.ConvertType(out[0], new([]string)).(*[]string)
outstruct.UserNames = *abi.ConvertType(out[1], new([]string)).(*[]string)
return *outstruct, err
}
// GetOwnedUsers is a free data retrieval call binding the contract method 0x98d24e88.
//
// Solidity: function getOwnedUsers() view returns(string[] _userIds, string[] _userNames)
func (_AonUser *AonUserSession) GetOwnedUsers() (struct {
UserIds []string
UserNames []string
}, error) {
return _AonUser.Contract.GetOwnedUsers(&_AonUser.CallOpts)
}
// GetOwnedUsers is a free data retrieval call binding the contract method 0x98d24e88.
//
// Solidity: function getOwnedUsers() view returns(string[] _userIds, string[] _userNames)
func (_AonUser *AonUserCallerSession) GetOwnedUsers() (struct {
UserIds []string
UserNames []string
}, error) {
return _AonUser.Contract.GetOwnedUsers(&_AonUser.CallOpts)
}
// GetOwner is a free data retrieval call binding the contract method 0x4aaf4a12.
//
// Solidity: function getOwner(string _user) view returns(address)
func (_AonUser *AonUserCaller) GetOwner(opts *bind.CallOpts, _user string) (common.Address, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "getOwner", _user)
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// GetOwner is a free data retrieval call binding the contract method 0x4aaf4a12.
//
// Solidity: function getOwner(string _user) view returns(address)
func (_AonUser *AonUserSession) GetOwner(_user string) (common.Address, error) {
return _AonUser.Contract.GetOwner(&_AonUser.CallOpts, _user)
}
// GetOwner is a free data retrieval call binding the contract method 0x4aaf4a12.
//
// Solidity: function getOwner(string _user) view returns(address)
func (_AonUser *AonUserCallerSession) GetOwner(_user string) (common.Address, error) {
return _AonUser.Contract.GetOwner(&_AonUser.CallOpts, _user)
}
// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5.
//
// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool)
func (_AonUser *AonUserCaller) IsApprovedForAll(opts *bind.CallOpts, owner common.Address, operator common.Address) (bool, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "isApprovedForAll", owner, operator)
if err != nil {
return *new(bool), err
}
out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
return out0, err
}
// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5.
//
// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool)
func (_AonUser *AonUserSession) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) {
return _AonUser.Contract.IsApprovedForAll(&_AonUser.CallOpts, owner, operator)
}
// IsApprovedForAll is a free data retrieval call binding the contract method 0xe985e9c5.
//
// Solidity: function isApprovedForAll(address owner, address operator) view returns(bool)
func (_AonUser *AonUserCallerSession) IsApprovedForAll(owner common.Address, operator common.Address) (bool, error) {
return _AonUser.Contract.IsApprovedForAll(&_AonUser.CallOpts, owner, operator)
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_AonUser *AonUserCaller) Name(opts *bind.CallOpts) (string, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "name")
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_AonUser *AonUserSession) Name() (string, error) {
return _AonUser.Contract.Name(&_AonUser.CallOpts)
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_AonUser *AonUserCallerSession) Name() (string, error) {
return _AonUser.Contract.Name(&_AonUser.CallOpts)
}
// OwnerOf is a free data retrieval call binding the contract method 0x6352211e.
//
// Solidity: function ownerOf(uint256 tokenId) view returns(address owner)
func (_AonUser *AonUserCaller) OwnerOf(opts *bind.CallOpts, tokenId *big.Int) (common.Address, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "ownerOf", tokenId)
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// OwnerOf is a free data retrieval call binding the contract method 0x6352211e.
//
// Solidity: function ownerOf(uint256 tokenId) view returns(address owner)
func (_AonUser *AonUserSession) OwnerOf(tokenId *big.Int) (common.Address, error) {
return _AonUser.Contract.OwnerOf(&_AonUser.CallOpts, tokenId)
}
// OwnerOf is a free data retrieval call binding the contract method 0x6352211e.
//
// Solidity: function ownerOf(uint256 tokenId) view returns(address owner)
func (_AonUser *AonUserCallerSession) OwnerOf(tokenId *big.Int) (common.Address, error) {
return _AonUser.Contract.OwnerOf(&_AonUser.CallOpts, tokenId)
}
// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
//
// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool)
func (_AonUser *AonUserCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "supportsInterface", interfaceId)
if err != nil {
return *new(bool), err
}
out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
return out0, err
}
// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
//
// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool)
func (_AonUser *AonUserSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
return _AonUser.Contract.SupportsInterface(&_AonUser.CallOpts, interfaceId)
}
// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
//
// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool)
func (_AonUser *AonUserCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
return _AonUser.Contract.SupportsInterface(&_AonUser.CallOpts, interfaceId)
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_AonUser *AonUserCaller) Symbol(opts *bind.CallOpts) (string, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "symbol")
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_AonUser *AonUserSession) Symbol() (string, error) {
return _AonUser.Contract.Symbol(&_AonUser.CallOpts)
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_AonUser *AonUserCallerSession) Symbol() (string, error) {
return _AonUser.Contract.Symbol(&_AonUser.CallOpts)
}
// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd.
//
// Solidity: function tokenURI(uint256 tokenId) view returns(string)
func (_AonUser *AonUserCaller) TokenURI(opts *bind.CallOpts, tokenId *big.Int) (string, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "tokenURI", tokenId)
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd.
//
// Solidity: function tokenURI(uint256 tokenId) view returns(string)
func (_AonUser *AonUserSession) TokenURI(tokenId *big.Int) (string, error) {
return _AonUser.Contract.TokenURI(&_AonUser.CallOpts, tokenId)
}
// TokenURI is a free data retrieval call binding the contract method 0xc87b56dd.
//
// Solidity: function tokenURI(uint256 tokenId) view returns(string)
func (_AonUser *AonUserCallerSession) TokenURI(tokenId *big.Int) (string, error) {
return _AonUser.Contract.TokenURI(&_AonUser.CallOpts, tokenId)
}
// UserIdToTokenId is a free data retrieval call binding the contract method 0x797cf053.
//
// Solidity: function userIdToTokenId(string _user) view returns(uint256)
func (_AonUser *AonUserCaller) UserIdToTokenId(opts *bind.CallOpts, _user string) (*big.Int, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "userIdToTokenId", _user)
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// UserIdToTokenId is a free data retrieval call binding the contract method 0x797cf053.
//
// Solidity: function userIdToTokenId(string _user) view returns(uint256)
func (_AonUser *AonUserSession) UserIdToTokenId(_user string) (*big.Int, error) {
return _AonUser.Contract.UserIdToTokenId(&_AonUser.CallOpts, _user)
}
// UserIdToTokenId is a free data retrieval call binding the contract method 0x797cf053.
//
// Solidity: function userIdToTokenId(string _user) view returns(uint256)
func (_AonUser *AonUserCallerSession) UserIdToTokenId(_user string) (*big.Int, error) {
return _AonUser.Contract.UserIdToTokenId(&_AonUser.CallOpts, _user)
}
// UserInviter is a free data retrieval call binding the contract method 0x6690c3a1.
//
// Solidity: function userInviter(uint256 _user) view returns(uint256)
func (_AonUser *AonUserCaller) UserInviter(opts *bind.CallOpts, _user *big.Int) (*big.Int, error) {
var out []interface{}
err := _AonUser.contract.Call(opts, &out, "userInviter", _user)
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// UserInviter is a free data retrieval call binding the contract method 0x6690c3a1.
//
// Solidity: function userInviter(uint256 _user) view returns(uint256)
func (_AonUser *AonUserSession) UserInviter(_user *big.Int) (*big.Int, error) {
return _AonUser.Contract.UserInviter(&_AonUser.CallOpts, _user)
}
// UserInviter is a free data retrieval call binding the contract method 0x6690c3a1.
//
// Solidity: function userInviter(uint256 _user) view returns(uint256)
func (_AonUser *AonUserCallerSession) UserInviter(_user *big.Int) (*big.Int, error) {
return _AonUser.Contract.UserInviter(&_AonUser.CallOpts, _user)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactor) Approve(opts *bind.TransactOpts, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "approve", to, tokenId)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address to, uint256 tokenId) returns()
func (_AonUser *AonUserSession) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.Approve(&_AonUser.TransactOpts, to, tokenId)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactorSession) Approve(to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.Approve(&_AonUser.TransactOpts, to, tokenId)
}
// Login is a paid mutator transaction binding the contract method 0x58467dbc.
//
// Solidity: function login(string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserTransactor) Login(opts *bind.TransactOpts, _userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "login", _userId, _inviter)
}
// Login is a paid mutator transaction binding the contract method 0x58467dbc.
//
// Solidity: function login(string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserSession) Login(_userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.Contract.Login(&_AonUser.TransactOpts, _userId, _inviter)
}
// Login is a paid mutator transaction binding the contract method 0x58467dbc.
//
// Solidity: function login(string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserTransactorSession) Login(_userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.Contract.Login(&_AonUser.TransactOpts, _userId, _inviter)
}
// LoginByServer is a paid mutator transaction binding the contract method 0x4cf9284b.
//
// Solidity: function loginByServer(address _user, string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserTransactor) LoginByServer(opts *bind.TransactOpts, _user common.Address, _userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "loginByServer", _user, _userId, _inviter)
}
// LoginByServer is a paid mutator transaction binding the contract method 0x4cf9284b.
//
// Solidity: function loginByServer(address _user, string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserSession) LoginByServer(_user common.Address, _userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.Contract.LoginByServer(&_AonUser.TransactOpts, _user, _userId, _inviter)
}
// LoginByServer is a paid mutator transaction binding the contract method 0x4cf9284b.
//
// Solidity: function loginByServer(address _user, string _userId, string _inviter) returns(bool)
func (_AonUser *AonUserTransactorSession) LoginByServer(_user common.Address, _userId string, _inviter string) (*types.Transaction, error) {
return _AonUser.Contract.LoginByServer(&_AonUser.TransactOpts, _user, _userId, _inviter)
}
// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactor) SafeTransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "safeTransferFrom", from, to, tokenId)
}
// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserSession) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.SafeTransferFrom(&_AonUser.TransactOpts, from, to, tokenId)
}
// SafeTransferFrom is a paid mutator transaction binding the contract method 0x42842e0e.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactorSession) SafeTransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.SafeTransferFrom(&_AonUser.TransactOpts, from, to, tokenId)
}
// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns()
func (_AonUser *AonUserTransactor) SafeTransferFrom0(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "safeTransferFrom0", from, to, tokenId, data)
}
// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns()
func (_AonUser *AonUserSession) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
return _AonUser.Contract.SafeTransferFrom0(&_AonUser.TransactOpts, from, to, tokenId, data)
}
// SafeTransferFrom0 is a paid mutator transaction binding the contract method 0xb88d4fde.
//
// Solidity: function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) returns()
func (_AonUser *AonUserTransactorSession) SafeTransferFrom0(from common.Address, to common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
return _AonUser.Contract.SafeTransferFrom0(&_AonUser.TransactOpts, from, to, tokenId, data)
}
// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465.
//
// Solidity: function setApprovalForAll(address operator, bool approved) returns()
func (_AonUser *AonUserTransactor) SetApprovalForAll(opts *bind.TransactOpts, operator common.Address, approved bool) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "setApprovalForAll", operator, approved)
}
// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465.
//
// Solidity: function setApprovalForAll(address operator, bool approved) returns()
func (_AonUser *AonUserSession) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) {
return _AonUser.Contract.SetApprovalForAll(&_AonUser.TransactOpts, operator, approved)
}
// SetApprovalForAll is a paid mutator transaction binding the contract method 0xa22cb465.
//
// Solidity: function setApprovalForAll(address operator, bool approved) returns()
func (_AonUser *AonUserTransactorSession) SetApprovalForAll(operator common.Address, approved bool) (*types.Transaction, error) {
return _AonUser.Contract.SetApprovalForAll(&_AonUser.TransactOpts, operator, approved)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.contract.Transact(opts, "transferFrom", from, to, tokenId)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserSession) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.TransferFrom(&_AonUser.TransactOpts, from, to, tokenId)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address from, address to, uint256 tokenId) returns()
func (_AonUser *AonUserTransactorSession) TransferFrom(from common.Address, to common.Address, tokenId *big.Int) (*types.Transaction, error) {
return _AonUser.Contract.TransferFrom(&_AonUser.TransactOpts, from, to, tokenId)
}
// AonUserApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the AonUser contract.
type AonUserApprovalIterator struct {
Event *AonUserApproval // 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 *AonUserApprovalIterator) 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(AonUserApproval)
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(AonUserApproval)
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 *AonUserApprovalIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonUserApprovalIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonUserApproval represents a Approval event raised by the AonUser contract.
type AonUserApproval struct {
Owner common.Address
Approved common.Address
TokenId *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, approved []common.Address, tokenId []*big.Int) (*AonUserApprovalIterator, error) {
var ownerRule []interface{}
for _, ownerItem := range owner {
ownerRule = append(ownerRule, ownerItem)
}
var approvedRule []interface{}
for _, approvedItem := range approved {
approvedRule = append(approvedRule, approvedItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
logs, sub, err := _AonUser.contract.FilterLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule)
if err != nil {
return nil, err
}
return &AonUserApprovalIterator{contract: _AonUser.contract, event: "Approval", logs: logs, sub: sub}, nil
}
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *AonUserApproval, owner []common.Address, approved []common.Address, tokenId []*big.Int) (event.Subscription, error) {
var ownerRule []interface{}
for _, ownerItem := range owner {
ownerRule = append(ownerRule, ownerItem)
}
var approvedRule []interface{}
for _, approvedItem := range approved {
approvedRule = append(approvedRule, approvedItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
logs, sub, err := _AonUser.contract.WatchLogs(opts, "Approval", ownerRule, approvedRule, tokenIdRule)
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(AonUserApproval)
if err := _AonUser.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
}
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) ParseApproval(log types.Log) (*AonUserApproval, error) {
event := new(AonUserApproval)
if err := _AonUser.contract.UnpackLog(event, "Approval", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonUserApprovalForAllIterator is returned from FilterApprovalForAll and is used to iterate over the raw logs and unpacked data for ApprovalForAll events raised by the AonUser contract.
type AonUserApprovalForAllIterator struct {
Event *AonUserApprovalForAll // 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 *AonUserApprovalForAllIterator) 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(AonUserApprovalForAll)
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(AonUserApprovalForAll)
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 *AonUserApprovalForAllIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonUserApprovalForAllIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonUserApprovalForAll represents a ApprovalForAll event raised by the AonUser contract.
type AonUserApprovalForAll struct {
Owner common.Address
Operator common.Address
Approved bool
Raw types.Log // Blockchain specific contextual infos
}
// FilterApprovalForAll is a free log retrieval operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31.
//
// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
func (_AonUser *AonUserFilterer) FilterApprovalForAll(opts *bind.FilterOpts, owner []common.Address, operator []common.Address) (*AonUserApprovalForAllIterator, error) {
var ownerRule []interface{}
for _, ownerItem := range owner {
ownerRule = append(ownerRule, ownerItem)
}
var operatorRule []interface{}
for _, operatorItem := range operator {
operatorRule = append(operatorRule, operatorItem)
}
logs, sub, err := _AonUser.contract.FilterLogs(opts, "ApprovalForAll", ownerRule, operatorRule)
if err != nil {
return nil, err
}
return &AonUserApprovalForAllIterator{contract: _AonUser.contract, event: "ApprovalForAll", logs: logs, sub: sub}, nil
}
// WatchApprovalForAll is a free log subscription operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31.
//
// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
func (_AonUser *AonUserFilterer) WatchApprovalForAll(opts *bind.WatchOpts, sink chan<- *AonUserApprovalForAll, owner []common.Address, operator []common.Address) (event.Subscription, error) {
var ownerRule []interface{}
for _, ownerItem := range owner {
ownerRule = append(ownerRule, ownerItem)
}
var operatorRule []interface{}
for _, operatorItem := range operator {
operatorRule = append(operatorRule, operatorItem)
}
logs, sub, err := _AonUser.contract.WatchLogs(opts, "ApprovalForAll", ownerRule, operatorRule)
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(AonUserApprovalForAll)
if err := _AonUser.contract.UnpackLog(event, "ApprovalForAll", 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
}
// ParseApprovalForAll is a log parse operation binding the contract event 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31.
//
// Solidity: event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
func (_AonUser *AonUserFilterer) ParseApprovalForAll(log types.Log) (*AonUserApprovalForAll, error) {
event := new(AonUserApprovalForAll)
if err := _AonUser.contract.UnpackLog(event, "ApprovalForAll", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonUserLoginIterator is returned from FilterLogin and is used to iterate over the raw logs and unpacked data for Login events raised by the AonUser contract.
type AonUserLoginIterator struct {
Event *AonUserLogin // 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 *AonUserLoginIterator) 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(AonUserLogin)
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(AonUserLogin)
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 *AonUserLoginIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonUserLoginIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonUserLogin represents a Login event raised by the AonUser contract.
type AonUserLogin struct {
Addr common.Address
TokenId *big.Int
UserId common.Hash
LoginTime *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterLogin is a free log retrieval operation binding the contract event 0x73a80bd7c53c518474cf6f5cf50c31f68267a3bba9884c5f7f60e3cc7a2b1f50.
//
// Solidity: event Login(address indexed addr, uint256 indexed tokenId, string indexed userId, uint256 loginTime)
func (_AonUser *AonUserFilterer) FilterLogin(opts *bind.FilterOpts, addr []common.Address, tokenId []*big.Int, userId []string) (*AonUserLoginIterator, error) {
var addrRule []interface{}
for _, addrItem := range addr {
addrRule = append(addrRule, addrItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
logs, sub, err := _AonUser.contract.FilterLogs(opts, "Login", addrRule, tokenIdRule, userIdRule)
if err != nil {
return nil, err
}
return &AonUserLoginIterator{contract: _AonUser.contract, event: "Login", logs: logs, sub: sub}, nil
}
// WatchLogin is a free log subscription operation binding the contract event 0x73a80bd7c53c518474cf6f5cf50c31f68267a3bba9884c5f7f60e3cc7a2b1f50.
//
// Solidity: event Login(address indexed addr, uint256 indexed tokenId, string indexed userId, uint256 loginTime)
func (_AonUser *AonUserFilterer) WatchLogin(opts *bind.WatchOpts, sink chan<- *AonUserLogin, addr []common.Address, tokenId []*big.Int, userId []string) (event.Subscription, error) {
var addrRule []interface{}
for _, addrItem := range addr {
addrRule = append(addrRule, addrItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
logs, sub, err := _AonUser.contract.WatchLogs(opts, "Login", addrRule, tokenIdRule, userIdRule)
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(AonUserLogin)
if err := _AonUser.contract.UnpackLog(event, "Login", 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
}
// ParseLogin is a log parse operation binding the contract event 0x73a80bd7c53c518474cf6f5cf50c31f68267a3bba9884c5f7f60e3cc7a2b1f50.
//
// Solidity: event Login(address indexed addr, uint256 indexed tokenId, string indexed userId, uint256 loginTime)
func (_AonUser *AonUserFilterer) ParseLogin(log types.Log) (*AonUserLogin, error) {
event := new(AonUserLogin)
if err := _AonUser.contract.UnpackLog(event, "Login", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonUserRegisterIterator is returned from FilterRegister and is used to iterate over the raw logs and unpacked data for Register events raised by the AonUser contract.
type AonUserRegisterIterator struct {
Event *AonUserRegister // 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 *AonUserRegisterIterator) 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(AonUserRegister)
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(AonUserRegister)
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 *AonUserRegisterIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonUserRegisterIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonUserRegister represents a Register event raised by the AonUser contract.
type AonUserRegister struct {
Addr common.Address
TokenId *big.Int
UserId common.Hash
UserInviter string
UserName string
RegisterTime *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterRegister is a free log retrieval operation binding the contract event 0x727986d2de20ed8f3e566563f137987e1ee5b6ffe929b8f9c05e3fe4216f1db8.
//
// Solidity: event Register(address indexed addr, uint256 indexed tokenId, string indexed userId, string userInviter, string userName, uint256 registerTime)
func (_AonUser *AonUserFilterer) FilterRegister(opts *bind.FilterOpts, addr []common.Address, tokenId []*big.Int, userId []string) (*AonUserRegisterIterator, error) {
var addrRule []interface{}
for _, addrItem := range addr {
addrRule = append(addrRule, addrItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
logs, sub, err := _AonUser.contract.FilterLogs(opts, "Register", addrRule, tokenIdRule, userIdRule)
if err != nil {
return nil, err
}
return &AonUserRegisterIterator{contract: _AonUser.contract, event: "Register", logs: logs, sub: sub}, nil
}
// WatchRegister is a free log subscription operation binding the contract event 0x727986d2de20ed8f3e566563f137987e1ee5b6ffe929b8f9c05e3fe4216f1db8.
//
// Solidity: event Register(address indexed addr, uint256 indexed tokenId, string indexed userId, string userInviter, string userName, uint256 registerTime)
func (_AonUser *AonUserFilterer) WatchRegister(opts *bind.WatchOpts, sink chan<- *AonUserRegister, addr []common.Address, tokenId []*big.Int, userId []string) (event.Subscription, error) {
var addrRule []interface{}
for _, addrItem := range addr {
addrRule = append(addrRule, addrItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
var userIdRule []interface{}
for _, userIdItem := range userId {
userIdRule = append(userIdRule, userIdItem)
}
logs, sub, err := _AonUser.contract.WatchLogs(opts, "Register", addrRule, tokenIdRule, userIdRule)
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(AonUserRegister)
if err := _AonUser.contract.UnpackLog(event, "Register", 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
}
// ParseRegister is a log parse operation binding the contract event 0x727986d2de20ed8f3e566563f137987e1ee5b6ffe929b8f9c05e3fe4216f1db8.
//
// Solidity: event Register(address indexed addr, uint256 indexed tokenId, string indexed userId, string userInviter, string userName, uint256 registerTime)
func (_AonUser *AonUserFilterer) ParseRegister(log types.Log) (*AonUserRegister, error) {
event := new(AonUserRegister)
if err := _AonUser.contract.UnpackLog(event, "Register", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// AonUserTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the AonUser contract.
type AonUserTransferIterator struct {
Event *AonUserTransfer // 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 *AonUserTransferIterator) 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(AonUserTransfer)
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(AonUserTransfer)
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 *AonUserTransferIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AonUserTransferIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// AonUserTransfer represents a Transfer event raised by the AonUser contract.
type AonUserTransfer struct {
From common.Address
To common.Address
TokenId *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address, tokenId []*big.Int) (*AonUserTransferIterator, error) {
var fromRule []interface{}
for _, fromItem := range from {
fromRule = append(fromRule, fromItem)
}
var toRule []interface{}
for _, toItem := range to {
toRule = append(toRule, toItem)
}
var tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
logs, sub, err := _AonUser.contract.FilterLogs(opts, "Transfer", fromRule, toRule, tokenIdRule)
if err != nil {
return nil, err
}
return &AonUserTransferIterator{contract: _AonUser.contract, event: "Transfer", logs: logs, sub: sub}, nil
}
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *AonUserTransfer, from []common.Address, to []common.Address, tokenId []*big.Int) (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 tokenIdRule []interface{}
for _, tokenIdItem := range tokenId {
tokenIdRule = append(tokenIdRule, tokenIdItem)
}
logs, sub, err := _AonUser.contract.WatchLogs(opts, "Transfer", fromRule, toRule, tokenIdRule)
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(AonUserTransfer)
if err := _AonUser.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
}
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
func (_AonUser *AonUserFilterer) ParseTransfer(log types.Log) (*AonUserTransfer, error) {
event := new(AonUserTransfer)
if err := _AonUser.contract.UnpackLog(event, "Transfer", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
package dao
import (
"contract_backend/contract/aon_executor"
"contract_backend/contract/aon_user"
"crypto/ecdsa"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
)
func (d *Dao) Login(privateKey *ecdsa.PrivateKey, userId string, inviter string) (txHash common.Hash, err error) {
instance, err := aon_user.NewAonUser(common.HexToAddress(d.c.Chain.UserContract), d.ethClient)
if err != nil {
return common.Hash{}, err
}
auth, err := bind.NewKeyedTransactorWithChainID(privateKey, d.chainId)
if err != nil {
return common.Hash{}, err
}
auth.GasPrice = d.gasPrice
auth.GasLimit = 800000
tx, err := instance.Login(auth, userId, inviter)
if err != nil {
return common.Hash{}, err
}
return tx.Hash(), nil
}
func (d *Dao) ExecuteTask(privateKey *ecdsa.PrivateKey, executeId, userId, appId string, modelIds []string, price *big.Int) (txHash common.Hash, err error) {
instance, err := aon_executor.NewAonExecutor(common.HexToAddress(d.c.Chain.UserContract), d.ethClient)
if err != nil {
return common.Hash{}, err
}
auth, err := bind.NewKeyedTransactorWithChainID(privateKey, d.chainId)
if err != nil {
return common.Hash{}, err
}
auth.GasPrice = d.gasPrice
tx, err := instance.ExecuteByUserId(auth, executeId, userId, appId, modelIds, price)
if err != nil {
return common.Hash{}, err
}
return tx.Hash(), nil
}
package dao
import (
"context"
"contract_backend/config"
"fmt"
"math/big"
"os"
"sync"
"time"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/rpc"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
type Dao struct {
chainId *big.Int
c *config.Config
db *gorm.DB
ethClient *ethclient.Client
ethRPC *rpc.Client
gasSenderNonce uint64
gasSenderLock sync.Mutex
gasPrice *big.Int
}
func New(_c *config.Config) (dao *Dao, err error) {
dao = &Dao{
c: _c,
}
dao.ethClient, err = ethclient.Dial(_c.Chain.RPC)
if err != nil {
return
}
dao.ethRPC, err = rpc.Dial(_c.Chain.RPC)
if err != nil {
return
}
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d",
_c.PGSQL.Host, _c.PGSQL.User, _c.PGSQL.Password, _c.PGSQL.Database, _c.PGSQL.Port,
)
chainId, err := dao.ethClient.ChainID(context.Background())
if err != nil {
return
}
dao.chainId = chainId
k, _ := crypto.HexToECDSA(_c.Chain.GasSenderPrivateKey)
dao.gasSenderNonce, _ = dao.ethClient.NonceAt(context.Background(), crypto.PubkeyToAddress(k.PublicKey), nil)
go dao.LoopGasPrice()
if _c.PGSQL.CertFile != "" {
dsn = fmt.Sprintf("%s sslmode=require sslrootcert=%s", dsn, _c.PGSQL.CertFile)
}
lgr := logger.Default
if _c.PGSQL.EnableLog {
lgr = logger.Default.LogMode(logger.Info)
}
dao.db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
Logger: lgr,
})
if err != nil {
return
}
sqlDB, err := dao.db.DB()
if err != nil {
return
}
sqlDB.SetMaxOpenConns(_c.PGSQL.MaxConn)
sqlDB.SetMaxIdleConns(_c.PGSQL.MaxIdleConn)
sqlDB.SetConnMaxIdleTime(time.Hour)
migrate := os.Getenv("MIGRATE")
if migrate == "true" {
// err = dao.db.AutoMigrate(&dbModel.User{}, &dbModel.Active{}, &dbModel.ChatGroup{})
if err != nil {
return
}
}
return dao, nil
}
package dao
import (
"contract_backend/model"
"encoding/json"
)
func (d *Dao) UpdateTask(id string, txHash string, status int) (err error) {
sql := `UPDATE public.exec_task SET tx_hash = ?, tx_status = ? WHERE id = ?`
return d.db.Exec(sql, txHash, status, id).Error
}
func (d *Dao) GetUnprocessedTasks(limit int) (tasks []*model.ExecTask, err error) {
sql := `SELECT id, user_id, app_key, model_ids, tx_hash, tx_status FROM public.exec_task WHERE tx_hash = '' AND tx_status = 1 LIMIT ?`
err = d.db.Raw(sql, limit).Scan(&tasks).Error
if err != nil {
return
}
for i := 0; i < len(tasks); i++ {
err = json.Unmarshal(tasks[i].ModelIds, &tasks[i].ModelIdsArray)
if err != nil {
return
}
}
return
}
package dao
import (
"context"
"math/big"
"time"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
log "github.com/sirupsen/logrus"
)
func (d *Dao) LoopGasPrice() {
gasPrice, err := d.ethClient.SuggestGasPrice(context.Background())
if err != nil {
log.WithError(err).Error("get gas price error")
panic(err)
}
d.gasPrice = big.NewInt(0).Div(
big.NewInt(0).Mul(gasPrice, big.NewInt(11)),
big.NewInt(10),
)
ticker := time.NewTicker(time.Second * 10)
defer ticker.Stop()
for {
select {
case <-ticker.C:
gasPrice, err := d.ethClient.SuggestGasPrice(context.Background())
if err != nil {
log.WithError(err).Error("get gas price error")
continue
}
d.gasPrice = big.NewInt(0).Div(
big.NewInt(0).Mul(gasPrice, big.NewInt(11)),
big.NewInt(10),
)
}
}
}
// EstimateGasRecharge 估算充值金额
func (d *Dao) EstimateGasRecharge(address common.Address) (val *big.Int, err error) {
_10val := new(big.Int).Mul(d.gasPrice, big.NewInt(10*500000)) // 10次 每次50w
_20val := new(big.Int).Mul(d.gasPrice, big.NewInt(20*500000)) // 20次 每次50w
currentBalance, err := d.ethClient.BalanceAt(context.Background(), address, nil)
if err != nil {
return nil, err
}
if currentBalance.Cmp(_10val) < 0 {
return new(big.Int).Sub(_20val, currentBalance), nil
}
return nil, nil
}
func (d *Dao) TransferETH(hexPrivateKey string, address common.Address, value *big.Int) (txHash common.Hash, err error) {
privateKey, _ := crypto.HexToECDSA(hexPrivateKey)
d.gasSenderLock.Lock()
defer func() {
d.gasSenderNonce++
d.gasSenderLock.Unlock()
}()
innerTx := types.LegacyTx{
Nonce: d.gasSenderNonce,
To: &address,
Value: value,
Gas: 21000,
GasPrice: d.gasPrice,
}
tx := types.NewTx(&innerTx)
from := crypto.PubkeyToAddress(privateKey.PublicKey)
gasLimit, err := d.ethClient.EstimateGas(context.Background(), ethereum.CallMsg{
From: from,
To: &address,
Value: value,
})
innerTx.Gas = gasLimit
innerTx.GasPrice = d.gasPrice
signer := types.NewCancunSigner(d.chainId)
signedTx, err := types.SignTx(tx, signer, privateKey)
if err != nil {
return common.Hash{}, err
}
return signedTx.Hash(), d.ethClient.SendTransaction(context.Background(), signedTx)
}
func (d *Dao) WaitForReceipt(hash common.Hash) (receipt *types.Receipt, err error) {
timeoutCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
queryTicker := time.NewTicker(time.Second)
defer queryTicker.Stop()
for {
receipt, err := d.ethClient.TransactionReceipt(timeoutCtx, hash)
if err == nil {
return receipt, nil
}
select {
case <-timeoutCtx.Done():
return nil, timeoutCtx.Err()
case <-queryTicker.C:
}
}
}
networks:
default:
name: aon-backend
services:
contract-backend-webhook:
image: caduceus/contract_backend:latest
pull_policy: always
container_name: contract-backend-webhook
ports:
- "16669:8080"
volumes:
- ./conf/contract_backend/config.toml:/config.toml
- ./conf/contract_backend/db.crt:/app/db.crt
- ./data/tg-contract_backend/webhook-log:/app
command:
- "/bin/sh"
- "-c"
- "/usr/bin/server -c /config.toml"
restart:
unless-stopped
contract-backend-sync:
image: caduceus/contract_backend:latest
pull_policy: always
container_name: contract-backend-sync
volumes:
- ./conf/contract_backend/config.toml:/config.toml
- ./conf/contract_backend/db.crt:/app/db.crt
- ./data/tg-contract_backend/sync-log:/app
command:
- "/bin/sh"
- "-c"
- "/usr/bin/sync -c /config.toml"
restart:
unless-stopped
\ No newline at end of file
module contract_backend
go 1.22
toolchain go1.22.8
require (
github.com/BurntSushi/toml v1.4.0
github.com/btcsuite/btcutil v1.0.2
github.com/ethereum/go-ethereum v1.14.11
github.com/gin-contrib/cors v1.7.2
github.com/gin-gonic/gin v1.10.0
github.com/google/uuid v1.3.0
github.com/sirupsen/logrus v1.9.3
github.com/tidwall/gjson v1.18.0
gorm.io/driver/postgres v1.5.9
gorm.io/gorm v1.25.12
)
require (
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/StackExchange/wmi v1.2.1 // indirect
github.com/bits-and-blooms/bitset v1.13.0 // indirect
github.com/btcsuite/btcd v0.20.1-beta // indirect
github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect
github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/holiman/uint256 v1.3.1 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.5.5 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/supranational/blst v0.3.13 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
)
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=
github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE=
github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw=
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts=
github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA=
github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I=
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
github.com/ethereum/go-ethereum v1.14.11 h1:8nFDCUUE67rPc6AKxFj7JKaOa2W/W1Rse3oS6LvvxEY=
github.com/ethereum/go-ethereum v1.14.11/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A=
github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs=
github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y=
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk=
github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ=
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8=
gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
package middleware
import (
"bytes"
"io"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
)
func PrintRequestResponseBodyMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 读取请求 body
var requestBody []byte
if c.Request.Body != nil {
requestBody, _ = io.ReadAll(c.Request.Body)
c.Request.Body = io.NopCloser(bytes.NewBuffer(requestBody))
}
log.WithFields(log.Fields{"method": c.Request.Method, "uri": c.Request.RequestURI, "body": string(requestBody)}).Debug("request body")
bodyWriter := &responseBodyWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
c.Writer = bodyWriter
c.Next()
responseBody := bodyWriter.body.String()
log.WithFields(log.Fields{"status": c.Writer.Status(), "body": responseBody}).Debug("response body")
}
}
type responseBodyWriter struct {
gin.ResponseWriter
body *bytes.Buffer
}
func (r *responseBodyWriter) Write(b []byte) (int, error) {
r.body.Write(b)
return r.ResponseWriter.Write(b)
}
package model
import (
"encoding/json"
)
type ExecTask struct {
Id string
UserId string
AppKey string
ModelIds json.RawMessage
ModelIdsArray []string `gorm:"-"`
}
package monitor
import (
"contract_backend/config"
. "contract_backend/constant"
"contract_backend/dao"
"contract_backend/model"
"crypto/ecdsa"
"math/big"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
log "github.com/sirupsen/logrus"
)
type Monitor struct {
conf *config.Config
d *dao.Dao
privateKey *ecdsa.PrivateKey
}
func NewMonitor(_conf *config.Config, _dao *dao.Dao) *Monitor {
k, err := crypto.HexToECDSA(common.Bytes2Hex(common.FromHex(_conf.Chain.ExecutorPrivateKey)))
if err != nil {
panic(err)
}
return &Monitor{
conf: _conf,
d: _dao,
privateKey: k,
}
}
func (m *Monitor) Start() {
for {
tasks, err := m.d.GetUnprocessedTasks(1)
if err != nil {
log.WithError(err).Error("get unprocessed tasks error")
continue
}
if len(tasks) == 0 {
time.Sleep(2 * time.Second)
continue
}
log.WithField("tasks", len(tasks)).Info("get unprocessed tasks")
for _, task := range tasks {
m.ProcessOne(task)
}
return
}
}
func (m *Monitor) ProcessOne(task *model.ExecTask) {
err := m.d.UpdateTask(task.Id, "", TxStatusPending)
if err != nil {
log.WithFields(log.Fields{
"id": task.Id,
"err": err.Error(),
}).Error("update task error")
return
}
txHash, err := m.d.ExecuteTask(m.privateKey, task.Id, task.UserId, task.AppKey, task.ModelIdsArray, big.NewInt(int64(m.conf.Chain.ModelPrice)))
if err != nil {
log.WithFields(log.Fields{
"id": task.Id,
"err": err.Error(),
}).Error("execute task error")
err = m.d.UpdateTask(task.Id, "", TxStatusFailed)
return
}
receipt, err := m.d.WaitForReceipt(txHash)
if err != nil {
log.WithFields(log.Fields{
"id": task.Id,
"err": err.Error(),
}).Error("wait for receipt error")
err = m.d.UpdateTask(task.Id, txHash.String(), TxStatusUnknown)
}
if receipt.Status == 1 {
err = m.d.UpdateTask(task.Id, txHash.String(), TxStatusSuccess)
} else {
err = m.d.UpdateTask(task.Id, txHash.String(), TxStatusRevert)
}
if err != nil {
log.WithFields(log.Fields{
"id": task.Id,
"err": err.Error(),
}).Error("update task error")
return
}
}
package server
import (
"contract_backend/middleware"
"github.com/gin-gonic/gin"
)
func initRouter(e *gin.Engine) {
e.Use(middleware.PrintRequestResponseBodyMiddleware())
webhook := e.Group("/webhook")
webhook.POST("/handleUserChange", userChange)
}
package server
import (
"contract_backend/config"
"contract_backend/dao"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
)
var conf *config.Config
var d *dao.Dao
func StartServer(_conf *config.Config, _da *dao.Dao) {
conf = _conf
d = _da
if !conf.Debug {
gin.SetMode(gin.ReleaseMode)
}
engine := gin.Default()
_cors := cors.DefaultConfig()
_cors.AllowAllOrigins = true
_cors.AllowHeaders = []string{"*"}
engine.Use(cors.New(_cors))
initRouter(engine)
log.Infof("start http server listening %s", conf.Server.Listen)
if err := engine.Run(conf.Server.Listen); err != nil {
log.Error("http server run error: ", err)
}
}
func withSuccess(obj interface{}) interface{} {
return gin.H{
"code": 0,
"msg": "ok",
"data": obj,
}
}
func withError(msg string) interface{} {
return gin.H{
"code": 1,
"error": msg,
"data": "",
}
}
package server
import (
. "contract_backend/constant"
"contract_backend/util"
"crypto/ecdsa"
"io"
"math/big"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
func taskChange(c *gin.Context) {
// 获取原始json数据
rawJson, err := io.ReadAll(c.Request.Body)
if err != nil {
log.WithError(err).Error("read body error")
c.JSON(200, withError(InvalidParam))
return
}
// 判断是插入还是update
table := gjson.Get(string(rawJson), "table").String()
if table != "exec_task" {
log.WithField("table", table).Error("wrong table")
c.JSON(200, withError(InvalidParam))
return
}
var userId string
var taskId string
var appId string
var modelIds []string
var key *ecdsa.PrivateKey
operation := gjson.Get(string(rawJson), "operation").String()
switch operation {
case "UPDATE":
userId = gjson.Get(string(rawJson), "new_row.user_id").String()
taskId = gjson.Get(string(rawJson), "new_row.id").String()
appId = gjson.Get(string(rawJson), "new_row.app_key").String()
tmp := gjson.Get(string(rawJson), "new_row.model_ids").Array()
for _, v := range tmp {
modelIds = append(modelIds, v.String())
}
key, err = util.GetPrivKeyByPriv(conf.Chain.XPrivateKey, userId)
if err != nil {
log.WithError(err).Error("get private key error")
c.JSON(200, withError(InternalError))
return
}
default:
log.WithField("operation", operation).Error("wrong operation")
c.JSON(200, withError(InvalidParam))
return
}
oldStatus := gjson.Get(string(rawJson), "old_row.status").Int()
newStatus := gjson.Get(string(rawJson), "new_row.status").Int()
if !(oldStatus == 0 && newStatus == 1) {
c.JSON(200, withSuccess(""))
return
}
dbTxHash := gjson.Get(string(rawJson), "new_row.tx_hash").String()
txStatus := gjson.Get(string(rawJson), "new_row.tx_status").Int()
if dbTxHash != "" || txStatus != 0 {
log.WithField("txHash", dbTxHash).WithField("txStatus", txStatus).Error("already processed")
c.JSON(200, withError(InternalError))
return
}
txHash, err := d.ExecuteTask(key, taskId, userId, appId, modelIds, big.NewInt(10))
if err != nil {
log.WithError(err).Error("execute task error")
c.JSON(200, withError(InternalError))
return
}
err = d.UpdateTask(taskId, txHash.String(), 0)
if err != nil {
log.WithError(err).Error("update task error")
c.JSON(200, withError(InternalError))
return
}
c.JSON(200, withSuccess(txHash.String()))
}
package server
import (
. "contract_backend/constant"
"contract_backend/util"
"crypto/ecdsa"
"fmt"
"io"
"time"
"github.com/ethereum/go-ethereum/crypto"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
)
func userChange(c *gin.Context) {
// 获取原始json数据
rawJson, err := io.ReadAll(c.Request.Body)
if err != nil {
log.WithError(err).Error("read body error")
c.JSON(200, withError(InvalidParam))
return
}
// 判断是插入还是update
table := gjson.Get(string(rawJson), "table").String()
if table != "users" {
log.WithField("table", table).Error("wrong table")
c.JSON(200, withError(InvalidParam))
return
}
var userId string
var key *ecdsa.PrivateKey
operation := gjson.Get(string(rawJson), "operation").String()
switch operation {
case "UPDATE":
userId = gjson.Get(string(rawJson), "new_row.id").String()
key, err = util.GetPrivateKeyByUserId(conf.Chain.XPrivateKey, userId)
if err != nil {
log.WithError(err).Error("get private key error")
c.JSON(200, withError(InternalError))
return
}
default:
log.WithField("operation", operation).Error("wrong operation")
c.JSON(200, withError(InvalidParam))
return
}
needLogin := true
if operation == "UPDATE" {
lastLogin := gjson.Get(string(rawJson), "old_row.last_sign_in_at").String()
newLogin := gjson.Get(string(rawJson), "new_row.last_sign_in_at").String()
if lastLogin == newLogin {
needLogin = false
} else if lastLogin != "" {
fmt.Println(lastLogin)
loginTime, err := time.Parse(lastLogin, "2006-01-02T15:04:05.999999+07:00")
if err != nil {
log.WithError(err).Error("parse time error")
c.JSON(200, withError(InternalError))
return
}
// 如果loginTime是0点之前
todayUnix := time.Now().Unix() % 86400
lastLoginUnix := loginTime.Unix() % 86400
if lastLoginUnix >= todayUnix {
needLogin = false
}
}
}
if !needLogin {
c.JSON(200, withSuccess(""))
return
}
// 需要登录
userAddress := crypto.PubkeyToAddress(key.PublicKey)
val, err := d.EstimateGasRecharge(userAddress)
if err != nil {
log.WithError(err).Error("estimate gas error")
c.JSON(200, withError(InternalError))
return
}
if val != nil {
// 需要充值
txHash, err := d.TransferETH(conf.Chain.GasSenderPrivateKey, userAddress, val)
if err != nil {
log.WithError(err).Error("transfer eth error")
c.JSON(200, withError(InternalError))
return
}
receipt, err := d.WaitForReceipt(txHash)
if err != nil {
log.WithError(err).Error("wait for receipt error")
c.JSON(200, withError(InternalError))
return
}
if receipt.Status != 1 {
log.WithField("receipt", receipt).Error("receipt status error")
c.JSON(200, withError(InternalError))
return
}
log.WithFields(log.Fields{
"userId": userId,
"address": userAddress.String(),
"txHash": txHash,
"val": val.String(),
}).Info("user recharge success")
}
txHash, err := d.Login(key, userId, "")
if err != nil {
log.WithError(err).Error("call ca login error")
c.JSON(200, withError(InternalError))
return
}
log.WithFields(log.Fields{
"userId": userId,
"txHash": txHash,
}).Info("user login")
c.JSON(200, withSuccess(""))
}
CREATE
OR REPLACE FUNCTION auth.userChange () RETURNS TRIGGER SECURITY definer AS $$
BEGIN
IF new.last_sign_in_at IS NOT NULL OR old.last_sign_in_at IS NOT NULL THEN
perform "net"."http_post"(
url := 'http://webhook.atqg.top/webhook/handleUserChange'::text,
body := jsonb_build_object(
'old_row', jsonb_build_object(
'id', old.id,
'last_sign_in_at', old.last_sign_in_at
),
'new_row', jsonb_build_object(
'id', new.id,
'last_sign_in_at', new.last_sign_in_at
),
'table', TG_TABLE_NAME,
'operation', TG_OP
),
headers:='{"Content-Type": "application/json"}'::jsonb
) as request_id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE
OR REPLACE TRIGGER userChange
AFTER
UPDATE ON auth.users FOR EACH ROW
EXECUTE FUNCTION auth.userChange();
CREATE
OR REPLACE FUNCTION public.taskChange () RETURNS TRIGGER SECURITY definer AS $$
BEGIN
perform "net"."http_post"(
url := 'http://webhook.atqg.top/webhook/handleTaskChange'::text,
body := jsonb_build_object(
'old_row', jsonb_build_object(
'id', old.id,
'user_id', old.user_id,
'app_key', old.app_key,
'model_ids', old.model_ids,
'status', old.status,
'tx_hash', old.tx_hash,
'tx_status', old.tx_status
),
'new_row', jsonb_build_object(
'id', new.id,
'user_id', new.user_id,
'app_key', new.app_key,
'model_ids', new.model_ids,
'status', new.status,
'tx_hash', new.tx_hash,
'tx_status', new.tx_status
),
'table', TG_TABLE_NAME,
'operation', TG_OP
),
headers:='{"Content-Type": "application/json"}'::jsonb
) as request_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION public.taskChange()
RETURNS TRIGGER
SECURITY DEFINER AS $$
BEGIN
-- 只在状态从0变为1时执行
IF (TG_OP = 'UPDATE' AND OLD.status = 0 AND NEW.status = 1) THEN
UPDATE public.exec_task SET tx_status = 1 WHERE id = NEW.id;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE
OR REPLACE TRIGGER taskChange
AFTER UPDATE ON public.exec_task FOR EACH ROW
EXECUTE FUNCTION public.taskChange();
package util
import (
"crypto/ecdsa"
"encoding/binary"
"fmt"
"strconv"
"strings"
"github.com/btcsuite/btcutil/hdkeychain"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/google/uuid"
)
func GetAddressByUserId(xpub, userId string) (output common.Address, err error) {
uid, err := uuid.Parse(userId)
if err != nil {
return common.Address{}, err
}
paths := make([]string, 0)
for i := 0; i < 16; i += 3 {
end := i + 3
if end > 16 {
end = 16
}
uint32Temp := binary.BigEndian.Uint32(common.LeftPadBytes(uid[i:end], 4))
paths = append(paths, fmt.Sprintf("%d", uint32Temp))
}
pubkey, err := GetPubKeyByPub(xpub, strings.Join(paths, "/"))
if err != nil {
return common.Address{}, err
}
return crypto.PubkeyToAddress(*pubkey), nil
}
func GetPrivateKeyByUserId(xpriv, userId string) (key *ecdsa.PrivateKey, err error) {
uid, err := uuid.Parse(userId)
if err != nil {
return nil, err
}
paths := make([]string, 0)
for i := 0; i < 16; i += 3 {
end := i + 3
if end > 16 {
end = 16
}
uint32Temp := binary.BigEndian.Uint32(common.LeftPadBytes(uid[i:end], 4))
paths = append(paths, fmt.Sprintf("%d", uint32Temp))
}
return GetPrivKeyByPriv(xpriv, strings.Join(paths, "/"))
}
func GetDepositAddress(input common.Address, xpub string) (output common.Address, err error) {
paths := make([]string, 7)
for i := 0; i < 7; i++ {
uint32Temp := uint32(0)
if i == 6 {
uint32Temp = binary.BigEndian.Uint32(common.LeftPadBytes(input.Bytes()[i*3:i*3+2], 4))
} else {
uint32Temp = binary.BigEndian.Uint32(common.LeftPadBytes(input.Bytes()[i*3:i*3+3], 4))
}
paths[i] = fmt.Sprintf("%d", uint32Temp)
}
pubkey, err := GetPubKeyByPub(xpub, strings.Join(paths, "/"))
if err != nil {
return common.Address{}, err
}
return crypto.PubkeyToAddress(*pubkey), nil
}
// pathList := parsePath(path)
// var next *hdkeychain.ExtendedKey
// for _, floor := range pathList {
// idx := floor[0]
// isHardened, _ := strconv.ParseBool(strconv.Itoa(floor[1]))
// next, err = nextFloor(xpub, isHardened, uint32(idx))
// if err != nil {
// return
// }
// xpub = next.String()
// }
// pk, err := next.ECPubKey()
// if err != nil {
// return
// }
// return pk.ToECDSA(), nil
func GetPrivKeyByPriv(xpriv string, path string) (privkey *ecdsa.PrivateKey, err error) {
pathList := parsePath(path)
var next *hdkeychain.ExtendedKey
for _, floor := range pathList {
idx := floor[0]
isHardened, _ := strconv.ParseBool(strconv.Itoa(floor[1]))
next, err = nextFloor(xpriv, isHardened, uint32(idx))
if err != nil {
return
}
xpriv = next.String()
}
pk, err := next.ECPrivKey()
if err != nil {
return
}
return pk.ToECDSA(), nil
}
func GetPubKeyByPub(xpub string, path string) (pubkey *ecdsa.PublicKey, err error) {
pathList := parsePath(path)
var next *hdkeychain.ExtendedKey
for _, floor := range pathList {
idx := floor[0]
isHardened, _ := strconv.ParseBool(strconv.Itoa(floor[1]))
next, err = nextFloor(xpub, isHardened, uint32(idx))
if err != nil {
return
}
xpub = next.String()
}
pk, err := next.ECPubKey()
if err != nil {
return
}
return pk.ToECDSA(), nil
}
// 返回一个二维数组 参数1 对应每一层偏移 参数2 1代表hardened 0普通
func parsePath(path string) [][]int {
l := strings.Split(path, "/")
var resList [][]int
// m开头或者/开头 去掉第一个
if l[0] == "m" || l[0] == "" {
l = l[1:]
}
// /结尾 去掉最后一个
if l[len(l)-1] == "" {
l = l[:len(l)-1]
}
for _, s := range l {
if strings.HasSuffix(s, "'") {
idx, _ := strconv.Atoi(s[:len(s)-1])
resList = append(resList, []int{idx, 1})
} else {
idx, _ := strconv.Atoi(s)
resList = append(resList, []int{idx, 0})
}
}
return resList
}
func nextFloor(key string, hardened bool, idx uint32) (*hdkeychain.ExtendedKey, error) {
key1, err := hdkeychain.NewKeyFromString(key)
if err != nil {
return nil, err
}
if hardened {
return key1.Child(hdkeychain.HardenedKeyStart + idx)
} else {
return key1.Child(idx)
}
}
package util
import (
"encoding/binary"
"fmt"
"strings"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)
func TestXpriv(t *testing.T) {
xpri := "xprv9xwX8JDK1LBoHbfUiif8tmaj5dTGEnrYrDat8RUNowmbz2hCD8N1wydNao1TBhgTzvF1gojUwekF4J28BNo4mCVW81BY3XUwDCQhscSMaC3"
uid := "6fc7f308-af15-463f-b15b-fee798d3e296"
k, _ := GetPrivateKeyByUserId(xpri, uid)
fmt.Println(crypto.PubkeyToAddress(k.PublicKey))
}
func TestGenHDKey(t *testing.T) {
xpub := "xpub6C9QTBQW4NDiwahEdPibQbLUtnhfny3E464dgDXGDkWFdqnkddYicVqUvaeAe8QrmXoSqXrcKMxszf8DJ2xzaQhth3nAgoBwjfC1J8jYwFS"
// xpub := "xpub6C2ojpneBn4KHz1zaHpsyVHQMuJQbeDPbdkXywAUR43hXpjyQNcRv1ZQdvxnGmGKvXLoGPoN1G7cwfmW5CGZjPagpLnggXmqN52HhJk9F4B"
ret, err := GetAddressByUserId("001b6462-43e6-4e8e-88b9-9636c8dece0d", xpub)
t.Log(ret.String(), err)
return
// k, _ := GetPubKeyByPub(xpub, "0/1")
// addr := crypto.PubkeyToAddress(*k)
// t.Log(addr.String())
userA := common.HexToAddress("0xAaf459E071637dE222D0a9e3b439704f478ed767")
path := convertAddrToPath(userA.String())
st := time.Now()
k, _ := GetPubKeyByPub(xpub, path)
addr2 := crypto.PubkeyToAddress(*k)
t.Log(path, addr2.String())
t.Log(time.Since(st))
a, _ := GetDepositAddress(userA, xpub)
t.Log(a.String())
t.Log(addr2.String(), time.Since(st))
}
func convertAddrToPath(address string) string {
addrBytes := common.HexToAddress(address).Bytes()
// split to 8
addrByteArray := make([]string, 7)
for i := 0; i < 7; i++ {
uint32Temp := uint32(0)
if i == 6 {
// fmt.Println("tt", tt)
// binary.BigEndian.PutUint32(tt, addrByteArray[i])
// fmt.Println("after tt", addrByteArray[i])
uint32Temp = binary.BigEndian.Uint32(common.LeftPadBytes(addrBytes[i*3:i*3+2], 4))
} else {
// addrByteArray[i] = addrBytes[i*3 : i*3+3]
// binary.BigEndian.PutUint32(temp4Byte(addrBytes[i*3:i*3+3]), addrByteArray[i])
uint32Temp = binary.BigEndian.Uint32(common.LeftPadBytes(addrBytes[i*3:i*3+3], 4))
}
addrByteArray[i] = fmt.Sprintf("%d", uint32Temp)
}
fmt.Println(strings.Join(addrByteArray, "/"))
return strings.Join(addrByteArray, "/")
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment