# DALP-4000 to DALP-4049

Source: https://docs.settlemint.com/docs/api-reference/errors/error-code-reference/dalp-4000-4049
Cause, fix and retry flag for every on-chain contract error with a code from DALP-4000 to DALP-4049.

This page lists the 49 errors in the contract error reference with a code from DALP-4000 to DALP-4049. Match the error's `id`, or its `dalpCode` on a contract error or a failed deployment step, for example `DALP-4001`, to the DALP Code column, then read Retryable and Suggested Fix. The [contract error reference](https://docs.settlemint.com/docs/api-reference/errors/error-code-reference#how-to-use-this-reference) explains each column, including Severity, and the [DALP error index](https://docs.settlemint.com/docs/api-reference/errors) lists the page for every code range.

| DALP Code | Message | Why | Suggested Fix | Severity | Retryable | Solidity Error |
| --- | --- | --- | --- | --- | --- | --- |
| DALP-4001 | Authority address has no deployed contract code. | The `setAuthority` function checks that the new authority address contains deployed contract bytecode. The address supplied has no contract code, so the contract rejected the update. | Supply an address where an authority contract is already deployed. Passing a wallet address or an address with no contract at it will always revert. | error | No | `AccessManagedInvalidAuthority(address)` |
| DALP-4002 | Access managed required delay. | The OpenZeppelin AccessManager enforces a mandatory delay before certain restricted calls can execute. The caller (`{{caller}}`) triggered a function that requires waiting `{{delay}}` seconds after scheduling before it may proceed. | Schedule the operation first, wait for the required delay of `{{delay}}` seconds, then execute it. Use the AccessManager's `schedule` function and check the operation's execution window before calling. | error | No | `AccessManagedRequiredDelay(address,uint32)` |
| DALP-4003 | Access manager already deployed. | The factory deploys each token's access manager with CREATE2 at an address derived from the caller, the token name, symbol and decimals, and for custom assets the asset type name. An access manager already exists at that address. | Change the token name or symbol. The existing access manager stays at the address in the error. | error | No | `AccessManagerAlreadyDeployed(address)` |
| DALP-4004 | Access manager already scheduled. | The OpenZeppelin AccessManager's schedule function rejected this call because an operation with the same id is already scheduled and its scheduled timepoint has not expired. The operation id is derived from the caller and target pair together with the calldata. The contract blocks duplicate scheduling of the same pending operation. | Wait for the existing scheduled operation to either execute or expire before scheduling it again. You can check the current schedule timepoint by calling getSchedule with the operation id, or cancel the existing schedule first. | error | No | `AccessManagerAlreadyScheduled(bytes32)` |
| DALP-4005 | Access manager bad confirmation. | The OpenZeppelin AccessManager's renounceRole function requires the caller to pass their own address as the callerConfirmation argument. The address supplied does not match the address of the account that sent the transaction. | Call renounceRole again and pass your own wallet address as the callerConfirmation argument. The value must exactly match the address that signs and sends the transaction. | error | No | `AccessManagerBadConfirmation()` |
| DALP-4006 | Scheduled operation deadline expired. | You submitted the scheduled operation (`{{operationId}}`) to the AccessManager after its execution window had already closed. Scheduled operations must execute within the allowed time window. | Re-schedule the operation to obtain a fresh execution window, then execute it before the window expires. | error | No | `AccessManagerExpired(bytes32)` |
| DALP-4007 | AccessManager deployed with a zero initial admin address. | The AccessManager constructor requires a non-zero address for the initial admin. The address supplied was the zero address (0x000...000), so the contract cannot grant the ADMIN_ROLE to any account. | Provide a valid, non-zero wallet or contract address as the initial admin when deploying the AccessManager. The address must be a real account that will hold the ADMIN_ROLE. | error | No | `AccessManagerInvalidInitialAdmin(address)` |
| DALP-4008 | Access manager locked role. | Role `{{roleId}}` is a locked administrative role in the AccessManager. The AccessManager protects this role from configuration changes. | Choose a different role ID that the AccessManager allows to be modified, or contact the system administrator if you believe this restriction needs to change at the governance level. | error | No | `AccessManagerLockedRole(uint64)` |
| DALP-4009 | Access manager not configured. | The token sale contract requires an AccessManager on the subject token before role checks can run. The token's access manager address is zero, meaning no one has set an access manager for it. | Ensure the subject token has an access manager deployed and configured before creating or interacting with a token sale for that token. | error | No | `AccessManagerNotConfigured()` |
| DALP-4010 | Access manager not ready. | The scheduled operation (`{{operationId}}`) exists in the AccessManager, but its delay period has not elapsed. The AccessManager blocks execution until the scheduled time arrives. | Wait until the scheduled execution window opens for operation `{{operationId}}`, then retry. Check the AccessManager for the exact scheduled timestamp. | error | No | `AccessManagerNotReady(bytes32)` |
| DALP-4011 | Access manager not scheduled. | The operation (`{{operationId}}`) has not been scheduled in the AccessManager. Executing or cancelling a delayed operation requires scheduling it first. | Call `schedule` on the AccessManager for this operation before attempting to execute or cancel it. | error | No | `AccessManagerNotScheduled(bytes32)` |
| DALP-4012 | Access manager unauthorized account. | The account (`{{msgsender}}`) does not hold role `{{roleId}}` in the AccessManager and is therefore not permitted to call the restricted function. | Request that an AccessManager admin grant role `{{roleId}}` to your address, or use an address that already holds the required role. | error | No | `AccessManagerUnauthorizedAccount(address,uint64)` |
| DALP-4013 | Access manager unauthorized call. | The caller (`{{caller}}`) attempted to call a function on target contract (`{{target}}`) with selector `{{selector}}`, but the AccessManager has no permission granting access to that call. | Ensure the AccessManager has a permission configured that allows your address (or role) to call the target function. Contact the system administrator to grant the necessary permission. | error | No | `AccessManagerUnauthorizedCall(address,address,bytes4)` |
| DALP-4014 | Access manager unauthorized cancel. | The OpenZeppelin AccessManager contract received a cancel request from an account that is not permitted to cancel this scheduled operation. Only the original caller or an account with the appropriate admin role may cancel a pending operation. | Retry the cancel from the account that originally scheduled the operation, or from an account holding the admin role that governs the target function. | error | No | `AccessManagerUnauthorizedCancel(address,address,address,bytes4)` |
| DALP-4015 | Access manager unauthorized consume. | The OpenZeppelin AccessManager blocked an attempt to consume a scheduled operation because the consuming target does not match the target the operation recorded at scheduling time. | Ensure the contract consuming the scheduled operation is the same target address that the operation recorded when scheduled. | error | No | `AccessManagerUnauthorizedConsume(address)` |
| DALP-4016 | Account implementation not set. | The directory does not have an account implementation address registered. The account proxy resolves its logic contract from the directory at call time, and found a zero address for the ACCOUNT key. | Register a valid account implementation address in the directory before deploying or calling through an account proxy. | error | No | `AccountImplementationNotSet()` |
| DALP-4017 | Account unauthorized. | The call reached the account contract from an address that is neither the configured EntryPoint nor the resolved canonical EntryPoint. The account only accepts UserOperation calls from its bound EntryPoint. | Submit this operation through the EntryPoint that is bound to this account. Direct calls to restricted account functions are not permitted. | error | No | `AccountUnauthorized(address)` |
| DALP-4018 | Accrual already closed. | Yield accrual for this holder address is already in a closed state. The fixed treasury yield feature records a closed flag per holder and blocks a second close on the same holder. | Check the holder's accrual status before calling closeAccrual. Nothing further is required if accrual is already closed. | error | No | `AccrualAlreadyClosed(address)` |
| DALP-4019 | Addon registry implementation not set. | The system cannot create or operate an addon registry because no logic contract address has been set for it. The system checked the addon registry implementation slot and found a zero address. An update that sets the address to zero is refused with the same error. | Configure a non-zero addon registry implementation address in the system before attempting to bootstrap or use the addon registry. | error | No | `AddonRegistryImplementationNotSet()` |
| DALP-4020 | Address already deployed. | A system addon factory or a token factory already deployed a contract at this CREATE2 address. | Change the inputs the address derives from. For a token, these are its name, symbol and decimals. | error | No | `AddressAlreadyDeployed(address)` |
| DALP-4021 | Address already on bypass list. | A call to the compliance contract named an address that is already on the compliance bypass list. DALP's factories check the list before they add an address, so the call came from a Compliance manager or from a custom token factory or add-on that a System manager registered or pointed at new code. | The list did not change and the address is already on it. Retrying changes nothing. To find out who made the call, read which account called the compliance contract in the transaction's call trace. | error | No | `AddressAlreadyOnBypassList(address)` |
| DALP-4022 | Address not in trusted issuer list. | The trusted issuer address you are trying to remove was not found in the registry list. The contract scans the list and reverts when no matching entry exists. | Confirm that the trusted issuer registry currently holds this address before you attempt to remove it. | error | No | `AddressNotFoundInList(address)` |
| DALP-4023 | Address not on bypass list. | A call to the compliance contract tried to remove an address that is not on the compliance bypass list. DALP's own factories never remove an address from the list, so the call came from a Compliance manager or from a custom token factory or add-on that a System manager registered or pointed at new code. | The list did not change and the address is not on it. Retrying changes nothing. To find out who made the call, read which account called the compliance contract in the transaction's call trace. | error | No | `AddressNotOnBypassList(address)` |
| DALP-4024 | Already archived. | The registration under this key is already archived, and a second archive call is blocked. | Confirm the current state of the registration before calling archive. No further step is required if the entry already carries the archived state. | error | No | `AlreadyArchived(bytes32)` |
| DALP-4025 | Already distributed. | The push airdrop contract already recorded a non-zero claimed amount for this index, which means the contract already distributed tokens for it. The contract blocks a second distribution for the same index. | Each airdrop index supports one distribution. Verify the contract has not already processed this index before you submit the distribution request. | error | No | `AlreadyDistributed()` |
| DALP-4026 | Already initialized. | The contract or feature already completed initialization. This guard prevents a second initialization call from overwriting the configured state. | The contract supports one initialization per deployment. Check whether the contract already ran initialization before calling the initialize function. | error | No | `AlreadyInitialized()` |
| DALP-4027 | Already matured. | The token is already matured. `mature()` and `matureEarly()` run once. The treasury cannot change after maturity. | Read `isMatured()` first. To fund redemptions after maturity, send the denomination asset to the current treasury address. | error | No | `AlreadyMatured()` |
| DALP-4028 | Key already registered. | The directory already has an entry under this key. Token types, compliance modules, addons, implementation keys and instance keys are each registered once. | Use a unique registration key. Retrieve the existing entry if you need to reference the already-registered resource. | error | No | `AlreadyRegistered(bytes32)` |
| DALP-4029 | Ambiguous interest provider. | During conversion, the contract resolved `{{providerCount}}` interest providers and could not determine which one to use. Configure the conversion feature with an explicit interest provider so that resolution selects exactly one. | Configure the conversion feature with an explicit interest provider so that resolution is unambiguous before triggering conversion. | error | No | `AmbiguousInterestProvider(uint256)` |
| DALP-4030 | Amount exceeds int256 max. | One of the settlement flow amounts exceeds the maximum value representable as a signed 256-bit integer. The XvP settlement uses signed integers to compute net positions, so all flow amounts must fit within that range. | Reduce the flow amount so that it does not exceed 2^255 - 1 before submitting the settlement. | error | No | `AmountExceedsInt256Max()` |
| DALP-4031 | Identity verification module `AND` or `OR` node needs two operands. | The identity verification compliance expression contains an `AND` or `OR` node that does not have at least two operands on the evaluation stack at that point. The expression has a structural problem at that node. | Correct the expression so that every `AND` or `OR` node follows at least two TOPIC or sub-expression nodes. Validate the expression structure before submitting it. | error | No | `AndOrOperationRequiresTwoOperands()` |
| DALP-4032 | Identity verification library `AND` or `OR` node needs two operands. | The identity verification expression passed to IdentityVerificationLib contains an `AND` or `OR` operation node that does not have at least two operands on the evaluation stack at that position. | Ensure that at least two TOPIC or sub-expression result nodes appear before each `AND` or `OR` node in the expression. Review the expression structure and resubmit. | error | No | `AndOrOperationsRequireTwoOperands()` |
| DALP-4033 | Approval already exists. | An active, unexpired approval for this exact token, sender identity, recipient identity, and amount already exists; a different approver created it. The contract prevents duplicate approvals from separate approvers for the same transfer parameters. | Check for an existing active approval for these transfer parameters. Either use the existing approval or wait for it to expire before creating a new one from a different approver. | error | No | `ApprovalAlreadyExists()` |
| DALP-4034 | Approval already used. | A previous transfer already consumed the transfer approval record for this sender-to-recipient pair. Each approval is single-use: once a transfer succeeds, the contract records the approval as used and blocks any further transfer against it. | Request a new transfer approval for this sender-to-recipient pair and token amount, then resubmit the transfer. | error | No | `ApprovalAlreadyUsed()` |
| DALP-4035 | Transfer approval expired. | The transfer approval record for this sender-to-recipient pair has passed its expiry timestamp. The contract enforces that you consume approvals before their deadline. | Request a fresh transfer approval with a suitable expiry, then resubmit the transfer before that expiry passes. | error | No | `ApprovalExpired()` |
| DALP-4036 | Approval required. | No transfer approval record exists for this sender-to-recipient pair and token amount. The token's transfer compliance module requires an explicit approval to be on-chain before the transfer can proceed. | Create a transfer approval for the sender identity, recipient identity, and exact token amount, then resubmit the transfer. | error | No | `ApprovalRequired()` |
| DALP-4037 | Archive not registered. | The registration key you supplied does not correspond to any registered system addon. The contract requires the addon to exist in the registry before you can archive it. | Verify the registration key against the addon registry and resubmit with a key that matches an existing registered addon. | error | No | `ArchiveNotRegistered(bytes32)` |
| DALP-4038 | Array length mismatch. | Two input arrays passed to this call have different lengths. The contract requires all array parameters to be the same length so each element maps to a corresponding element in the other arrays. | Ensure all array arguments have equal length and resubmit the call. | error | No | `ArrayLengthMismatch()` |
| DALP-4039 | Array length mismatch. | Two arrays in a batch call have different lengths. Batch registrations of topic schemes, system addons and token factories pair each entry with the entry at the same position. | Send arrays of equal length. This call sent `{{namesLength}}` and `{{signaturesLength}}` entries. | error | No | `ArrayLengthMismatch(uint256,uint256)` |
| DALP-4040 | Associated contract not set. | The on-chain identity contract has no associated contract address configured. The issueClaimTo path requires a non-zero associated contract address before you can issue claims on behalf of a contract. | Configure the associated contract address on this identity contract before calling claim issuance operations. | error | No | `AssociatedContractNotSet()` |
| DALP-4041 | Authorization contract already registered. | The claim authorization contract at the supplied address is already present in the registry. The registry accepts each authorization contract only once. | Remove the existing registration for this contract before re-registering it, or supply a different authorization contract address. | error | No | `AuthorizationContractAlreadyRegistered(address)` |
| DALP-4042 | Authorization contract not registered. | The claim authorization contract at the supplied address is not present in the registry. The contract requires a registration to exist before you can remove it. | Register the authorization contract before attempting to remove it, or verify the correct contract address. | error | No | `AuthorizationContractNotRegistered(address)` |
| DALP-4043 | Batch size exceeds limit. | The number of entries in the batch exceeds the airdrop contract's maximum of 100. | Split the batch into segments of 100 entries or fewer and submit each segment separately. | error | No | `BatchSizeExceedsLimit()` |
| DALP-4044 | Below min conversion amount. | The conversion amount you submitted is below the token's minimum conversion threshold. The contract checks that the amount you want to convert meets or exceeds the configured minimum before proceeding. | Increase the conversion amount to at least the minimum required. The current minimum is `{{minimum}}` and your amount was `{{amount}}`. | error | No | `BelowMinConversionAmount(uint256,uint256)` |
| DALP-4045 | Buyer not eligible. | The buyer's wallet does not pass the token's compliance check. The token sale delegates eligibility to the token's on-chain compliance module, which returned false for this buyer and amount. | Verify that the buyer's identity has the required compliance claims and that the purchase amount is within the allowed limits for this buyer, then retry. | error | No | `BuyerNotEligible()` |
| DALP-4046 | Caller not factory. | Only the factory contract that deployed this XvP settlement or trading venue may call this function. The caller's address does not match the stored factory address. | Route this call through the factory contract that created this settlement, or verify you are calling the correct settlement address. | error | No | `CallerNotFactory()` |
| DALP-4047 | Cancel not allowed. | The settlement cannot be cancelled in its current state. Cancellation is blocked either because the contract has already recorded a revealed HTLC secret, or because the settlement holds external flows with full approval but has not collected unanimous cancel votes. | If the secret remains unrevealed and the settlement has external flows, use proposeCancel to submit a cancel vote. Each local participant must vote before the contract cancels the settlement. | error | No | `CancelNotAllowed()` |
| DALP-4048 | Cancel vote already cast. | This participant has already submitted a cancel vote for this settlement. The contract records one cancel vote per participant and rejects duplicate votes. | Withdraw the existing cancel vote with withdrawCancelProposal before casting a new one, or proceed without re-voting. | error | No | `CancelVoteAlreadyCast(address)` |
| DALP-4049 | Cancel vote not cast. | The contract holds no cancel vote from this participant for this settlement. Withdrawing a cancel vote requires that you previously submitted one via proposeCancel. | Submit a cancel vote with proposeCancel before attempting to withdraw it. | error | No | `CancelVoteNotCast(address)` |

The previous page is [DALP-3000 to DALP-3999](https://docs.settlemint.com/docs/api-reference/errors/error-code-reference/dalp-3000-3999). The next page is [DALP-4050 to DALP-4099](https://docs.settlemint.com/docs/api-reference/errors/error-code-reference/dalp-4050-4099).
