@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.
- package/README.md +377 -376
- package/abi/AccountBlox.abi.json +2679 -4500
- package/abi/BareBlox.abi.json +94 -0
- package/abi/BaseStateMachine.abi.json +798 -753
- package/abi/CopyBlox.abi.json +1609 -0
- package/abi/EngineBlox.abi.json +566 -576
- package/abi/GuardController.abi.json +1546 -2095
- package/abi/GuardControllerDefinitions.abi.json +416 -0
- package/abi/IDefinition.abi.json +57 -47
- package/abi/RoleBlox.abi.json +2993 -4208
- package/abi/RuntimeRBAC.abi.json +901 -959
- package/abi/RuntimeRBACDefinitions.abi.json +265 -81
- package/abi/SecureBlox.abi.json +2752 -3827
- package/abi/SecureOwnable.abi.json +1522 -2581
- package/abi/SecureOwnableDefinitions.abi.json +174 -164
- package/dist/abi/AccountBlox.abi.json +3978 -0
- package/dist/abi/BareBlox.abi.json +1378 -0
- package/dist/abi/BaseStateMachine.abi.json +1281 -1236
- package/dist/abi/CopyBlox.abi.json +1609 -0
- package/dist/abi/EngineBlox.abi.json +862 -0
- package/dist/abi/GuardController.abi.json +2328 -2877
- package/dist/abi/GuardControllerDefinitions.abi.json +416 -0
- package/dist/abi/IDefinition.abi.json +122 -112
- package/dist/abi/RoleBlox.abi.json +2994 -0
- package/dist/abi/RuntimeRBAC.abi.json +1629 -1687
- package/dist/abi/RuntimeRBACDefinitions.abi.json +386 -0
- package/dist/abi/SecureBlox.abi.json +2753 -0
- package/dist/abi/SecureOwnable.abi.json +2733 -3792
- package/dist/abi/SecureOwnableDefinitions.abi.json +421 -0
- package/{abi → dist/abi}/SimpleRWA20.abi.json +478 -1756
- package/{abi → dist/abi}/SimpleRWA20Definitions.abi.json +5 -0
- package/{abi → dist/abi}/SimpleVault.abi.json +648 -2214
- package/{abi → dist/abi}/SimpleVaultDefinitions.abi.json +5 -0
- package/dist/abi.d.ts +11 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +10 -0
- package/dist/abi.js.map +1 -0
- package/dist/contracts/{BaseStateMachine.d.ts → core/BaseStateMachine.d.ts} +20 -6
- package/dist/contracts/core/BaseStateMachine.d.ts.map +1 -0
- package/dist/contracts/{BaseStateMachine.js → core/BaseStateMachine.js} +88 -38
- package/dist/contracts/core/BaseStateMachine.js.map +1 -0
- package/dist/contracts/{GuardController.d.ts → core/GuardController.d.ts} +22 -15
- package/dist/contracts/core/GuardController.d.ts.map +1 -0
- package/dist/contracts/{GuardController.js → core/GuardController.js} +19 -21
- package/dist/contracts/core/GuardController.js.map +1 -0
- package/dist/contracts/core/RuntimeRBAC.d.ts +27 -0
- package/dist/contracts/core/RuntimeRBAC.d.ts.map +1 -0
- package/dist/contracts/core/RuntimeRBAC.js +33 -0
- package/dist/contracts/core/RuntimeRBAC.js.map +1 -0
- package/dist/contracts/{SecureOwnable.d.ts → core/SecureOwnable.d.ts} +5 -15
- package/dist/contracts/core/SecureOwnable.d.ts.map +1 -0
- package/dist/contracts/{SecureOwnable.js → core/SecureOwnable.js} +4 -23
- package/dist/contracts/core/SecureOwnable.js.map +1 -0
- package/dist/index.d.ts +8 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/interfaces/base.index.d.ts +10 -2
- package/dist/interfaces/base.index.d.ts.map +1 -1
- package/dist/interfaces/base.state.machine.index.d.ts +3 -2
- package/dist/interfaces/base.state.machine.index.d.ts.map +1 -1
- package/dist/interfaces/core.access.index.d.ts +2 -16
- package/dist/interfaces/core.access.index.d.ts.map +1 -1
- package/dist/interfaces/core.execution.index.d.ts +8 -11
- package/dist/interfaces/core.execution.index.d.ts.map +1 -1
- package/dist/interfaces/core.security.index.d.ts +1 -4
- package/dist/interfaces/core.security.index.d.ts.map +1 -1
- package/dist/interfaces/lib.index.d.ts +1 -1
- package/dist/interfaces/lib.index.d.ts.map +1 -1
- package/dist/lib/Definition.d.ts.map +1 -1
- package/dist/lib/Definition.js +2 -0
- package/dist/lib/Definition.js.map +1 -1
- package/dist/lib/EngineBlox.d.ts +17 -51
- package/dist/lib/EngineBlox.d.ts.map +1 -1
- package/dist/lib/EngineBlox.js +26 -110
- package/dist/lib/EngineBlox.js.map +1 -1
- package/dist/lib/definitions/GuardControllerDefinitions.d.ts +34 -7
- package/dist/lib/definitions/GuardControllerDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/GuardControllerDefinitions.js +62 -10
- package/dist/lib/definitions/GuardControllerDefinitions.js.map +1 -1
- package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts +48 -7
- package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/RuntimeRBACDefinitions.js +73 -10
- package/dist/lib/definitions/RuntimeRBACDefinitions.js.map +1 -1
- package/dist/lib/definitions/SecureOwnableDefinitions.d.ts +12 -7
- package/dist/lib/definitions/SecureOwnableDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/SecureOwnableDefinitions.js +25 -9
- package/dist/lib/definitions/SecureOwnableDefinitions.js.map +1 -1
- package/dist/lib/definitions/index.d.ts +6 -4
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +5 -4
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/types/base.state.machine.index.d.ts +0 -2
- package/dist/types/base.state.machine.index.d.ts.map +1 -1
- package/dist/types/base.state.machine.index.js +1 -3
- package/dist/types/base.state.machine.index.js.map +1 -1
- package/dist/types/core.execution.index.d.ts +1 -0
- package/dist/types/core.execution.index.d.ts.map +1 -1
- package/dist/types/core.execution.index.js +1 -0
- package/dist/types/core.execution.index.js.map +1 -1
- package/dist/types/core.security.index.d.ts.map +1 -1
- package/dist/types/core.security.index.js +2 -2
- package/dist/types/core.security.index.js.map +1 -1
- package/dist/types/definition.index.d.ts +7 -0
- package/dist/types/definition.index.d.ts.map +1 -1
- package/dist/types/definition.index.js.map +1 -1
- package/dist/types/lib.index.d.ts +0 -1
- package/dist/types/lib.index.d.ts.map +1 -1
- package/dist/types/lib.index.js +1 -2
- package/dist/types/lib.index.js.map +1 -1
- package/dist/utils/contract-errors.d.ts +125 -13
- package/dist/utils/contract-errors.d.ts.map +1 -1
- package/dist/utils/contract-errors.js +370 -107
- package/dist/utils/contract-errors.js.map +1 -1
- package/dist/utils/interface-ids.js +8 -8
- package/dist/utils/interface-ids.js.map +1 -1
- package/dist/utils/metaTx/metaTransaction.d.ts +103 -7
- package/dist/utils/metaTx/metaTransaction.d.ts.map +1 -1
- package/dist/utils/metaTx/metaTransaction.js +136 -25
- package/dist/utils/metaTx/metaTransaction.js.map +1 -1
- package/dist/utils/validations.d.ts.map +1 -1
- package/dist/utils/validations.js +10 -11
- package/dist/utils/validations.js.map +1 -1
- package/package.json +10 -6
- package/dist/contracts/BaseStateMachine.d.ts.map +0 -1
- package/dist/contracts/BaseStateMachine.js.map +0 -1
- package/dist/contracts/GuardController.d.ts.map +0 -1
- package/dist/contracts/GuardController.js.map +0 -1
- package/dist/contracts/RuntimeRBAC.d.ts +0 -54
- package/dist/contracts/RuntimeRBAC.d.ts.map +0 -1
- package/dist/contracts/RuntimeRBAC.js +0 -58
- package/dist/contracts/RuntimeRBAC.js.map +0 -1
- package/dist/contracts/SecureOwnable.d.ts.map +0 -1
- 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
|
-
*
|
|
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
|
|
20
|
-
'
|
|
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
|
-
'
|
|
26
|
-
name: '
|
|
27
|
-
params: ['
|
|
28
|
-
userMessage: (
|
|
25
|
+
'0x1c024b14': {
|
|
26
|
+
name: 'NotNewAddress',
|
|
27
|
+
params: ['newAddress', 'currentAddress'],
|
|
28
|
+
userMessage: () => `NotNewAddress: New address must be different from current address`
|
|
29
29
|
},
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
'
|
|
36
|
-
name: '
|
|
37
|
-
params: ['
|
|
38
|
-
userMessage: (
|
|
36
|
+
'0xbcdedf97': {
|
|
37
|
+
name: 'TimeLockPeriodZero',
|
|
38
|
+
params: ['provided'],
|
|
39
|
+
userMessage: () => `TimeLockPeriodZero: Time lock period must be greater than zero`
|
|
39
40
|
},
|
|
40
|
-
'
|
|
41
|
-
name: '
|
|
42
|
-
params: ['
|
|
43
|
-
userMessage: (
|
|
41
|
+
'0x0ce5c69c': {
|
|
42
|
+
name: 'MetaTxExpired',
|
|
43
|
+
params: ['deadline', 'currentTime'],
|
|
44
|
+
userMessage: () => `MetaTxExpired: Meta-transaction has expired`
|
|
44
45
|
},
|
|
45
|
-
'
|
|
46
|
-
name: '
|
|
47
|
-
params: ['
|
|
48
|
-
userMessage: () => `
|
|
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
|
|
51
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
87
|
+
'0x3b94fe24': {
|
|
67
88
|
name: 'SignerNotAuthorized',
|
|
68
89
|
params: ['signer'],
|
|
69
90
|
userMessage: (params) => `SignerNotAuthorized: Signer ${params.signer} is not authorized`
|
|
70
91
|
},
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
params:
|
|
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
|
-
'
|
|
78
|
-
name: '
|
|
79
|
-
params: ['
|
|
80
|
-
userMessage: (params) => `
|
|
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
|
-
'
|
|
83
|
-
name: '
|
|
84
|
-
params: ['
|
|
85
|
-
userMessage: (params) => `
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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: () => `
|
|
111
|
+
userMessage: () => `NotSupported: This operation is not supported`
|
|
97
112
|
},
|
|
98
|
-
'
|
|
99
|
-
name: '
|
|
100
|
-
params: ['
|
|
101
|
-
userMessage: (
|
|
113
|
+
'0xc502078d': {
|
|
114
|
+
name: 'InvalidOperationType',
|
|
115
|
+
params: ['actualType', 'expectedType'],
|
|
116
|
+
userMessage: () => `InvalidOperationType: Operation type does not match expected`
|
|
102
117
|
},
|
|
103
|
-
'
|
|
104
|
-
name: '
|
|
105
|
-
params: [
|
|
106
|
-
userMessage: (
|
|
118
|
+
'0x784a33af': {
|
|
119
|
+
name: 'ZeroOperationTypeNotAllowed',
|
|
120
|
+
params: [],
|
|
121
|
+
userMessage: () => `ZeroOperationTypeNotAllowed: Zero operation type is not allowed`
|
|
107
122
|
},
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
params:
|
|
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
|
-
'
|
|
115
|
-
name: '
|
|
116
|
-
params: [
|
|
117
|
-
userMessage: () => `
|
|
128
|
+
'0x0dc149f0': {
|
|
129
|
+
name: 'AlreadyInitialized',
|
|
130
|
+
params: [],
|
|
131
|
+
userMessage: () => `AlreadyInitialized: Contract is already initialized`
|
|
118
132
|
},
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
name: 'RoleDoesNotExist',
|
|
133
|
+
'0x87138d5c': {
|
|
134
|
+
name: 'NotInitialized',
|
|
122
135
|
params: [],
|
|
123
|
-
userMessage: () => `
|
|
136
|
+
userMessage: () => `NotInitialized: Contract is not initialized`
|
|
124
137
|
},
|
|
125
|
-
'
|
|
126
|
-
name: '
|
|
127
|
-
params: ['
|
|
128
|
-
userMessage: (params) => `
|
|
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
|
-
'
|
|
131
|
-
name: '
|
|
132
|
-
params: [
|
|
133
|
-
userMessage: (
|
|
143
|
+
'0xf5b20274': {
|
|
144
|
+
name: 'PendingSecureRequest',
|
|
145
|
+
params: [],
|
|
146
|
+
userMessage: () => `PendingSecureRequest: A secure request is already pending`
|
|
134
147
|
},
|
|
135
|
-
// Signature
|
|
136
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
params:
|
|
155
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
|
269
|
+
userMessage: (params) => `HandlerForSelectorMismatch: Handler selector mismatch - schema: ${params.schemaHandlerForSelector}, permission: ${params.permissionHandlerForSelector}`
|
|
162
270
|
},
|
|
163
|
-
'
|
|
164
|
-
name: '
|
|
165
|
-
params: ['
|
|
166
|
-
userMessage: (params) => `
|
|
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
|
|
169
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
|
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}
|
|
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
|
|
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,
|