Skip to content

Commit

Permalink
Move registry fetch error to global variable (#294)
Browse files Browse the repository at this point in the history
* Add global ErrNotDeployed

* Gofmt fix

* Rename error to ErrSmartContractNotDeployed

* Add default case for address retrieval error

* Lint fix
  • Loading branch information
bricewang authored and jarmg committed Jun 25, 2019
1 parent 643b23b commit f6fc613
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 13 deletions.
2 changes: 1 addition & 1 deletion common/compiler/solidity_test.go
Expand Up @@ -25,7 +25,7 @@ const (
testSource = `
contract test {
/// @notice Will multiply ` + "`a`" + ` by 7.
function multiply(uint a) returns(uint d) {
function multiply(uint a) public returns(uint d) {
return a * 7;
}
}
Expand Down
19 changes: 14 additions & 5 deletions consensus/istanbul/backend/engine.go
Expand Up @@ -420,9 +420,12 @@ func (sb *Backend) Prepare(chain consensus.ChainReader, header *types.Header) er
func (sb *Backend) getValSet(header *types.Header, state *state.StateDB) ([]common.Address, error) {
var newValSet []common.Address
validatorsAddress, err := sb.regAdd.GetRegisteredAddress(params.ValidatorsRegistryId)
if err != nil {
if err == core.ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
return newValSet, errValidatorsContractNotRegistered
} else if err != nil {
log.Error(err.Error())
return newValSet, err
} else {
// Get the new epoch's validator set
maxGasForGetValidators := uint64(1000000)
Expand Down Expand Up @@ -465,7 +468,7 @@ func (sb *Backend) UpdateValSetDiff(chain consensus.ChainReader, header *types.H
return nil
}

// UpdateValSetDiff will update the validator set diff in the header, if the mined header is the last block of the epoch
// TODO(brice): This needs a comment.
func (sb *Backend) IsLastBlockOfEpoch(header *types.Header) bool {
return istanbul.IsLastBlockOfEpoch(header.Number.Uint64(), sb.config.Epoch)
}
Expand All @@ -483,22 +486,28 @@ func (sb *Backend) Finalize(chain consensus.ChainReader, header *types.Header, s

// Add block rewards
goldTokenAddress, err := sb.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)
if err != nil {
if err == core.ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
} else if err != nil {
log.Error(err.Error())
}
if goldTokenAddress != nil { // add block rewards only if goldtoken smart contract has been initialized
totalBlockRewards := big.NewInt(0)

infrastructureBlockReward := big.NewInt(params.Ether)
governanceAddress, err := sb.regAdd.GetRegisteredAddress(params.GovernanceRegistryId)
if err != nil {
if err == core.ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
} else if err != nil {
log.Error(err.Error())
}

stakerBlockReward := big.NewInt(params.Ether)
bondedDepositsAddress, err := sb.regAdd.GetRegisteredAddress(params.BondedDepositsRegistryId)
if err != nil {
if err == core.ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
} else if err != nil {
log.Error(err.Error())
}

if governanceAddress != nil && bondedDepositsAddress != nil {
Expand Down
16 changes: 12 additions & 4 deletions core/currency.go
Expand Up @@ -133,9 +133,11 @@ func (co *CurrencyOperator) getExchangeRate(currency *common.Address) (*exchange

func (co *CurrencyOperator) ConvertToGold(val *big.Int, currencyFrom *common.Address) (*big.Int, error) {
celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)
if err != nil || currencyFrom == celoGoldAddress {
if err == ErrSmartContractNotDeployed || currencyFrom == celoGoldAddress {
log.Warn("Registry address lookup failed", "err", err)
return val, nil
} else if err != nil {
log.Error(err.Error())
}
return co.Convert(val, currencyFrom, celoGoldAddress)
}
Expand Down Expand Up @@ -202,16 +204,20 @@ func (co *CurrencyOperator) retrieveExchangeRates() {

sortedOraclesAddress, err := co.regAdd.GetRegisteredAddress(params.SortedOraclesRegistryId)

if err != nil {
if err == ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
return
} else if err != nil {
log.Error(err.Error())
}

celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)

if err != nil {
if err == ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
return
} else if err != nil {
log.Error(err.Error())
}

co.currencyOperatorMu.Lock()
Expand Down Expand Up @@ -312,9 +318,11 @@ func (gcWl *GasCurrencyWhitelist) retrieveWhitelist() []common.Address {
returnList := []common.Address{}

gasCurrencyWhiteListAddress, err := gcWl.regAdd.GetRegisteredAddress(params.GasCurrencyWhitelistRegistryId)
if err != nil {
if err == ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
return returnList
} else if err != nil {
log.Error(err.Error())
}

log.Trace("GasCurrencyWhiteList.retrieveWhiteList() - Calling retrieveWhiteList", "address", gasCurrencyWhiteListAddress.Hex())
Expand Down
4 changes: 3 additions & 1 deletion core/random.go
Expand Up @@ -113,8 +113,10 @@ func NewRandom(registeredAddresses *RegisteredAddresses, iEvmH *InternalEVMHandl
func (r *Random) address() *common.Address {
if r.registeredAddresses != nil {
randomAddress, err := r.registeredAddresses.GetRegisteredAddress(params.RandomRegistryId)
if err != nil {
if err == ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
} else if err != nil {
log.Error(err.Error())
}
return randomAddress
} else {
Expand Down
7 changes: 6 additions & 1 deletion core/registeredAddresses.go
Expand Up @@ -27,6 +27,9 @@ import (
"github.com/ethereum/go-ethereum/params"
)

// ErrSmartContractNotDeployed is returned when the RegisteredAddresses mapping does not contain the specified contract
var ErrSmartContractNotDeployed = errors.New("registry contract not deployed")

const (
// This is taken from celo-monorepo/packages/protocol/build/<env>/contracts/Registry.json
getAddressForABI = `[{"constant": true,
Expand Down Expand Up @@ -104,6 +107,8 @@ func (ra *RegisteredAddresses) RefreshAddresses() {
}

func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) (*common.Address, error) {
log.Trace("RegisteredAddresses.GetRegisteredAddress called for", "registryId", registryId)

if len(ra.registeredAddresses) == 0 { // This refresh is for a light client that failed to refresh (did not have a network connection) during node construction
ra.RefreshAddresses()
}
Expand All @@ -112,7 +117,7 @@ func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) (*common.
defer ra.registeredAddressesMu.RUnlock()

if address, ok := ra.registeredAddresses[registryId]; !ok {
return nil, errors.New("RegisteredAddresses.GetRegisteredAddress - " + registryId + " contract not deployed")
return nil, ErrSmartContractNotDeployed
} else {
return &address, nil
}
Expand Down
4 changes: 3 additions & 1 deletion eth/gasprice/access_gasprice.go
Expand Up @@ -55,9 +55,11 @@ func GetGasPrice(ctx context.Context, iEvmH *core.InternalEVMHandler, regAdd *co
var gasPrice *big.Int
gasPriceOracleAddress, err := regAdd.GetRegisteredAddress(params.GasPriceOracleRegistryId)

if err != nil {
if err == core.ErrSmartContractNotDeployed {
log.Warn("Registry address lookup failed", "err", err)
return big.NewInt(0), errors.New("no gasprice oracle contract address found")
} else if err != nil {
log.Error(err.Error())
}

_, err = iEvmH.MakeStaticCall(*gasPriceOracleAddress, gasPriceOracleABI, "getGasPriceSuggestion", []interface{}{}, &gasPrice, 2000, nil, nil)
Expand Down

0 comments on commit f6fc613

Please sign in to comment.