@@ -10,7 +10,7 @@ const bobAddress = 'bchtest:qz6q5gqnxdldkr07xpls5474mmzmlesd6qnux4skuc';
10
10
const carolAddress = 'bchtest:qqsr7nqwe6rq5crj63gy5gdqchpnwmguusmr7tfmsj' ;
11
11
12
12
export 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
14
14
private utxoMap : Record < string , Utxo [ ] > = { } ;
15
15
private transactionMap : Record < string , string > = { } ;
16
16
public network : Network = Network . MOCKNET ;
@@ -45,6 +45,11 @@ export default class MockNetworkProvider implements NetworkProvider {
45
45
const transactionBin = hexToBin ( txHex ) ;
46
46
47
47
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
+
48
53
this . transactionMap [ txid ] = txHex ;
49
54
50
55
const decoded = decodeTransaction ( transactionBin ) ;
@@ -54,21 +59,23 @@ export default class MockNetworkProvider implements NetworkProvider {
54
59
55
60
// remove (spend) UTXOs from the map
56
61
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 ] ;
59
64
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 ,
61
66
) ;
62
67
63
68
if ( index !== - 1 ) {
64
69
// Remove the UTXO from the map
65
70
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
+
67
77
break ; // Exit loop after finding and removing the UTXO
68
78
}
69
- if ( utxos . length === 0 ) {
70
- delete this . utxoMap [ address ] ; // Clean up empty address entries
71
- }
72
79
}
73
80
}
74
81
@@ -93,7 +100,8 @@ export default class MockNetworkProvider implements NetworkProvider {
93
100
}
94
101
95
102
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 ) ) ;
97
105
if ( ! this . utxoMap [ lockingBytecode ] ) {
98
106
this . utxoMap [ lockingBytecode ] = [ ] ;
99
107
}
0 commit comments