@@ -10,7 +10,7 @@ const bobAddress = 'bchtest:qz6q5gqnxdldkr07xpls5474mmzmlesd6qnux4skuc';
1010const carolAddress = 'bchtest:qqsr7nqwe6rq5crj63gy5gdqchpnwmguusmr7tfmsj' ;
1111
1212export default class MockNetworkProvider implements NetworkProvider {
13- // we use lockingBytecode as the key for utxoMap to make cashaddresses and tokenaddresses interchangeable
13+ // we use lockingBytecode hex as the key for utxoMap to make cash addresses and token addresses interchangeable
1414 private utxoMap : Record < string , Utxo [ ] > = { } ;
1515 private transactionMap : Record < string , string > = { } ;
1616 public network : Network = Network . MOCKNET ;
@@ -45,6 +45,11 @@ export default class MockNetworkProvider implements NetworkProvider {
4545 const transactionBin = hexToBin ( txHex ) ;
4646
4747 const txid = binToHex ( sha256 ( sha256 ( transactionBin ) ) . reverse ( ) ) ;
48+
49+ if ( this . transactionMap [ txid ] ) {
50+ throw new Error ( `Transaction with txid ${ txid } was already submitted: txn-mempool-conflict` ) ;
51+ }
52+
4853 this . transactionMap [ txid ] = txHex ;
4954
5055 const decoded = decodeTransaction ( transactionBin ) ;
@@ -54,21 +59,23 @@ export default class MockNetworkProvider implements NetworkProvider {
5459
5560 // remove (spend) UTXOs from the map
5661 for ( const input of decoded . inputs ) {
57- for ( const address of Object . keys ( this . utxoMap ) ) {
58- const utxos = this . utxoMap [ address ] ;
62+ for ( const lockingBytecodeHex of Object . keys ( this . utxoMap ) ) {
63+ const utxos = this . utxoMap [ lockingBytecodeHex ] ;
5964 const index = utxos . findIndex (
60- ( utxo ) => utxo . txid === binToHex ( input . outpointTransactionHash ) && utxo . vout === input . outpointIndex
65+ ( utxo ) => utxo . txid === binToHex ( input . outpointTransactionHash ) && utxo . vout === input . outpointIndex ,
6166 ) ;
6267
6368 if ( index !== - 1 ) {
6469 // Remove the UTXO from the map
6570 utxos . splice ( index , 1 ) ;
66- this . utxoMap [ address ] = utxos ;
71+ this . utxoMap [ lockingBytecodeHex ] = utxos ;
72+
73+ if ( utxos . length === 0 ) {
74+ delete this . utxoMap [ lockingBytecodeHex ] ; // Clean up empty address entries
75+ }
76+
6777 break ; // Exit loop after finding and removing the UTXO
6878 }
69- if ( utxos . length === 0 ) {
70- delete this . utxoMap [ address ] ; // Clean up empty address entries
71- }
7279 }
7380 }
7481
@@ -93,7 +100,8 @@ export default class MockNetworkProvider implements NetworkProvider {
93100 }
94101
95102 addUtxo ( addressOrLockingBytecode : string , utxo : Utxo ) : void {
96- const lockingBytecode = isHex ( addressOrLockingBytecode ) ? addressOrLockingBytecode : binToHex ( addressToLockScript ( addressOrLockingBytecode ) ) ;
103+ const lockingBytecode = isHex ( addressOrLockingBytecode ) ?
104+ addressOrLockingBytecode : binToHex ( addressToLockScript ( addressOrLockingBytecode ) ) ;
97105 if ( ! this . utxoMap [ lockingBytecode ] ) {
98106 this . utxoMap [ lockingBytecode ] = [ ] ;
99107 }
0 commit comments