|
|
@ -5,7 +5,6 @@ import ( |
|
|
|
"context" |
|
|
|
"context" |
|
|
|
"encoding/json" |
|
|
|
"encoding/json" |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
"math/big" |
|
|
|
|
|
|
|
"net" |
|
|
|
"net" |
|
|
|
"net/http" |
|
|
|
"net/http" |
|
|
|
"path" |
|
|
|
"path" |
|
|
@ -22,7 +21,6 @@ import ( |
|
|
|
"github.com/harmony-one/harmony/hmy" |
|
|
|
"github.com/harmony-one/harmony/hmy" |
|
|
|
"github.com/harmony-one/harmony/hmy/tracers" |
|
|
|
"github.com/harmony-one/harmony/hmy/tracers" |
|
|
|
"github.com/harmony-one/harmony/internal/chain" |
|
|
|
"github.com/harmony-one/harmony/internal/chain" |
|
|
|
"github.com/harmony-one/harmony/internal/common" |
|
|
|
|
|
|
|
nodeconfig "github.com/harmony-one/harmony/internal/configs/node" |
|
|
|
nodeconfig "github.com/harmony-one/harmony/internal/configs/node" |
|
|
|
"github.com/harmony-one/harmony/internal/utils" |
|
|
|
"github.com/harmony-one/harmony/internal/utils" |
|
|
|
"github.com/harmony-one/harmony/numeric" |
|
|
|
"github.com/harmony-one/harmony/numeric" |
|
|
@ -212,14 +210,6 @@ func (s *Service) IsAvailable() bool { |
|
|
|
return s.storage.available.IsSet() |
|
|
|
return s.storage.available.IsSet() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
|
|
|
// InaccessibleAddresses are a list of known eth addresses that cannot spend ONE tokens.
|
|
|
|
|
|
|
|
InaccessibleAddresses = []ethCommon.Address{ |
|
|
|
|
|
|
|
// one10000000000000000000000000000dead5shlag
|
|
|
|
|
|
|
|
ethCommon.HexToAddress("0x7bDeF7Bdef7BDeF7BDEf7bDef7bdef7bdeF6E7AD"), |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// InaccessibleAddressInfo ..
|
|
|
|
// InaccessibleAddressInfo ..
|
|
|
|
type InaccessibleAddressInfo struct { |
|
|
|
type InaccessibleAddressInfo struct { |
|
|
|
EthAddress ethCommon.Address `json:"eth-address"` |
|
|
|
EthAddress ethCommon.Address `json:"eth-address"` |
|
|
@ -228,48 +218,23 @@ type InaccessibleAddressInfo struct { |
|
|
|
Nonce uint64 `json:"nonce"` |
|
|
|
Nonce uint64 `json:"nonce"` |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// getAllInaccessibleAddresses information according to InaccessibleAddresses
|
|
|
|
|
|
|
|
func (s *Service) getAllInaccessibleAddresses() ([]*InaccessibleAddressInfo, error) { |
|
|
|
|
|
|
|
state, err := s.blockchain.StateAt(s.blockchain.CurrentHeader().Root()) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
accs := []*InaccessibleAddressInfo{} |
|
|
|
|
|
|
|
for _, addr := range InaccessibleAddresses { |
|
|
|
|
|
|
|
accs = append(accs, &InaccessibleAddressInfo{ |
|
|
|
|
|
|
|
EthAddress: addr, |
|
|
|
|
|
|
|
Address: common.MustAddressToBech32(addr), |
|
|
|
|
|
|
|
Balance: numeric.NewDecFromBigIntWithPrec(state.GetBalance(addr), 18), |
|
|
|
|
|
|
|
Nonce: state.GetNonce(addr), |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return accs, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// getTotalInaccessibleTokens in ONE at the latest header.
|
|
|
|
|
|
|
|
func (s *Service) getTotalInaccessibleTokens() (numeric.Dec, error) { |
|
|
|
|
|
|
|
addrInfos, err := s.getAllInaccessibleAddresses() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return numeric.Dec{}, err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
total := numeric.NewDecFromBigIntWithPrec(big.NewInt(0), 18) |
|
|
|
|
|
|
|
for _, addr := range addrInfos { |
|
|
|
|
|
|
|
total = total.Add(addr.Balance) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return total, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GetInaccessibleAddressInfo serves /burn-addresses end-point.
|
|
|
|
// GetInaccessibleAddressInfo serves /burn-addresses end-point.
|
|
|
|
func (s *Service) GetInaccessibleAddressInfo(w http.ResponseWriter, r *http.Request) { |
|
|
|
func (s *Service) GetInaccessibleAddressInfo(w http.ResponseWriter, r *http.Request) { |
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
accInfos, err := s.getAllInaccessibleAddresses() |
|
|
|
accInfos, err := chain.GetInaccessibleAddressInfo(s.blockchain) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch inaccessible addresses") |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch inaccessible addresses") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
display := make([]*InaccessibleAddressInfo, 0, len(accInfos)) |
|
|
|
|
|
|
|
for _, acc := range accInfos { |
|
|
|
|
|
|
|
display = append(display, &InaccessibleAddressInfo{ |
|
|
|
|
|
|
|
EthAddress: acc.EthAddress, |
|
|
|
|
|
|
|
Address: acc.Address, |
|
|
|
|
|
|
|
Balance: acc.Balance, |
|
|
|
|
|
|
|
Nonce: acc.Nonce, |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
if err := json.NewEncoder(w).Encode(accInfos); err != nil { |
|
|
|
if err := json.NewEncoder(w).Encode(accInfos); err != nil { |
|
|
|
utils.Logger().Warn().Msg("cannot JSON-encode inaccessible account info") |
|
|
|
utils.Logger().Warn().Msg("cannot JSON-encode inaccessible account info") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
@ -280,17 +245,12 @@ func (s *Service) GetInaccessibleAddressInfo(w http.ResponseWriter, r *http.Requ |
|
|
|
// Note that known InaccessibleAddresses have their funds removed from the supply for this endpoint.
|
|
|
|
// Note that known InaccessibleAddresses have their funds removed from the supply for this endpoint.
|
|
|
|
func (s *Service) GetCirculatingSupply(w http.ResponseWriter, r *http.Request) { |
|
|
|
func (s *Service) GetCirculatingSupply(w http.ResponseWriter, r *http.Request) { |
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
circulatingSupply, err := chain.GetCirculatingSupply(context.Background(), s.blockchain) |
|
|
|
cs, err := chain.GetCirculatingSupply(s.blockchain) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch circulating supply") |
|
|
|
utils.Logger().Warn().Msg("Failed to get circulating supply") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
totalInaccessible, err := s.getTotalInaccessibleTokens() |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch inaccessible tokens") |
|
|
|
|
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
} |
|
|
|
} |
|
|
|
if err := json.NewEncoder(w).Encode(circulatingSupply.Sub(totalInaccessible)); err != nil { |
|
|
|
if err := json.NewEncoder(w).Encode(cs); err != nil { |
|
|
|
utils.Logger().Warn().Msg("cannot JSON-encode circulating supply") |
|
|
|
utils.Logger().Warn().Msg("cannot JSON-encode circulating supply") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
} |
|
|
|
} |
|
|
@ -305,7 +265,7 @@ func (s *Service) GetTotalSupply(w http.ResponseWriter, r *http.Request) { |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch total supply") |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch total supply") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
} |
|
|
|
} |
|
|
|
totalInaccessible, err := s.getTotalInaccessibleTokens() |
|
|
|
totalInaccessible, err := chain.GetInaccessibleTokens(s.blockchain) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch inaccessible tokens") |
|
|
|
utils.Logger().Warn().Err(err).Msg("unable to fetch inaccessible tokens") |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|