Skip to content

Commit 6149727

Browse files
committed
Wrap error from remote and 3rd party libraries with stacktrace
1 parent ffc712b commit 6149727

File tree

13 files changed

+93
-63
lines changed

13 files changed

+93
-63
lines changed

cmd/root.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"os"
55

6+
"github.com/dyng/ramen/internal/common"
67
conf "github.com/dyng/ramen/internal/config"
78
"github.com/dyng/ramen/internal/view"
89
"github.com/ethereum/go-ethereum/log"
@@ -95,7 +96,7 @@ func initLogger() {
9596
log.Crit("Failed to create log file", "error", err)
9697
}
9798

98-
handler := log.StreamHandler(file, log.TerminalFormat(false))
99+
handler := common.ErrorStackHandler(log.StreamHandler(file, log.TerminalFormat(false)))
99100
if config.DebugMode {
100101
handler = log.LvlFilterHandler(log.LvlDebug, handler)
101102
} else {

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef
77
github.com/ethereum/go-ethereum v1.10.26
88
github.com/gdamore/tcell/v2 v2.5.4
9+
github.com/pkg/errors v0.9.1
910
github.com/rivo/tview v0.0.0-20230104153304-892d1a2eb0da
1011
github.com/shopspring/decimal v1.3.1
1112
github.com/spf13/cobra v1.6.1

go.sum

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxd
5656
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
5757
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
5858
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
59+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
5960
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6061
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
6162
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=

internal/common/conv/argument.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package conv
22

33
import (
4-
"fmt"
54
"math/big"
65
"strconv"
76

87
"github.com/ethereum/go-ethereum/accounts/abi"
98
"github.com/ethereum/go-ethereum/common"
9+
"github.com/pkg/errors"
1010
)
1111

1212
// UnpackArgument converts string format of a value into the Go type corresponding to given argument type.
@@ -23,7 +23,7 @@ func UnpackArgument(t abi.Type, s string) (any, error) {
2323
case abi.HashTy:
2424
return common.HexToHash(s), nil
2525
default:
26-
return nil, fmt.Errorf("unsupported argument type %v", t.T)
26+
return nil, errors.Errorf("unsupported argument type %v", t.T)
2727
}
2828
}
2929

@@ -35,7 +35,7 @@ func parseInteger(t abi.Type, s string) (any, error) {
3535
default:
3636
i, ok := new(big.Int).SetString(s, 10)
3737
if !ok {
38-
return nil, fmt.Errorf("cannot parse %s as type %v", s, t.T)
38+
return nil, errors.Errorf("cannot parse %s as type %v", s, t.T)
3939
} else {
4040
return i, nil
4141
}
@@ -47,7 +47,7 @@ func parseInteger(t abi.Type, s string) (any, error) {
4747
default:
4848
i, ok := new(big.Int).SetString(s, 10)
4949
if !ok {
50-
return nil, fmt.Errorf("cannot parse %s as type %v", s, t.T)
50+
return nil, errors.Errorf("cannot parse %s as type %v", s, t.T)
5151
} else {
5252
return i, nil
5353
}

internal/common/log.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package common
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/ethereum/go-ethereum/log"
7+
)
8+
9+
func ErrorStackHandler(h log.Handler) log.Handler {
10+
return log.FuncHandler(func(r *log.Record) error {
11+
i := len(r.Ctx) - 1
12+
if i > 0 {
13+
e := r.Ctx[i]
14+
if err, ok := e.(error); ok {
15+
r.Ctx[i] = fmt.Sprintf("%+v", err)
16+
}
17+
}
18+
return h.Log(r)
19+
})
20+
}

internal/config/config.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88

99
"github.com/dyng/ramen/internal/view/style"
10+
"github.com/pkg/errors"
1011
)
1112

