@bloxchain/sdk 1.0.0-alpha.7 → 1.0.0

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 (169) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +411 -376
  3. package/abi/AccountBlox.abi.json +1894 -1851
  4. package/abi/BaseStateMachine.abi.json +773 -822
  5. package/abi/CopyBlox.abi.json +1609 -0
  6. package/abi/EngineBlox.abi.json +562 -552
  7. package/abi/GuardController.abi.json +1597 -1609
  8. package/abi/GuardControllerDefinitions.abi.json +235 -199
  9. package/abi/IDefinition.abi.json +57 -47
  10. package/abi/RoleBlox.abi.json +2993 -2982
  11. package/abi/RuntimeRBAC.abi.json +841 -842
  12. package/abi/RuntimeRBACDefinitions.abi.json +212 -202
  13. package/abi/SecureBlox.abi.json +2752 -2752
  14. package/abi/SecureOwnable.abi.json +1365 -1349
  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 -1330
  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 +2325 -2337
  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 -1630
  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 +2735 -2719
  29. package/dist/abi/SecureOwnableDefinitions.abi.json +421 -0
  30. package/{abi → dist/abi}/SimpleRWA20.abi.json +52 -74
  31. package/{abi → dist/abi}/SimpleRWA20Definitions.abi.json +5 -0
  32. package/{abi → dist/abi}/SimpleVault.abi.json +54 -76
  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/core/BaseStateMachine.d.ts +7 -8
  39. package/dist/contracts/core/BaseStateMachine.d.ts.map +1 -1
  40. package/dist/contracts/core/BaseStateMachine.js +77 -42
  41. package/dist/contracts/core/BaseStateMachine.js.map +1 -1
  42. package/dist/contracts/core/GuardController.d.ts +21 -14
  43. package/dist/contracts/core/GuardController.d.ts.map +1 -1
  44. package/dist/contracts/core/GuardController.js +18 -20
  45. package/dist/contracts/core/GuardController.js.map +1 -1
  46. package/dist/contracts/core/RuntimeRBAC.d.ts +5 -18
  47. package/dist/contracts/core/RuntimeRBAC.d.ts.map +1 -1
  48. package/dist/contracts/core/RuntimeRBAC.js +4 -21
  49. package/dist/contracts/core/RuntimeRBAC.js.map +1 -1
  50. package/dist/contracts/core/SecureOwnable.d.ts +14 -16
  51. package/dist/contracts/core/SecureOwnable.d.ts.map +1 -1
  52. package/dist/contracts/core/SecureOwnable.js +21 -24
  53. package/dist/contracts/core/SecureOwnable.js.map +1 -1
  54. package/dist/index.d.ts +32 -30
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +28 -26
  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 +4 -6
  61. package/dist/interfaces/base.state.machine.index.d.ts.map +1 -1
  62. package/dist/interfaces/core.access.index.d.ts +4 -9
  63. package/dist/interfaces/core.access.index.d.ts.map +1 -1
  64. package/dist/interfaces/core.execution.index.d.ts +9 -12
  65. package/dist/interfaces/core.execution.index.d.ts.map +1 -1
  66. package/dist/interfaces/core.security.index.d.ts +4 -7
  67. package/dist/interfaces/core.security.index.d.ts.map +1 -1
  68. package/dist/interfaces/definition.index.d.ts +1 -1
  69. package/dist/interfaces/definition.index.d.ts.map +1 -1
  70. package/dist/interfaces/lib.index.d.ts +2 -2
  71. package/dist/interfaces/lib.index.d.ts.map +1 -1
  72. package/dist/lib/Definition.d.ts +2 -2
  73. package/dist/lib/Definition.d.ts.map +1 -1
  74. package/dist/lib/Definition.js +9 -2
  75. package/dist/lib/Definition.js.map +1 -1
  76. package/dist/lib/EngineBlox.d.ts +23 -48
  77. package/dist/lib/EngineBlox.d.ts.map +1 -1
  78. package/dist/lib/EngineBlox.js +61 -136
  79. package/dist/lib/EngineBlox.js.map +1 -1
  80. package/dist/lib/definitions/GuardControllerDefinitions.d.ts +21 -22
  81. package/dist/lib/definitions/GuardControllerDefinitions.d.ts.map +1 -1
  82. package/dist/lib/definitions/GuardControllerDefinitions.js +42 -39
  83. package/dist/lib/definitions/GuardControllerDefinitions.js.map +1 -1
  84. package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts +24 -27
  85. package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts.map +1 -1
  86. package/dist/lib/definitions/RuntimeRBACDefinitions.js +42 -51
  87. package/dist/lib/definitions/RuntimeRBACDefinitions.js.map +1 -1
  88. package/dist/lib/definitions/SecureOwnableDefinitions.d.ts +12 -7
  89. package/dist/lib/definitions/SecureOwnableDefinitions.d.ts.map +1 -1
  90. package/dist/lib/definitions/SecureOwnableDefinitions.js +25 -9
  91. package/dist/lib/definitions/SecureOwnableDefinitions.js.map +1 -1
  92. package/dist/lib/definitions/index.d.ts +7 -6
  93. package/dist/lib/definitions/index.d.ts.map +1 -1
  94. package/dist/lib/definitions/index.js +6 -5
  95. package/dist/lib/definitions/index.js.map +1 -1
  96. package/dist/types/base.state.machine.index.d.ts +4 -20
  97. package/dist/types/base.state.machine.index.d.ts.map +1 -1
  98. package/dist/types/base.state.machine.index.js +20 -40
  99. package/dist/types/base.state.machine.index.js.map +1 -1
  100. package/dist/types/core.access.index.d.ts +0 -16
  101. package/dist/types/core.access.index.d.ts.map +1 -1
  102. package/dist/types/core.access.index.js +2 -13
  103. package/dist/types/core.access.index.js.map +1 -1
  104. package/dist/types/core.execution.index.d.ts +9 -10
  105. package/dist/types/core.execution.index.d.ts.map +1 -1
  106. package/dist/types/core.execution.index.js +16 -13
  107. package/dist/types/core.execution.index.js.map +1 -1
  108. package/dist/types/core.security.index.d.ts +4 -6
  109. package/dist/types/core.security.index.d.ts.map +1 -1
  110. package/dist/types/core.security.index.js +23 -27
  111. package/dist/types/core.security.index.js.map +1 -1
  112. package/dist/types/definition.index.d.ts +8 -1
  113. package/dist/types/definition.index.d.ts.map +1 -1
  114. package/dist/types/definition.index.js.map +1 -1
  115. package/dist/types/lib.index.d.ts +7 -28
  116. package/dist/types/lib.index.d.ts.map +1 -1
  117. package/dist/types/lib.index.js +11 -34
  118. package/dist/types/lib.index.js.map +1 -1
  119. package/dist/types/meta-transaction.signatures.d.ts +10 -0
  120. package/dist/types/meta-transaction.signatures.d.ts.map +1 -0
  121. package/dist/types/meta-transaction.signatures.js +12 -0
  122. package/dist/types/meta-transaction.signatures.js.map +1 -0
  123. package/dist/types/meta-tx-signatures.d.ts +9 -0
  124. package/dist/types/meta-tx-signatures.d.ts.map +1 -0
  125. package/dist/types/meta-tx-signatures.js +11 -0
  126. package/dist/types/meta-tx-signatures.js.map +1 -0
  127. package/dist/utils/bitmap.d.ts +1 -1
  128. package/dist/utils/bitmap.d.ts.map +1 -1
  129. package/dist/utils/contract-errors.d.ts +111 -12
  130. package/dist/utils/contract-errors.d.ts.map +1 -1
  131. package/dist/utils/contract-errors.js +362 -113
  132. package/dist/utils/contract-errors.js.map +1 -1
  133. package/dist/utils/erc20/erc20Token.d.ts +1 -1
  134. package/dist/utils/erc20/erc20Token.d.ts.map +1 -1
  135. package/dist/utils/erc20/erc20Token.js +5 -1
  136. package/dist/utils/erc20/erc20Token.js.map +1 -1
  137. package/dist/utils/interface-ids.d.ts +5 -31
  138. package/dist/utils/interface-ids.d.ts.map +1 -1
  139. package/dist/utils/interface-ids.js +27 -88
  140. package/dist/utils/interface-ids.js.map +1 -1
  141. package/dist/utils/metaTx/metaTransaction.d.ts +110 -9
  142. package/dist/utils/metaTx/metaTransaction.d.ts.map +1 -1
  143. package/dist/utils/metaTx/metaTransaction.js +146 -26
  144. package/dist/utils/metaTx/metaTransaction.js.map +1 -1
  145. package/dist/utils/validations.d.ts +1 -1
  146. package/dist/utils/validations.d.ts.map +1 -1
  147. package/dist/utils/validations.js +12 -12
  148. package/dist/utils/validations.js.map +1 -1
  149. package/dist/utils/viem-error-handler.d.ts +1 -1
  150. package/dist/utils/viem-error-handler.d.ts.map +1 -1
  151. package/dist/utils/viem-error-handler.js +1 -1
  152. package/dist/utils/viem-error-handler.js.map +1 -1
  153. package/package.json +77 -71
  154. package/dist/contracts/BaseStateMachine.d.ts +0 -92
  155. package/dist/contracts/BaseStateMachine.d.ts.map +0 -1
  156. package/dist/contracts/BaseStateMachine.js +0 -263
  157. package/dist/contracts/BaseStateMachine.js.map +0 -1
  158. package/dist/contracts/GuardController.d.ts +0 -120
  159. package/dist/contracts/GuardController.d.ts.map +0 -1
  160. package/dist/contracts/GuardController.js +0 -150
  161. package/dist/contracts/GuardController.js.map +0 -1
  162. package/dist/contracts/RuntimeRBAC.d.ts +0 -40
  163. package/dist/contracts/RuntimeRBAC.d.ts.map +0 -1
  164. package/dist/contracts/RuntimeRBAC.js +0 -50
  165. package/dist/contracts/RuntimeRBAC.js.map +0 -1
  166. package/dist/contracts/SecureOwnable.d.ts +0 -41
  167. package/dist/contracts/SecureOwnable.d.ts.map +0 -1
  168. package/dist/contracts/SecureOwnable.js +0 -81
  169. package/dist/contracts/SecureOwnable.js.map +0 -1
