From dbd24092494ecda3c194ed4e947cd44e850ce6bb Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 25 Jul 2024 19:41:39 +0800 Subject: [PATCH 1/7] feat: add nft trails whitelist --- adapters/blocks/nft_deployed.go | 103 ++++++++++++++++++++++++++ adapters/blocks/transaction_sender.go | 3 - adapters/contracts/erc165/abi.go | 25 +++++++ adapters/logs/collection_created.go | 64 ++++++++++++++++ adapters/logs/contract_deployed.go | 72 ++++++++++++++++++ cmd/collection_created.go | 11 +++ cmd/contract_deployed.go | 11 +++ cmd/root.go | 8 +- cmd/transaction_sender.go | 16 ++++ 9 files changed, 309 insertions(+), 4 deletions(-) create mode 100644 adapters/blocks/nft_deployed.go create mode 100644 adapters/contracts/erc165/abi.go create mode 100644 adapters/logs/collection_created.go create mode 100644 adapters/logs/contract_deployed.go create mode 100644 cmd/collection_created.go create mode 100644 cmd/contract_deployed.go diff --git a/adapters/blocks/nft_deployed.go b/adapters/blocks/nft_deployed.go new file mode 100644 index 0000000..dfc3f2f --- /dev/null +++ b/adapters/blocks/nft_deployed.go @@ -0,0 +1,103 @@ +package blocks + +import ( + "context" + "fmt" + "strings" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters/contracts/erc165" +) + +type NftDeployedIndexer struct{} + +// NewNftDeployedIndexer creates a new NftDeployedIndexer. +func NewNftDeployedIndexer() *NftDeployedIndexer { + return &NftDeployedIndexer{} +} + +const ( + ERC721InterfaceID = "0x80ac58cd" // ERC721 interface ID + ERC1155InterfaceID = "0xd9b67a26" // ERC1155 interface ID +) + +func supportsInterface(contractAddress common.Address, client *ethclient.Client, interfaceID string) (bool, error) { + parsedABI, err := abi.JSON(strings.NewReader(erc165.ABI)) + if err != nil { + return false, err + } + + interfaceIDBytes := common.FromHex(interfaceID) + if len(interfaceIDBytes) != 4 { + return false, fmt.Errorf("invalid interface ID length") + } + + data, err := parsedABI.Pack("supportsInterface", [4]byte{interfaceIDBytes[0], interfaceIDBytes[1], interfaceIDBytes[2], interfaceIDBytes[3]}) + if err != nil { + return false, err + } + + msg := ethereum.CallMsg{ + To: &contractAddress, + Data: data, + } + + result, err := client.CallContract(context.Background(), msg, nil) + if err != nil { + return false, err + } + + var supports bool + err = parsedABI.UnpackIntoInterface(&supports, "supportsInterface", result) + if err != nil { + return false, err + } + + return supports, nil +} + +func (indexer *NftDeployedIndexer) ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) ([]common.Address, error) { + txs := block.Transactions() + var result []common.Address + + for _, tx := range txs { + receipt, err := client.TransactionReceipt(ctx, tx.Hash()) + if err != nil { + return nil, err + } + + sender, err := client.TransactionSender(ctx, tx, block.Hash(), receipt.TransactionIndex) + if err != nil { + return nil, err + } + + to := tx.To() + if to != nil { + continue + } + + isErc721, err := supportsInterface(receipt.ContractAddress, client, ERC721InterfaceID) + if err != nil { + return nil, err + } + + if isErc721 { + result = append(result, sender) + } + + isErc1155, err := supportsInterface(receipt.ContractAddress, client, ERC1155InterfaceID) + if err != nil { + return nil, err + } + + if isErc1155 { + result = append(result, sender) + } + } + + return result, nil +} diff --git a/adapters/blocks/transaction_sender.go b/adapters/blocks/transaction_sender.go index 6515d24..bb98d50 100644 --- a/adapters/blocks/transaction_sender.go +++ b/adapters/blocks/transaction_sender.go @@ -6,11 +6,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters" ) -var _ adapters.BlockProcessor = (*TransactionSender)(nil) - type TransactionSender struct { ValidRecipient map[string]struct{} } diff --git a/adapters/contracts/erc165/abi.go b/adapters/contracts/erc165/abi.go new file mode 100644 index 0000000..19162fc --- /dev/null +++ b/adapters/contracts/erc165/abi.go @@ -0,0 +1,25 @@ +package erc165 + +var ( + ABI = `[ + { + "constant": true, + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ]` +) diff --git a/adapters/logs/collection_created.go b/adapters/logs/collection_created.go new file mode 100644 index 0000000..9c2af2b --- /dev/null +++ b/adapters/logs/collection_created.go @@ -0,0 +1,64 @@ +package logs + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" +) + +type CollectionCreatedIndexer struct { + TargetAddresses []common.Address +} + +// NewCollectionCreatedIndexer creates a new CollectionCreatedIndexer. +func NewCollectionCreatedIndexer() *CollectionCreatedIndexer { + return &CollectionCreatedIndexer{TargetAddresses: []common.Address{common.HexToAddress("0x00000000001594C61dD8a6804da9AB58eD2483ce")}} +} + +func (indexer *CollectionCreatedIndexer) Addresses() []common.Address { + return indexer.TargetAddresses +} + +func (indexer *CollectionCreatedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { + var result []adapters.TransferData + for _, vLog := range logs { + if !isERC721Transfer(vLog) && !isFromZeroAddress(vLog) { + continue + } + transferData, err := indexer.ProcessLog(ctx, chainID, client, vLog) + if err != nil { + return nil, err + } + result = append(result, *transferData) + } + return result, nil +} + +func isERC721Transfer(vLog types.Log) bool { + return len(vLog.Topics) == 4 && vLog.Topics[0].Hex() == logTransferSigHash.Hex() +} + +func isFromZeroAddress(vLog types.Log) bool { + from := common.BytesToAddress(vLog.Topics[1].Bytes()[12:]) + return from.Hex() != adapters.ZeroAddress.Hex() +} + +// processLog processes a single ERC20 transfer log. +func (indexer *CollectionCreatedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { + to := common.BytesToAddress(vLog.Topics[2].Bytes()[12:]) + + block, err := client.BlockByNumber(ctx, big.NewInt(int64(vLog.BlockNumber))) + if err != nil { + return nil, err + } + + return &adapters.TransferData{ + To: to, + Time: block.Time(), + BlockNumber: block.Number().Uint64(), + }, nil +} diff --git a/adapters/logs/contract_deployed.go b/adapters/logs/contract_deployed.go new file mode 100644 index 0000000..4dc3f52 --- /dev/null +++ b/adapters/logs/contract_deployed.go @@ -0,0 +1,72 @@ +package logs + +import ( + "context" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" +) + +var ( + logContractDeployedSigHash = crypto.Keccak256Hash([]byte("ContractDeployed(address)")) +) + +type ContractDeployedIndexer struct { + TargetAddresses []common.Address +} + +func NewContractDeployedIndexer() *ContractDeployedIndexer { + return &ContractDeployedIndexer{TargetAddresses: []common.Address{ + common.HexToAddress("0xb0B4B761C9e9Bf5A9194a42e944A4A6646B83919"), + }} +} + +func (indexer *ContractDeployedIndexer) Addresses() []common.Address { + return indexer.TargetAddresses +} + +func (indexer *ContractDeployedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { + var result []adapters.TransferData + for _, vLog := range logs { + if !indexer.isRelevantLog(vLog.Topics[0]) { + continue + } + transferData, err := indexer.ProcessLog(ctx, chainID, client, vLog) + if err != nil { + return nil, err + } + result = append(result, *transferData) + } + return result, nil +} + +func (indexer *ContractDeployedIndexer) isRelevantLog(topic common.Hash) bool { + return topic.Hex() == logContractDeployedSigHash.Hex() +} + +func (indexer *ContractDeployedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { + txn, err := client.TransactionInBlock(ctx, vLog.BlockHash, vLog.TxIndex) + if err != nil { + return nil, err + } + + sender, err := client.TransactionSender(ctx, txn, vLog.BlockHash, vLog.TxIndex) + if err != nil { + return nil, err + } + + block, err := client.BlockByNumber(ctx, big.NewInt(int64(vLog.BlockNumber))) + if err != nil { + return nil, err + } + + return &adapters.TransferData{ + To: sender, + Time: block.Time(), + BlockNumber: block.Number().Uint64(), + }, nil +} diff --git a/cmd/collection_created.go b/cmd/collection_created.go new file mode 100644 index 0000000..fc6fc4f --- /dev/null +++ b/cmd/collection_created.go @@ -0,0 +1,11 @@ +package cmd + +import ( + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters/logs" +) + +func processCollectionCreatedIndexer(client *ethclient.Client, blockNumber int64) { + processor := logs.NewCollectionCreatedIndexer() + processLogIndexer(client, processor, blockNumber) +} diff --git a/cmd/contract_deployed.go b/cmd/contract_deployed.go new file mode 100644 index 0000000..e05f448 --- /dev/null +++ b/cmd/contract_deployed.go @@ -0,0 +1,11 @@ +package cmd + +import ( + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters/logs" +) + +func processContractDeployedIndexer(client *ethclient.Client, blockNumber int64) { + processor := logs.NewContractDeployedIndexer() + processLogIndexer(client, processor, blockNumber) +} diff --git a/cmd/root.go b/cmd/root.go index 7f4da7b..2d3c836 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -32,7 +32,7 @@ func init() { } func promptUser() { - var adapterOptions = []string{"NewTransactionSender", "DotTaikoIndexer", "OrderFulfilledIndexer", "NewSaleIndexer"} + var adapterOptions = []string{"NewTransactionSender", "NftDeployed", "DotTaikoIndexer", "OrderFulfilledIndexer", "NewSaleIndexer", "ContractDeployed", "CollectionCreated"} var qs = []*survey.Question{ { Name: "adapter", @@ -72,12 +72,18 @@ func executeCommand() { switch adapter { case "NewTransactionSender": processNewTransactionSender(client, blockNumber) + case "NftDeployed": + processNewNftDeployed(client, blockNumber) case "OrderFulfilledIndexer": processOrderFulfilledIndexer(client, blockNumber) case "DotTaikoIndexer": processDotTaikoIndexer(client, blockNumber) case "NewSaleIndexer": processNewSaleIndexer(client, blockNumber) + case "ContractDeployed": + processContractDeployedIndexer(client, blockNumber) + case "CollectionCreated": + processCollectionCreatedIndexer(client, blockNumber) default: log.Fatalf("Adapter %s is not supported", adapter) } diff --git a/cmd/transaction_sender.go b/cmd/transaction_sender.go index 397b20f..3f09816 100644 --- a/cmd/transaction_sender.go +++ b/cmd/transaction_sender.go @@ -25,3 +25,19 @@ func processNewTransactionSender(client *ethclient.Client, blockNumber int64) { fmt.Printf("Senders: %v\n", senders) } + +func processNewNftDeployed(client *ethclient.Client, blockNumber int64) { + processor := blocks.NewNftDeployedIndexer() + blockNumberBig := big.NewInt(blockNumber) + block, err := client.BlockByNumber(context.Background(), blockNumberBig) + if err != nil { + log.Fatalf("Failed to fetch the block: %v", err) + } + + senders, err := processor.ProcessBlock(context.Background(), block, client) + if err != nil { + log.Fatalf("Failed to process the block: %v", err) + } + + fmt.Printf("Senders: %v\n", senders) +} From b5417fe18436f1d37e1f397b055595056376c091 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 25 Jul 2024 19:48:42 +0800 Subject: [PATCH 2/7] refactor: block processor --- adapters/blocks.go | 8 ++++++- adapters/blocks/nft_deployed.go | 17 +++++++++++---- adapters/blocks/transaction_sender.go | 13 +++++++---- cmd/process_transaction.go | 26 ++++++++++++++++++++++ cmd/transaction_sender.go | 31 ++------------------------- 5 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 cmd/process_transaction.go diff --git a/adapters/blocks.go b/adapters/blocks.go index 93951bd..892ce46 100644 --- a/adapters/blocks.go +++ b/adapters/blocks.go @@ -14,5 +14,11 @@ var ( // BlockProcessor is an interface that defines the methods for processing blocks. type BlockProcessor interface { - ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) (*[]common.Address, error) + ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) ([]Whitelist, error) +} + +type Whitelist struct { + User common.Address + Time uint64 + BlockNumber uint64 } diff --git a/adapters/blocks/nft_deployed.go b/adapters/blocks/nft_deployed.go index dfc3f2f..a040a7a 100644 --- a/adapters/blocks/nft_deployed.go +++ b/adapters/blocks/nft_deployed.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" "github.com/taikoxyz/trailblazer-adapters/adapters/contracts/erc165" ) @@ -60,9 +61,9 @@ func supportsInterface(contractAddress common.Address, client *ethclient.Client, return supports, nil } -func (indexer *NftDeployedIndexer) ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) ([]common.Address, error) { +func (indexer *NftDeployedIndexer) ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) ([]adapters.Whitelist, error) { txs := block.Transactions() - var result []common.Address + var result []adapters.Whitelist for _, tx := range txs { receipt, err := client.TransactionReceipt(ctx, tx.Hash()) @@ -86,7 +87,11 @@ func (indexer *NftDeployedIndexer) ProcessBlock(ctx context.Context, block *type } if isErc721 { - result = append(result, sender) + result = append(result, adapters.Whitelist{ + User: sender, + BlockNumber: block.Number().Uint64(), + Time: block.Time(), + }) } isErc1155, err := supportsInterface(receipt.ContractAddress, client, ERC1155InterfaceID) @@ -95,7 +100,11 @@ func (indexer *NftDeployedIndexer) ProcessBlock(ctx context.Context, block *type } if isErc1155 { - result = append(result, sender) + result = append(result, adapters.Whitelist{ + User: sender, + BlockNumber: block.Number().Uint64(), + Time: block.Time(), + }) } } diff --git a/adapters/blocks/transaction_sender.go b/adapters/blocks/transaction_sender.go index bb98d50..85b1eb5 100644 --- a/adapters/blocks/transaction_sender.go +++ b/adapters/blocks/transaction_sender.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" ) type TransactionSender struct { @@ -19,9 +20,9 @@ func NewTransactionSender() *TransactionSender { }} } -func (indexer *TransactionSender) ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) (*[]common.Address, error) { +func (indexer *TransactionSender) ProcessBlock(ctx context.Context, block *types.Block, client *ethclient.Client) ([]adapters.Whitelist, error) { txs := block.Transactions() - var result []common.Address + var result []adapters.Whitelist for _, tx := range txs { receipt, err := client.TransactionReceipt(ctx, tx.Hash()) @@ -37,8 +38,12 @@ func (indexer *TransactionSender) ProcessBlock(ctx context.Context, block *types continue } if _, exists := indexer.ValidRecipient[to.Hex()]; exists { - result = append(result, sender) + result = append(result, adapters.Whitelist{ + User: sender, + BlockNumber: block.Number().Uint64(), + Time: block.Time(), + }) } } - return &result, nil + return result, nil } diff --git a/cmd/process_transaction.go b/cmd/process_transaction.go new file mode 100644 index 0000000..71e1a9c --- /dev/null +++ b/cmd/process_transaction.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "context" + "fmt" + "log" + "math/big" + + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" +) + +func processTransactionIndexer(client *ethclient.Client, processor adapters.BlockProcessor, blockNumber int64) { + blockNumberBig := big.NewInt(blockNumber) + block, err := client.BlockByNumber(context.Background(), blockNumberBig) + if err != nil { + log.Fatalf("Failed to fetch the block: %v", err) + } + + senders, err := processor.ProcessBlock(context.Background(), block, client) + if err != nil { + log.Fatalf("Failed to process the block: %v", err) + } + + fmt.Printf("Senders: %v\n", senders) +} diff --git a/cmd/transaction_sender.go b/cmd/transaction_sender.go index 3f09816..051091c 100644 --- a/cmd/transaction_sender.go +++ b/cmd/transaction_sender.go @@ -1,43 +1,16 @@ package cmd import ( - "context" - "fmt" - "log" - "math/big" - "github.com/ethereum/go-ethereum/ethclient" "github.com/taikoxyz/trailblazer-adapters/adapters/blocks" ) func processNewTransactionSender(client *ethclient.Client, blockNumber int64) { processor := blocks.NewTransactionSender() - blockNumberBig := big.NewInt(blockNumber) - block, err := client.BlockByNumber(context.Background(), blockNumberBig) - if err != nil { - log.Fatalf("Failed to fetch the block: %v", err) - } - - senders, err := processor.ProcessBlock(context.Background(), block, client) - if err != nil { - log.Fatalf("Failed to process the block: %v", err) - } - - fmt.Printf("Senders: %v\n", senders) + processTransactionIndexer(client, processor, blockNumber) } func processNewNftDeployed(client *ethclient.Client, blockNumber int64) { processor := blocks.NewNftDeployedIndexer() - blockNumberBig := big.NewInt(blockNumber) - block, err := client.BlockByNumber(context.Background(), blockNumberBig) - if err != nil { - log.Fatalf("Failed to fetch the block: %v", err) - } - - senders, err := processor.ProcessBlock(context.Background(), block, client) - if err != nil { - log.Fatalf("Failed to process the block: %v", err) - } - - fmt.Printf("Senders: %v\n", senders) + processTransactionIndexer(client, processor, blockNumber) } From 24f82fa1da8838e803d20c1fe96858065e94f822 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 26 Jul 2024 14:44:44 +0800 Subject: [PATCH 3/7] feat: add conft --- adapters/contracts/conft/abi.go | 49 +++++++++++++++++++ adapters/logs/token_sold.go | 85 +++++++++++++++++++++++++++++++++ cmd/collection_created.go | 4 +- cmd/contract_deployed.go | 4 +- cmd/domain_register.go | 4 +- cmd/new_sale.go | 4 +- cmd/order_fulfilled.go | 4 +- cmd/process_log.go | 6 ++- cmd/process_transaction.go | 5 +- cmd/root.go | 4 +- cmd/token_sold.go | 11 +++++ cmd/transaction_sender.go | 8 ++-- 12 files changed, 171 insertions(+), 17 deletions(-) create mode 100644 adapters/contracts/conft/abi.go create mode 100644 adapters/logs/token_sold.go create mode 100644 cmd/token_sold.go diff --git a/adapters/contracts/conft/abi.go b/adapters/contracts/conft/abi.go new file mode 100644 index 0000000..2d18b7b --- /dev/null +++ b/adapters/contracts/conft/abi.go @@ -0,0 +1,49 @@ +package conft + +var ( + ABI = `[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint128", + "name": "id", + "type": "uint128" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "contractAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "name": "TokenSold", + "type": "event" + } +]` +) diff --git a/adapters/logs/token_sold.go b/adapters/logs/token_sold.go new file mode 100644 index 0000000..64be91c --- /dev/null +++ b/adapters/logs/token_sold.go @@ -0,0 +1,85 @@ +package logs + +import ( + "context" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters" + "github.com/taikoxyz/trailblazer-adapters/adapters/contracts/conft" +) + +var ( + logTokenSoldSigHash = crypto.Keccak256Hash([]byte("TokenSold(uint128,address,address,address,uint256,uint128)")) +) + +type TokenSoldEvent struct { + ID *big.Int + Seller common.Address + Buyer common.Address + ContractAddress common.Address + TokenID *big.Int + Price *big.Int +} + +type TokenSoldIndexer struct { + TargetAddresses []common.Address +} + +// NewTokenSoldIndexer creates a new TokenSoldIndexer. +func NewTokenSoldIndexer() *TokenSoldIndexer { + return &TokenSoldIndexer{TargetAddresses: []common.Address{common.HexToAddress("0x6Ce2CFD7674cf47A851690a11d1DB45c6cCBe17A")}} +} + +func (indexer *TokenSoldIndexer) Addresses() []common.Address { + return indexer.TargetAddresses +} + +func (indexer *TokenSoldIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { + var result []adapters.TransferData + for _, vLog := range logs { + if !indexer.isRelevantLog(vLog.Topics[0]) { + continue + } + transferData, err := indexer.ProcessLog(ctx, chainID, client, vLog) + if err != nil { + return nil, err + } + result = append(result, *transferData) + } + return result, nil +} + +func (indexer *TokenSoldIndexer) isRelevantLog(topic common.Hash) bool { + return topic.Hex() == logTokenSoldSigHash.Hex() +} + +func (indexer *TokenSoldIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { + var tokenSoldEvent TokenSoldEvent + + tokenSoldABI, err := abi.JSON(strings.NewReader(conft.ABI)) + if err != nil { + return nil, err + } + + err = tokenSoldABI.UnpackIntoInterface(&tokenSoldEvent, "OrderFulfilled", vLog.Data) + if err != nil { + return nil, err + } + + block, err := client.BlockByNumber(ctx, big.NewInt(int64(vLog.BlockNumber))) + if err != nil { + return nil, err + } + + return &adapters.TransferData{ + To: tokenSoldEvent.Buyer, + Time: block.Time(), + BlockNumber: block.Number().Uint64(), + }, nil +} diff --git a/cmd/collection_created.go b/cmd/collection_created.go index fc6fc4f..766a43c 100644 --- a/cmd/collection_created.go +++ b/cmd/collection_created.go @@ -5,7 +5,7 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/logs" ) -func processCollectionCreatedIndexer(client *ethclient.Client, blockNumber int64) { +func processCollectionCreatedIndexer(client *ethclient.Client, blockNumber int64) error { processor := logs.NewCollectionCreatedIndexer() - processLogIndexer(client, processor, blockNumber) + return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/contract_deployed.go b/cmd/contract_deployed.go index e05f448..3289f21 100644 --- a/cmd/contract_deployed.go +++ b/cmd/contract_deployed.go @@ -5,7 +5,7 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/logs" ) -func processContractDeployedIndexer(client *ethclient.Client, blockNumber int64) { +func processContractDeployedIndexer(client *ethclient.Client, blockNumber int64) error { processor := logs.NewContractDeployedIndexer() - processLogIndexer(client, processor, blockNumber) + return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/domain_register.go b/cmd/domain_register.go index cd963fc..d4a5dae 100644 --- a/cmd/domain_register.go +++ b/cmd/domain_register.go @@ -5,7 +5,7 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/logs" ) -func processDotTaikoIndexer(client *ethclient.Client, blockNumber int64) { +func processDotTaikoIndexer(client *ethclient.Client, blockNumber int64) error { processor := logs.NewDotTaikoIndexer() - processLogIndexer(client, processor, blockNumber) + return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/new_sale.go b/cmd/new_sale.go index 99e419c..bc2e5ae 100644 --- a/cmd/new_sale.go +++ b/cmd/new_sale.go @@ -5,7 +5,7 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/logs" ) -func processNewSaleIndexer(client *ethclient.Client, blockNumber int64) { +func processNewSaleIndexer(client *ethclient.Client, blockNumber int64) error { processor := logs.NewNewSaleIndexer() - processLogIndexer(client, processor, blockNumber) + return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/order_fulfilled.go b/cmd/order_fulfilled.go index 1625540..b4e158d 100644 --- a/cmd/order_fulfilled.go +++ b/cmd/order_fulfilled.go @@ -5,7 +5,7 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/logs" ) -func processOrderFulfilledIndexer(client *ethclient.Client, blockNumber int64) { +func processOrderFulfilledIndexer(client *ethclient.Client, blockNumber int64) error { processor := logs.NewOrderFulfilledIndexer() - processLogIndexer(client, processor, blockNumber) + return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/process_log.go b/cmd/process_log.go index 37d322d..43878d9 100644 --- a/cmd/process_log.go +++ b/cmd/process_log.go @@ -11,10 +11,11 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters" ) -func processLogIndexer(client *ethclient.Client, processor adapters.TransferLogsIndexer, blockNumber int64) { +func processLogIndexer(client *ethclient.Client, processor adapters.TransferLogsIndexer, blockNumber int64) error { chainID, err := client.ChainID(context.Background()) if err != nil { log.Fatalf("Failed to fetch the chain ID: %v", err) + return err } query := ethereum.FilterQuery{ Addresses: processor.Addresses(), @@ -24,11 +25,14 @@ func processLogIndexer(client *ethclient.Client, processor adapters.TransferLogs logs, err := client.FilterLogs(context.Background(), query) if err != nil { log.Fatalf("Failed to fetch the logs: %v", err) + return err } senders, err := processor.IndexLogs(context.Background(), chainID, client, logs) if err != nil { log.Fatalf("Failed to process the logs: %v", err) + return err } fmt.Printf("Senders: %v\n", senders) + return nil } diff --git a/cmd/process_transaction.go b/cmd/process_transaction.go index 71e1a9c..81004c6 100644 --- a/cmd/process_transaction.go +++ b/cmd/process_transaction.go @@ -10,17 +10,20 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters" ) -func processTransactionIndexer(client *ethclient.Client, processor adapters.BlockProcessor, blockNumber int64) { +func processTransactionIndexer(client *ethclient.Client, processor adapters.BlockProcessor, blockNumber int64) error { blockNumberBig := big.NewInt(blockNumber) block, err := client.BlockByNumber(context.Background(), blockNumberBig) if err != nil { log.Fatalf("Failed to fetch the block: %v", err) + return err } senders, err := processor.ProcessBlock(context.Background(), block, client) if err != nil { log.Fatalf("Failed to process the block: %v", err) + return err } fmt.Printf("Senders: %v\n", senders) + return nil } diff --git a/cmd/root.go b/cmd/root.go index 2d3c836..3574c4d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -32,7 +32,7 @@ func init() { } func promptUser() { - var adapterOptions = []string{"NewTransactionSender", "NftDeployed", "DotTaikoIndexer", "OrderFulfilledIndexer", "NewSaleIndexer", "ContractDeployed", "CollectionCreated"} + var adapterOptions = []string{"NewTransactionSender", "NftDeployed", "DotTaikoIndexer", "OrderFulfilledIndexer", "NewSaleIndexer", "ContractDeployed", "CollectionCreated", "TokenSold"} var qs = []*survey.Question{ { Name: "adapter", @@ -84,6 +84,8 @@ func executeCommand() { processContractDeployedIndexer(client, blockNumber) case "CollectionCreated": processCollectionCreatedIndexer(client, blockNumber) + case "TokenSold": + processTokenSoldIndexer(client, blockNumber) default: log.Fatalf("Adapter %s is not supported", adapter) } diff --git a/cmd/token_sold.go b/cmd/token_sold.go new file mode 100644 index 0000000..73e880d --- /dev/null +++ b/cmd/token_sold.go @@ -0,0 +1,11 @@ +package cmd + +import ( + "github.com/ethereum/go-ethereum/ethclient" + "github.com/taikoxyz/trailblazer-adapters/adapters/logs" +) + +func processTokenSoldIndexer(client *ethclient.Client, blockNumber int64) error { + processor := logs.NewTokenSoldIndexer() + return processLogIndexer(client, processor, blockNumber) +} diff --git a/cmd/transaction_sender.go b/cmd/transaction_sender.go index 051091c..e90b5ba 100644 --- a/cmd/transaction_sender.go +++ b/cmd/transaction_sender.go @@ -5,12 +5,12 @@ import ( "github.com/taikoxyz/trailblazer-adapters/adapters/blocks" ) -func processNewTransactionSender(client *ethclient.Client, blockNumber int64) { +func processNewTransactionSender(client *ethclient.Client, blockNumber int64) error { processor := blocks.NewTransactionSender() - processTransactionIndexer(client, processor, blockNumber) + return processTransactionIndexer(client, processor, blockNumber) } -func processNewNftDeployed(client *ethclient.Client, blockNumber int64) { +func processNewNftDeployed(client *ethclient.Client, blockNumber int64) error { processor := blocks.NewNftDeployedIndexer() - processTransactionIndexer(client, processor, blockNumber) + return processTransactionIndexer(client, processor, blockNumber) } From 0a4f8c98cfdb636a4a9c57a6d97a3b2fd5a23d61 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 26 Jul 2024 15:44:58 +0800 Subject: [PATCH 4/7] refactor: projects --- README.md | 35 +++++++++++++++++++ .../{logs => projects/conft}/token_sold.go | 2 +- .../domains}/dot_taiko_register.go | 2 +- .../{logs => projects/loopex}/new_sale.go | 2 +- .../nfts2me}/collection_created.go | 7 +++- .../{logs => projects/okx}/order_fulfilled.go | 2 +- .../omnihub}/contract_deployed.go | 2 +- cmd/collection_created.go | 4 +-- cmd/contract_deployed.go | 4 +-- cmd/domain_register.go | 4 +-- cmd/new_sale.go | 4 +-- cmd/order_fulfilled.go | 4 +-- cmd/token_sold.go | 4 +-- 13 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 README.md rename adapters/{logs => projects/conft}/token_sold.go (99%) rename adapters/{logs => projects/domains}/dot_taiko_register.go (99%) rename adapters/{logs => projects/loopex}/new_sale.go (99%) rename adapters/{logs => projects/nfts2me}/collection_created.go (92%) rename adapters/{logs => projects/okx}/order_fulfilled.go (99%) rename adapters/{logs => projects/omnihub}/contract_deployed.go (99%) diff --git a/README.md b/README.md new file mode 100644 index 0000000..5917fb7 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Trailblazer Adapters + +## Adding a New Protocol to the Whitelist + +### 1. Modify `whitelist.go` + +Open `whitelist.go` add the new protocol entry to the whitelist. + +### 2. Example Protocol Entry + +An example entry format for adding a new protocol is: + +- Name: Name of Protocol +- Slug: name-of-protocol +- Contracts: 0x0 + +```json +{ + "name": "Name of Protocol", + "slug": "name-of-protocol", + "contracts": [ + "0x0" + ] +} +``` + +### 3. Create a Pull Request + +Create a pull request (PR) on GitHub to merge your changes into the main branch. Provide a clear description of the changes and the protocol added. + +### 6. Review and Merge + +Wait for the PR to be reviewed by the maintainers. Once approved, your changes will be merged, and the new protocol will be added to the whitelist. + +For further details, refer to the official documentation or contact the maintainers for support. diff --git a/adapters/logs/token_sold.go b/adapters/projects/conft/token_sold.go similarity index 99% rename from adapters/logs/token_sold.go rename to adapters/projects/conft/token_sold.go index 64be91c..3f873ba 100644 --- a/adapters/logs/token_sold.go +++ b/adapters/projects/conft/token_sold.go @@ -1,4 +1,4 @@ -package logs +package conft import ( "context" diff --git a/adapters/logs/dot_taiko_register.go b/adapters/projects/domains/dot_taiko_register.go similarity index 99% rename from adapters/logs/dot_taiko_register.go rename to adapters/projects/domains/dot_taiko_register.go index ef041b9..e8abf8c 100644 --- a/adapters/logs/dot_taiko_register.go +++ b/adapters/projects/domains/dot_taiko_register.go @@ -1,4 +1,4 @@ -package logs +package domains import ( "context" diff --git a/adapters/logs/new_sale.go b/adapters/projects/loopex/new_sale.go similarity index 99% rename from adapters/logs/new_sale.go rename to adapters/projects/loopex/new_sale.go index 5a94834..4e3b858 100644 --- a/adapters/logs/new_sale.go +++ b/adapters/projects/loopex/new_sale.go @@ -1,4 +1,4 @@ -package logs +package loopex import ( "context" diff --git a/adapters/logs/collection_created.go b/adapters/projects/nfts2me/collection_created.go similarity index 92% rename from adapters/logs/collection_created.go rename to adapters/projects/nfts2me/collection_created.go index 9c2af2b..016f5eb 100644 --- a/adapters/logs/collection_created.go +++ b/adapters/projects/nfts2me/collection_created.go @@ -1,4 +1,4 @@ -package logs +package nfts2me import ( "context" @@ -6,10 +6,15 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/taikoxyz/trailblazer-adapters/adapters" ) +var ( + logTransferSigHash = crypto.Keccak256Hash([]byte("Transfer(address,address,uint256)")) +) + type CollectionCreatedIndexer struct { TargetAddresses []common.Address } diff --git a/adapters/logs/order_fulfilled.go b/adapters/projects/okx/order_fulfilled.go similarity index 99% rename from adapters/logs/order_fulfilled.go rename to adapters/projects/okx/order_fulfilled.go index b4be545..92ece21 100644 --- a/adapters/logs/order_fulfilled.go +++ b/adapters/projects/okx/order_fulfilled.go @@ -1,4 +1,4 @@ -package logs +package okx import ( "context" diff --git a/adapters/logs/contract_deployed.go b/adapters/projects/omnihub/contract_deployed.go similarity index 99% rename from adapters/logs/contract_deployed.go rename to adapters/projects/omnihub/contract_deployed.go index 4dc3f52..9a1bd90 100644 --- a/adapters/logs/contract_deployed.go +++ b/adapters/projects/omnihub/contract_deployed.go @@ -1,4 +1,4 @@ -package logs +package omnihub import ( "context" diff --git a/cmd/collection_created.go b/cmd/collection_created.go index 766a43c..a85d7a5 100644 --- a/cmd/collection_created.go +++ b/cmd/collection_created.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/nfts2me" ) func processCollectionCreatedIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewCollectionCreatedIndexer() + processor := nfts2me.NewCollectionCreatedIndexer() return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/contract_deployed.go b/cmd/contract_deployed.go index 3289f21..15cc25a 100644 --- a/cmd/contract_deployed.go +++ b/cmd/contract_deployed.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/omnihub" ) func processContractDeployedIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewContractDeployedIndexer() + processor := omnihub.NewContractDeployedIndexer() return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/domain_register.go b/cmd/domain_register.go index d4a5dae..8b6e9c3 100644 --- a/cmd/domain_register.go +++ b/cmd/domain_register.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/domains" ) func processDotTaikoIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewDotTaikoIndexer() + processor := domains.NewDotTaikoIndexer() return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/new_sale.go b/cmd/new_sale.go index bc2e5ae..08c8fb8 100644 --- a/cmd/new_sale.go +++ b/cmd/new_sale.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/loopex" ) func processNewSaleIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewNewSaleIndexer() + processor := loopex.NewNewSaleIndexer() return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/order_fulfilled.go b/cmd/order_fulfilled.go index b4e158d..0a6ada6 100644 --- a/cmd/order_fulfilled.go +++ b/cmd/order_fulfilled.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/okx" ) func processOrderFulfilledIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewOrderFulfilledIndexer() + processor := okx.NewOrderFulfilledIndexer() return processLogIndexer(client, processor, blockNumber) } diff --git a/cmd/token_sold.go b/cmd/token_sold.go index 73e880d..7d2f0f7 100644 --- a/cmd/token_sold.go +++ b/cmd/token_sold.go @@ -2,10 +2,10 @@ package cmd import ( "github.com/ethereum/go-ethereum/ethclient" - "github.com/taikoxyz/trailblazer-adapters/adapters/logs" + "github.com/taikoxyz/trailblazer-adapters/adapters/projects/conft" ) func processTokenSoldIndexer(client *ethclient.Client, blockNumber int64) error { - processor := logs.NewTokenSoldIndexer() + processor := conft.NewTokenSoldIndexer() return processLogIndexer(client, processor, blockNumber) } From ba3189fc9a44551bc6fb0f8b35306ade6d6891e2 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 26 Jul 2024 15:50:11 +0800 Subject: [PATCH 5/7] refactor: cli --- README.md | 2 +- cmd/root.go | 60 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 5917fb7..0bceb0f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Trailblazer Adapters -## Adding a New Protocol to the Whitelist +## Adding a New Protocol Adapter ### 1. Modify `whitelist.go` diff --git a/cmd/root.go b/cmd/root.go index 3574c4d..b4d0d2e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -12,14 +12,6 @@ import ( var adapter string var blockNumber int64 -var rootCmd = &cobra.Command{ - Use: "trailblazer-adapters", - Short: "Trailblazer Adapters CLI", - Run: func(cmd *cobra.Command, args []string) { - promptUser() - }, -} - func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) @@ -27,12 +19,30 @@ func Execute() { } } +var rootCmd = &cobra.Command{ + Use: "trailblazer-adapters", + Short: "Trailblazer Adapters CLI", + Run: func(cmd *cobra.Command, args []string) { + if err := promptUser(); err != nil { + log.Fatalf("Prompt failed: %v", err) + } + if err := executeCommand(); err != nil { + log.Fatalf("Execution failed: %v", err) + } + }, +} + func init() { cobra.OnInitialize() } -func promptUser() { - var adapterOptions = []string{"NewTransactionSender", "NftDeployed", "DotTaikoIndexer", "OrderFulfilledIndexer", "NewSaleIndexer", "ContractDeployed", "CollectionCreated", "TokenSold"} +func promptUser() error { + var adapterOptions = []string{ + "NewTransactionSender", "NftDeployed", "DotTaikoIndexer", + "OrderFulfilledIndexer", "NewSaleIndexer", "ContractDeployed", + "CollectionCreated", "TokenSold", + } + var qs = []*survey.Question{ { Name: "adapter", @@ -52,41 +62,39 @@ func promptUser() { BlockNumber int64 `survey:"blockNumber"` }{} - err := survey.Ask(qs, &answers) - if err != nil { - log.Fatalf("Prompt failed %v", err) + if err := survey.Ask(qs, &answers); err != nil { + return err } adapter = answers.Adapter blockNumber = answers.BlockNumber - - executeCommand() + return nil } -func executeCommand() { +func executeCommand() error { client, err := ethclient.Dial("https://rpc.taiko.xyz") if err != nil { - log.Fatalf("Failed to connect to the Ethereum client: %v", err) + return fmt.Errorf("failed to connect to the Ethereum client: %v", err) } switch adapter { case "NewTransactionSender": - processNewTransactionSender(client, blockNumber) + return processNewTransactionSender(client, blockNumber) case "NftDeployed": - processNewNftDeployed(client, blockNumber) + return processNewNftDeployed(client, blockNumber) case "OrderFulfilledIndexer": - processOrderFulfilledIndexer(client, blockNumber) + return processOrderFulfilledIndexer(client, blockNumber) case "DotTaikoIndexer": - processDotTaikoIndexer(client, blockNumber) + return processDotTaikoIndexer(client, blockNumber) case "NewSaleIndexer": - processNewSaleIndexer(client, blockNumber) + return processNewSaleIndexer(client, blockNumber) case "ContractDeployed": - processContractDeployedIndexer(client, blockNumber) + return processContractDeployedIndexer(client, blockNumber) case "CollectionCreated": - processCollectionCreatedIndexer(client, blockNumber) + return processCollectionCreatedIndexer(client, blockNumber) case "TokenSold": - processTokenSoldIndexer(client, blockNumber) + return processTokenSoldIndexer(client, blockNumber) default: - log.Fatalf("Adapter %s is not supported", adapter) + return fmt.Errorf("adapter %s is not supported", adapter) } } From d310c3ca21aaa5d3b6a0d7753fb08d53266b395f Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 26 Jul 2024 16:00:23 +0800 Subject: [PATCH 6/7] fix: add docs --- README.md | 28 ++++++++-------------------- cmd/README.md | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 cmd/README.md diff --git a/README.md b/README.md index 0bceb0f..a6ba65d 100644 --- a/README.md +++ b/README.md @@ -2,34 +2,22 @@ ## Adding a New Protocol Adapter -### 1. Modify `whitelist.go` +### 1. Add your project under adapters/projects folder -Open `whitelist.go` add the new protocol entry to the whitelist. +### 2. Write an indexer in the new folder -### 2. Example Protocol Entry +An example adapter for tracking OrderFulfilled Event on the OKX marketplace can be seen [here](./adapters/projects/okx/order_fulfilled.go) -An example entry format for adding a new protocol is: +### 3. Test out the adapter by adding it to the cli -- Name: Name of Protocol -- Slug: name-of-protocol -- Contracts: 0x0 +An example on how to add a new adapter to the cli is [here](./cmd/README.md) -```json -{ - "name": "Name of Protocol", - "slug": "name-of-protocol", - "contracts": [ - "0x0" - ] -} -``` - -### 3. Create a Pull Request +### 4. Create a Pull Request Create a pull request (PR) on GitHub to merge your changes into the main branch. Provide a clear description of the changes and the protocol added. -### 6. Review and Merge +### 5. Review and Merge -Wait for the PR to be reviewed by the maintainers. Once approved, your changes will be merged, and the new protocol will be added to the whitelist. +Wait for the PR to be reviewed by the maintainers. Once approved, your changes will be merged, and the protocol info will be added to trailblazers. For further details, refer to the official documentation or contact the maintainers for support. diff --git a/cmd/README.md b/cmd/README.md new file mode 100644 index 0000000..4642565 --- /dev/null +++ b/cmd/README.md @@ -0,0 +1,17 @@ +# Trailblazer Adapters CLI + +## Adding a New CLI Command + +### 1. Add a new option under ```adapterOptions``` in ```root.go``` + +### 2. Import adapter + +An example on how to add import a newly added adapter [here](./order_fulfilled.go) + +### 3. Test out the CLI + +Test out the CLI with the following command and input your parameters accordingly. +``` +go run main.go process +``` + From 47170bcc5e4404f6c2a9dbde3ff9343628f1dd86 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 26 Jul 2024 16:05:26 +0800 Subject: [PATCH 7/7] refactor: return type --- adapters/logs.go | 13 ++----------- adapters/logs/transfer_event.go | 10 +++++----- adapters/projects/conft/token_sold.go | 10 +++++----- adapters/projects/domains/dot_taiko_register.go | 10 +++++----- adapters/projects/loopex/new_sale.go | 10 +++++----- adapters/projects/nfts2me/collection_created.go | 10 +++++----- adapters/projects/okx/order_fulfilled.go | 10 +++++----- adapters/projects/omnihub/contract_deployed.go | 10 +++++----- 8 files changed, 37 insertions(+), 46 deletions(-) diff --git a/adapters/logs.go b/adapters/logs.go index 4ccb7de..cbac90e 100644 --- a/adapters/logs.go +++ b/adapters/logs.go @@ -12,15 +12,6 @@ import ( // TransferLogsIndexer is an interface that defines the methods for indexing and processing transfer logs. type TransferLogsIndexer interface { Addresses() []common.Address - IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]TransferData, error) - ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*TransferData, error) -} - -// TransferData represents an event with specific fields. -type TransferData struct { - From common.Address - To common.Address - Value *big.Int - Time uint64 - BlockNumber uint64 + IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]Whitelist, error) + ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*Whitelist, error) } diff --git a/adapters/logs/transfer_event.go b/adapters/logs/transfer_event.go index e114911..552c216 100644 --- a/adapters/logs/transfer_event.go +++ b/adapters/logs/transfer_event.go @@ -33,8 +33,8 @@ func (indexer *TransferIndexer) Addresses() []common.Address { } // IndexLogs processes logs for ERC20 transfers. -func (indexer *TransferIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *TransferIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !isERC20Transfer(vLog) { continue @@ -53,7 +53,7 @@ func isERC20Transfer(vLog types.Log) bool { } // processLog processes a single ERC20 transfer log. -func (indexer *TransferIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *TransferIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { to := common.BytesToAddress(vLog.Topics[2].Bytes()[12:]) from := common.BytesToAddress(vLog.Topics[1].Bytes()[12:]) @@ -75,9 +75,9 @@ func (indexer *TransferIndexer) ProcessLog(ctx context.Context, chainID *big.Int return nil, err } - return &adapters.TransferData{ + return &adapters.Whitelist{ From: from, - To: to, + User: to, Time: block.Time(), Value: transferEvent.Value, }, nil diff --git a/adapters/projects/conft/token_sold.go b/adapters/projects/conft/token_sold.go index 3f873ba..8821316 100644 --- a/adapters/projects/conft/token_sold.go +++ b/adapters/projects/conft/token_sold.go @@ -40,8 +40,8 @@ func (indexer *TokenSoldIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *TokenSoldIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *TokenSoldIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !indexer.isRelevantLog(vLog.Topics[0]) { continue @@ -59,7 +59,7 @@ func (indexer *TokenSoldIndexer) isRelevantLog(topic common.Hash) bool { return topic.Hex() == logTokenSoldSigHash.Hex() } -func (indexer *TokenSoldIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *TokenSoldIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { var tokenSoldEvent TokenSoldEvent tokenSoldABI, err := abi.JSON(strings.NewReader(conft.ABI)) @@ -77,8 +77,8 @@ func (indexer *TokenSoldIndexer) ProcessLog(ctx context.Context, chainID *big.In return nil, err } - return &adapters.TransferData{ - To: tokenSoldEvent.Buyer, + return &adapters.Whitelist{ + User: tokenSoldEvent.Buyer, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil diff --git a/adapters/projects/domains/dot_taiko_register.go b/adapters/projects/domains/dot_taiko_register.go index e8abf8c..96debcd 100644 --- a/adapters/projects/domains/dot_taiko_register.go +++ b/adapters/projects/domains/dot_taiko_register.go @@ -33,8 +33,8 @@ func (indexer *DotTaikoIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *DotTaikoIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *DotTaikoIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !indexer.isRelevantLog(vLog.Topics[0]) { continue @@ -52,7 +52,7 @@ func (indexer *DotTaikoIndexer) isRelevantLog(topic common.Hash) bool { return topic.Hex() == logNameRegisteredSigHash.Hex() || topic.Hex() == logMintedDomainSigHash.Hex() || topic.Hex() == logProfileCreatedSigHash.Hex() } -func (indexer *DotTaikoIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *DotTaikoIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { ownerHex := common.BytesToAddress(vLog.Topics[2].Bytes()[12:]) block, err := client.BlockByNumber(ctx, big.NewInt(int64(vLog.BlockNumber))) @@ -60,8 +60,8 @@ func (indexer *DotTaikoIndexer) ProcessLog(ctx context.Context, chainID *big.Int return nil, err } - return &adapters.TransferData{ - To: ownerHex, + return &adapters.Whitelist{ + User: ownerHex, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil diff --git a/adapters/projects/loopex/new_sale.go b/adapters/projects/loopex/new_sale.go index 4e3b858..8dad44f 100644 --- a/adapters/projects/loopex/new_sale.go +++ b/adapters/projects/loopex/new_sale.go @@ -43,8 +43,8 @@ func (indexer *NewSaleIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *NewSaleIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *NewSaleIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !indexer.isRelevantLog(vLog.Topics[0]) { continue @@ -62,7 +62,7 @@ func (indexer *NewSaleIndexer) isRelevantLog(topic common.Hash) bool { return topic.Hex() == logNewSaleSigHash.Hex() } -func (indexer *NewSaleIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *NewSaleIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { var newSaleEvent NewSaleEvent newSaleABI, err := abi.JSON(strings.NewReader(sale.ABI)) @@ -80,8 +80,8 @@ func (indexer *NewSaleIndexer) ProcessLog(ctx context.Context, chainID *big.Int, return nil, err } - return &adapters.TransferData{ - To: newSaleEvent.Buyer, + return &adapters.Whitelist{ + User: newSaleEvent.Buyer, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil diff --git a/adapters/projects/nfts2me/collection_created.go b/adapters/projects/nfts2me/collection_created.go index 016f5eb..586dd1c 100644 --- a/adapters/projects/nfts2me/collection_created.go +++ b/adapters/projects/nfts2me/collection_created.go @@ -28,8 +28,8 @@ func (indexer *CollectionCreatedIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *CollectionCreatedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *CollectionCreatedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !isERC721Transfer(vLog) && !isFromZeroAddress(vLog) { continue @@ -53,7 +53,7 @@ func isFromZeroAddress(vLog types.Log) bool { } // processLog processes a single ERC20 transfer log. -func (indexer *CollectionCreatedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *CollectionCreatedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { to := common.BytesToAddress(vLog.Topics[2].Bytes()[12:]) block, err := client.BlockByNumber(ctx, big.NewInt(int64(vLog.BlockNumber))) @@ -61,8 +61,8 @@ func (indexer *CollectionCreatedIndexer) ProcessLog(ctx context.Context, chainID return nil, err } - return &adapters.TransferData{ - To: to, + return &adapters.Whitelist{ + User: to, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil diff --git a/adapters/projects/okx/order_fulfilled.go b/adapters/projects/okx/order_fulfilled.go index 92ece21..dbfc79e 100644 --- a/adapters/projects/okx/order_fulfilled.go +++ b/adapters/projects/okx/order_fulfilled.go @@ -56,8 +56,8 @@ func (indexer *OrderFulfilledIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *OrderFulfilledIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *OrderFulfilledIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !indexer.isRelevantLog(vLog.Topics[0]) { continue @@ -75,7 +75,7 @@ func (indexer *OrderFulfilledIndexer) isRelevantLog(topic common.Hash) bool { return topic.Hex() == logOrderFulfilledSigHash.Hex() } -func (indexer *OrderFulfilledIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *OrderFulfilledIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { var orderFulfilledEvent OrderFulfilledEvent orderFulfilledABI, err := abi.JSON(strings.NewReader(order.ABI)) @@ -92,8 +92,8 @@ func (indexer *OrderFulfilledIndexer) ProcessLog(ctx context.Context, chainID *b return nil, err } - return &adapters.TransferData{ - To: orderFulfilledEvent.Recipient, + return &adapters.Whitelist{ + User: orderFulfilledEvent.Recipient, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil diff --git a/adapters/projects/omnihub/contract_deployed.go b/adapters/projects/omnihub/contract_deployed.go index 9a1bd90..2574874 100644 --- a/adapters/projects/omnihub/contract_deployed.go +++ b/adapters/projects/omnihub/contract_deployed.go @@ -29,8 +29,8 @@ func (indexer *ContractDeployedIndexer) Addresses() []common.Address { return indexer.TargetAddresses } -func (indexer *ContractDeployedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.TransferData, error) { - var result []adapters.TransferData +func (indexer *ContractDeployedIndexer) IndexLogs(ctx context.Context, chainID *big.Int, client *ethclient.Client, logs []types.Log) ([]adapters.Whitelist, error) { + var result []adapters.Whitelist for _, vLog := range logs { if !indexer.isRelevantLog(vLog.Topics[0]) { continue @@ -48,7 +48,7 @@ func (indexer *ContractDeployedIndexer) isRelevantLog(topic common.Hash) bool { return topic.Hex() == logContractDeployedSigHash.Hex() } -func (indexer *ContractDeployedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.TransferData, error) { +func (indexer *ContractDeployedIndexer) ProcessLog(ctx context.Context, chainID *big.Int, client *ethclient.Client, vLog types.Log) (*adapters.Whitelist, error) { txn, err := client.TransactionInBlock(ctx, vLog.BlockHash, vLog.TxIndex) if err != nil { return nil, err @@ -64,8 +64,8 @@ func (indexer *ContractDeployedIndexer) ProcessLog(ctx context.Context, chainID return nil, err } - return &adapters.TransferData{ - To: sender, + return &adapters.Whitelist{ + User: sender, Time: block.Time(), BlockNumber: block.Number().Uint64(), }, nil