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