@keep-network/tbtc-v2 0.1.1-dev.68 → 0.1.1-dev.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/artifacts/Bank.json +6 -6
  2. package/artifacts/Bridge.json +21 -21
  3. package/artifacts/DefaultProxyAdmin.json +5 -5
  4. package/artifacts/Deposit.json +11 -11
  5. package/artifacts/DepositSweep.json +9 -9
  6. package/artifacts/EcdsaDkgValidator.json +4 -4
  7. package/artifacts/EcdsaInactivity.json +3 -3
  8. package/artifacts/Fraud.json +21 -21
  9. package/artifacts/KeepRegistry.json +1 -1
  10. package/artifacts/KeepStake.json +2 -2
  11. package/artifacts/KeepToken.json +2 -2
  12. package/artifacts/KeepTokenStaking.json +1 -1
  13. package/artifacts/MovingFunds.json +16 -16
  14. package/artifacts/NuCypherStakingEscrow.json +1 -1
  15. package/artifacts/NuCypherToken.json +2 -2
  16. package/artifacts/RandomBeaconStub.json +3 -3
  17. package/artifacts/Redemption.json +13 -13
  18. package/artifacts/ReimbursementPool.json +5 -5
  19. package/artifacts/Relay.json +11 -11
  20. package/artifacts/SortitionPool.json +6 -6
  21. package/artifacts/T.json +2 -2
  22. package/artifacts/TBTC.json +6 -6
  23. package/artifacts/TBTCToken.json +6 -6
  24. package/artifacts/TokenStaking.json +1 -1
  25. package/artifacts/TokenholderGovernor.json +9 -9
  26. package/artifacts/TokenholderTimelock.json +8 -8
  27. package/artifacts/VendingMachine.json +13 -13
  28. package/artifacts/VendingMachineKeep.json +1 -1
  29. package/artifacts/VendingMachineNuCypher.json +1 -1
  30. package/artifacts/WalletRegistry.json +12 -12
  31. package/artifacts/WalletRegistry_Implementation.json +3 -3
  32. package/artifacts/WalletRegistry_Proxy.json +12 -12
  33. package/artifacts/Wallets.json +7 -7
  34. package/artifacts/solcInputs/{849676ae534cda0adec6ccf4d074608c.json → 922f95457ca7980d018c851fb3308a7e.json} +5 -5
  35. package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
  36. package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
  37. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
  38. package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.json +2 -2
  39. package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
  40. package/build/contracts/bridge/Bridge.sol/Bridge.json +34 -34
  41. package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
  42. package/build/contracts/bridge/BridgeState.sol/BridgeState.json +2 -2
  43. package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
  44. package/build/contracts/bridge/Deposit.sol/Deposit.json +4 -4
  45. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
  46. package/build/contracts/bridge/DepositSweep.sol/DepositSweep.json +2 -2
  47. package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
  48. package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
  49. package/build/contracts/bridge/Fraud.sol/Fraud.json +5 -5
  50. package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
  51. package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
  52. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
  53. package/build/contracts/bridge/MovingFunds.sol/MovingFunds.json +9 -9
  54. package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
  55. package/build/contracts/bridge/Redemption.sol/OutboundTx.json +2 -2
  56. package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
  57. package/build/contracts/bridge/Redemption.sol/Redemption.json +6 -6
  58. package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
  59. package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
  60. package/build/contracts/bridge/Wallets.sol/Wallets.json +2 -2
  61. package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
  62. package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
  63. package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
  64. package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
  65. package/contracts/bridge/Bridge.sol +45 -35
  66. package/contracts/bridge/Deposit.sol +2 -2
  67. package/contracts/bridge/Fraud.sol +38 -22
  68. package/contracts/bridge/MovingFunds.sol +10 -7
  69. package/contracts/bridge/Redemption.sol +4 -4
  70. package/export.json +36 -36
  71. package/package.json +1 -1
