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 }