Skip to content

Commit

Permalink
read history
Browse files Browse the repository at this point in the history
  • Loading branch information
envestcc committed Jan 3, 2025
1 parent d786832 commit e42b0aa
Show file tree
Hide file tree
Showing 11 changed files with 301 additions and 38 deletions.
4 changes: 2 additions & 2 deletions action/protocol/execution/evm/contractv2.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package evm

import (
"encoding/hex"
"math/big"

"github.com/holiman/uint256"
"github.com/iotexproject/go-pkgs/hash"
Expand Down Expand Up @@ -61,7 +61,7 @@ func (c *contractV2) SetState(key hash.Hash256, value []byte) error {
}
c.dirtyState = true
k := libcommon.Hash(key)
c.intra.SetState(libcommon.Address(c.addr), &k, *uint256.MustFromHex(hex.EncodeToString(value)))
c.intra.SetState(libcommon.Address(c.addr), &k, *uint256.MustFromBig(big.NewInt(0).SetBytes(value)))
return nil
}
func (c *contractV2) GetCode() ([]byte, error) {
Expand Down
49 changes: 48 additions & 1 deletion action/protocol/execution/evm/erigonadapter.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package evm

import (
"math/big"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/holiman/uint256"
erigonchain "github.com/ledgerwatch/erigon-lib/chain"
libcommon "github.com/ledgerwatch/erigon-lib/common"
erigonstate "github.com/ledgerwatch/erigon/core/state"
"github.com/pkg/errors"
"go.uber.org/zap"

"github.com/iotexproject/go-pkgs/hash"

"github.com/iotexproject/iotex-core/v2/action"
"github.com/iotexproject/iotex-core/v2/pkg/log"
"github.com/iotexproject/iotex-core/v2/state"
)

Expand All @@ -30,7 +37,7 @@ type ErigonStateDBAdapter struct {
}

func NewErigonStateDBAdapter(adapter *StateDBAdapter,
rw *erigonstate.DbStateWriter,
rw erigonstate.StateWriter,
intra *erigonstate.IntraBlockState,
chainRules *erigonchain.Rules,
) *ErigonStateDBAdapter {
Expand All @@ -45,7 +52,47 @@ func NewErigonStateDBAdapter(adapter *StateDBAdapter,
}
}

func (s *ErigonStateDBAdapter) CreateAccount(evmAddr common.Address) {
s.StateDBAdapter.CreateAccount(evmAddr)
s.intra.CreateAccount(libcommon.Address(evmAddr), true)
}

func (s *ErigonStateDBAdapter) SubBalance(evmAddr common.Address, v *uint256.Int) {
s.StateDBAdapter.SubBalance(evmAddr, v)
s.intra.SubBalance(libcommon.Address(evmAddr), v)
}

func (s *ErigonStateDBAdapter) AddBalance(evmAddr common.Address, v *uint256.Int) {
s.StateDBAdapter.AddBalance(evmAddr, v)
s.intra.AddBalance(libcommon.Address(evmAddr), v)
}

func (s *ErigonStateDBAdapter) SetNonce(evmAddr common.Address, n uint64) {
s.StateDBAdapter.SetNonce(evmAddr, n)
s.intra.SetNonce(libcommon.Address(evmAddr), n)
}

func (s *ErigonStateDBAdapter) SetCode(evmAddr common.Address, c []byte) {
s.StateDBAdapter.SetCode(evmAddr, c)
s.intra.SetCode(libcommon.Address(evmAddr), c)
}

func (s *ErigonStateDBAdapter) AddRefund(r uint64) {
s.StateDBAdapter.AddRefund(r)
s.intra.AddRefund(r)
}
func (s *ErigonStateDBAdapter) SubRefund(r uint64) {
s.StateDBAdapter.SubRefund(r)
s.intra.SubRefund(r)
}
func (s *ErigonStateDBAdapter) SetState(evmAddr common.Address, k common.Hash, v common.Hash) {
s.StateDBAdapter.SetState(evmAddr, k, v)
key := libcommon.Hash(k)
s.intra.SetState(libcommon.Address(evmAddr), &key, *uint256.MustFromBig(big.NewInt(0).SetBytes(v[:])))
}

func (s *ErigonStateDBAdapter) CommitContracts() error {
log.L().Info("intraBlockState Committing contracts", zap.Uint64("height", s.StateDBAdapter.blockHeight))
err := s.intra.FinalizeTx(s.chainRules, s.rw)
if err != nil {
return errors.Wrap(err, "failed to finalize tx")
Expand Down
9 changes: 4 additions & 5 deletions action/protocol/execution/evm/evm.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,10 @@ func ExecuteContract(
if err != nil {
return nil, nil, err
}
if cfg.ErigonStorage {
erigonsm := sm.(interface {
StateWriter() *erigonstate.DbStateWriter
Intra() *erigonstate.IntraBlockState
})
if erigonsm, ok := sm.(interface {
StateWriter() erigonstate.StateWriter
Intra() *erigonstate.IntraBlockState
}); ok {
rules := ps.chainConfig.Rules(ps.context.BlockNumber, ps.genesis.IsSumatra(uint64(ps.context.BlockNumber.Int64())), ps.context.Time)
stateDB = NewErigonStateDBAdapter(
stateDB.(*StateDBAdapter),
Expand Down
2 changes: 1 addition & 1 deletion action/protocol/execution/evm/evmstatedbadapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -1134,7 +1134,7 @@ func (stateDB *StateDBAdapter) getNewContract(evmAddr common.Address) (Contract,
if err != nil {
return nil, errors.Wrapf(err, "failed to load account state for address %x", addr)
}
contract, err := newContract(addr, account, stateDB.sm, stateDB.asyncContractTrie)
contract, err := stateDB.newContract(addr, account)
if err != nil {
return nil, errors.Wrapf(err, "failed to create storage trie for new contract %x", addr)
}
Expand Down
69 changes: 69 additions & 0 deletions api/coreservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ type (
SendAction(ctx context.Context, in *iotextypes.Action) (string, error)
// ReadContract reads the state in a contract address specified by the slot
ReadContract(ctx context.Context, callerAddr address.Address, sc action.Envelope) (string, *iotextypes.Receipt, error)

ReadContractAt(ctx context.Context, callerAddr address.Address, sc action.Envelope, height uint64) (string, *iotextypes.Receipt, error)
// ReadState reads state on blockchain
ReadState(protocolID string, height string, methodName []byte, arguments [][]byte) (*iotexapi.ReadStateResponse, error)
// SuggestGasPrice suggests gas price
Expand Down Expand Up @@ -195,6 +197,7 @@ type (
bc blockchain.Blockchain
bs blocksync.BlockSync
sf factory.Factory
history *factory.HistoryStateIndex
dao blockdao.BlockDAO
indexer blockindex.Indexer
bfIndexer blockindex.BloomFilterIndexer
Expand Down Expand Up @@ -245,6 +248,12 @@ func WithAPIStats(stats *nodestats.APILocalStats) Option {
}
}

func WithHistory(history *factory.HistoryStateIndex) Option {
return func(svr *coreService) {
svr.history = history
}
}

type intrinsicGasCalculator interface {
IntrinsicGas() (uint64, error)
}
Expand Down Expand Up @@ -549,6 +558,26 @@ func (core *coreService) ReadContract(ctx context.Context, callerAddr address.Ad
return res.Data, res.Receipt, nil
}

func (core *coreService) ReadContractAt(ctx context.Context, callerAddr address.Address, elp action.Envelope, height uint64) (string, *iotextypes.Receipt, error) {
log.Logger("api").Debug("receive read smart contract request")
var (
g = core.bc.Genesis()
blockGasLimit = g.BlockGasLimitByHeight(height)
)
if elp.Gas() == 0 || blockGasLimit < elp.Gas() {
elp.SetGas(blockGasLimit)
}
retval, receipt, err := core.simulateExecutionAt(ctx, callerAddr, elp, height)
if err != nil {
return "", nil, status.Error(codes.Internal, err.Error())
}
res := iotexapi.ReadContractResponse{
Data: hex.EncodeToString(retval),
Receipt: receipt.ConvertToReceiptPb(),
}
return res.Data, res.Receipt, nil
}

// ReadState reads state on blockchain
func (core *coreService) ReadState(protocolID string, height string, methodName []byte, arguments [][]byte) (*iotexapi.ReadStateResponse, error) {
p, ok := core.registry.Find(protocolID)
Expand Down Expand Up @@ -1831,6 +1860,15 @@ func (core *coreService) SimulateExecution(ctx context.Context, addr address.Add
return core.simulateExecution(ctx, addr, elp)
}

func (core *coreService) SimulateExecutionAt(ctx context.Context, addr address.Address, elp action.Envelope, height uint64) ([]byte, *action.Receipt, error) {
var (
g = core.bc.Genesis()
blockGasLimit = g.BlockGasLimitByHeight(height)
)
elp.SetGas(blockGasLimit)
return core.simulateExecution(ctx, addr, elp)
}

// SyncingProgress returns the syncing status of node
func (core *coreService) SyncingProgress() (uint64, uint64, uint64) {
startingHeight, currentHeight, targetHeight, _ := core.bs.SyncStatus()
Expand Down Expand Up @@ -1970,6 +2008,37 @@ func (core *coreService) simulateExecution(ctx context.Context, addr address.Add
return evm.SimulateExecution(ctx, ws, addr, elp, opts...)
}

func (core *coreService) simulateExecutionAt(ctx context.Context, addr address.Address, elp action.Envelope, height uint64, opts ...protocol.SimulateOption) ([]byte, *action.Receipt, error) {
ctx, err := core.bc.ContextAtHeight(ctx, height)
if err != nil {
return nil, nil, status.Error(codes.Internal, err.Error())
}
state, err := accountutil.AccountState(ctx, core.sf, addr)
if err != nil {
return nil, nil, status.Error(codes.InvalidArgument, err.Error())
}
var pendingNonce uint64
ctx = protocol.WithFeatureCtx(protocol.WithBlockCtx(ctx, protocol.BlockCtx{
BlockHeight: height,
}))
if protocol.MustGetFeatureCtx(ctx).RefactorFreshAccountConversion {
pendingNonce = state.PendingNonceConsideringFreshAccount()
} else {
pendingNonce = state.PendingNonce()
}
elp.SetNonce(pendingNonce)
ctx = evm.WithHelperCtx(ctx, evm.HelperContext{
GetBlockHash: core.dao.GetBlockHash,
GetBlockTime: core.getBlockTime,
DepositGasFunc: rewarding.DepositGas,
})
ws, err := core.history.StateManagerAt(ctx, height)
if err != nil {
return nil, nil, status.Error(codes.Internal, err.Error())
}
return evm.SimulateExecution(ctx, ws, addr, elp, opts...)
}

func filterReceipts(receipts []*action.Receipt, actHash hash.Hash256) *action.Receipt {
for _, r := range receipts {
if r.ActionHash == actHash {
Expand Down
12 changes: 9 additions & 3 deletions api/web3server.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func (svr *web3Handler) handleWeb3Req(ctx context.Context, web3Req *gjson.Result
)
defer func(start time.Time) { svr.coreService.Track(ctx, start, method.(string), int64(size), err == nil) }(time.Now())

log.T(ctx).Debug("handleWeb3Req", zap.String("method", method.(string)), zap.String("requestParams", fmt.Sprintf("%+v", web3Req)))
// log.T(ctx).Debug("handleWeb3Req", zap.String("method", method.(string)), zap.String("requestParams", fmt.Sprintf("%+v", web3Req)))
_web3ServerMtc.WithLabelValues(method.(string)).Inc()
_web3ServerMtc.WithLabelValues("requests_total").Inc()
switch method {
Expand Down Expand Up @@ -267,7 +267,7 @@ func (svr *web3Handler) handleWeb3Req(ctx context.Context, web3Req *gjson.Result
zap.String("requestParams", fmt.Sprintf("%+v", web3Req)),
zap.Error(err))
} else {
log.Logger("api").Debug("web3Debug", zap.String("response", fmt.Sprintf("%+v", res)))
// log.Logger("api").Debug("web3Debug", zap.String("response", fmt.Sprintf("%+v", res)))
}
var id any
reqID := web3Req.Get("id")
Expand Down Expand Up @@ -471,7 +471,13 @@ func (svr *web3Handler) call(ctx context.Context, in *gjson.Result) (interface{}
}
elp := (&action.EnvelopeBuilder{}).SetAction(action.NewExecution(to, callMsg.Value, data)).
SetGasLimit(callMsg.Gas).Build()
ret, receipt, err := svr.coreService.ReadContract(ctx, callMsg.From, elp)
var ret string
var receipt *iotextypes.Receipt
if callMsg.BlockNumber <= 0 {
ret, receipt, err = svr.coreService.ReadContract(ctx, callMsg.From, elp)
} else {
ret, receipt, err = svr.coreService.ReadContractAt(ctx, callMsg.From, elp, uint64(callMsg.BlockNumber.Int64()))
}
if err != nil {
return nil, err
}
Expand Down
29 changes: 20 additions & 9 deletions chainservice/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,14 @@ func (builder *Builder) createHistoryIndex() (*factory.HistoryStateIndex, error)
if len(builder.cfg.Chain.HistoryIndexPath) == 0 {
return nil, nil
}
getBlockTime := func(height uint64) (time.Time, error) {
blk, err := builder.cs.blockdao.GetBlockByHeight(height)
if err != nil {
return time.Time{}, err
}
return blk.Timestamp(), nil
}
return factory.NewHistoryStateIndex(builder.cs.factory, builder.cfg.Chain.HistoryIndexPath, getBlockTime), nil
// getBlockTime := func(height uint64) (time.Time, error) {
// blk, err := builder.cs.blockdao.GetBlockByHeight(height)
// if err != nil {
// return time.Time{}, err
// }
// return blk.Timestamp(), nil
// }
return factory.NewHistoryStateIndex(builder.cs.factory, builder.cfg.Chain.HistoryIndexPath, nil), nil
}

func (builder *Builder) createFactory(forTest bool) (factory.Factory, error) {
Expand Down Expand Up @@ -371,7 +371,18 @@ func (builder *Builder) buildBlockDAO(forTest bool) error {
}
builder.cs.blockdao = blockdao.NewBlockDAOWithIndexersAndCache(
store, indexers, cfg.DB.MaxCacheSize, opts...)

// TODO: refactor
if builder.cs.historyIndex != nil {
dao := builder.cs.blockdao
getBlockTime := func(height uint64) (time.Time, error) {
blk, err := dao.GetBlockByHeight(height)
if err != nil {
return time.Time{}, err
}
return blk.Timestamp(), nil
}
builder.cs.historyIndex.SetGetBlockTime(getBlockTime)
}
return nil
}

Expand Down
4 changes: 3 additions & 1 deletion chainservice/chainservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,9 @@ func (cs *ChainService) NewAPIServer(cfg api.Config, plugins map[int]interface{}
api.WithNativeElection(cs.electionCommittee),
api.WithAPIStats(cs.apiStats),
}

if cs.historyIndex != nil {
apiServerOptions = append(apiServerOptions, api.WithHistory(cs.historyIndex))
}
svr, err := api.NewServerV2(
cfg,
cs.chain,
Expand Down
6 changes: 5 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -261,14 +261,18 @@ require (
)

//Note: add tag for go-ethereum before cutting hard-fork release
replace github.com/ethereum/go-ethereum => github.com/iotexproject/go-ethereum v0.5.0
replace github.com/ethereum/go-ethereum => github.com/iotexproject/go-ethereum v1.7.4-0.20250102060848-adaefd28e52f

replace golang.org/x/xerrors => golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3

replace github.com/ledgerwatch/erigon => github.com/envestcc/erigon v0.0.0-20250102030637-ee31f4bde3a1

replace github.com/ledgerwatch/erigon-lib => github.com/envestcc/erigon/erigon-lib v0.0.0-20250102030637-ee31f4bde3a1

replace github.com/iotexproject/go-pkgs => github.com/iotexproject/go-pkgs v0.1.15-0.20250102061825-4556d014fc54

// replace github.com/gballet/go-verkle => github.com/gballet/go-verkle v0.0.0-20221121182333-31427a1f2d35

// replace github.com/crate-crypto/go-ipa => github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc

// replace github.com/ethereum/go-ethereum/crypto/secp256k1 => github.com/ledgerwatch/secp256k1 v1.0.0
13 changes: 4 additions & 9 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/aristanetworks/goarista v0.0.0-20190429220743-799535f6f364/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
github.com/aristanetworks/goarista v0.0.0-20190531155855-fef20d617fa7/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
Expand Down Expand Up @@ -572,7 +571,6 @@ github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBT
github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8=
github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og=
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
Expand Down Expand Up @@ -777,7 +775,6 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/dustinxie/gmsm v1.2.1-0.20200206225615-ad1978e2c91f/go.mod h1:WqZ5qDGL/A1PfaK1yAAKkIxhNxXCbB0iSZ1XpsyfjMg=
github.com/dustinxie/gmsm v1.4.0 h1:6nksaLOaQZ3jWsiOngxuLxqF1lMnx1kOkBSzu1q5b5A=
github.com/dustinxie/gmsm v1.4.0/go.mod h1:RXcL1h0Punq69MHL2yZrWYCDFPbqxrXCZiZvZnKjGUI=
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
Expand Down Expand Up @@ -1262,16 +1259,14 @@ github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrp
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/iotexproject/go-ethereum v0.5.0 h1:lpmCpO4AdoFElHvrbmcSict86hHmd1yYSMrwIIhQ08k=
github.com/iotexproject/go-ethereum v0.5.0/go.mod h1:hKL2Qcj1OvStXNSEDbucexqnEt1Wh4Cz329XsjAalZY=
github.com/iotexproject/go-ethereum v1.7.4-0.20250102060848-adaefd28e52f h1:oB3Ony0/O7HP0J0U1arirCXb+s3wa8V4zC1zNG1YLkQ=
github.com/iotexproject/go-ethereum v1.7.4-0.20250102060848-adaefd28e52f/go.mod h1:yKrYnC/JvHuTgZ/4Ve/UcAIRGIUr2wKf72fOdc6+r+I=
github.com/iotexproject/go-fsm v1.0.0 h1:Zrg9JnNDUZg4Anpj6oa0Tk4+sXbHTpJzI0v5/Cj5N6A=
github.com/iotexproject/go-fsm v1.0.0/go.mod h1:t3aYXtCCcQxyS7oduQZyuUpPnVI4ddFTwbAagHN7fT0=
github.com/iotexproject/go-p2p v0.3.7-0.20240327085559-423bb9cc8f5f h1:Kf3PMDMmTWAXPoymCPqrN4FaBzdGRLp92GJEYvA/Qb4=
github.com/iotexproject/go-p2p v0.3.7-0.20240327085559-423bb9cc8f5f/go.mod h1:UN76xdrgwV7DbJOpB5R89ICUd0CuwgdzMrxt4ZMyfp0=
github.com/iotexproject/go-pkgs v0.1.5-0.20210604060651-be5ee19f2575/go.mod h1:ttXhcwrtODyh7JozpJlCml09CjP0pcKqTe2B0MbTGc8=
github.com/iotexproject/go-pkgs v0.1.12/go.mod h1:t5X9kQ1VL5H+L+DC5GmohXnFKlcxaTcRnIBBuydcsTQ=
github.com/iotexproject/go-pkgs v0.1.13 h1:bK48DVenkfYkC4TRoqL77RLFRBE1MUfscCW495kzcC8=
github.com/iotexproject/go-pkgs v0.1.13/go.mod h1:t5X9kQ1VL5H+L+DC5GmohXnFKlcxaTcRnIBBuydcsTQ=
github.com/iotexproject/go-pkgs v0.1.15-0.20250102061825-4556d014fc54 h1:q5kxVGX866/z1dijzzct7gp1AZBI7RjDiyk6dcAg+s0=
github.com/iotexproject/go-pkgs v0.1.15-0.20250102061825-4556d014fc54/go.mod h1:M5WgCUbgFJefENEKWHwjsqrS0MdK6R79wlzfDKm1J3c=
github.com/iotexproject/iotex-address v0.2.4/go.mod h1:K78yPSMB4K7gF/iQ7djT1amph0RBrP3rSkFfH7gNG70=
github.com/iotexproject/iotex-address v0.2.7/go.mod h1:K78yPSMB4K7gF/iQ7djT1amph0RBrP3rSkFfH7gNG70=
github.com/iotexproject/iotex-address v0.2.8 h1:jaTR5pZe/ljiYW4OqHl9NKPs0h1o91Gi6FILOTaBCXw=
Expand Down
Loading

0 comments on commit e42b0aa

Please sign in to comment.