@bloxchain/sdk 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (129) hide show
  1. package/README.md +376 -376
  2. package/abi/AccountBlox.abi.json +609 -2479
  3. package/abi/BareBlox.abi.json +94 -0
  4. package/abi/BaseStateMachine.abi.json +85 -45
  5. package/abi/CopyBlox.abi.json +1593 -0
  6. package/abi/EngineBlox.abi.json +73 -90
  7. package/abi/GuardController.abi.json +252 -806
  8. package/abi/GuardControllerDefinitions.abi.json +411 -0
  9. package/abi/IDefinition.abi.json +5 -0
  10. package/abi/RoleBlox.abi.json +375 -1590
  11. package/abi/RuntimeRBAC.abi.json +155 -218
  12. package/abi/RuntimeRBACDefinitions.abi.json +179 -0
  13. package/abi/SecureBlox.abi.json +436 -1511
  14. package/abi/SecureOwnable.abi.json +524 -1621
  15. package/abi/SecureOwnableDefinitions.abi.json +5 -0
  16. package/abi/SimpleRWA20.abi.json +478 -1756
  17. package/abi/SimpleRWA20Definitions.abi.json +5 -0
  18. package/abi/SimpleVault.abi.json +648 -2214
  19. package/abi/SimpleVaultDefinitions.abi.json +5 -0
  20. package/dist/abi/AccountBlox.abi.json +3929 -0
  21. package/dist/abi/BareBlox.abi.json +1378 -0
  22. package/dist/abi/BaseStateMachine.abi.json +1213 -1173
  23. package/dist/abi/CopyBlox.abi.json +1593 -0
  24. package/dist/abi/EngineBlox.abi.json +855 -0
  25. package/dist/abi/GuardController.abi.json +2222 -2776
  26. package/dist/abi/GuardControllerDefinitions.abi.json +411 -0
  27. package/dist/abi/IDefinition.abi.json +113 -108
  28. package/dist/abi/RoleBlox.abi.json +2994 -0
  29. package/dist/abi/RuntimeRBAC.abi.json +1540 -1603
  30. package/dist/abi/RuntimeRBACDefinitions.abi.json +381 -0
  31. package/dist/abi/SecureBlox.abi.json +2753 -0
  32. package/dist/abi/SecureOwnable.abi.json +2585 -3682
  33. package/dist/abi/SecureOwnableDefinitions.abi.json +416 -0
  34. package/dist/abi/SimpleRWA20.abi.json +4010 -0
  35. package/dist/abi/SimpleRWA20Definitions.abi.json +196 -0
  36. package/dist/abi/SimpleVault.abi.json +3385 -0
  37. package/dist/abi/SimpleVaultDefinitions.abi.json +274 -0
  38. package/dist/abi.d.ts +11 -0
  39. package/dist/abi.d.ts.map +1 -0
  40. package/dist/abi.js +10 -0
  41. package/dist/abi.js.map +1 -0
  42. package/dist/contracts/{BaseStateMachine.d.ts → core/BaseStateMachine.d.ts} +20 -6
  43. package/dist/contracts/core/BaseStateMachine.d.ts.map +1 -0
  44. package/dist/contracts/{BaseStateMachine.js → core/BaseStateMachine.js} +88 -38
  45. package/dist/contracts/core/BaseStateMachine.js.map +1 -0
  46. package/dist/contracts/{GuardController.d.ts → core/GuardController.d.ts} +22 -15
  47. package/dist/contracts/core/GuardController.d.ts.map +1 -0
  48. package/dist/contracts/{GuardController.js → core/GuardController.js} +19 -21
  49. package/dist/contracts/core/GuardController.js.map +1 -0
  50. package/dist/contracts/core/RuntimeRBAC.d.ts +27 -0
  51. package/dist/contracts/core/RuntimeRBAC.d.ts.map +1 -0
  52. package/dist/contracts/core/RuntimeRBAC.js +33 -0
  53. package/dist/contracts/core/RuntimeRBAC.js.map +1 -0
  54. package/dist/contracts/{SecureOwnable.d.ts → core/SecureOwnable.d.ts} +5 -15
  55. package/dist/contracts/core/SecureOwnable.d.ts.map +1 -0
  56. package/dist/contracts/{SecureOwnable.js → core/SecureOwnable.js} +4 -23
  57. package/dist/contracts/core/SecureOwnable.js.map +1 -0
  58. package/dist/index.d.ts +8 -7
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +6 -6
  61. package/dist/index.js.map +1 -1
  62. package/dist/interfaces/base.index.d.ts +10 -2
  63. package/dist/interfaces/base.index.d.ts.map +1 -1
  64. package/dist/interfaces/base.state.machine.index.d.ts +3 -2
  65. package/dist/interfaces/base.state.machine.index.d.ts.map +1 -1
  66. package/dist/interfaces/core.access.index.d.ts +2 -16
  67. package/dist/interfaces/core.access.index.d.ts.map +1 -1
  68. package/dist/interfaces/core.execution.index.d.ts +8 -11
  69. package/dist/interfaces/core.execution.index.d.ts.map +1 -1
  70. package/dist/interfaces/core.security.index.d.ts +1 -4
  71. package/dist/interfaces/core.security.index.d.ts.map +1 -1
  72. package/dist/lib/Definition.d.ts.map +1 -1
  73. package/dist/lib/Definition.js +1 -0
  74. package/dist/lib/Definition.js.map +1 -1
  75. package/dist/lib/EngineBlox.d.ts +16 -49
  76. package/dist/lib/EngineBlox.d.ts.map +1 -1
  77. package/dist/lib/EngineBlox.js +20 -108
  78. package/dist/lib/EngineBlox.js.map +1 -1
  79. package/dist/lib/definitions/GuardControllerDefinitions.d.ts +34 -7
  80. package/dist/lib/definitions/GuardControllerDefinitions.d.ts.map +1 -1
  81. package/dist/lib/definitions/GuardControllerDefinitions.js +62 -10
  82. package/dist/lib/definitions/GuardControllerDefinitions.js.map +1 -1
  83. package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts +48 -7
  84. package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts.map +1 -1
  85. package/dist/lib/definitions/RuntimeRBACDefinitions.js +73 -10
  86. package/dist/lib/definitions/RuntimeRBACDefinitions.js.map +1 -1
  87. package/dist/lib/definitions/SecureOwnableDefinitions.d.ts +12 -7
  88. package/dist/lib/definitions/SecureOwnableDefinitions.d.ts.map +1 -1
  89. package/dist/lib/definitions/SecureOwnableDefinitions.js +25 -9
  90. package/dist/lib/definitions/SecureOwnableDefinitions.js.map +1 -1
  91. package/dist/lib/definitions/index.d.ts +6 -4
  92. package/dist/lib/definitions/index.d.ts.map +1 -1
  93. package/dist/lib/definitions/index.js +5 -4
  94. package/dist/lib/definitions/index.js.map +1 -1
  95. package/dist/types/base.state.machine.index.d.ts +0 -2
  96. package/dist/types/base.state.machine.index.d.ts.map +1 -1
  97. package/dist/types/base.state.machine.index.js +1 -3
  98. package/dist/types/base.state.machine.index.js.map +1 -1
  99. package/dist/types/core.execution.index.d.ts +1 -0
  100. package/dist/types/core.execution.index.d.ts.map +1 -1
  101. package/dist/types/core.execution.index.js +1 -0
  102. package/dist/types/core.execution.index.js.map +1 -1
  103. package/dist/types/core.security.index.d.ts.map +1 -1
  104. package/dist/types/core.security.index.js +2 -2
  105. package/dist/types/core.security.index.js.map +1 -1
  106. package/dist/types/definition.index.d.ts +2 -0
  107. package/dist/types/definition.index.d.ts.map +1 -1
  108. package/dist/types/definition.index.js.map +1 -1
  109. package/dist/utils/contract-errors.d.ts +125 -6
  110. package/dist/utils/contract-errors.d.ts.map +1 -1
  111. package/dist/utils/contract-errors.js +375 -107
  112. package/dist/utils/contract-errors.js.map +1 -1
  113. package/dist/utils/interface-ids.js +8 -8
  114. package/dist/utils/interface-ids.js.map +1 -1
  115. package/dist/utils/metaTx/metaTransaction.d.ts +103 -7
  116. package/dist/utils/metaTx/metaTransaction.d.ts.map +1 -1
  117. package/dist/utils/metaTx/metaTransaction.js +136 -25
  118. package/dist/utils/metaTx/metaTransaction.js.map +1 -1
  119. package/package.json +10 -6
  120. package/dist/contracts/BaseStateMachine.d.ts.map +0 -1
  121. package/dist/contracts/BaseStateMachine.js.map +0 -1
  122. package/dist/contracts/GuardController.d.ts.map +0 -1
  123. package/dist/contracts/GuardController.js.map +0 -1
  124. package/dist/contracts/RuntimeRBAC.d.ts +0 -54
  125. package/dist/contracts/RuntimeRBAC.d.ts.map +0 -1
  126. package/dist/contracts/RuntimeRBAC.js +0 -58
  127. package/dist/contracts/RuntimeRBAC.js.map +0 -1
  128. package/dist/contracts/SecureOwnable.d.ts.map +0 -1
  129. package/dist/contracts/SecureOwnable.js.map +0 -1