@@ -10,183 +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`
49
50
  },
50
- // Permission errors
51
- '0x8da5cb5d': {
51
+ '0x013cfafc': {
52
+ name: 'NewTimelockSame',
53
+ params: ['newPeriod', 'currentPeriod'],
54
+ userMessage: () => `NewTimelockSame: New timelock period must differ from current`
55
+ },
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`
76
- },
77
- '0x9da5cb60': {
78
- name: 'ItemNotFound',
79
- params: ['item'],
80
- userMessage: (params) => `ItemNotFound: Item ${params.item} not found`
92
+ '0x7ae1eaa8': {
93
+ name: 'MetaTxHandlerSelectorMismatch',
94
+ params: ['signedSelector', 'entrySelector'],
95
+ userMessage: (params) => `MetaTxHandlerSelectorMismatch: Signed handler ${params.signedSelector} does not match entrypoint ${params.entrySelector}`
81
96
  },
82
- '0x9da5cb63': {
83
- name: 'DefinitionNotIDefinition',
84
- params: ['definition'],
85
- userMessage: (params) => `DefinitionNotIDefinition: Address ${params.definition} is not an IDefinition contract`
97
+ '0x4ffe15c0': {
98
+ name: 'MetaTxHandlerContractMismatch',
99
+ params: ['signedContract', 'entryContract'],
100
+ userMessage: (params) => `MetaTxHandlerContractMismatch: Signed contract ${params.signedContract} does not match entry contract ${params.entryContract}`
86
101
  },
87
- '0x9da5cb61': {
88
- name: 'TargetNotWhitelisted',
89
- params: ['target', 'functionSelector', 'roleHash'],
90
- 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}`
91
106
  },
92
- '0x9da5cb62': {
93
- name: 'ResourceNotFound',
94
- params: ['resource'],
95
- userMessage: (params) => `ResourceNotFound: Resource ${params.resource} not found`
96
- },
97
- // Operation errors
98
- '0x8c5be1e9': {
99
- name: 'OperationNotSupported',
107
+ // Transaction and operation
108
+ '0xa0387940': {
109
+ name: 'NotSupported',
100
110
  params: [],
101
- userMessage: () => `OperationNotSupported: This operation is not supported`
111
+ userMessage: () => `NotSupported: This operation is not supported`
102
112
  },
103
- '0x5c60da1f': {
104
- name: 'RequestAlreadyPending',
105
- params: ['txId'],
106
- 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`
107
117
  },
108
- '0x8da5cb5f': {
109
- name: 'TransactionNotFound',
110
- params: ['txId'],
111
- userMessage: (params) => `TransactionNotFound: Transaction not found: ${params.txId}`
118
+ '0x784a33af': {
119
+ name: 'ZeroOperationTypeNotAllowed',
120
+ params: [],
121
+ userMessage: () => `ZeroOperationTypeNotAllowed: Zero operation type is not allowed`
112
122
  },
113
- // Time errors
114
- '0x8c5be1ea': {
115
- name: 'DeadlineInPast',
116
- params: ['deadline', 'currentTime'],
117
- 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}`
118
127
  },
119
- '0x5c60da20': {
120
- name: 'MetaTxExpired',
121
- params: ['deadline', 'currentTime'],
122
- userMessage: () => `MetaTxExpired: Meta-transaction has expired`
128
+ '0x0dc149f0': {
129
+ name: 'AlreadyInitialized',
130
+ params: [],
131
+ userMessage: () => `AlreadyInitialized: Contract is already initialized`
123
132
  },
124
- // Role errors
125
- '0x8da5cb60': {
126
- name: 'RoleDoesNotExist',
133
+ '0x87138d5c': {
134
+ name: 'NotInitialized',
127
135
  params: [],
128
- userMessage: () => `RoleDoesNotExist: Role does not exist`
136
+ userMessage: () => `NotInitialized: Contract is not initialized`
129
137
  },
130
- '0x8c5be1eb': {
131
- name: 'WalletAlreadyInRole',
132
- params: ['wallet'],
133
- 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})`
134
142
  },
135
- '0x5c60da21': {
136
- name: 'RoleWalletLimitReached',
137
- params: ['currentCount', 'maxWallets'],
138
- 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`
139
147
  },
140
- // Signature errors
141
- '0x8da5cb61': {
148
+ // Signature and meta-transaction
149
+ '0xd615d706': {
142
150
  name: 'InvalidSignatureLength',
143
151
  params: ['providedLength', 'expectedLength'],
144
152
  userMessage: (params) => `InvalidSignatureLength: Invalid signature length: ${params.providedLength} (expected: ${params.expectedLength})`
145
153
  },
146
- '0x8c5be1ec': {
154
+ '0x2adfdc30': {
155
+ name: 'InvalidSignature',
156
+ params: ['signature'],
157
+ userMessage: () => `InvalidSignature: Invalid signature`
158
+ },
159
+ '0x06427aeb': {
147
160
  name: 'InvalidNonce',
148
161
  params: ['providedNonce', 'expectedNonce'],
149
162
  userMessage: (params) => `InvalidNonce: Invalid nonce: ${params.providedNonce} (expected: ${params.expectedNonce})`
150
163
  },
151
- '0x5c60da22': {
164
+ '0x21967608': {
152
165
  name: 'ChainIdMismatch',
153
166
  params: ['providedChainId', 'expectedChainId'],
154
167
  userMessage: (params) => `ChainIdMismatch: Chain ID mismatch: ${params.providedChainId} (expected: ${params.expectedChainId})`
155
168
  },
156
- // Balance errors
157
- '0x8da5cb62': {
158
- name: 'InsufficientBalance',
159
- params: ['currentBalance', 'requiredAmount'],
160
- 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}`
161
173
  },
162
- '0x3c6b4b28': {
163
- name: 'InvalidPayment',
164
- params: [],
165
- userMessage: () => `InvalidPayment: Invalid payment (e.g. wrong value or payment not allowed)`
174
+ '0xa9f81b00': {
175
+ name: 'InvalidSValue',
176
+ params: ['s'],
177
+ userMessage: () => `InvalidSValue: Invalid signature s value`
166
178
  },
167
- // Function validation errors
168
- '0x8c5be1ee': {
169
- name: 'HandlerForSelectorMismatch',
170
- params: ['schemaHandlerForSelector', 'permissionHandlerForSelector'],
171
- userMessage: (params) => `HandlerForSelectorMismatch: Handler selector mismatch - schema handler: ${params.schemaHandlerForSelector}, permission handler: ${params.permissionHandlerForSelector}`
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`
199
+ },
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`
172
250
  },
173
251
  '0x11269582': {
174
252
  name: 'ContractFunctionMustBeProtected',
175
253
  params: ['functionSelector'],
176
254
  userMessage: (params) => `ContractFunctionMustBeProtected: Internal function (selector: ${params.functionSelector}) must be protected`
177
255
  },
178
- // Array errors
179
- '0x8c5be1ed': {
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': {
267
+ name: 'HandlerForSelectorMismatch',
268
+ params: ['schemaHandlerForSelector', 'permissionHandlerForSelector'],
269
+ userMessage: (params) => `HandlerForSelectorMismatch: Handler selector mismatch - schema: ${params.schemaHandlerForSelector}, permission: ${params.permissionHandlerForSelector}`
270
+ },
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`
296
+ },
297
+ // Array validation
298
+ '0xfa5dbe08': {
180
299
  name: 'ArrayLengthMismatch',
181
300
  params: ['array1Length', 'array2Length'],
182
301
  userMessage: (params) => `ArrayLengthMismatch: Array length mismatch: ${params.array1Length} vs ${params.array2Length}`
183
302
  },
184
- '0x5c60da23': {
303
+ '0x63a056dd': {
185
304
  name: 'IndexOutOfBounds',
186
305
  params: ['index', 'arrayLength'],
187
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}`
188
333
  }
189
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
+ };
190
404
  /**
191
405
  * Common error patterns that can be extracted from revert data
192
406
  */
