Skip to content

Commit

Permalink
feat: use customized ethereum client for source and worker
Browse files Browse the repository at this point in the history
  • Loading branch information
kallydev authored Dec 4, 2023
1 parent b0277ce commit 6af0e79
Show file tree
Hide file tree
Showing 48 changed files with 7,210 additions and 146 deletions.
23 changes: 2 additions & 21 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
Expand Down Expand Up @@ -102,7 +104,6 @@ github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJ
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA=
github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
Expand Down Expand Up @@ -144,8 +145,6 @@ github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R
github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
github.com/ethereum/go-ethereum v1.13.5 h1:U6TCRciCqZRe4FPXmy1sMGxTfuk8P7u2UoinF3VbaFk=
github.com/ethereum/go-ethereum v1.13.5/go.mod h1:yMTu38GSuyxaYzQMViqNmQ1s3cE84abZexQmTgenWk0=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
Expand Down Expand Up @@ -251,14 +250,10 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o=
Expand Down Expand Up @@ -316,8 +311,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
Expand All @@ -326,8 +319,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
Expand Down Expand Up @@ -378,10 +369,6 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ=
github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
Expand Down Expand Up @@ -439,8 +426,6 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
github.com/vektah/gqlparser/v2 v2.5.1 h1:ZGu+bquAY23jsxDRcYpWjttRZrUz07LbiY77gUOHcr4=
github.com/vektah/gqlparser/v2 v2.5.1/go.mod h1:mPgqFBu/woKTVYWyNk8cO3kh4S/f4aRFZrvOnp3hmCs=
github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw=
Expand All @@ -451,8 +436,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE=
github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA=
Expand Down Expand Up @@ -804,8 +787,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Expand Down
34 changes: 16 additions & 18 deletions internal/engine/source/ethereum/source.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ import (
"math/big"
"time"

"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/rpc"
"github.com/naturalselectionlabs/rss3-node/internal/engine"
"github.com/naturalselectionlabs/rss3-node/provider/ethereum"
"github.com/naturalselectionlabs/rss3-node/schema/filter"
"github.com/samber/lo"
"go.uber.org/zap"
Expand All @@ -25,7 +23,7 @@ var _ engine.Source = (*source)(nil)

type source struct {
config *engine.Config
ethereumClient *ethclient.Client
ethereumClient ethereum.Client
state State
pendingState State
}
Expand All @@ -51,8 +49,8 @@ func (s *source) Start(ctx context.Context, tasksChan chan<- []engine.Task, erro
}

func (s *source) initialize(ctx context.Context) (err error) {
if s.ethereumClient, err = ethclient.Dial(s.config.Endpoint); err != nil {
return fmt.Errorf("dial ethereum endpoint: %w", err)
if s.ethereumClient, err = ethereum.Dial(ctx, s.config.Endpoint); err != nil {
return fmt.Errorf("dial to ethereum rpc endpoint: %w", err)
}

chainID, err := s.ethereumClient.ChainID(ctx)
Expand Down Expand Up @@ -81,13 +79,13 @@ func (s *source) pollBlocks(ctx context.Context, tasksChan chan<- []engine.Task)
}

// RPC providers may incorrectly shunt the request to a lagging node.
if blockNumberLatestRemote <= blockNumberLatestLocal {
if blockNumberLatestRemote.Uint64() <= blockNumberLatestLocal {
zap.L().Info("waiting new block", zap.Uint64("block.number.local", s.state.BlockNumber), zap.Uint64("block.number.remote", blockNumberLatestLocal), zap.Duration("block.time", defaultBlockTime))

time.Sleep(defaultBlockTime)
} else {
// TODO Need to handle block reorganization.
blockNumberLatestLocal = blockNumberLatestRemote
blockNumberLatestLocal = blockNumberLatestRemote.Uint64()
}

continue
Expand All @@ -99,14 +97,14 @@ func (s *source) pollBlocks(ctx context.Context, tasksChan chan<- []engine.Task)
}

// Before being able to handle block reorganization, correctly handle canonical.
receipts, err := s.ethereumClient.BlockReceipts(ctx, rpc.BlockNumberOrHashWithHash(block.Hash(), true))
receipts, err := s.ethereumClient.BlockReceipts(ctx, block.Number)
if err != nil {
return fmt.Errorf("get receipts by block hash %s: %w", block.Hash(), err)
return fmt.Errorf("get receipts by block number %d: %w", block.Number, err)
}

tasks, err := s.buildTasks(block, receipts)
if err != nil {
return fmt.Errorf("build tasks for block hash: %s: %w", block.Hash(), err)
return fmt.Errorf("build tasks for block hash: %s: %w", block.Hash, err)
}

// TODO It might be possible to use generics to avoid manual type assertions.
Expand All @@ -115,25 +113,25 @@ func (s *source) pollBlocks(ctx context.Context, tasksChan chan<- []engine.Task)
// Update state by two phase commit to avoid data inconsistency.
s.state = s.pendingState

s.pendingState.BlockHash = block.Hash()
s.pendingState.BlockHash = block.Hash
s.pendingState.BlockNumber++
}
}