@@ -10,173 +10,402 @@
10
10
  * @author Guardian Framework Team
11
11
  * @version 1.0.0
12
12
  */
13
+ import { decodeAbiParameters, parseAbiParameters } from 'viem';
13
14
  /**
14
- * Error signature mapping for quick lookup
15
- * Maps the keccak256 hash of the error signature to error information
16
- * Note: These are placeholder signatures - in practice, you would use the actual keccak256 hashes
15
+ * Error signature mapping for quick lookup.
16
+ * Selectors are the first 4 bytes of keccak256("ErrorName(type1,type2,...)") from SharedValidation.sol.
17
17
  */
18
18
  export const ERROR_SIGNATURES = {
19
- // Address validation errors (placeholder signatures)
20
- '0x2c7b6e7f': {
19
+ // Address validation (SharedValidation.sol)
20
+ '0x8e4c8aa6': {
21
21
  name: 'InvalidAddress',
22
22
  params: ['provided'],
23
23
  userMessage: (params) => `InvalidAddress: Invalid address provided: ${params.provided}`
24
24
  },
25
- '0x8c5be1e6': {
26
- name: 'InvalidTargetAddress',
27
- params: ['target'],
28
- userMessage: (params) => `InvalidTargetAddress: Invalid target address: ${params.target}`
25
+ '0x1c024b14': {
26
+ name: 'NotNewAddress',
27
+ params: ['newAddress', 'currentAddress'],
28
+ userMessage: () => `NotNewAddress: New address must be different from current address`
29
29
  },
30
- '0x5c60da1c': {
31
- name: 'InvalidRequesterAddress',
32
- params: ['requester'],
33
- userMessage: (params) => `InvalidRequesterAddress: Invalid requester address: ${params.requester}`
30
+ // Time and deadline
31
+ '0xf027e09d': {
32
+ name: 'InvalidTimeLockPeriod',
33
+ params: ['provided'],
34
+ userMessage: (params) => `InvalidTimeLockPeriod: Invalid time lock period: ${params.provided}`
34
35
  },
35
- '0x8da5cb5c': {
36
- name: 'InvalidHandlerContract',
37
- params: ['handler'],
38
- userMessage: (params) => `InvalidHandlerContract: Invalid handler contract: ${params.handler}`
36
+ '0xbcdedf97': {
37
+ name: 'TimeLockPeriodZero',
38
+ params: ['provided'],
39
+ userMessage: () => `TimeLockPeriodZero: Time lock period must be greater than zero`
39
40
  },
40
- '0x8c5be1e7': {
41
- name: 'InvalidSignerAddress',
42
- params: ['signer'],
43
- userMessage: (params) => `InvalidSignerAddress: Invalid signer address: ${params.signer}`
41
+ '0x0e6fd6e4': {
42
+ name: 'DeadlineInPast',
43
+ params: ['deadline', 'currentTime'],
44
+ userMessage: () => `DeadlineInPast: Transaction deadline has passed`
44
45
  },
45
- '0x5c60da1d': {
46
- name: 'NotNewAddress',
47
- params: ['newAddress', 'currentAddress'],
48
- userMessage: () => `NotNewAddress: New address must be different from current address`
46
+ '0x0ce5c69c': {
47
+ name: 'MetaTxExpired',
48
+ params: ['deadline', 'currentTime'],
49
+ userMessage: () => `MetaTxExpired: Meta-transaction has expired`
50
+ },
51
+ '0xee142cd7': {
52
+ name: 'BeforeReleaseTime',
53
+ params: ['releaseTime', 'currentTime'],
54
+ userMessage: () => `BeforeReleaseTime: Current time is before release time`
55
+ },
56
+ '0x013cfafc': {
57
+ name: 'NewTimelockSame',
58
+ params: ['newPeriod', 'currentPeriod'],
59
+ userMessage: () => `NewTimelockSame: New timelock period must differ from current`
49
60
  },
50
- // Permission errors
51
- '0x8da5cb5d': {
61
+ // Permission and authorization
62
+ '0xf37a3442': {
52
63
  name: 'NoPermission',
53
64
  params: ['caller'],
54
65
  userMessage: (params) => `NoPermission: Caller ${params.caller} does not have permission`
55
66
  },
56
- '0x8c5be1e8': {
67
+ '0x3975c914': {
68
+ name: 'NoPermissionForFunction',
69
+ params: ['caller', 'functionSelector'],
70
+ userMessage: (params) => `NoPermissionForFunction: Caller ${params.caller} has no permission for function ${params.functionSelector}`
71
+ },
72
+ '0x5f16a21a': {
57
73
  name: 'RestrictedOwner',
58
74
  params: ['caller', 'owner'],
59
75
  userMessage: () => `RestrictedOwner: Only the owner can perform this action`
60
76
  },
61
- '0x5c60da1e': {
77
+ '0x14437a05': {
78
+ name: 'RestrictedOwnerRecovery',
79
+ params: ['caller', 'owner', 'recovery'],
80
+ userMessage: () => `RestrictedOwnerRecovery: Only owner or recovery can perform this action`
81
+ },
82
+ '0x92e22b88': {
83
+ name: 'RestrictedRecovery',
84
+ params: ['caller', 'recovery'],
85
+ userMessage: () => `RestrictedRecovery: Only the recovery address can perform this action`
86
+ },
87
+ '0xc26028e0': {
62
88
  name: 'RestrictedBroadcaster',
63
89
  params: ['caller', 'broadcaster'],
64
90
  userMessage: () => `RestrictedBroadcaster: Only the broadcaster can perform this action`
65
91
  },
66
- '0x8da5cb5e': {
92
+ '0x3b94fe24': {
67
93
  name: 'SignerNotAuthorized',
68
94
  params: ['signer'],
69
95
  userMessage: (params) => `SignerNotAuthorized: Signer ${params.signer} is not authorized`
70
96
  },
71
- // Resource and item management errors
72
- '0x9da5cb5f': {
73
- name: 'ItemAlreadyExists',
74
- params: ['item'],
75
- userMessage: (params) => `ItemAlreadyExists: Item ${params.item} already exists`
76
- },
77
- '0x9da5cb60': {
78
- name: 'ItemNotFound',
79
- params: ['item'],
80
- userMessage: (params) => `ItemNotFound: Item ${params.item} not found`
97
+ '0x7ae1eaa8': {
98
+ name: 'MetaTxHandlerSelectorMismatch',
99
+ params: ['signedSelector', 'entrySelector'],
100
+ userMessage: (params) => `MetaTxHandlerSelectorMismatch: Signed handler ${params.signedSelector} does not match entrypoint ${params.entrySelector}`
81
101
  },
82
- '0x9da5cb61': {
83
- name: 'TargetNotWhitelisted',
84
- params: ['target', 'functionSelector', 'roleHash'],
85
- userMessage: (params) => `TargetNotWhitelisted: Target ${params.target} is not whitelisted for function selector ${params.functionSelector} and role ${params.roleHash}`
102
+ '0x4ffe15c0': {
103
+ name: 'MetaTxHandlerContractMismatch',
104
+ params: ['signedContract', 'entryContract'],
105
+ userMessage: (params) => `MetaTxHandlerContractMismatch: Signed contract ${params.signedContract} does not match entry contract ${params.entryContract}`
86
106
  },
87
- '0x9da5cb62': {
88
- name: 'ResourceNotFound',
89
- params: ['resource'],
90
- userMessage: (params) => `ResourceNotFound: Resource ${params.resource} not found`
107
+ '0xf364cb26': {
108
+ name: 'OnlyCallableByContract',
109
+ params: ['caller', 'contractAddress'],
110
+ userMessage: (params) => `OnlyCallableByContract: Caller ${params.caller} is not the contract ${params.contractAddress}`
91
111
  },
92
- // Operation errors
93
- '0x8c5be1e9': {
94
- name: 'OperationNotSupported',
112
+ // Transaction and operation
113
+ '0xa0387940': {
114
+ name: 'NotSupported',
95
115
  params: [],
96
- userMessage: () => `OperationNotSupported: This operation is not supported`
116
+ userMessage: () => `NotSupported: This operation is not supported`
97
117
  },
98
- '0x5c60da1f': {
99
- name: 'RequestAlreadyPending',
100
- params: ['txId'],
101
- userMessage: (params) => `RequestAlreadyPending: Request is already pending (Transaction ID: ${params.txId})`
118
+ '0xc502078d': {
119
+ name: 'InvalidOperationType',
120
+ params: ['actualType', 'expectedType'],
121
+ userMessage: () => `InvalidOperationType: Operation type does not match expected`
102
122
  },
103
- '0x8da5cb5f': {
104
- name: 'TransactionNotFound',
105
- params: ['txId'],
106
- userMessage: (params) => `TransactionNotFound: Transaction not found: ${params.txId}`
123
+ '0x784a33af': {
124
+ name: 'ZeroOperationTypeNotAllowed',
125
+ params: [],
126
+ userMessage: () => `ZeroOperationTypeNotAllowed: Zero operation type is not allowed`
107
127
  },
108
- // Time errors
109
- '0x8c5be1ea': {
110
- name: 'DeadlineInPast',
111
- params: ['deadline', 'currentTime'],
112
- userMessage: () => `DeadlineInPast: Transaction deadline has passed`
128
+ '0x10423d7c': {
129
+ name: 'TransactionStatusMismatch',
130
+ params: ['expectedStatus', 'currentStatus'],
131
+ userMessage: (params) => `TransactionStatusMismatch: Expected status ${params.expectedStatus}, current ${params.currentStatus}`
113
132
  },
114
- '0x5c60da20': {
115
- name: 'MetaTxExpired',
116
- params: ['deadline', 'currentTime'],
117
- userMessage: () => `MetaTxExpired: Meta-transaction has expired`
133
+ '0x0dc149f0': {
134
+ name: 'AlreadyInitialized',
135
+ params: [],
136
+ userMessage: () => `AlreadyInitialized: Contract is already initialized`
118
137
  },
119
- // Role errors
120
- '0x8da5cb60': {
121
- name: 'RoleDoesNotExist',
138
+ '0x87138d5c': {
139
+ name: 'NotInitialized',
122
140
  params: [],
123
- userMessage: () => `RoleDoesNotExist: Role does not exist`
141
+ userMessage: () => `NotInitialized: Contract is not initialized`
124
142
  },
125
- '0x8c5be1eb': {
126
- name: 'WalletAlreadyInRole',
127
- params: ['wallet'],
128
- userMessage: (params) => `WalletAlreadyInRole: Wallet ${params.wallet} is already in this role`
143
+ '0x1efa143c': {
144
+ name: 'TransactionIdMismatch',
145
+ params: ['expectedTxId', 'providedTxId'],
146
+ userMessage: (params) => `TransactionIdMismatch: Transaction ID mismatch (expected: ${params.expectedTxId}, provided: ${params.providedTxId})`
129
147
  },
130
- '0x5c60da21': {
131
- name: 'RoleWalletLimitReached',
132
- params: ['currentCount', 'maxWallets'],
133
- userMessage: (params) => `RoleWalletLimitReached: Role wallet limit reached (${params.currentCount}/${params.maxWallets})`
148
+ '0xf5b20274': {
149
+ name: 'PendingSecureRequest',
150
+ params: [],
151
+ userMessage: () => `PendingSecureRequest: A secure request is already pending`
134
152
  },
135
- // Signature errors
136
- '0x8da5cb61': {
153
+ // Signature and meta-transaction
154
+ '0xd615d706': {
137
155
  name: 'InvalidSignatureLength',
138
156
  params: ['providedLength', 'expectedLength'],
139
157
  userMessage: (params) => `InvalidSignatureLength: Invalid signature length: ${params.providedLength} (expected: ${params.expectedLength})`
140
158
  },
141
- '0x8c5be1ec': {
159
+ '0x2adfdc30': {
160
+ name: 'InvalidSignature',
161
+ params: ['signature'],
162
+ userMessage: () => `InvalidSignature: Invalid signature`
163
+ },
164
+ '0x06427aeb': {
142
165
  name: 'InvalidNonce',
143
166
  params: ['providedNonce', 'expectedNonce'],
144
167
  userMessage: (params) => `InvalidNonce: Invalid nonce: ${params.providedNonce} (expected: ${params.expectedNonce})`
145
168
  },
146
- '0x5c60da22': {
169
+ '0x21967608': {
147
170
  name: 'ChainIdMismatch',
148
171
  params: ['providedChainId', 'expectedChainId'],
149
172
  userMessage: (params) => `ChainIdMismatch: Chain ID mismatch: ${params.providedChainId} (expected: ${params.expectedChainId})`
150
173
  },
151
- // Balance errors
152
- '0x8da5cb62': {
153
- name: 'InsufficientBalance',
154
- params: ['currentBalance', 'requiredAmount'],
155
- userMessage: (params) => `InsufficientBalance: Insufficient balance: ${params.currentBalance} (required: ${params.requiredAmount})`
174
+ '0x1c3e0d9d': {
175
+ name: 'InvalidHandlerSelector',
176
+ params: ['selector'],
177
+ userMessage: (params) => `InvalidHandlerSelector: Invalid handler selector: ${params.selector}`
178
+ },
179
+ '0xa9f81b00': {
180
+ name: 'InvalidSValue',
181
+ params: ['s'],
182
+ userMessage: () => `InvalidSValue: Invalid signature s value`
183
+ },
184
+ '0x8da8a15b': {
185
+ name: 'InvalidVValue',
186
+ params: ['v'],
187
+ userMessage: (params) => `InvalidVValue: Invalid signature v value: ${params.v}`
156
188
  },
157
- // Function validation errors
158
- '0x8c5be1ee': {
189
+ '0xb840c203': {
190
+ name: 'ECDSAInvalidSignature',
191
+ params: ['recoveredSigner'],
192
+ userMessage: (params) => `ECDSAInvalidSignature: ECDSA recovery returned invalid signer: ${params.recoveredSigner}`
193
+ },
194
+ '0xc6ded982': {
195
+ name: 'GasPriceExceedsMax',
196
+ params: ['currentGasPrice', 'maxGasPrice'],
197
+ userMessage: (params) => `GasPriceExceedsMax: Gas price ${params.currentGasPrice} exceeds max ${params.maxGasPrice}`
198
+ },
199
+ // Resource and item (SharedValidation.sol)
200
+ '0x474d3baf': {
201
+ name: 'ResourceNotFound',
202
+ params: ['resource'],
203
+ userMessage: (params) => `ResourceNotFound: Resource ${params.resource} not found`
204
+ },
205
+ '0x430fab94': {
206
+ name: 'ResourceAlreadyExists',
207
+ params: ['resourceId'],
208
+ userMessage: (params) => `ResourceAlreadyExists: Resource ${params.resourceId} already exists`
209
+ },
210
+ '0xee809d50': {
211
+ name: 'CannotModifyProtected',
212
+ params: ['resourceId'],
213
+ userMessage: (params) => `CannotModifyProtected: Cannot modify protected resource ${params.resourceId}`
214
+ },
215
+ '0x0da9443d': {
216
+ name: 'ItemAlreadyExists',
217
+ params: ['item'],
218
+ userMessage: (params) => `ItemAlreadyExists: Item ${params.item} already exists`
219
+ },
220
+ '0x7a6318f1': {
221
+ name: 'ItemNotFound',
222
+ params: ['item'],
223
+ userMessage: (params) => `ItemNotFound: Item ${params.item} not found`
224
+ },
225
+ '0xf438c55f': {
226
+ name: 'InvalidOperation',
227
+ params: ['item'],
228
+ userMessage: (params) => `InvalidOperation: Invalid operation for item ${params.item}`
229
+ },
230
+ '0x5ca3be63': {
231
+ name: 'DefinitionNotIDefinition',
232
+ params: ['definition'],
233
+ userMessage: (params) => `DefinitionNotIDefinition: Address ${params.definition} is not an IDefinition contract`
234
+ },
235
+ // Role and function
236
+ '0xfc861e8c': {
237
+ name: 'RoleWalletLimitReached',
238
+ params: ['currentCount', 'maxWallets'],
239
+ userMessage: (params) => `RoleWalletLimitReached: Role wallet limit reached (${params.currentCount}/${params.maxWallets})`
240
+ },
241
+ '0xd2bbf46a': {
242
+ name: 'MaxWalletsZero',
243
+ params: ['provided'],
244
+ userMessage: () => `MaxWalletsZero: Max wallets must be greater than zero`
245
+ },
246
+ '0x405c16b9': {
247
+ name: 'ConflictingMetaTxPermissions',
248
+ params: ['functionSelector'],
249
+ userMessage: (params) => `ConflictingMetaTxPermissions: Conflicting meta-tx permissions for selector ${params.functionSelector}`
250
+ },
251
+ '0xbb8128de': {
252
+ name: 'InternalFunctionNotAccessible',
253
+ params: ['functionSelector'],
254
+ userMessage: (params) => `InternalFunctionNotAccessible: Internal function ${params.functionSelector} is not accessible`
255
+ },
256
+ '0x11269582': {
257
+ name: 'ContractFunctionMustBeProtected',
258
+ params: ['functionSelector'],
259
+ userMessage: (params) => `ContractFunctionMustBeProtected: Internal function (selector: ${params.functionSelector}) must be protected`
260
+ },
261
+ '0x1fe7e0ac': {
262
+ name: 'TargetNotWhitelisted',
263
+ params: ['target', 'functionSelector'],
264
+ userMessage: (params) => `TargetNotWhitelisted: Target ${params.target} is not whitelisted for function selector ${params.functionSelector}`
265
+ },
266
+ '0x2584c569': {
267
+ name: 'FunctionSelectorMismatch',
268
+ params: ['providedSelector', 'derivedSelector'],
269
+ userMessage: (params) => `FunctionSelectorMismatch: Selector mismatch (provided: ${params.providedSelector}, derived: ${params.derivedSelector})`
270
+ },
271
+ '0xc0baa221': {
159
272
  name: 'HandlerForSelectorMismatch',
160
273
  params: ['schemaHandlerForSelector', 'permissionHandlerForSelector'],
161
- userMessage: (params) => `HandlerForSelectorMismatch: Handler selector mismatch - schema handler: ${params.schemaHandlerForSelector}, permission handler: ${params.permissionHandlerForSelector}`
274
+ userMessage: (params) => `HandlerForSelectorMismatch: Handler selector mismatch - schema: ${params.schemaHandlerForSelector}, permission: ${params.permissionHandlerForSelector}`
162
275
  },
163
- '0x51d89ea2': {
164
- name: 'ContractFunctionMustBeProtected',
165
- params: ['functionSelector', 'functionSignature'],
166
- userMessage: (params) => `ContractFunctionMustBeProtected: Internal function ${params.functionSignature} (selector: ${params.functionSelector}) must be protected`
276
+ '0x2457cde7': {
277
+ name: 'InvalidRange',
278
+ params: ['from', 'to'],
279
+ userMessage: (params) => `InvalidRange: Invalid range (from: ${params.from}, to: ${params.to})`
280
+ },
281
+ '0x0364eed2': {
282
+ name: 'OperationFailed',
283
+ params: [],
284
+ userMessage: () => `OperationFailed: Operation failed`
285
+ },
286
+ // Payment and balance
287
+ '0x3c6b4b28': {
288
+ name: 'InvalidPayment',
289
+ params: [],
290
+ userMessage: () => `InvalidPayment: Invalid payment (e.g. wrong value or payment not allowed)`
291
+ },
292
+ '0xcf479181': {
293
+ name: 'InsufficientBalance',
294
+ params: ['currentBalance', 'requiredAmount'],
295
+ userMessage: (params) => `InsufficientBalance: Insufficient balance: ${params.currentBalance} (required: ${params.requiredAmount})`
296
+ },
297
+ '0xadca8d51': {
298
+ name: 'PaymentFailed',
299
+ params: ['recipient', 'amount', 'reason'],
300
+ userMessage: (params) => `PaymentFailed: Payment to ${params.recipient} for ${params.amount} failed`
167
301
  },
168
- // Array errors
169
- '0x8c5be1ed': {
302
+ // Array validation
303
+ '0xfa5dbe08': {
170
304
  name: 'ArrayLengthMismatch',
171
305
  params: ['array1Length', 'array2Length'],
172
306
  userMessage: (params) => `ArrayLengthMismatch: Array length mismatch: ${params.array1Length} vs ${params.array2Length}`
173
307
  },
174
- '0x5c60da23': {
308
+ '0x63a056dd': {
175
309
  name: 'IndexOutOfBounds',
176
310
  params: ['index', 'arrayLength'],
177
311
  userMessage: (params) => `IndexOutOfBounds: Index out of bounds: ${params.index} (array length: ${params.arrayLength})`
312
+ },
313
+ // System limits
314
+ '0xf80a4845': {
315
+ name: 'BatchSizeExceeded',
316
+ params: ['currentSize', 'maxSize'],
317
+ userMessage: (params) => `BatchSizeExceeded: Batch size ${params.currentSize} exceeds max ${params.maxSize}`
318
+ },
319
+ '0xc37aabb4': {
320
+ name: 'MaxRolesExceeded',
321
+ params: ['currentCount', 'maxRoles'],
322
+ userMessage: (params) => `MaxRolesExceeded: Role count ${params.currentCount} exceeds max ${params.maxRoles}`
323
+ },
324
+ '0x0c285f2e': {
325
+ name: 'MaxHooksExceeded',
326
+ params: ['currentCount', 'maxHooks'],
327
+ userMessage: (params) => `MaxHooksExceeded: Hook count ${params.currentCount} exceeds max ${params.maxHooks}`
328
+ },
329
+ '0x106e9da6': {
330
+ name: 'MaxFunctionsExceeded',
331
+ params: ['currentCount', 'maxFunctions'],
332
+ userMessage: (params) => `MaxFunctionsExceeded: Function count ${params.currentCount} exceeds max ${params.maxFunctions}`
333
+ },
334
+ '0x82289375': {
335
+ name: 'RangeSizeExceeded',
336
+ params: ['rangeSize', 'maxRangeSize'],
337
+ userMessage: (params) => `RangeSizeExceeded: Range size ${params.rangeSize} exceeds max ${params.maxRangeSize}`
178
338
  }
179
339
  };
340
+ /**
341
+ * ABI parameter types for decoding custom error args (selector -> viem parseAbiParameters string).
342
+ * Keys match ERROR_SIGNATURES; values are canonical ABI type strings for decodeAbiParameters.
343
+ * viem/abitype parseAbiParameters accepts type-only strings (e.g. 'address, bytes4'); names are optional.
344
+ */
345
+ export const ERROR_DECODE_TYPES = {
346
+ '0x8e4c8aa6': 'address',
347
+ '0x1c024b14': 'address, address',
348
+ '0xf027e09d': 'uint256',
349
+ '0xbcdedf97': 'uint256',
350
+ '0x0e6fd6e4': 'uint256, uint256',
351
+ '0x0ce5c69c': 'uint256, uint256',
352
+ '0xee142cd7': 'uint256, uint256',
353
+ '0x013cfafc': 'uint256, uint256',
354
+ '0xf37a3442': 'address',
355
+ '0x3975c914': 'address, bytes4',
356
+ '0x5f16a21a': 'address, address',
357
+ '0x14437a05': 'address, address, address',
358
+ '0x92e22b88': 'address, address',
359
+ '0xc26028e0': 'address, address',
360
+ '0x3b94fe24': 'address',
361
+ '0x7ae1eaa8': 'bytes4, bytes4',
362
+ '0x4ffe15c0': 'address, address',
363
+ '0xf364cb26': 'address, address',
364
+ '0xa0387940': '',
365
+ '0xc502078d': 'bytes32, bytes32',
366
+ '0x784a33af': '',
367
+ '0x10423d7c': 'uint8, uint8',
368
+ '0x0dc149f0': '',
369
+ '0x87138d5c': '',
370
+ '0x1efa143c': 'uint256, uint256',
371
+ '0xf5b20274': '',
372
+ '0xd615d706': 'uint256, uint256',
373
+ '0x2adfdc30': 'bytes',
374
+ '0x06427aeb': 'uint256, uint256',
375
+ '0x21967608': 'uint256, uint256',
376
+ '0x1c3e0d9d': 'bytes4',
377
+ '0xa9f81b00': 'bytes32',
378
+ '0x8da8a15b': 'uint8',
379
+ '0xb840c203': 'address',
380
+ '0xc6ded982': 'uint256, uint256',
381
+ '0x474d3baf': 'bytes32',
382
+ '0x430fab94': 'bytes32',
383
+ '0xee809d50': 'bytes32',
384
+ '0x0da9443d': 'address',
385
+ '0x7a6318f1': 'address',
386
+ '0xf438c55f': 'address',
387
+ '0x5ca3be63': 'address',
388
+ '0xfc861e8c': 'uint256, uint256',
389
+ '0xd2bbf46a': 'uint256',
390
+ '0x405c16b9': 'bytes4',
391
+ '0xbb8128de': 'bytes4',
392
+ '0x11269582': 'bytes4',
393
+ '0x1fe7e0ac': 'address, bytes4',
394
+ '0x2584c569': 'bytes4, bytes4',
395
+ '0xc0baa221': 'bytes4, bytes4',
396
+ '0x2457cde7': 'uint256, uint256',
397
+ '0x0364eed2': '',
398
+ '0x3c6b4b28': '',
399
+ '0xcf479181': 'uint256, uint256',
400
+ '0xadca8d51': 'address, uint256, bytes',
401
+ '0xfa5dbe08': 'uint256, uint256',
402
+ '0x63a056dd': 'uint256, uint256',
403
+ '0xf80a4845': 'uint256, uint256',
404
+ '0xc37aabb4': 'uint256, uint256',
405
+ '0x0c285f2e': 'uint256, uint256',
406
+ '0x106e9da6': 'uint256, uint256',
407
+ '0x82289375': 'uint256, uint256'
408
+ };
180
409
  /**
181
410
  * Common error patterns that can be extracted from revert data
182
411
  */
@@ -212,11 +441,44 @@ export const COMMON_ERROR_PATTERNS = [
212
441
  */
213
442
  export function decodeRevertReason(data) {
214
443
  try {
215
- // Ensure data is hex string without 0x prefix
444
+ // Ensure data is hex string without 0x prefix (normalize to lowercase for lookup)
216
445
  if (data.startsWith('0x')) {
217
446
  data = data.slice(2);
218
447
  }
219
- // Check if it starts with Error(string) selector (0x08c379a0)
448
+ data = data.toLowerCase();
449
+ // Try known custom error by 4-byte selector (before Error(string))
450
+ if (data.length >= 8) {
451
+ const selector = ('0x' + data.slice(0, 8));
452
+ const sig = ERROR_SIGNATURES[selector];
453
+ const types = ERROR_DECODE_TYPES[selector];
454
+ if (sig && (types === '' || types)) {
455
+ const paramNames = sig.params;
456
+ let params = {};
457
+ let decodeOk = true;
458
+ if (types) {
459
+ try {
460
+ const argsHex = '0x' + data.slice(8);
461
+ const decoded = decodeAbiParameters(parseAbiParameters(types), argsHex);
462
+ paramNames.forEach((name, i) => {
463
+ params[name] = decoded[i] !== undefined ? String(decoded[i]) : '';
464
+ });
465
+ }
466
+ catch (_) {
467
+ decodeOk = false;
468
+ }
469
+ }
470
+ if (decodeOk) {
471
+ const message = sig.userMessage(params);
472
+ return {
473
+ name: sig.name,
474
+ signature: selector,
475
+ params,
476
+ message
477
+ };
478
+ }
479
+ }
480
+ }
481
+ // Check if it starts with Error(string) selector (0x08c379a0); data already lowercased
220
482
  if (data.length >= 8 && data.startsWith('08c379a0')) {
221
483
  const stringData = data.slice(8); // Remove selector
222
484
  if (stringData.length < 64)
@@ -318,8 +580,9 @@ export function decodeRevertReason(data) {
318
580
  * @returns User-friendly error message
319
581
  */
320
582
  export function getUserFriendlyErrorMessage(error) {
321
- // Check if it's a known error signature
322
- const errorSignature = ERROR_SIGNATURES[error.signature];
583
+ // Check if it's a known error signature (normalize selector to lowercase for lookup)
584
+ const selectorKey = error.signature.toLowerCase();
585
+ const errorSignature = ERROR_SIGNATURES[selectorKey];
323
586
  if (errorSignature) {
324
587
  return errorSignature.userMessage(error.params);
325
588
  }
@@ -339,14 +602,18 @@ export function getUserFriendlyErrorMessage(error) {
339
602
  return `ItemAlreadyExists: Item ${error.params.item} already exists`;
340
603
  case 'ItemNotFound':
341
604
  return `ItemNotFound: Item ${error.params.item} not found`;
605
+ case 'DefinitionNotIDefinition':
606
+ return `DefinitionNotIDefinition: Address ${error.params.definition} is not an IDefinition contract`;
607
+ case 'InvalidPayment':
608
+ return 'InvalidPayment: Invalid payment (e.g. wrong value or payment not allowed)';
342
609
  case 'TargetNotWhitelisted':
343
- return `TargetNotWhitelisted: Target ${error.params.target} is not whitelisted for function selector ${error.params.functionSelector} and role ${error.params.roleHash}`;
610
+ return `TargetNotWhitelisted: Target ${error.params.target} is not whitelisted for function selector ${error.params.functionSelector}`;
344
611
  case 'ResourceNotFound':
345
612
  return `ResourceNotFound: Resource ${error.params.resource} not found`;
346
613
  case 'HandlerForSelectorMismatch':
347
614
  return `HandlerForSelectorMismatch: Handler selector mismatch - schema handler: ${error.params.schemaHandlerForSelector}, permission handler: ${error.params.permissionHandlerForSelector}`;
348
615
  case 'ContractFunctionMustBeProtected':
349
- return `ContractFunctionMustBeProtected: Internal function ${error.params.functionSignature} (selector: ${error.params.functionSelector}) must be protected`;
616
+ return `ContractFunctionMustBeProtected: Internal function (selector: ${error.params.functionSelector}) must be protected`;
350
617
  case 'PatternMatch':
351
618
  // For pattern matches, return a more descriptive message
352
619
  if (error.params.pattern === 'OWNER_ROLE') {
@@ -394,7 +661,7 @@ export function extractErrorInfo(revertData) {
394
661
  };
395
662
  }
396
663
  const userMessage = getUserFriendlyErrorMessage(error);
397
- const isKnownError = ERROR_SIGNATURES[error.signature] !== undefined;
664
+ const isKnownError = ERROR_SIGNATURES[error.signature.toLowerCase()] !== undefined;
398
665
  return {
399
666
  error,
400
667
  userMessage,
@@ -403,6 +670,7 @@ export function extractErrorInfo(revertData) {
403
670
  }
404
671
  export default {
405
672
  ERROR_SIGNATURES,
673
+ ERROR_DECODE_TYPES,
406
674
  COMMON_ERROR_PATTERNS,
407
675
  decodeRevertReason,
408
676
  getUserFriendlyErrorMessage,