github.com/trezor/blockbook@v0.4.1-0.20240328132726-e9a08582ee2c/tests/dbtestdata/fakechain.go (about)

     1  package dbtestdata
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"math/big"
     8  
     9  	"github.com/trezor/blockbook/bchain"
    10  )
    11  
    12  type fakeBlockChain struct {
    13  	*bchain.BaseChain
    14  }
    15  
    16  // NewFakeBlockChain returns mocked blockchain RPC interface used for tests
    17  func NewFakeBlockChain(parser bchain.BlockChainParser) (bchain.BlockChain, error) {
    18  	return &fakeBlockChain{&bchain.BaseChain{Parser: parser}}, nil
    19  }
    20  
    21  func (c *fakeBlockChain) CreateMempool(chain bchain.BlockChain) (bchain.Mempool, error) {
    22  	return bchain.NewMempoolBitcoinType(chain, 1, 1, 0, "", false), nil
    23  }
    24  
    25  func (c *fakeBlockChain) Initialize() error {
    26  	return nil
    27  }
    28  
    29  func (c *fakeBlockChain) InitializeMempool(addrDescForOutpoint bchain.AddrDescForOutpointFunc, onNewTxAddr bchain.OnNewTxAddrFunc, onNewTx bchain.OnNewTxFunc) error {
    30  	return nil
    31  }
    32  
    33  func (c *fakeBlockChain) Shutdown(ctx context.Context) error {
    34  	return nil
    35  }
    36  
    37  func (c *fakeBlockChain) IsTestnet() bool {
    38  	return true
    39  }
    40  
    41  func (c *fakeBlockChain) GetNetworkName() string {
    42  	return "fakecoin"
    43  }
    44  
    45  func (c *fakeBlockChain) GetCoinName() string {
    46  	return "Fakecoin"
    47  }
    48  
    49  func (c *fakeBlockChain) GetSubversion() string {
    50  	return "/Fakecoin:0.0.1/"
    51  }
    52  
    53  func (c *fakeBlockChain) GetChainInfo() (v *bchain.ChainInfo, err error) {
    54  	return &bchain.ChainInfo{
    55  		Chain:         c.GetNetworkName(),
    56  		Blocks:        2,
    57  		Headers:       2,
    58  		Bestblockhash: GetTestBitcoinTypeBlock2(c.Parser).BlockHeader.Hash,
    59  		Version:       "001001",
    60  		Subversion:    c.GetSubversion(),
    61  	}, nil
    62  }
    63  
    64  func (c *fakeBlockChain) GetBestBlockHash() (v string, err error) {
    65  	return GetTestBitcoinTypeBlock2(c.Parser).BlockHeader.Hash, nil
    66  }
    67  
    68  func (c *fakeBlockChain) GetBestBlockHeight() (v uint32, err error) {
    69  	return GetTestBitcoinTypeBlock2(c.Parser).BlockHeader.Height, nil
    70  }
    71  
    72  func (c *fakeBlockChain) GetBlockHash(height uint32) (v string, err error) {
    73  	b1 := GetTestBitcoinTypeBlock1(c.Parser)
    74  	if height == b1.BlockHeader.Height {
    75  		return b1.BlockHeader.Hash, nil
    76  	}
    77  	b2 := GetTestBitcoinTypeBlock2(c.Parser)
    78  	if height == b2.BlockHeader.Height {
    79  		return b2.BlockHeader.Hash, nil
    80  	}
    81  	return "", bchain.ErrBlockNotFound
    82  }
    83  
    84  func (c *fakeBlockChain) GetBlockHeader(hash string) (v *bchain.BlockHeader, err error) {
    85  	b1 := GetTestBitcoinTypeBlock1(c.Parser)
    86  	if hash == b1.BlockHeader.Hash {
    87  		return &b1.BlockHeader, nil
    88  	}
    89  	b2 := GetTestBitcoinTypeBlock2(c.Parser)
    90  	if hash == b2.BlockHeader.Hash {
    91  		return &b2.BlockHeader, nil
    92  	}
    93  	return nil, bchain.ErrBlockNotFound
    94  }
    95  
    96  func (c *fakeBlockChain) GetBlock(hash string, height uint32) (v *bchain.Block, err error) {
    97  	b1 := GetTestBitcoinTypeBlock1(c.Parser)
    98  	if hash == b1.BlockHeader.Hash || height == b1.BlockHeader.Height {
    99  		return b1, nil
   100  	}
   101  	b2 := GetTestBitcoinTypeBlock2(c.Parser)
   102  	if hash == b2.BlockHeader.Hash || height == b2.BlockHeader.Height {
   103  		return b2, nil
   104  	}
   105  	return nil, bchain.ErrBlockNotFound
   106  }
   107  
   108  func getBlockInfo(b *bchain.Block) *bchain.BlockInfo {
   109  	bi := &bchain.BlockInfo{
   110  		BlockHeader: b.BlockHeader,
   111  	}
   112  	for _, tx := range b.Txs {
   113  		bi.Txids = append(bi.Txids, tx.Txid)
   114  	}
   115  	return bi
   116  }
   117  
   118  func (c *fakeBlockChain) GetBlockInfo(hash string) (v *bchain.BlockInfo, err error) {
   119  	b1 := GetTestBitcoinTypeBlock1(c.Parser)
   120  	if hash == b1.BlockHeader.Hash {
   121  		return getBlockInfo(b1), nil
   122  	}
   123  	b2 := GetTestBitcoinTypeBlock2(c.Parser)
   124  	if hash == b2.BlockHeader.Hash {
   125  		return getBlockInfo(b2), nil
   126  	}
   127  	return nil, bchain.ErrBlockNotFound
   128  }
   129  
   130  func getTxInBlock(b *bchain.Block, txid string) *bchain.Tx {
   131  	for _, tx := range b.Txs {
   132  		if tx.Txid == txid {
   133  			return &tx
   134  		}
   135  	}
   136  	return nil
   137  }
   138  
   139  func (c *fakeBlockChain) GetBlockRaw(hash string) (string, error) {
   140  	return "00e0ff3fd42677a86f1515bafcf9802c1765e02226655a9b97fd44132602000000000000", nil
   141  }
   142  
   143  func (c *fakeBlockChain) GetTransaction(txid string) (v *bchain.Tx, err error) {
   144  	v = getTxInBlock(GetTestBitcoinTypeBlock1(c.Parser), txid)
   145  	if v == nil {
   146  		v = getTxInBlock(GetTestBitcoinTypeBlock2(c.Parser), txid)
   147  	}
   148  	if v != nil {
   149  		return v, nil
   150  	}
   151  	return nil, bchain.ErrTxNotFound
   152  }
   153  
   154  func (c *fakeBlockChain) GetTransactionSpecific(tx *bchain.Tx) (v json.RawMessage, err error) {
   155  	// txSpecific extends Tx with an additional Size and Vsize info
   156  	type txSpecific struct {
   157  		*bchain.Tx
   158  		Vsize int `json:"vsize,omitempty"`
   159  		Size  int `json:"size,omitempty"`
   160  	}
   161  
   162  	tx, err = c.GetTransaction(tx.Txid)
   163  	if err != nil {
   164  		return nil, err
   165  	}
   166  	txS := txSpecific{Tx: tx}
   167  
   168  	if tx.Txid == "7c3be24063f268aaa1ed81b64776798f56088757641a34fb156c4f51ed2e9d25" {
   169  		txS.Vsize = 206
   170  		txS.Size = 376
   171  	} else if tx.Txid == "fdd824a780cbb718eeb766eb05d83fdefc793a27082cd5e67f856d69798cf7db" {
   172  		txS.Size = 300
   173  	} else if tx.Txid == "05e2e48aeabdd9b75def7b48d756ba304713c2aba7b522bf9dbc893fc4231b07" {
   174  		txS.Hex = "010000000001012720b597ef06045c935960342b0bbc45aab5fd5642017282f5110216caaa2364010000002322002069dae530beb09a05d46d0b2aee98645b15bb5d1e808a386b5ef0c48aed5531cbffffffff021ec403000000000017a914203c9dbd3ffbd1a790fc1609fb430efa5cbe516d87061523000000000017a91465dfc5c16e80b86b589df3f85dacd43f5c5b4a8f8704004730440220783e9349fc48f22aa0064acf32bc255eafa761eb9fa8f90a504986713c52dc3702206fc6a1a42f74ea0b416b35671770c0d26fc453668e6107edc271f11e629cda1001483045022100b82ef510c7eec61f39bee3e73a19df451fb8cca842b66bc94696d6a095dd8e96022071767bf8e4859de06cd5caf75e833e284328570ea1caa88bc93478a8d0fa9ac90147522103958c08660082c9ce90399ded0da7c3b39ed20a7767160f12428191e005aa42572102b1e6d8187f54d83d1ffd70508e24c5bd3603bccb2346d8c6677434169de8bc2652ae00000000"
   175  	} else if tx.Txid == "3d90d15ed026dc45e19ffb52875ed18fa9e8012ad123d7f7212176e2b0ebdb71" {
   176  		txS.Vsize = 400
   177  	}
   178  
   179  	rm, err := json.Marshal(txS)
   180  	if err != nil {
   181  		return nil, err
   182  	}
   183  	return json.RawMessage(rm), nil
   184  }
   185  
   186  func (c *fakeBlockChain) GetTransactionForMempool(txid string) (v *bchain.Tx, err error) {
   187  	return nil, errors.New("Not implemented")
   188  }
   189  
   190  func (c *fakeBlockChain) EstimateSmartFee(blocks int, conservative bool) (v big.Int, err error) {
   191  	if !conservative {
   192  		v.SetInt64(int64(blocks)*100 - 1)
   193  	} else {
   194  		v.SetInt64(int64(blocks) * 100)
   195  	}
   196  	return
   197  }
   198  
   199  func (c *fakeBlockChain) EstimateFee(blocks int) (v big.Int, err error) {
   200  	v.SetInt64(int64(blocks) * 200)
   201  	return
   202  }
   203  
   204  func (c *fakeBlockChain) SendRawTransaction(tx string) (v string, err error) {
   205  	if tx == "123456" {
   206  		return "9876", nil
   207  	}
   208  	return "", errors.New("Invalid data")
   209  }
   210  
   211  // GetChainParser returns parser for the blockchain
   212  func (c *fakeBlockChain) GetChainParser() bchain.BlockChainParser {
   213  	return c.Parser
   214  }
   215  
   216  // GetMempoolTransactions returns transactions in mempool
   217  func (c *fakeBlockChain) GetMempoolTransactions() ([]string, error) {
   218  	return nil, errors.New("Not implemented")
   219  }