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

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