func (s *source) buildTasks(block *types.Block, receipts types.Receipts) ([]*Task, error) {
tasks := make([]*Task, len(block.Transactions()))
func (s *source) buildTasks(block *ethereum.Block, receipts []*ethereum.Receipt) ([]*Task, error) {
tasks := make([]*Task, len(block.Transactions))

for index, transaction := range block.Transactions() {
for index, transaction := range block.Transactions {
// There is no guarantee that the receipts provided by RPC will be in the same order as the transactions,
// so instead of using a transaction index, we can match the hash.
receipt, exists := lo.Find(receipts, func(receipt *types.Receipt) bool {
return receipt.TxHash == transaction.Hash()
receipt, exists := lo.Find(receipts, func(receipt *ethereum.Receipt) bool {
return receipt.TransactionHash == transaction.Hash
})

// TODO Often this is also caused by a lagging RPC node failing to get the latest data,
// and it's best to fix this before the build task.
if !exists {
return nil, fmt.Errorf("no receipt matched to transaction hash %s", transaction.Hash())
return nil, fmt.Errorf("no receipt matched to transaction hash %s", transaction.Hash)
}

task := Task{
Expand Down
60 changes: 37 additions & 23 deletions internal/engine/source/ethereum/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ var _ engine.Task = (*Task)(nil)

type Task struct {
Chain filter.ChainEthereum
Header *types.Header
Transaction *types.Transaction
Receipt *types.Receipt
Header *ethereum.Header
Transaction *ethereum.Transaction
Receipt *ethereum.Receipt
}

func (t Task) ID() string {
return fmt.Sprintf("%s.%s.%s", t.Chain.Network(), t.Chain, t.Transaction.Hash())
return fmt.Sprintf("%s.%s.%s", t.Chain.Network(), t.Chain, t.Transaction.Hash)
}

func (t Task) Network() filter.Network {
return t.Chain.Network()
}

func (t Task) Timestamp() uint64 {
return t.Header.Time
return t.Header.Timestamp
}

func (t Task) Validate() error {
Expand All @@ -42,32 +42,31 @@ func (t Task) Validate() error {
}

func (t Task) BuildFeed( /* TODO Implementing options. */ ) (*schema.Feed, error) {
var to common.Address
var to, from common.Address

if t.Transaction.To() == nil {
if t.Transaction.To == nil {
// The Nethermind node may be missing this field,
// Reference https://github.com/NethermindEth/nethermind/issues/5823.
if t.Receipt.ContractAddress == ethereum.AddressGenesis {
return nil, fmt.Errorf("invalid receipt %s", t.Transaction.Hash().String())
if t.Receipt.ContractAddress == nil {
return nil, fmt.Errorf("invalid receipt %s", t.Transaction.Hash)
}

to = t.Receipt.ContractAddress
to = *t.Receipt.ContractAddress
} else {
to = *t.Transaction.To()
to = *t.Transaction.To
}

from, err := types.LatestSignerForChainID(t.Transaction.ChainId()).Sender(t.Transaction)
if err != nil {
return nil, fmt.Errorf("recovery transaction sender: %w", err)
}
// TODO Verify transaction signature.
// There is no signer implementation that supports all of layer 2 network at the same time.
from = t.Transaction.From

feeAmount, err := t.buildFee()
if err != nil {
return nil, fmt.Errorf("build fee: %w", err)
}

feed := schema.Feed{
ID: t.Transaction.Hash().String(),
ID: t.Transaction.Hash.String(),
Chain: t.Chain,
Index: t.Receipt.TransactionIndex,
From: from.String(),
Expand All @@ -79,20 +78,35 @@ func (t Task) BuildFeed( /* TODO Implementing options. */ ) (*schema.Feed, error
},
Actions: make([]*schema.Action, 0),
Status: t.Receipt.Status == types.ReceiptStatusSuccessful,
Timestamp: t.Header.Time,
Timestamp: t.Header.Timestamp,
}

return &feed, nil
}

func (t Task) buildFee() (*big.Int, error) {
switch t.Receipt.Type {
switch t.Transaction.Type {
case types.LegacyTxType, types.AccessListTxType:
return new(big.Int).Mul(t.Transaction.GasPrice(), new(big.Int).SetUint64(t.Receipt.GasUsed)), nil
case types.DynamicFeeTxType:
// TODO Add support for EIP-1559 transaction.
return big.NewInt(0), nil
return new(big.Int).Mul(t.Transaction.GasPrice, new(big.Int).SetUint64(t.Receipt.GasUsed)), nil
case types.DynamicFeeTxType: // https://eips.ethereum.org/EIPS/eip-1559
var (
gasPrice decimal.Decimal
gasUsed = decimal.NewFromBigInt(new(big.Int).SetUint64(t.Receipt.GasUsed), 0)
)

if t.Receipt.EffectiveGasPrice != nil {
gasPrice = decimal.NewFromBigInt(t.Receipt.EffectiveGasPrice, 0)
} else {
var (
baseFee = decimal.NewFromBigInt(t.Header.BaseFee, 0)
gasTipCap = decimal.NewFromBigInt(t.Transaction.GasTipCap, 0)
)

gasPrice = baseFee.Add(gasTipCap)
}

return gasPrice.Mul(gasUsed).BigInt(), nil
default:
return nil, fmt.Errorf("unsupported transaction type %d", t.Receipt.Type)
return nil, fmt.Errorf("unsupported transaction type %d", t.Transaction.Type)
}
}
Loading

0 comments on commit 6af0e79

Please sign in to comment.