@@ -59,7 +59,6 @@ import "../bank/Bank.sol";
59
59
  /// functionalities in this contract is: deposit, sweep, redemption,
60
60
  /// moving funds, wallet lifecycle, frauds, parameters.
61
61
  ///
62
- /// TODO: Revisit all events and look which parameters should be indexed.
63
62
  /// TODO: Align the convention around `param` and `dev` endings. They should
64
63
  /// not have a punctuation mark.
65
64
  contract Bridge is Governable, EcdsaWalletOwner, Initializable {
@@ -76,10 +75,10 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
76
75
  event DepositRevealed(
77
76
  bytes32 fundingTxHash,
78
77
  uint32 fundingOutputIndex,
79
- address depositor,
78
+ address indexed depositor,
80
79
  uint64 amount,
81
80
  bytes8 blindingFactor,
82
- bytes20 walletPubKeyHash,
81
+ bytes20 indexed walletPubKeyHash,
83
82
  bytes20 refundPubKeyHash,
84
83
  bytes4 refundLocktime,
85
84
  address vault
@@ -88,21 +87,21 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
88
87
  event DepositsSwept(bytes20 walletPubKeyHash, bytes32 sweepTxHash);
89
88
 
90
89
  event RedemptionRequested(
91
- bytes20 walletPubKeyHash,
90
+ bytes20 indexed walletPubKeyHash,
92
91
  bytes redeemerOutputScript,
93
- address redeemer,
92
+ address indexed redeemer,
94
93
  uint64 requestedAmount,
95
94
  uint64 treasuryFee,
96
95
  uint64 txMaxFee
97
96
  );
98
97
 
99
98
  event RedemptionsCompleted(
100
- bytes20 walletPubKeyHash,
99
+ bytes20 indexed walletPubKeyHash,
101
100
  bytes32 redemptionTxHash
102
101
  );
103
102
 
104
103
  event RedemptionTimedOut(
105
- bytes20 walletPubKeyHash,
104
+ bytes20 indexed walletPubKeyHash,
106
105
  bytes redeemerOutputScript
107
106
  );
108
107
 
@@ -112,26 +111,29 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
112
111
  );
113
112
 
114
113
  event MovingFundsCommitmentSubmitted(
115
- bytes20 walletPubKeyHash,
114
+ bytes20 indexed walletPubKeyHash,
116
115
  bytes20[] targetWallets,
117
116
  address submitter
118
117
  );
119
118
 
120
- event MovingFundsTimeoutReset(bytes20 walletPubKeyHash);
119
+ event MovingFundsTimeoutReset(bytes20 indexed walletPubKeyHash);
121
120
 
122
121
  event MovingFundsCompleted(
123
- bytes20 walletPubKeyHash,
122
+ bytes20 indexed walletPubKeyHash,
124
123
  bytes32 movingFundsTxHash
125
124
  );
126
125
 
127
- event MovingFundsTimedOut(bytes20 walletPubKeyHash);
126
+ event MovingFundsTimedOut(bytes20 indexed walletPubKeyHash);
128
127
 
129
- event MovingFundsBelowDustReported(bytes20 walletPubKeyHash);
128
+ event MovingFundsBelowDustReported(bytes20 indexed walletPubKeyHash);
130
129
 
131
- event MovedFundsSwept(bytes20 walletPubKeyHash, bytes32 sweepTxHash);
130
+ event MovedFundsSwept(
131
+ bytes20 indexed walletPubKeyHash,
132
+ bytes32 sweepTxHash
133
+ );
132
134
 
133
135
  event MovedFundsSweepTimedOut(
134
- bytes20 walletPubKeyHash,
136
+ bytes20 indexed walletPubKeyHash,
135
137
  bytes32 movingFundsTxHash,
136
138
  uint32 movingFundsTxOutputIndex
137
139
  );
@@ -159,17 +161,20 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
159
161
  );
160
162
 
