diff --git a/build/ci.go b/build/ci.go index ff23e15fdb..2546e6112f 100644 --- a/build/ci.go +++ b/build/ci.go @@ -239,6 +239,8 @@ func doInstall(cmdline []string) { goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) + os.Rename(filepath.Join(GOBIN, "geth"), filepath.Join(GOBIN, "fgeth")) + os.Rename(filepath.Join(GOBIN, "geth.exe"), filepath.Join(GOBIN, "fgeth.exe")) return } // If we are cross compiling to ARMv5 ARMv6 or ARMv7, clean any previous builds diff --git a/cmd/geth/config.go b/cmd/geth/config.go index e6bd4d5bef..1fce7476a6 100644 --- a/cmd/geth/config.go +++ b/cmd/geth/config.go @@ -121,6 +121,13 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { if err := loadConfig(file, &cfg); err != nil { utils.Fatalf("%v", err) } + } else { + // Load config file from default place. + if err := loadConfig("./geth_conf.toml", &cfg); err != nil { + if ctx.Command.Name != "dumpconfig" { + utils.Fatalf("Config not found: %v. Put config file here or set config path with flag --config /path/to/your_config.toml", err) + } + } } // Apply flags. diff --git a/console/console.go b/console/console.go index 56e03837ac..1632c531f7 100644 --- a/console/console.go +++ b/console/console.go @@ -137,7 +137,7 @@ func (c *Console) init(preload []string) error { if err != nil { return fmt.Errorf("api modules: %v", err) } - flatten := "var eth = web3.eth; var personal = web3.personal; " + flatten := "var food = web3.eth; var personal = web3.personal; " for api := range apis { if api == "web3" { continue // manually mapped or ignore @@ -147,7 +147,11 @@ func (c *Console) init(preload []string) error { if err = c.jsre.Compile(fmt.Sprintf("%s.js", api), file); err != nil { return fmt.Errorf("%s.js: %v", api, err) } - flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) + if api == "eth" { + flatten += fmt.Sprintf("var food = web3.%s; ", api) + } else { + flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) + } } else if obj, err := c.jsre.Run("web3." + api); err == nil && obj.IsObject() { // Enable web3.js built-in extension if available. flatten += fmt.Sprintf("var %s = web3.%s; ", api, api) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index a465a59046..db3e958e47 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -25,6 +25,7 @@ import ( "strings" "time" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -44,10 +45,14 @@ import ( "github.com/ethereum/go-ethereum/rpc" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/util" + + "encoding/json" ) const ( defaultGasPrice = 50 * params.Shannon + abiFRJSON = `[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"getPersonRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"isPerson","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"verificators","outputs":[{"name":"verificatorAddress","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVarByIndex","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"verificatorAddress","type":"address"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"updateVerificatorLicenseExpiration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getPersonRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"verificatorAddress","type":"address"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"addVerificator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPersonsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"verificatorsIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"}],"name":"getPersonRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getVerificatorAtIndex","outputs":[{"name":"verificatorAddress","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"licenceIssuedTimeStamp","type":"uint256"},{"name":"licenceValidUntilTimeStamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"personAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVerificatorsIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVerificatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getPersonAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"personAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"personAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"verificatorAddress","type":"address"},{"indexed":false,"name":"licenceIssuedTimeStamp","type":"uint256"},{"indexed":false,"name":"licenceValidUntilTimeStamp","type":"uint256"}],"name":"LogAddVerificator","type":"event"}]` + registryAddress = `0xb9c84fe5d9ee933202012efa6380bd83930d44cc` ) // PublicEthereumAPI provides an API to access Ethereum related information. @@ -680,6 +685,284 @@ func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr r return (hexutil.Bytes)(result), err } +type FRVar struct { + Exist bool + VarName string + VarValue string + Timestamp *big.Int +} + +type FRVerificator struct { + VerificatorAddress common.Address + Timestamp *big.Int + LicenceIssuedTimeStamp *big.Int + LicenceValidUntilTimeStamp *big.Int +} + +// FRGetArgs represents the arguments for a GetVarFR. +type FRGetArgs struct { + CallArgs + VarName string `json:"varName"` + AccountAddress common.Address `json:"accountAddress"` + CreatorAddress common.Address `json:"creatorAddress"` +} + +// FRSetArgs represents the arguments for a SetVarFR. +type FRSetArgs struct { + SendTxArgs + VarName string `json:"varName"` + VarValue string `json:"varValue"` + AccountAddress common.Address `json:"accountAddress"` +} + +// FRAddVerificatorArgs represents the arguments for a AddVerificator. +type FRAddVerificatorArgs struct { + SendTxArgs + VerificatorAddress common.Address `json:"verificatorAddress"` + IssuedTimeStamp *big.Int `json:"IssuedTimeStamp"` + ValidUntilTimeStamp *big.Int `json:"ValidUntilTimeStamp"` + Index *big.Int `json:"Index"` +} + +// FRVerificatorByIndexArgs represents the arguments for a GetVerificatorByIndex. +type FRVerificatorByIndexArgs struct { + CallArgs + Index *big.Int `json:"Index"` +} + +func isJSON(s string) bool { + var js map[string]interface{} + return json.Unmarshal([]byte(s), &js) == nil + +} + +func (s *PublicTransactionPoolAPI) SendTransactionWithData(ctx context.Context, args SendTxArgs, data interface{}) (common.Hash, error) { + + var packed hexutil.Bytes + packed, err := json.Marshal(data) + + if err != nil { + return common.Hash{}, err + } + + if !isJSON(string(packed)) { + packed = []byte("{\"description\":" + string(packed) + "}") + } + args.Data = &packed + return s.SendTransaction(ctx, args) +} + +func (s *PublicBlockChainAPI) GetVarFR(ctx context.Context, args FRGetArgs, blockNr rpc.BlockNumber) (FRVar, error) { + + var ev FRVar + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVar", args.AccountAddress, args.CreatorAddress, args.VarName) + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{}, 5*time.Second) + + err = abi.Unpack(&ev, "getVar", result) + + return ev, err +} + +func (s *PublicTransactionPoolAPI) SetVarFR(ctx context.Context, args FRSetArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("setVar", args.AccountAddress, args.VarName, args.VarValue) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + +func (s *PublicTransactionPoolAPI) AddVerificator(ctx context.Context, args FRAddVerificatorArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("addVerificator", args.VerificatorAddress, args.IssuedTimeStamp, args.ValidUntilTimeStamp) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + +func (s *PublicBlockChainAPI) GetVerificatorsCount(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (*big.Int, error) { + + ev := big.NewInt(0) + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorsCount") + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second) + + err = abi.Unpack(&ev, "getVerificatorsCount", result) + + return ev, err +} + +func (s *PublicBlockChainAPI) GetVerificatorsIndex(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) ([]common.Address, error) { + + var ev []common.Address + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorsIndex") + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second) + + err = abi.Unpack(&ev, "getVerificatorsIndex", result) + + return ev, err +} + +func (s *PublicBlockChainAPI) GetVerificatorAtIndex(ctx context.Context, args FRVerificatorByIndexArgs, + blockNr rpc.BlockNumber) (FRVerificator, error) { + + var ev FRVerificator + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return ev, err + } + + packed, err := abi.Pack("getVerificatorAtIndex", args.Index) + if err != nil { + return ev, err + } + + if args.Data == nil { + args.Data = packed + } + + result, _, _, err := s.doCall(ctx, args.CallArgs, blockNr, vm.Config{}, 5*time.Second) + + err = abi.Unpack(&ev, "getVerificatorAtIndex", result) + + return ev, err +} + +func (s *PublicTransactionPoolAPI) UpdateVerificatorLicenseExpiration(ctx context.Context, args FRAddVerificatorArgs) (common.Hash, error) { + + if args.To == nil { + address := common.HexToAddress(registryAddress) + args.To = &address + } + + abi, err := abi.JSON(strings.NewReader(abiFRJSON)) + if err != nil { + return common.Hash{}, err + } + + var packed hexutil.Bytes + + packed, err = abi.Pack("updateVerificatorLicenseExpiration", args.VerificatorAddress, args.ValidUntilTimeStamp) + if err != nil { + return common.Hash{}, err + } + + if args.Data == nil { + args.Data = &packed + } + + result, err := s.SendTransaction(ctx, args.SendTxArgs) + + return result, err +} + + + // EstimateGas returns an estimate of the amount of gas needed to execute the // given transaction against the current pending block. func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { @@ -1024,6 +1307,11 @@ func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, has return nil } +// Stub function. Do nothing. Need to extend web3ext in some cases. +func (s *PublicTransactionPoolAPI) GetStub(ctx context.Context, result string) string { + return result +} + // GetRawTransactionByHash returns the bytes of the transaction for the given hash. func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) { var tx *types.Transaction diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 000e3728de..7aee8e946b 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -23,7 +23,7 @@ var Modules = map[string]string{ "clique": Clique_JS, "ethash": Ethash_JS, "debug": Debug_JS, - "eth": Eth_JS, + "eth": Eth_JS, "miner": Miner_JS, "net": Net_JS, "personal": Personal_JS, @@ -430,6 +430,8 @@ web3._extend({ ` const Eth_JS = ` +var address = "0xe5acd4bca588bf3d8fe9b6189ecf434da21f6f76"; +var abi = [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registry","outputs":[{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registryIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"index","type":"uint256"}],"name":"getVariableNameAtIndex","outputs":[{"name":"varName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"},{"name":"name","type":"string"}],"name":"getVar","outputs":[{"name":"exist","type":"bool"},{"name":"varName","type":"string"},{"name":"varValue","type":"string"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistryIndex","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getHoldersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"getHolderRegistryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"from","type":"address"}],"name":"getVariablesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holderAddress","type":"address"},{"name":"index","type":"uint256"}],"name":"getHolderRegistryAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getHolderAddressAtIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holderAddress","type":"address"},{"name":"name","type":"string"},{"name":"value","type":"string"}],"name":"setVar","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"holderAddress","type":"address"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"LogSetVariable","type":"event"}]; web3._extend({ property: 'eth', methods: [ @@ -470,7 +472,94 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] }), - ], + // FoodCoin method to send transaction with formatted data payload + new web3._extend.Method({ + name: 'sendTransactionWithData', + call: 'eth_sendTransactionWithData', + params: 2, + inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] + }), + // FoodCoin method to get formatted transaction info + new web3._extend.Method({ + name: 'getTransactionFormatted', + call: 'eth_getTransactionByHash', + params: 1, + outputFormatter: function (tx) { + if(tx.blockNumber !== null) + tx.blockNumber = web3.toDecimal(tx.blockNumber); + if(tx.transactionIndex !== null) + tx.transactionIndex = web3.toDecimal(tx.transactionIndex); + tx.nonce = web3.toDecimal(tx.nonce); + tx.gas = web3.toDecimal(tx.gas); + tx.gasPrice = web3.toBigNumber(tx.gasPrice); + tx.value = web3.toBigNumber(tx.value); + inputStr = web3.toUtf8(tx.input); + tx.input = inputStr; + if (web3._extend.utils.isJson(inputStr)) { + tx.input = JSON.parse(inputStr); + } else { + tx.input = inputStr; + } + return tx; + } + }), + // FoodCoin Registry method: get variable from registry + // Example: food.getRegistryVar({accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', creatorAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name'}); + new web3._extend.Method({ + name: 'getRegistryVar', + call: 'eth_getVarFR', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter] + }), + // FoodCoin Registry method: set variable to registry + // Example: food.setRegistryVar({from:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', accountAddress:'0xd79e977264887083aadb3e22e5f7b84c9a7531b7', varName:'name', varValue:'John'}); + new web3._extend.Method({ + name: 'setRegistryVar', + call: 'eth_setVarFR', + params: 1, + inputFormatter: [null] + }), + // Adds verificator to the list of verificators. + // parameters: + // VerificatorAddress - address of a verificator + // IssuedTimeStamp - verificator's license issued timestamp + // ValidUntilTimeStamp - verificator's license valid until timestamp + new web3._extend.Method({ + name: 'addVerificator', + call: 'eth_addVerificator', + params: 1, + inputFormatter: [null] + }), + new web3._extend.Method({ + name: 'getVerificatorsCount', + call: 'eth_getVerificatorsCount', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + outputFormatter: function (tx) { + if(tx !== null) + tx = web3.toDecimal(tx); + return tx; + } + }), + new web3._extend.Method({ + name: 'getVerificatorsIndex', + call: 'eth_getVerificatorsIndex', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + }), + new web3._extend.Method({ + name: 'getVerificatorAtIndex', + call: 'eth_getVerificatorAtIndex', + params: 2, + inputFormatter: [null, web3._extend.formatters.inputDefaultBlockNumberFormatter], + }), + new web3._extend.Method({ + name: 'updateVerificatorLicenseExpiration', + call: 'eth_updateVerificatorLicenseExpiration', + params: 1, + inputFormatter: [null], + }), + ], properties: [ new web3._extend.Property({ name: 'pendingTransactions', @@ -483,7 +572,7 @@ web3._extend({ } return formatted; } - }), + }) ] }); `