@@ -222,11 +436,44 @@ export const COMMON_ERROR_PATTERNS = [
222
436
  */
223
437
  export function decodeRevertReason(data) {
224
438
  try {
225
- // Ensure data is hex string without 0x prefix
439
+ // Ensure data is hex string without 0x prefix (normalize to lowercase for lookup)
226
440
  if (data.startsWith('0x')) {
227
441
  data = data.slice(2);
228
442
  }
229
- // 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
230
477
  if (data.length >= 8 && data.startsWith('08c379a0')) {
231
478
  const stringData = data.slice(8); // Remove selector
232
479
  if (stringData.length < 64)
@@ -328,8 +575,9 @@ export function decodeRevertReason(data) {
328
575
  * @returns User-friendly error message
329
576
  */
330
577
  export function getUserFriendlyErrorMessage(error) {
331
- // Check if it's a known error signature
332
- 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];
333
581
  if (errorSignature) {
334
582
  return errorSignature.userMessage(error.params);
335
583
  }
@@ -354,7 +602,7 @@ export function getUserFriendlyErrorMessage(error) {
354
602
  case 'InvalidPayment':
355
603
  return 'InvalidPayment: Invalid payment (e.g. wrong value or payment not allowed)';
356
604
  case 'TargetNotWhitelisted':
357
- 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}`;
358
606
  case 'ResourceNotFound':
359
607
  return `ResourceNotFound: Resource ${error.params.resource} not found`;
360
608
  case 'HandlerForSelectorMismatch':
@@ -408,7 +656,7 @@ export function extractErrorInfo(revertData) {
408
656
  };
409
657
  }
410
658
  const userMessage = getUserFriendlyErrorMessage(error);
411
- const isKnownError = ERROR_SIGNATURES[error.signature] !== undefined;
659
+ const isKnownError = ERROR_SIGNATURES[error.signature.toLowerCase()] !== undefined;
412
660
  return {
413
661
  error,
414
662
  userMessage,
@@ -417,6 +665,7 @@ export function extractErrorInfo(revertData) {
417
665
  }
418
666
  export default {
419
667
  ERROR_SIGNATURES,
668
+ ERROR_DECODE_TYPES,
420
669
  COMMON_ERROR_PATTERNS,
421
670
  decodeRevertReason,
422
671
  getUserFriendlyErrorMessage,