161
163
  event FraudChallengeSubmitted(
162
- bytes20 walletPubKeyHash,
164
+ bytes20 indexed walletPubKeyHash,
163
165
  bytes32 sighash,
164
166
  uint8 v,
165
167
  bytes32 r,
166
168
  bytes32 s
167
169
  );
168
170
 
169
- event FraudChallengeDefeated(bytes20 walletPubKeyHash, bytes32 sighash);
171
+ event FraudChallengeDefeated(
172
+ bytes20 indexed walletPubKeyHash,
173
+ bytes32 sighash
174
+ );
170
175
 
171
176
  event FraudChallengeDefeatTimedOut(
172
- bytes20 walletPubKeyHash,
177
+ bytes20 indexed walletPubKeyHash,
173
178
  bytes32 sighash
174
179
  );
175
180
 
@@ -888,12 +893,14 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
888
893
  /// challenge or confiscated otherwise.
889
894
  /// @param walletPublicKey The public key of the wallet in the uncompressed
890
895
  /// and unprefixed format (64 bytes)
891
- /// @param sighash The hash that was used to produce the ECDSA signature
892
- /// that is the subject of the fraud claim. This hash is constructed
893
- /// by applying double SHA-256 over a serialized subset of the
894
- /// transaction. The exact subset used as hash preimage depends on
895
- /// the transaction input the signature is produced for. See BIP-143
896
- /// for reference
896
+ /// @param preimageSha256 The hash that was generated by applying SHA-256
897
+ /// one time over the preimage used during input signing. The preimage
898
+ /// is a serialized subset of the transaction and its structure
899
+ /// depends on the transaction input (see BIP-143 for reference).
900
+ /// Notice that applying SHA-256 over the `preimageSha256` results
901
+ /// in `sighash`. The path from `preimage` to `sighash` looks like
902
+ /// this:
903
+ /// preimage -> (SHA-256) -> preimageSha256 -> (SHA-256) -> sighash
897
904
  /// @param signature Bitcoin signature in the R/S/V format
898
905
  /// @dev Requirements:
899
906
  /// - Wallet behind `walletPublicKey` must be in Live or MovingFunds
@@ -902,13 +909,14 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
902
909
  /// fraud challenge deposit
903
910
  /// - The signature (represented by r, s and v) must be generated by
904
911
  /// the wallet behind `walletPubKey` during signing of `sighash`
912
+ /// which was calculated from `preimageSha256`
905
913
  /// - Wallet can be challenged for the given signature only once
906
914
  function submitFraudChallenge(
907
915
  bytes calldata walletPublicKey,
908
- bytes32 sighash,
916
+ bytes memory preimageSha256,
909
917
  BitcoinTx.RSVSignature calldata signature
910
918
  ) external payable {
911
- self.submitFraudChallenge(walletPublicKey, sighash, signature);
919
+ self.submitFraudChallenge(walletPublicKey, preimageSha256, signature);
912
920
  }
913
921
 
914
922
  /// @notice Allows to defeat a pending fraud challenge against a wallet if
@@ -992,17 +1000,19 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
992
1000
  /// @param walletPublicKey The public key of the wallet in the uncompressed
993
1001
  /// and unprefixed format (64 bytes)
994
1002
  /// @param walletMembersIDs Identifiers of the wallet signing group members
995
- /// @param sighash The hash that was used to produce the ECDSA signature
996
- /// that is the subject of the fraud claim. This hash is constructed
997
- /// by applying double SHA-256 over a serialized subset of the
998
- /// transaction. The exact subset used as hash preimage depends on
999
- /// the transaction input the signature is produced for. See BIP-143
1000
- /// for reference
1003
+ /// @param preimageSha256 The hash that was generated by applying SHA-256
1004
+ /// one time over the preimage used during input signing. The preimage
1005
+ /// is a serialized subset of the transaction and its structure
1006
+ /// depends on the transaction input (see BIP-143 for reference).
1007
+ /// Notice that applying SHA-256 over the `preimageSha256` results
1008
+ /// in `sighash`. The path from `preimage` to `sighash` looks like
1009
+ /// this:
1010
+ /// preimage -> (SHA-256) -> preimageSha256 -> (SHA-256) -> sighash
1001
1011
  /// @dev Requirements:
