@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.
- package/CHANGELOG.md +21 -0
- package/README.md +411 -376
- package/abi/AccountBlox.abi.json +1894 -1851
- package/abi/BaseStateMachine.abi.json +773 -822
- package/abi/CopyBlox.abi.json +1609 -0
- package/abi/EngineBlox.abi.json +562 -552
- package/abi/GuardController.abi.json +1597 -1609
- package/abi/GuardControllerDefinitions.abi.json +235 -199
- package/abi/IDefinition.abi.json +57 -47
- package/abi/RoleBlox.abi.json +2993 -2982
- package/abi/RuntimeRBAC.abi.json +841 -842
- package/abi/RuntimeRBACDefinitions.abi.json +212 -202
- package/abi/SecureBlox.abi.json +2752 -2752
- package/abi/SecureOwnable.abi.json +1365 -1349
- 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 -1330
- package/dist/abi/CopyBlox.abi.json +1609 -0
- package/dist/abi/EngineBlox.abi.json +862 -0
- package/dist/abi/GuardController.abi.json +2325 -2337
- 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 -1630
- package/dist/abi/RuntimeRBACDefinitions.abi.json +386 -0
- package/dist/abi/SecureBlox.abi.json +2753 -0
- package/dist/abi/SecureOwnable.abi.json +2735 -2719
- package/dist/abi/SecureOwnableDefinitions.abi.json +421 -0
- package/{abi → dist/abi}/SimpleRWA20.abi.json +52 -74
- package/{abi → dist/abi}/SimpleRWA20Definitions.abi.json +5 -0
- package/{abi → dist/abi}/SimpleVault.abi.json +54 -76
- 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/core/BaseStateMachine.d.ts +7 -8
- package/dist/contracts/core/BaseStateMachine.d.ts.map +1 -1
- package/dist/contracts/core/BaseStateMachine.js +77 -42
- package/dist/contracts/core/BaseStateMachine.js.map +1 -1
- package/dist/contracts/core/GuardController.d.ts +21 -14
- package/dist/contracts/core/GuardController.d.ts.map +1 -1
- package/dist/contracts/core/GuardController.js +18 -20
- package/dist/contracts/core/GuardController.js.map +1 -1
- package/dist/contracts/core/RuntimeRBAC.d.ts +5 -18
- package/dist/contracts/core/RuntimeRBAC.d.ts.map +1 -1
- package/dist/contracts/core/RuntimeRBAC.js +4 -21
- package/dist/contracts/core/RuntimeRBAC.js.map +1 -1
- package/dist/contracts/core/SecureOwnable.d.ts +14 -16
- package/dist/contracts/core/SecureOwnable.d.ts.map +1 -1
- package/dist/contracts/core/SecureOwnable.js +21 -24
- package/dist/contracts/core/SecureOwnable.js.map +1 -1
- package/dist/index.d.ts +32 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -26
- 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 +4 -6
- package/dist/interfaces/base.state.machine.index.d.ts.map +1 -1
- package/dist/interfaces/core.access.index.d.ts +4 -9
- package/dist/interfaces/core.access.index.d.ts.map +1 -1
- package/dist/interfaces/core.execution.index.d.ts +9 -12
- package/dist/interfaces/core.execution.index.d.ts.map +1 -1
- package/dist/interfaces/core.security.index.d.ts +4 -7
- package/dist/interfaces/core.security.index.d.ts.map +1 -1
- package/dist/interfaces/definition.index.d.ts +1 -1
- package/dist/interfaces/definition.index.d.ts.map +1 -1
- package/dist/interfaces/lib.index.d.ts +2 -2
- package/dist/interfaces/lib.index.d.ts.map +1 -1
- package/dist/lib/Definition.d.ts +2 -2
- package/dist/lib/Definition.d.ts.map +1 -1
- package/dist/lib/Definition.js +9 -2
- package/dist/lib/Definition.js.map +1 -1
- package/dist/lib/EngineBlox.d.ts +23 -48
- package/dist/lib/EngineBlox.d.ts.map +1 -1
- package/dist/lib/EngineBlox.js +61 -136
- package/dist/lib/EngineBlox.js.map +1 -1
- package/dist/lib/definitions/GuardControllerDefinitions.d.ts +21 -22
- package/dist/lib/definitions/GuardControllerDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/GuardControllerDefinitions.js +42 -39
- package/dist/lib/definitions/GuardControllerDefinitions.js.map +1 -1
- package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts +24 -27
- package/dist/lib/definitions/RuntimeRBACDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/RuntimeRBACDefinitions.js +42 -51
- 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 +7 -6
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +6 -5
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/types/base.state.machine.index.d.ts +4 -20
- package/dist/types/base.state.machine.index.d.ts.map +1 -1
- package/dist/types/base.state.machine.index.js +20 -40
- package/dist/types/base.state.machine.index.js.map +1 -1
- package/dist/types/core.access.index.d.ts +0 -16
- package/dist/types/core.access.index.d.ts.map +1 -1
- package/dist/types/core.access.index.js +2 -13
- package/dist/types/core.access.index.js.map +1 -1
- package/dist/types/core.execution.index.d.ts +9 -10
- package/dist/types/core.execution.index.d.ts.map +1 -1
- package/dist/types/core.execution.index.js +16 -13
- package/dist/types/core.execution.index.js.map +1 -1
- package/dist/types/core.security.index.d.ts +4 -6
- package/dist/types/core.security.index.d.ts.map +1 -1
- package/dist/types/core.security.index.js +23 -27
- package/dist/types/core.security.index.js.map +1 -1
- package/dist/types/definition.index.d.ts +8 -1
- 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 +7 -28
- package/dist/types/lib.index.d.ts.map +1 -1
- package/dist/types/lib.index.js +11 -34
- package/dist/types/lib.index.js.map +1 -1
- package/dist/types/meta-transaction.signatures.d.ts +10 -0
- package/dist/types/meta-transaction.signatures.d.ts.map +1 -0
- package/dist/types/meta-transaction.signatures.js +12 -0
- package/dist/types/meta-transaction.signatures.js.map +1 -0
- package/dist/types/meta-tx-signatures.d.ts +9 -0
- package/dist/types/meta-tx-signatures.d.ts.map +1 -0
- package/dist/types/meta-tx-signatures.js +11 -0
- package/dist/types/meta-tx-signatures.js.map +1 -0
- package/dist/utils/bitmap.d.ts +1 -1
- package/dist/utils/bitmap.d.ts.map +1 -1
- package/dist/utils/contract-errors.d.ts +111 -12
- package/dist/utils/contract-errors.d.ts.map +1 -1
- package/dist/utils/contract-errors.js +362 -113
- package/dist/utils/contract-errors.js.map +1 -1
- package/dist/utils/erc20/erc20Token.d.ts +1 -1
- package/dist/utils/erc20/erc20Token.d.ts.map +1 -1
- package/dist/utils/erc20/erc20Token.js +5 -1
- package/dist/utils/erc20/erc20Token.js.map +1 -1
- package/dist/utils/interface-ids.d.ts +5 -31
- package/dist/utils/interface-ids.d.ts.map +1 -1
- package/dist/utils/interface-ids.js +27 -88
- package/dist/utils/interface-ids.js.map +1 -1
- package/dist/utils/metaTx/metaTransaction.d.ts +110 -9
- package/dist/utils/metaTx/metaTransaction.d.ts.map +1 -1
- package/dist/utils/metaTx/metaTransaction.js +146 -26
- package/dist/utils/metaTx/metaTransaction.js.map +1 -1
- package/dist/utils/validations.d.ts +1 -1
- package/dist/utils/validations.d.ts.map +1 -1
- package/dist/utils/validations.js +12 -12
- package/dist/utils/validations.js.map +1 -1
- package/dist/utils/viem-error-handler.d.ts +1 -1
- package/dist/utils/viem-error-handler.d.ts.map +1 -1
- package/dist/utils/viem-error-handler.js +1 -1
- package/dist/utils/viem-error-handler.js.map +1 -1
- package/package.json +77 -71
- package/dist/contracts/BaseStateMachine.d.ts +0 -92
- package/dist/contracts/BaseStateMachine.d.ts.map +0 -1
- package/dist/contracts/BaseStateMachine.js +0 -263
- package/dist/contracts/BaseStateMachine.js.map +0 -1
- package/dist/contracts/GuardController.d.ts +0 -120
- package/dist/contracts/GuardController.d.ts.map +0 -1
- package/dist/contracts/GuardController.js +0 -150
- package/dist/contracts/GuardController.js.map +0 -1
- package/dist/contracts/RuntimeRBAC.d.ts +0 -40
- package/dist/contracts/RuntimeRBAC.d.ts.map +0 -1
- package/dist/contracts/RuntimeRBAC.js +0 -50
- package/dist/contracts/RuntimeRBAC.js.map +0 -1
- package/dist/contracts/SecureOwnable.d.ts +0 -41
- package/dist/contracts/SecureOwnable.d.ts.map +0 -1
- package/dist/contracts/SecureOwnable.js +0 -81
- 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
|
-
*
|
|
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`
|
|
49
50
|
},
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
'
|
|
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`
|
|
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
|
-
'
|
|
83
|
-
name: '
|
|
84
|
-
params: ['
|
|
85
|
-
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}`
|
|
86
101
|
},
|
|
87
|
-
'
|
|
88
|
-
name: '
|
|
89
|
-
params: ['
|
|
90
|
-
userMessage: (params) => `
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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: () => `
|
|
111
|
+
userMessage: () => `NotSupported: This operation is not supported`
|
|
102
112
|
},
|
|
103
|
-
'
|
|
104
|
-
name: '
|
|
105
|
-
params: ['
|
|
106
|
-
userMessage: (
|
|
113
|
+
'0xc502078d': {
|
|
114
|
+
name: 'InvalidOperationType',
|
|
115
|
+
params: ['actualType', 'expectedType'],
|
|
116
|
+
userMessage: () => `InvalidOperationType: Operation type does not match expected`
|
|
107
117
|
},
|
|
108
|
-
'
|
|
109
|
-
name: '
|
|
110
|
-
params: [
|
|
111
|
-
userMessage: (
|
|
118
|
+
'0x784a33af': {
|
|
119
|
+
name: 'ZeroOperationTypeNotAllowed',
|
|
120
|
+
params: [],
|
|
121
|
+
userMessage: () => `ZeroOperationTypeNotAllowed: Zero operation type is not allowed`
|
|
112
122
|
},
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
params:
|
|
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
|
-
'
|
|
120
|
-
name: '
|
|
121
|
-
params: [
|
|
122
|
-
userMessage: () => `
|
|
128
|
+
'0x0dc149f0': {
|
|
129
|
+
name: 'AlreadyInitialized',
|
|
130
|
+
params: [],
|
|
131
|
+
userMessage: () => `AlreadyInitialized: Contract is already initialized`
|
|
123
132
|
},
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
name: 'RoleDoesNotExist',
|
|
133
|
+
'0x87138d5c': {
|
|
134
|
+
name: 'NotInitialized',
|
|
127
135
|
params: [],
|
|
128
|
-
userMessage: () => `
|
|
136
|
+
userMessage: () => `NotInitialized: Contract is not initialized`
|
|
129
137
|
},
|
|
130
|
-
'
|
|
131
|
-
name: '
|
|
132
|
-
params: ['
|
|
133
|
-
userMessage: (params) => `
|
|
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
|
-
'
|
|
136
|
-
name: '
|
|
137
|
-
params: [
|
|
138
|
-
userMessage: (
|
|
143
|
+
'0xf5b20274': {
|
|
144
|
+
name: 'PendingSecureRequest',
|
|
145
|
+
params: [],
|
|
146
|
+
userMessage: () => `PendingSecureRequest: A secure request is already pending`
|
|
139
147
|
},
|
|
140
|
-
// Signature
|
|
141
|
-
'
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
params:
|
|
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
|
-
'
|
|
163
|
-
name: '
|
|
164
|
-
params: [],
|
|
165
|
-
userMessage: () => `
|
|
174
|
+
'0xa9f81b00': {
|
|
175
|
+
name: 'InvalidSValue',
|
|
176
|
+
params: ['s'],
|
|
177
|
+
userMessage: () => `InvalidSValue: Invalid signature s value`
|
|
166
178
|
},
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
params:
|
|
171
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
|
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}
|
|
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,
|