1213
var (
@@ -55,15 +56,15 @@ func ParseConfig(config *Config) error {
5556
if os.IsNotExist(err) {
5657
return nil
5758
} else {
58-
return err
59+
return errors.WithStack(err)
5960
}
6061
}
6162

6263
// read and parse config file
6364
configJson := new(configJSON)
6465
err = json.Unmarshal(bytes, &configJson)
6566
if err != nil {
66-
return err
67+
return errors.WithStack(err)
6768
}
6869

6970
// overwrite configurations only when the default value is used

internal/provider/alchemy.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package provider
22

3+
import "github.com/pkg/errors"
4+
35
type (
46
GetAssetTransfersParams struct {
57
FromBlock string `json:"fromBlock,omitempty"`
@@ -47,7 +49,7 @@ func (p *Provider) GetAssetTransfers(params GetAssetTransfersParams) (*GetAssetT
4749
var result *GetAssetTransfersResult
4850
err := p.rpcClient.CallContext(ctx, &result, "alchemy_getAssetTransfers", params)
4951
if err != nil {
50-
return nil, err
52+
return nil, errors.WithStack(err)
5153
}
5254
return result, nil
5355
}

internal/provider/ethereum.go

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package provider
33
import (
44
"context"
55
"encoding/json"
6-
"errors"
76
"math/big"
87
"time"
98

@@ -16,6 +15,7 @@ import (
1615
"github.com/ethereum/go-ethereum/ethclient"
1716
"github.com/ethereum/go-ethereum/log"
1817
"github.com/ethereum/go-ethereum/rpc"
18+
"github.com/pkg/errors"
1919
)
2020

2121
var (
@@ -47,7 +47,7 @@ type txExtraInfo struct {
4747

4848
func (tx *rpcTransaction) UnmarshalJSON(msg []byte) error {
4949
if err := json.Unmarshal(msg, &tx.tx); err != nil {
50-
return err
50+
return errors.WithStack(err)
5151
}
5252
return json.Unmarshal(msg, &tx.txExtraInfo)
5353
}
@@ -77,7 +77,7 @@ func NewProvider(url string, providerType string) *Provider {
7777

7878
rpcClient, err := rpc.Dial(url)
7979
if err != nil {
80-
log.Crit("Cannot connect to rpc server", "url", url, "error", err)
80+
log.Crit("Cannot connect to rpc server", "url", url, "error", errors.WithStack(err))
8181
}
8282

8383
p.rpcClient = rpcClient
@@ -97,7 +97,7 @@ func (p *Provider) GetNetwork() (common.BigInt, error) {
9797
if p.chainId == nil {
9898
chainId, err := p.client.NetworkID(ctx)
9999
if err != nil {
100-
return nil, err
100+
return nil, errors.WithStack(err)
101101
}
102102
p.chainId = chainId
103103
p.signer = types.NewLondonSigner(chainId)
@@ -108,7 +108,8 @@ func (p *Provider) GetNetwork() (common.BigInt, error) {
108108
func (p *Provider) GetGasPrice() (common.BigInt, error) {
109109
ctx, cancel := p.createContext()
110110
defer cancel()
111-
return p.client.SuggestGasPrice(ctx)
111+
gasPrice, err := p.client.SuggestGasPrice(ctx)
112+
return gasPrice, errors.WithStack(err)
112113
}
113114

114115
func (p *Provider) GetSigner() (types.Signer, error) {
@@ -122,31 +123,36 @@ func (p *Provider) GetSigner() (types.Signer, error) {
122123
func (p *Provider) GetCode(addr common.Address) ([]byte, error) {
123124
ctx, cancel := p.createContext()
124125
defer cancel()
125-
return p.client.CodeAt(ctx, addr, nil)
126+
code, err := p.client.CodeAt(ctx, addr, nil)
127+
return code, errors.WithStack(err)
126128
}
127129

128130
func (p *Provider) GetBalance(addr common.Address) (common.BigInt, error) {
129131
ctx, cancel := p.createContext()
130132
defer cancel()
131-
return p.client.BalanceAt(ctx, addr, nil)
133+
balance, err := p.client.BalanceAt(ctx, addr, nil)
134+
return balance, errors.WithStack(err)
132135
}
133136

134137
func (p *Provider) GetBlockHeight() (uint64, error) {
135138
ctx, cancel := p.createContext()
136139
defer cancel()
137-
return p.client.BlockNumber(ctx)
140+
height, err := p.client.BlockNumber(ctx)
141+
return height, errors.WithStack(err)
138142
}
139143

140144
func (p *Provider) GetBlockByHash(hash common.Hash) (*common.Block, error) {
141145
ctx, cancel := p.createContext()
142146
defer cancel()
143-
return p.client.BlockByHash(ctx, hash)
147+
block, err := p.client.BlockByHash(ctx, hash)
148+
return block, errors.WithStack(err)
144149
}
145150

146151
func (p *Provider) GetBlockByNumber(number common.BigInt) (*common.Block, error) {
147152
ctx, cancel := p.createContext()
148153
defer cancel()
149-
return p.client.BlockByNumber(ctx, number)
154+
block, err := p.client.BlockByNumber(ctx, number)
155+
return block, errors.WithStack(err)
150156
}
151157

152158
func (p *Provider) BatchTransactionByHash(hashList []common.Hash) (common.Transactions, error) {
@@ -166,7 +172,7 @@ func (p *Provider) BatchTransactionByHash(hashList []common.Hash) (common.Transa
166172

167173
err := p.rpcClient.BatchCallContext(ctx, reqs)
168174
if err != nil {
169-
return nil, err
175+
return nil, errors.WithStack(err)
170176
}
171177

172178
result := make(common.Transactions, size)
@@ -191,7 +197,7 @@ func (p *Provider) EstimateGas(address common.Address, from common.Address, inpu
191197

192198
gasLimit, err := p.client.EstimateGas(ctx, msg)
193199
if err != nil {
194-
return 0, err
200+
return 0, errors.WithStack(err)
195201
}
196202

197203
return gasLimit, nil
@@ -201,7 +207,7 @@ func (p *Provider) CallContract(address common.Address, abi *abi.ABI, method str
201207
// encode calldata
202208
input, err := abi.Pack(method, args...)
203209
if err != nil {
204-
return nil, err
210+
return nil, errors.WithStack(err)
205211
}
206212

207213
// build call message
@@ -215,12 +221,12 @@ func (p *Provider) CallContract(address common.Address, abi *abi.ABI, method str
215221

216222
data, err := p.client.CallContract(ctx, msg, nil)
217223
if err != nil {
218-
return nil, err
224+
return nil, errors.WithStack(err)
219225
}
220226

221227
vals, err := abi.Unpack(method, data)
222228
if err != nil {
223-
return nil, err
229+
return nil, errors.WithStack(err)
224230
}
225231

226232
return vals, nil
@@ -236,7 +242,7 @@ func (p *Provider) SendTransaction(txnReq *common.TxnRequest) (common.Hash, erro
236242
// fetch the next nonce
237243
nonce, err := p.client.PendingNonceAt(ctx, from)
238244
if err != nil {
239-
return common.Hash{}, err
245+
return common.Hash{}, errors.WithStack(err)
240246
}
241247

242248
txn := types.NewTx(&types.LegacyTx{
@@ -255,17 +261,18 @@ func (p *Provider) SendTransaction(txnReq *common.TxnRequest) (common.Hash, erro
255261

256262
signedTx, err := types.SignTx(txn, signer, key)
257263
if err != nil {
258-
return common.Hash{}, err
264+
return common.Hash{}, errors.WithStack(err)
259265
}
260266

261267
err = p.client.SendTransaction(ctx, signedTx)
262-
return signedTx.Hash(), err
268+
return signedTx.Hash(), errors.WithStack(err)
263269
}
264270

265271
func (p *Provider) SubscribeNewHead(ch chan<- *common.Header) (ethereum.Subscription, error) {
266272
ctx, cancel := p.createContext()
267273
defer cancel()
268-
return p.client.SubscribeNewHead(ctx, ch)
274+
sub, err := p.client.SubscribeNewHead(ctx, ch)
275+
return sub, errors.WithStack(err)
269276
}
270277

271278
func (p *Provider) createContext() (context.Context, context.CancelFunc) {

0 commit comments

Comments
 (0)