1002
1012
  /// - The wallet must be in the Live or MovingFunds or Closing or
1003
1013
  /// Terminated state
1004
- /// - The `walletPublicKey` and `sighash` must identify an open fraud
1005
- /// challenge
1014
+ /// - The `walletPublicKey` and `sighash` calculated from
1015
+ /// `preimageSha256` must identify an open fraud challenge
1006
1016
  /// - The expression `keccak256(abi.encode(walletMembersIDs))` must
1007
1017
  /// be exactly the same as the hash stored under `membersIdsHash`
1008
1018
  /// for the given `walletID`. Those IDs are not directly stored
@@ -1014,12 +1024,12 @@ contract Bridge is Governable, EcdsaWalletOwner, Initializable {
1014
1024
  function notifyFraudChallengeDefeatTimeout(
1015
1025
  bytes calldata walletPublicKey,
1016
1026
  uint32[] calldata walletMembersIDs,
1017
- bytes32 sighash
1027
+ bytes memory preimageSha256
1018
1028
  ) external {
1019
1029
  self.notifyFraudChallengeDefeatTimeout(
1020
1030
  walletPublicKey,
1021
1031
  walletMembersIDs,
1022
- sighash
1032
+ preimageSha256
1023
1033
  );
1024
1034
  }
1025
1035
 
@@ -103,10 +103,10 @@ library Deposit {
103
103
  event DepositRevealed(
104
104
  bytes32 fundingTxHash,
105
105
  uint32 fundingOutputIndex,
106
- address depositor,
106
+ address indexed depositor,
107
107
  uint64 amount,
108
108
  bytes8 blindingFactor,
109
- bytes20 walletPubKeyHash,
109
+ bytes20 indexed walletPubKeyHash,
110
110
  bytes20 refundPubKeyHash,
111
111
  bytes4 refundLocktime,
112
112
  address vault
@@ -74,17 +74,20 @@ library Fraud {
74
74
  }
75
75
 
76
76
  event FraudChallengeSubmitted(
77
- bytes20 walletPubKeyHash,
77
+ bytes20 indexed walletPubKeyHash,
78
78
  bytes32 sighash,
79
79
  uint8 v,
80
80
  bytes32 r,
81
81
  bytes32 s
82
82
  );
83
83
 
84
- event FraudChallengeDefeated(bytes20 walletPubKeyHash, bytes32 sighash);
84
+ event FraudChallengeDefeated(
85
+ bytes20 indexed walletPubKeyHash,
86
+ bytes32 sighash
87
+ );
85
88
 
86
89
  event FraudChallengeDefeatTimedOut(
87
- bytes20 walletPubKeyHash,
90
+ bytes20 indexed walletPubKeyHash,
88
91
  // Sighash calculated as a Bitcoin's hash256 (double sha2) of:
89
92
  // - a preimage of a transaction spending UTXO according to the protocol
90
93
  // rules OR
@@ -109,12 +112,14 @@ library Fraud {
109
112
  /// challenge or confiscated otherwise
110
113
  /// @param walletPublicKey The public key of the wallet in the uncompressed
111
114
  /// and unprefixed format (64 bytes)
112
- /// @param sighash The hash that was used to produce the ECDSA signature
113
- /// that is the subject of the fraud claim. This hash is constructed
114
- /// by applying double SHA-256 over a serialized subset of the
115
- /// transaction. The exact subset used as hash preimage depends on
116
- /// the transaction input the signature is produced for. See BIP-143
117
- /// for reference
115
+ /// @param preimageSha256 The hash that was generated by applying SHA-256
116
+ /// one time over the preimage used during input signing. The preimage
117
+ /// is a serialized subset of the transaction and its structure
118
+ /// depends on the transaction input (see BIP-143 for reference).
119
+ /// Notice that applying SHA-256 over the `preimageSha256` results
120
+ /// in `sighash`. The path from `preimage` to `sighash` looks like
121
+ /// this:
122
+ /// preimage -> (SHA-256) -> preimageSha256 -> (SHA-256) -> sighash
118
123
  /// @param signature Bitcoin signature in the R/S/V format
119
124
  /// @dev Requirements:
120
125
  /// - Wallet behind `walletPublicKey` must be in Live or MovingFunds
@@ -122,12 +127,13 @@ library Fraud {
122
127
  /// - The challenger must send appropriate amount of ETH used as
123
128
  /// fraud challenge deposit
124
129
  /// - The signature (represented by r, s and v) must be generated by
125
- /// the wallet behind `walletPublicKey` during signing of `sighash`
130
+ /// the wallet behind `walletPubKey` during signing of `sighash`
131
+ /// which was calculated from `preimageSha256`
126
132
  /// - Wallet can be challenged for the given signature only once
127
133
  function submitFraudChallenge(
128
134
  BridgeState.Storage storage self,
129
135
  bytes calldata walletPublicKey,
130
- bytes32 sighash,
136
+ bytes memory preimageSha256,
131
137
  BitcoinTx.RSVSignature calldata signature
132
138
  ) external {
133
139
  require(
@@ -135,6 +141,12 @@ library Fraud {
135
141
  "The amount of ETH deposited is too low"
136
142
  );
137
143
 
144
+ // To prevent ECDSA signature forgery `sighash` must be calculated
145
+ // inside the function and not passed as a function parameter.
146
+ // Signature forgery could result in a wrongful fraud accusation
147
+ // against a wallet.
148
+ bytes32 sighash = sha256(preimageSha256);
149
+
138
150
  require(
139
151
  CheckBitcoinSigs.checkSig(
140
152
  walletPublicKey,
@@ -335,8 +347,8 @@ library Fraud {
335
347
  /// @notice Notifies about defeat timeout for the given fraud challenge.
336
348
  /// Can be called only if there was a fraud challenge identified by
337
349
  /// the provided `walletPublicKey` and `sighash` and it was not
338
- /// defeated on time. The amount of time that needs to pass after a
339
- /// fraud challenge is reported is indicated by the
350
+ /// defeated on time. The amount of time that needs to pass after
351
+ /// a fraud challenge is reported is indicated by the
340
352
  /// `challengeDefeatTimeout`. After a successful fraud challenge
341
353
  /// defeat timeout notification the fraud challenge is marked as
342
354
  /// resolved, the stake of each operator is slashed, the ether
@@ -345,17 +357,19 @@ library Fraud {
345
357
  /// @param walletPublicKey The public key of the wallet in the uncompressed
346
358
  /// and unprefixed format (64 bytes)
347
359
  /// @param walletMembersIDs Identifiers of the wallet signing group members
348
- /// @param sighash The hash that was used to produce the ECDSA signature
349
- /// that is the subject of the fraud claim. This hash is constructed
350
- /// by applying double SHA-256 over a serialized subset of the
351
- /// transaction. The exact subset used as hash preimage depends on
352
- /// the transaction input the signature is produced for. See BIP-143
353
- /// for reference
360
+ /// @param preimageSha256 The hash that was generated by applying SHA-256
361
+ /// one time over the preimage used during input signing. The preimage
362
+ /// is a serialized subset of the transaction and its structure
363
+ /// depends on the transaction input (see BIP-143 for reference).
364
+ /// Notice that applying SHA-256 over the `preimageSha256` results
365
+ /// in `sighash`. The path from `preimage` to `sighash` looks like
366
+ /// this:
367
+ /// preimage -> (SHA-256) -> preimageSha256 -> (SHA-256) -> sighash
354
368
  /// @dev Requirements:
355
369
  /// - The wallet must be in the Live or MovingFunds or Closing or
356
370
  /// Terminated state
357
- /// - The `walletPublicKey` and `sighash` must identify an open fraud
358
- /// challenge
371
+ /// - The `walletPublicKey` and `sighash` calculated from
372
+ /// `preimageSha256` must identify an open fraud challenge
359
373
  /// - The expression `keccak256(abi.encode(walletMembersIDs))` must
360
374
  /// be exactly the same as the hash stored under `membersIdsHash`
361
375
  /// for the given `walletID`. Those IDs are not directly stored
@@ -368,8 +382,10 @@ library Fraud {
368
382
  BridgeState.Storage storage self,
369
383
  bytes calldata walletPublicKey,
370
384
  uint32[] calldata walletMembersIDs,
371
- bytes32 sighash
385
+ bytes memory preimageSha256
372
386
  ) external {
387
+ bytes32 sighash = sha256(preimageSha256);
388
+
373
389
  uint256 challengeKey = uint256(
374
390
  keccak256(abi.encodePacked(walletPublicKey, sighash))
375
391
  );
@@ -93,26 +93,29 @@ library MovingFunds {
93
93
  }
94
94
 
95
95
  event MovingFundsCommitmentSubmitted(
96
- bytes20 walletPubKeyHash,
96
+ bytes20 indexed walletPubKeyHash,
97
97
  bytes20[] targetWallets,
98
98
  address submitter
99
99
  );
100
100
 
101
- event MovingFundsTimeoutReset(bytes20 walletPubKeyHash);
101
+ event MovingFundsTimeoutReset(bytes20 indexed walletPubKeyHash);
102
102
 
103
103
  event MovingFundsCompleted(
104
- bytes20 walletPubKeyHash,
104
+ bytes20 indexed walletPubKeyHash,
105
105
  bytes32 movingFundsTxHash
106
106
  );
107
107
 
108
- event MovingFundsTimedOut(bytes20 walletPubKeyHash);
108
+ event MovingFundsTimedOut(bytes20 indexed walletPubKeyHash);
109
109
 
110
- event MovingFundsBelowDustReported(bytes20 walletPubKeyHash);
110
+ event MovingFundsBelowDustReported(bytes20 indexed walletPubKeyHash);
111
111
 
112
- event MovedFundsSwept(bytes20 walletPubKeyHash, bytes32 sweepTxHash);
112
+ event MovedFundsSwept(
113
+ bytes20 indexed walletPubKeyHash,
114
+ bytes32 sweepTxHash
115
+ );
113
116
 
114
117
  event MovedFundsSweepTimedOut(
115
- bytes20 walletPubKeyHash,
118
+ bytes20 indexed walletPubKeyHash,
116
119
  bytes32 movingFundsTxHash,
117
120
  uint32 movingFundsTxOutputIndex
118
121
  );
@@ -213,21 +213,21 @@ library Redemption {
213
213
  }
214
214
 
215
215
  event RedemptionRequested(
216
- bytes20 walletPubKeyHash,
216
+ bytes20 indexed walletPubKeyHash,
217
217
  bytes redeemerOutputScript,
218
- address redeemer,
218
+ address indexed redeemer,
219
219
  uint64 requestedAmount,
220
220
  uint64 treasuryFee,
221
221
  uint64 txMaxFee
222
222
  );
223
223
 
224
224
  event RedemptionsCompleted(
225
- bytes20 walletPubKeyHash,
225
+ bytes20 indexed walletPubKeyHash,
226
226
  bytes32 redemptionTxHash
227
227
  );
228
228
 
229
229
  event RedemptionTimedOut(
230
- bytes20 walletPubKeyHash,
230
+ bytes20 indexed walletPubKeyHash,
231
231
  bytes redeemerOutputScript
232
232
  );
233
233