# DALP-4400 to DALP-4499

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

This page lists the 97 errors in the contract error reference with a code from DALP-4400 to DALP-4499. Match the error's `id`, or its `dalpCode` on a contract error or a failed deployment step, for example `DALP-4400`, 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-4400 | The account `{{account}}` does not have the required role to perform this operation. | Account `{{account}}` does not hold the role this function requires, in the contract or in the access manager it defers to. | Ask an administrator of this contract to grant account `{{account}}` the role the function requires. | error | No | `AccessControlUnauthorizedAccount(address,bytes32)` |
| DALP-4401 | Only the owner of this resource can perform this operation. | The function is restricted to the contract owner, and the calling address is not the owner recorded on-chain. | Send the call from the owner address, or ask the owner to run the operation. | error | No | `OwnableUnauthorizedAccount(address)` |
| DALP-4402 | The calling address is not permitted to perform this operation. | The contract delegates authorization to an external access manager, and that manager has determined the calling address is not permitted to call this function. The restriction is set at the access manager level, not within the token contract itself. | Contact your administrator to request access. | error | No | `AccessManagedUnauthorized(address)` |
| DALP-4404 | System already set. | The contract already has a non-zero DALPSystem proxy address stored. The contract permits this reference only once to prevent silent redirection. | The system reference is write-once after initial setup. If you need to point to a different system, re-deploy the compliance contract. Verify the currently configured system address before attempting to set it again. | error | No | `SystemAlreadySet()` |
| DALP-4405 | System not set. | The compliance contract tried to resolve the compliance module registry, but no DALPSystem proxy address has been configured yet. The registry address flows through the system proxy and the contract cannot resolve it without one. | Call setSystem on the compliance contract with the DALPSystem proxy address before attempting registry-dependent operations. Perform this one-time initialization during platform setup. | error | No | `SystemNotSet()` |
| DALP-4406 | Scope expression too complex. | The compliance module scope being set contains at least one expression array that exceeds 32 nodes, or a country list that exceeds 250 entries. The contract enforces these limits to keep on-chain evaluation within gas bounds. | Reduce each expression array in the module scope to 32 nodes or fewer and each country inclusion or exclusion list to 250 entries or fewer. | error | No | `ScopeExpressionTooComplex()` |
| DALP-4407 | Management keys not supported. | The identity implementation deployed at this proxy does not support the V2 interface required for management keys. Management keys can only be set on identities backed by a V2-compatible implementation. | Deploy the identity proxy without management keys when using a V1 implementation, or upgrade to an implementation that supports the IDALPContractIdentityV2 interface before providing management keys. | error | No | `ManagementKeysNotSupported()` |
| DALP-4408 | Config immutable. | The CapitalRaiseLimit compliance module already has a configuration set from its first initialization, and the module policy locks that configuration permanently. The contract blocks any subsequent updateConfig call. | Deploy a new module instance with the parameters you need. | error | No | `ConfigImmutable()` |
| DALP-4409 | Binding already active. | The binding for this instance address is already active. | No action is needed. The binding is already active. | error | No | `BindingAlreadyActive(address)` |
| DALP-4410 | Binding already inactive. | The binding for this instance address is already inactive. | No action is needed. The binding is already inactive. | error | No | `BindingAlreadyInactive(address)` |
| DALP-4411 | Binding not active. | The compliance module binding for the given instance address exists in the registry but has a disabled state. Operations such as reconfiguring the module or updating its scope require an active binding, so the contract blocks the call until you re-enable it. | Call `enableModule` with the instance address, then retry. | error | No | `BindingNotActive(address)` |
| DALP-4412 | Compliance module binding not found. | The compliance module registry holds no record for the given instance address. The contract looks up the binding by address and finds no type identifier, meaning you never installed this module or it has already been fully uninstalled. | Verify that the instance address is correct and that the compliance module has been installed on the token. Install the module first if you have not registered it. | error | No | `BindingNotFound(address)` |
| DALP-4413 | Caller cannot set the OnchainID on this account. | The caller of setOnchainID does not satisfy authorization from any validator installed on the account. Single-owner validators require the recorded EOA owner to call directly. Threshold validators require the call to arrive as a UserOp self-call so a quorum check runs first. | Call setOnchainID from the authorized owner address, or route the call through a UserOp self-call if the account uses a threshold validator. Confirm which validator is installed on the account and satisfy its canManage check. | error | No | `UnauthorizedOnchainIDSetter(address)` |
| DALP-4414 | Caller `{{caller}}` is not authorized to create management keys for contract `{{contractAddress}}`. | The caller (`{{caller}}`) does not hold the authorization required to create management keys for the contract identity at `{{contractAddress}}`. Contract identity creation with management keys requires an authorized signer. | Use an authorized contract-management signer or ask an administrator to create the contract identity. | error | No | `UnauthorizedContractManagementKeys(address,address)` |
| DALP-4415 | Caller `{{caller}}` is not authorized to create an identity for wallet `{{wallet}}`. | The identity factory requires that the wallet creates its own on-chain identity by calling as itself. Caller `{{caller}}` attempted to create the identity for wallet `{{wallet}}`, but the factory accepts direct creation only when the caller and the wallet address match. This prevents any third party from pre-claiming a wallet's CREATE2 identity slot. | Call `createIdentity` as the wallet itself, or have the wallet sign a `createIdentityWithManagementKeyAuthorization` that a relayer then submits. | error | No | `UnauthorizedWalletManagementKeys(address,address)` |
| DALP-4416 | Account onchain id mismatch. | The account at the computed address already stores an ONCHAINID that does not match the expectedOnchainID you supplied in the creation parameters. The factory validates this when you supply a non-zero expectedOnchainID. | Supply the correct expectedOnchainID that matches the ONCHAINID already recorded on the existing account, or omit expectedOnchainID if you do not need to enforce an identity match. | error | No | `AccountOnchainIDMismatch(address,address,address)` |
| DALP-4417 | Account creation authorization deadline expired. | The authorization you supplied carries a deadline that has already passed. The factory checks block.timestamp against the deadline encoded in the authorization parameters and rejects the call when the deadline is in the past. | Request a new account creation authorization signed with a future deadline, then resubmit the call before that deadline passes. | error | No | `ExpiredAccountCreationAuthorization(uint256)` |
| DALP-4418 | Account creation authorization signature does not recover the required owner. | The account factory verified the EIP-712 authorization signature and recovered a signer address that does not match the required owner address. The signature is from a different key than expected. | Have the correct owner sign a fresh account creation authorization and resubmit. | error | No | `InvalidAccountCreationAuthorization(address,address)` |
| DALP-4419 | Unexpected validator init data. | You submitted account creation with non-empty validatorInitData but provided no explicit validator address. When you use the default validator, the factory sets the init data automatically and does not accept caller-supplied init data. | Remove the validatorInitData from the request when creating an account with the default validator, or supply an explicit validator address that accepts the provided init data. | error | No | `UnexpectedValidatorInitData()` |
| DALP-4420 | Empty batch. | A batch call arrived with an empty list. | Include at least one entry in the batch before submitting. | error | No | `EmptyBatch()` |
| DALP-4421 | Conversion trigger expiry timestamp is in the past. | When a non-zero expiry is provided, the contract requires it to be strictly in the future. The supplied `expiresAt` value refers to a time that has already passed. | Set `expiresAt` to a future timestamp, or pass zero to create a trigger that never expires. | error | No | `InvalidExpiry(uint256)` |
| DALP-4422 | The authorized converter must be a conversion feature. | When authorizing a converter address on the minter feature, the contract verifies via ERC-165 introspection that the address implements the IConversionFeature interface. The address at `{{converter}}` did not return a positive response to the interface check, so the contract rejected the authorization. | Select a loan token conversion feature address that supports IConversionFeature, then retry. | error | No | `NotAConversionFeature(address)` |
| DALP-4423 | This transfer is more than the remaining approved allowance. | The transfer approval record for the sender-recipient pair has a remaining allowance that is smaller than the requested transfer amount. The contract enforces that the approval covers the full amount before permitting the transfer. | Request a new transfer approval for an amount at least as large as the transfer you intend to make, or reduce the transfer amount to fit within the existing approval balance. | error | No | `InsufficientApproval()` |
| DALP-4424 | Basis per unit zero. | The fixed treasury yield feature configuration sets basisPerUnit to zero. The contract requires a non-zero value because yield calculations divide by basisPerUnit to compute payouts. | Set basisPerUnit to a positive non-zero value in the feature configuration before creating the fixed treasury yield feature. | error | No | `BasisPerUnitZero()` |
| DALP-4425 | Config data must be empty. | The token feature factory for this feature type does not accept configuration data. The default validateConfig implementation rejects any non-empty configData because this feature has no configurable parameters. | Submit the createFeature or replaceFeature call with an empty configData byte array for this feature type. | error | No | `ConfigDataMustBeEmpty()` |
| DALP-4426 | Config data required. | The token feature factory requires non-empty configuration data for this feature type, but the call arrived with an empty configData byte array. Features such as maturity redemption and fixed treasury yield encode their parameters in configData. | Provide the ABI-encoded configuration parameters for this feature type in configData. Consult the feature factory's validateConfig signature for the expected encoding. | error | No | `ConfigDataRequired()` |
| DALP-4427 | Discount too high. | The discountBps value in the conversion feature configuration exceeds 9999 basis points (99.99%). The contract enforces this limit so the effective conversion price remains non-zero: effectivePrice = roundPrice \* (10000 - discountBps) / 10000. | Set discountBps to a value between 0 and 9999 inclusive in the conversion feature configuration. | error | No | `DiscountTooHigh(uint256)` |
| DALP-4428 | Duplicate converter address. | The initialConverters list you provided to the conversion minter feature contains the same converter address more than once. The factory checks for duplicates to ensure each converter appears exactly once. | Remove duplicate entries from the initialConverters array so every address appears exactly once before submitting the feature creation request. | error | No | `DuplicateConverterAddress(address)` |
| DALP-4429 | End date not after start date. | The endDate in the fixed treasury yield configuration is less than or equal to the startDate. The contract requires endDate to be strictly after startDate for the yield schedule to be valid. | Set endDate to a Unix timestamp that is strictly greater than startDate in the feature configuration. | error | No | `EndDateNotAfterStartDate(uint256,uint256)` |
| DALP-4430 | End date zero. | The endDate in the fixed treasury yield configuration is zero. The contract requires a non-zero endDate to define when yield accrual stops. | Set endDate to a non-zero Unix timestamp in the feature configuration before creating the fixed treasury yield feature. | error | No | `EndDateZero()` |
| DALP-4431 | Escrow required for lock method. | The conversion feature uses the Lock debt reduction method, which requires an escrow contract address to hold locked tokens, but you did not provide one. The contract enforces this dependency at configuration time. | Supply a non-zero escrow contract address in the conversion feature configuration when using the Lock debt reduction method. | error | No | `EscrowRequiredForLockMethod()` |
| DALP-4432 | Face value zero. | The faceValue in the maturity redemption feature configuration is zero. The contract requires a non-zero face value to calculate redemption payouts per token unit at maturity. | Set faceValue to a positive non-zero value in the maturity redemption feature configuration before creating the feature. | error | No | `FaceValueZero()` |
| DALP-4433 | Implementation address zero. | The implementation address provided to the token feature factory upgrade call is the zero address. The contract requires a deployed contract address for the new implementation. | Provide the address of the deployed feature implementation contract when calling validateImplementation or the upgrade path on the feature factory. | error | No | `ImplementationAddressZero()` |
| DALP-4435 | Interval zero. | The interval parameter in the fixed treasury yield feature configuration is zero. The contract requires a non-zero interval to define the time step between yield accrual periods. | Set interval to a positive non-zero duration in seconds in the feature configuration before creating the fixed treasury yield feature. | error | No | `IntervalZero()` |
| DALP-4436 | Conversion window start is after the end timestamp. | The contract requires `conversionWindowStart` to be at or before `conversionWindowEnd` when an end is set. A start timestamp later than the end produces a window that can never open. | Set `conversionWindowStart` to a timestamp that is equal to or earlier than `conversionWindowEnd`, then resubmit the configuration. | error | No | `InvalidConversionWindow()` |
| DALP-4437 | Converter address at position `{{index}}` is the zero address. | Each address in the initial converters list must be a non-zero address. The contract found the zero address at list position `{{index}}`. | Replace the zero address at index `{{index}}` with the intended converter address and resubmit. | error | No | `InvalidConverterAddress(uint256)` |
| DALP-4438 | Treasury address is the zero address. | The fixed treasury yield feature requires a non-zero treasury address to receive yield distributions. A zero address was supplied. | Supply the address of the treasury contract that will receive yield payments. | error | No | `InvalidTreasuryAddress()` |
| DALP-4439 | No feature to replace. | You called replaceFeature for a token that has no feature currently registered in this factory. The factory requires an existing feature before it can replace one. | Call createFeature first to register a feature for this token, then use replaceFeature to update it. | error | No | `NoFeatureToReplace()` |
| DALP-4440 | Rate zero. | The fixed treasury yield feature requires a non-zero yield rate. The rate field in the configuration data resolved to zero, so the factory rejected the deployment. | Supply a positive integer for the yield rate field in the feature configuration and resubmit. | error | No | `RateZero()` |
| DALP-4441 | Replacement not supported. | The Permit and Booked movements feature factories do not replace a feature in place. | To change the feature, remove it and create a new one. The replaceFeature path is not available for these factories. | error | No | `ReplacementNotSupported()` |
| DALP-4442 | Replacement would collide. | The new configuration produces the same CREATE2 address as the feature already registered for this token. This happens when the replacement configuration is identical to the configuration used to deploy the current feature. | Change at least one configuration parameter so the replacement resolves to a different address, then resubmit the replaceFeature call. | error | No | `ReplacementWouldCollide()` |
| DALP-4443 | Start date zero. | The fixed treasury yield feature requires a non-zero start date timestamp. The startDate field in the configuration data resolved to zero, so the factory rejected the deployment. | Supply a valid Unix timestamp for the startDate field in the feature configuration and resubmit. | error | No | `StartDateZero()` |
| DALP-4444 | Implementation interface check failed. | The contract probed the proposed implementation address for ERC-165 support and the call reverted rather than returning a boolean. The implementation contract does not respond correctly to interface introspection. | Verify that the implementation address is a deployed contract that correctly implements ERC-165 supportsInterface without reverting, then resubmit the implementation registration. | error | No | `ImplementationInterfaceCheckFailed()` |
| DALP-4445 | Implementation missing interface. | The proposed implementation contract returned false when queried for ERC-165 interface support for the required feature interface (interfaceId). The contract exists but does not expose the expected capability. | Ensure the implementation contract declares support for the required feature interface via supportsInterface, then resubmit the implementation registration. | error | No | `ImplementationMissingInterface(bytes4)` |
| DALP-4446 | Not deployer. | Only the account that deployed a deferred proxy, such as the Directory or account factory proxy, can call `initializeProxy`. The caller's address does not match the deployer address recorded at construction. | Call initializeProxy from the same account that deployed the proxy contract. | error | No | `NotDeployer()` |
| DALP-4447 | Proxy already initialized. | This deferred directory, account factory or identity factory proxy has already run `initializeProxy`. The contract records a proxy-initialised storage flag on first call, and the contract blocks any further initialisation attempt. | The proxy is ready for use and needs no further initialization. If you intended to upgrade, use the UUPS upgrade path instead. | error | No | `ProxyAlreadyInitialized()` |
| DALP-4448 | Proxy uninitialized. | This deferred directory, account factory or identity factory proxy has not run initializeProxy. The ERC1967 implementation slot holds no address, so the proxy cannot forward calls. | Call initializeProxy on the proxy contract before making any other calls through it. | error | No | `ProxyUninitialized()` |
| DALP-4449 | Bundler call failed. | The paymaster refund splitter tried to forward the bundler portion of a refund to the configured bundler address, but the native ETH transfer reverted. | Verify that the configured bundler address is able to receive native ETH (not a contract that rejects transfers), then retry the refund routing. | error | No | `BundlerCallFailed()` |
| DALP-4450 | Bundler share in basis points exceeds 10000. | The paymaster refund splitter requires the bundler share `bps` to be at most 10000 (100%). The supplied value `{{bps}}` is higher than that limit. | Provide a `bps` value between 0 and 10000 inclusive, where 10000 represents 100% of the refund going to the bundler. | error | No | `InvalidBps(uint16)` |
| DALP-4451 | Bundler address is the zero address. | The paymaster refund splitter requires a non-zero bundler address to route the bundler share of refunds. A zero address was supplied during initialization. | Supply the address of the bundler that will receive its share of EntryPoint refunds. | error | No | `InvalidBundler()` |
| DALP-4453 | Paymaster address does not point to a deployed paymaster contract. | The refund splitter requires the paymaster to be a deployed contract that implements `depositEntryPoint()` and returns a valid, deployed EntryPoint address. The supplied address is either zero, has no deployed code, or its `depositEntryPoint` call failed or returned a zero/undeployed address. | Supply the address of a deployed paymaster contract that implements `depositEntryPoint()` and whose `depositEntryPoint` resolves to a live EntryPoint contract. | error | No | `InvalidPaymaster()` |
| DALP-4454 | Paymaster call failed. | The paymaster refund splitter tried to deposit the paymaster portion of a refund to the paymaster's EntryPoint, but the deposit call reverted. | Verify that the paymaster's canonical EntryPoint is operational and accepts deposits, then retry the refund routing. | error | No | `PaymasterCallFailed()` |
| DALP-4455 | Multicall3 address is zero. | The Multicall3Reference wrapper requires a valid underlying Multicall3 contract address. The address provided to the constructor was the zero address. | Provide the address of a deployed Multicall3 contract when constructing the Multicall3Reference wrapper. | error | No | `ZeroMulticall3()` |
| DALP-4456 | Not refundable. | The settlement owes you nothing yet. A refund opens when the settlement is cancelled, its cutoff date passes or you revoke your approval, and never after it executed. | Check the settlement status. If the settlement executed, use the delivery claim path instead. If the cutoff passed or the settlement was cancelled by the counterparty, confirm your approval state and retry the refund claim. | error | No | `NotRefundable()` |
| DALP-4457 | Stake management must call the canonical EntryPoint directly. | The EntryPointReference wrapper intentionally blocks stake management calls (addStake, unlockStake, withdrawStake). The canonical ERC-4337 EntryPoint records stake keyed by msg.sender, so forwarding through the wrapper would credit stake to the wrapper address rather than your contract. | Call addStake, unlockStake and withdrawStake on the canonical EntryPoint directly, not through the EntryPointReference wrapper. | error | No | `StakeManagementMustCallCanonical()` |
| DALP-4458 | Deposit withdrawal must call the canonical EntryPoint directly. | The EntryPointReference wrapper intentionally blocks `withdrawTo`. The canonical ERC-4337 EntryPoint keys deposits by the calling address, so a forwarded withdrawal would spend the wrapper's own balance instead of yours. Deposits made through the wrapper are credited to the original sender on the canonical EntryPoint. | Call `withdrawTo` on the canonical EntryPoint directly. Your deposit is recorded there under the address that sent it, so the direct call reaches your balance. | error | No | `DepositWithdrawalMustCallCanonical()` |
| DALP-4459 | Sale not finalized. | Sale proceeds stay in the sale contract until the sale is finalized. The sale is still in setup, running, paused, or ended without finalization, so the contract blocks the withdrawal whether or not a soft cap is set. | Finalize the sale after its end time, then withdraw the proceeds. If the sale fails, wait for the refund grace period to pass before withdrawing. | error | No | `SaleNotFinalized()` |
| DALP-4460 | Purchase still deliverable. | The token sale contract releases a buyer's purchase only when it can no longer deliver the tokens, for example because the buyer's wallet is frozen or its identity verification lapsed. A transfer of the buyer's tokens would still succeed, so the contract keeps the purchase. | Let the buyer withdraw their tokens. Release the purchase only for a buyer the sale cannot deliver to. | error | No | `PurchaseStillDeliverable()` |
| DALP-4461 | No undelivered tokens. | The buyer has no tokens left for the sale to deliver: they already withdrew everything they bought, or their purchase was already released. | Read the buyer's position on the sale's cap table. Nothing remains to release for this buyer. | error | No | `NoUndeliveredTokens()` |
| DALP-4462 | Delivery check failed. | The token sale contract could not tell whether the buyer's purchase is still deliverable. A test transfer of the tokens to the sale itself also failed, for example because the token is paused or the sale holds too few tokens, so the refusal is not about the buyer. | Resolve the condition that blocks every transfer of the sale's tokens, such as unpausing the token, then release the purchase again. | error | No | `DeliveryCheckFailed()` |
| DALP-4463 | Waterfall class count mismatch. | The distribution-waterfall feature needs one inclusion flag and one dividend reference per configured share class. The request gave a different number of entries than the waterfall has classes. | Read the waterfall's classes and send one inclusion flag and one dividend reference for each class, in configuration order. | error | No | `ClassCountMismatch(uint256,uint256)` |
| DALP-4464 | No class included in the distribution. | Every share class was left out of the distribution, so the waterfall has no class to give the pool to. A class is left out when it held no supply on the record date. | Choose a record date on which at least one share class has holders, then fund the distribution again. | error | No | `NoClassIncluded()` |
| DALP-4465 | Class dividend cannot be bound. | The waterfall binds each class dividend to that class's part of the distribution when it is funded. This dividend cannot be bound: its class is left out of the distribution, it belongs to a dividend feature the class token does not use, or it does not exist or is already recorded, paid or cancelled. | Preview the coordinated distribution again so each class gets a fresh dividend on its current dividend feature, then fund it. | error | No | `DividendNotBindable(address,uint256)` |
| DALP-4466 | Class dividend already bound. | This class dividend already pays from another distribution of the waterfall. A dividend pays from one distribution only. | Preview the coordinated distribution again so each class gets a new dividend, then fund it. | error | No | `DividendAlreadyBound(address,uint256)` |
| DALP-4467 | Class dividend pays from another treasury. | The class's dividend feature pays its holders from a treasury other than the distribution waterfall, so its claims would never reach the money the waterfall holds for the class. | Use a dividend feature whose treasury is the distribution waterfall for every share class of the instrument. | error | No | `TreasuryMismatch(address,address)` |
| DALP-4468 | Dividend not funded by the waterfall. | The claimed dividend was never bound to a funded distribution of the waterfall, so the waterfall holds no money for it. | Claim a dividend from a coordinated distribution that was funded through the waterfall. Contact the issuer if you expected this dividend to be paid. | error | No | `UnboundDividend(address,uint256)` |
| DALP-4469 | Payout must name its dividend. | The distribution waterfall holds each distribution's money separately, so it pays only a request that names the dividend being claimed. This request did not name one. | Claim through the class's dividend feature, which names the dividend when it asks the waterfall to pay. | error | No | `ReferenceRequired()` |
| DALP-4470 | Class dividend still open for claims. | The share class's dividend for this distribution is still open, so holders can still claim from the money the waterfall holds for it. | Wait until the claim deadline has passed and reclaim the unclaimed dividend, or cancel the dividend if it was never recorded, then release the money. | error | No | `DividendStillOpen(address,uint256)` |
| DALP-4471 | Class money already released. | The money the waterfall held for this share class of the distribution was already returned to the wallet that funded it. | No action is needed. Check the funding wallet for the earlier release. | error | No | `AlreadyReleased(uint256,uint256)` |
| DALP-4472 | Nothing left to release. | The waterfall holds no money for this share class of the distribution: its holders claimed it all, or the class named does not exist or took no part in the distribution. | No action is needed. | error | No | `NothingToRelease(uint256,uint256)` |
| DALP-4473 | Waterfall holds less than it owes. | The waterfall's balance of the distribution currency is below what it still owes across every distribution, so no money is released until the shortfall is covered. Holder claims keep paying while money remains. | Transfer the missing amount of the distribution currency to the waterfall, then release again. | error | No | `WaterfallUnderfunded(uint256,uint256)` |
| DALP-4474 | Governance operation not ready for this step. | The timelock holds each queued governance operation through a fixed delay and runs each step only in the matching operation state. The operation `{{operationId}}` is not in a state that allows this step: it may still be waiting out its delay, or it may already be executed or cancelled. | Read the proposal state and its earliest execution time. Wait until the delay has passed before you execute it, and do not execute or cancel a proposal that is already done. | error | No | `TimelockUnexpectedOperationState(bytes32,bytes32)` |
| DALP-4475 | Governance delay below the timelock minimum. | The timelock refuses to schedule an operation with a delay of `{{delay}}` seconds because its minimum delay is `{{minDelay}}` seconds. | Schedule the operation with a delay of at least the timelock's minimum delay. | error | No | `TimelockInsufficientDelay(uint256,uint256)` |
| DALP-4476 | Earlier governance operation not executed yet. | This governance operation depends on an earlier operation, `{{predecessorId}}`, and the timelock runs it only after that operation has been executed. | Execute the earlier operation first, then execute this one. | error | No | `TimelockUnexecutedPredecessor(bytes32)` |
| DALP-4477 | Only the timelock can change its minimum delay. | Only the timelock itself can change its minimum delay. `{{caller}}` called `updateDelay` directly. | Propose the delay change through the token's governor so the timelock calls `updateDelay` after the delay. | error | No | `TimelockUnauthorizedCaller(address)` |
| DALP-4478 | Governance operation lists do not match. | The timelock needs one target, one value, and one call payload for each action in the operation. It received `{{targets}}` targets, `{{values}}` values, and `{{payloads}}` payloads. | Send the same number of targets, values, and call payloads, one of each per action. | error | No | `TimelockInvalidOperationLength(uint256,uint256,uint256)` |
| DALP-4479 | Buyer wallet not lost. | The token sale contract delivers a buyer's tokens to another wallet only when the identity registry marks the buyer's own wallet as lost and replaced through identity recovery. This buyer's wallet is not marked lost, so the buyer withdraws their tokens themselves. | Let the buyer withdraw their tokens from their own wallet. Recover the buyer's identity onto a new wallet first if the wallet is lost. | error | No | `BuyerWalletNotLost()` |
| DALP-4480 | Buyer wallet lost. | The identity registry marks the buyer's wallet as lost, and no current replacement wallet is known for it, so the token sale contract has no wallet to pay or deliver to. | Recover the buyer's identity onto a new wallet through identity recovery, then deliver or pay again. | error | No | `BuyerWalletLost()` |
| DALP-4481 | This token only moves through a movement the administrator books. | The token has the Booked movements feature attached. A plain transfer, mint, or burn was attempted, and the feature only lets units move when the administrator books a movement in the register. | Ask the administrator to book this movement. | error | No | `MovementRequiresRegisterLine()` |
| DALP-4482 | Movement not found. | The movement number does not exist in this token's register. | Check the movement number and try again. | error | No | `LineNotFound(uint256)` |
| DALP-4483 | Movement cannot change state. | The movement was already booked or cancelled, or it has not been opened yet, so the action does not apply. | Refresh the register and check the movement's current state before you retry. | error | No | `InvalidLineState(uint256,uint8)` |
| DALP-4484 | Request kind not allowed. | The administrator chose which request kinds holders can open for this token. This kind is not on that list. | Open a request of a kind the token accepts, or ask the administrator to allow this kind. | error | No | `KindNotRequestable(uint8)` |
| DALP-4485 | Subscription request already open. | A holder can have one open subscription request at a time, and this holder has one that is still waiting. | Wait for the open request to be booked or cancelled, then open a new one. | error | No | `OpenSubscriptionRequestExists(address)` |
| DALP-4486 | Movement parties invalid. | A movement needs two different parties, and at most one of them can be the zero address. This movement named the same wallet twice, or both parties were the zero address. | Name two different parties, with at most one of them the zero address, and try again. | error | No | `InvalidParties()` |
| DALP-4487 | Register reference missing. | Every movement must carry the reference of the entry it records in the register. This one was empty. | Enter the register reference and try again. | error | No | `EmptyRegisterReference()` |
| DALP-4488 | Corrected movement invalid. | A correction must name an earlier booked movement. The movement given is not a booked movement. | Name a booked movement to correct, or book a new movement instead. | error | No | `InvalidCorrectedLine(uint256)` |
| DALP-4489 | Request kinds invalid. | The setting must be a combination of subscription, transfer, and redemption. The value given has other bits set. | Choose any combination of subscription, transfer, and redemption. | error | No | `InvalidRequestableKinds(uint8)` |
| DALP-4490 | Wallet marked lost. | The identity registry marks the wallet making the request as lost, so it cannot request a movement. | Use a different wallet, or ask the administrator to recover the lost wallet first. | error | No | `WalletMarkedLost(address)` |
| DALP-4491 | Hold feature missing. | Booked movements reserve units with the hold feature. This token does not have it attached. | Attach the hold feature to the token, then try again. | error | No | `HoldFeatureMissing()` |
| DALP-4492 | Feature detached from the token. | The token no longer registers this Booked movements or Hold feature, so it takes no new commitments. | Attach the feature to the token again if you still need it. | error | No | `FeatureDetached()` |
| DALP-4493 | Investor wallet has no registered identity. | The sale sets and reads an allocation cap on the investor's identity. It looks the wallet up in the token's identity registry, and the registry holds no identity for this wallet. | Register the wallet to the investor's identity in the token's identity registry, then set or read the allocation again. | error | No | `InvestorIdentityNotRegistered(address)` |
| DALP-4494 | Investor identity lookup failed. | The sale looked up the buyer's identity in the token's identity registry for the allocation cap, and the registry call reverted without a reason. The sale cannot tell whether a cap applies, so it refuses the purchase. | Check that the token's identity registry is deployed and answers identity lookups. Retry after the registry is fixed. | error | No | `InvestorIdentityLookupFailed()` |
| DALP-4495 | Not a supply delegate. | The address is not registered as a supply delegate on this token, or it is registered without the permission for this mint or burn. | Ask the token's governance to register the address as a supply delegate with the permission it needs. | error | No | `NotADelegate(address)` |
| DALP-4496 | Already a supply delegate. | The address is already registered as a supply delegate on this token. | To change its permissions, remove the delegate and add it again. | error | No | `AlreadyDelegate(address)` |
| DALP-4497 | Supply delegate address is empty. | The zero address cannot be a supply delegate. | Enter the address of the wallet or add-on factory to register. | error | No | `ZeroDelegate()` |
| DALP-4498 | Supply delegate has no permission. | A supply delegate must be allowed to mint, to burn, or both. | Turn on mint, burn, or both before you add the delegate. | error | No | `NoPermission(address)` |
| DALP-4499 | Mint cap without mint permission. | A mint cap was set for a supply delegate that is not allowed to mint. | Allow the delegate to mint, or leave the cap empty. | error | No | `CapWithoutMint(address)` |

The previous page is [DALP-4300 to DALP-4399](https://docs.settlemint.com/docs/api-reference/errors/error-code-reference/dalp-4300-4399). The next page is [DALP-4500 to DALP-4999](https://docs.settlemint.com/docs/api-reference/errors/error-code-reference/dalp-4500-4999).
