Vault
The Vault capability provides contract-level treasury custody for ETH and ERC-20 tokens, with signer roles, EIP-712 transaction signatures, configurable signature thresholds, weighted-signature support, and emergency pause controls.
The Vault is DALP's contract-level treasury custody capability. A vault can hold ETH and ERC-20 tokens, store proposed transactions, collect signer signatures, and execute the transaction when the configured threshold is reached.
What the vault controls
The vault controls treasury transactions for assets already held by the vault contract:
- native ETH transfers
- ERC-20 token transfers through contract-call calldata
- general contract calls to a target address
- transaction comments and on-chain events for operational traceability
The vault does not issue assets, run investor identity checks, or decide whether a token transfer is compliant. Issuance, identity, and transfer compliance sit in the SMART Protocol and compliance layers. The vault can have its own on-chain identity, and governance controls whether claims can be added to or removed from that identity.
Owned contracts
| Contract | Responsibility |
|---|---|
| DALPVault | Stores transactions, validates signatures, executes calls, and pauses operations |
| DALPVaultFactoryImplementation | Deploys vault instances through the vault factory |
Roles
| Role | Permissions |
|---|---|
| SIGNER_ROLE | Submit transactions and add valid signatures to pending transactions |
| EMERGENCY_ROLE | Pause and unpause vault operations |
| GOVERNANCE_ROLE | Change signature requirements, configure weighted signatures, and set the vault on-chain identity |
Role separation keeps transaction approval separate from parameter changes. Signers can propose and sign transactions. Governance changes the rules that govern signing. Emergency operators can stop vault activity during an incident.
Transaction lifecycle
The vault follows a proposal-signature-execution model:
- Proposal. A signer submits the target address, ETH value, calldata, comment, and required signature count. If the required count is
0, the vault uses the default requirement. - Signature collection. Signers provide EIP-712 signatures for the stored transaction hash. The vault rejects unauthorized signers, invalid signatures, duplicate signatures, mismatched signature arrays, and signatures added after execution.
- Execution. The vault executes automatically when the collected signatures satisfy the active threshold. If the underlying call fails, the vault reverts the execution and leaves the transaction unexecuted.
There is no separate manual execute step in the current vault contract. Execution is attempted when signatures are processed and the threshold is met.
Signature threshold modes
| Mode | How execution threshold is evaluated |
|---|---|
| Standard signatures | The number of unique valid signer signatures must meet the transaction requirement |
| Weighted signatures | Each signer contributes a configured weight, and the total collected weight must meet the configured weight threshold |
Governance can enable or disable weighted signatures, set signer weights, set the total weight required, and change the default required signature count. In standard mode, a transaction can carry its own required signature count when submitted. In weighted mode, execution uses the configured total weight requirement instead of the per-transaction signature count.
Transaction types
| Type | Description |
|---|---|
| ETH transfer | Sends native currency from the vault to a recipient address |
| ERC-20 transfer | Calls an ERC-20 token contract, typically with encoded transfer calldata |
| Contract call | Calls any target contract with the submitted calldata and ETH value |
All transaction types use the same stored transaction model. The vault validates signers and signatures, then executes the target call. The vault does not inspect whether the calldata represents a simple transfer, a token operation, or another contract interaction.
Controls and operating limits
| Control | Behaviour |
|---|---|
| Signer role check | Only accounts with SIGNER_ROLE can submit transactions or add signatures |
| Duplicate signature rejection | The same signer cannot be counted twice for one transaction |
| Pause control | When paused, ETH deposits, new submissions, and signature processing are blocked |
| Governance-only configuration | Only GOVERNANCE_ROLE can change requirements, weighted-signature settings, and the vault identity |
| One-time vault identity setting | The vault on-chain identity can be set once, either at construction or later by governance |
| Execution failure handling | A failed target call reverts with no successful fund movement for that transaction |
Events and evidence
The vault emits events for deposits, submitted transactions, signature collection, execution, requirement changes, weighted-signature toggles, signer-weight updates, and on-chain identity assignment. These events give operators and auditors a chain-native record of treasury activity and governance changes.
Failure modes
| Failure | System behaviour |
|---|---|
| Insufficient signatures | The transaction stays pending and unexecuted |
| Invalid or duplicate signature | The signature submission reverts and does not change the transaction state |
| Unauthorized signer | The submission reverts because the address does not hold SIGNER_ROLE |
| Paused state | Deposits, new proposals, and signature processing are blocked until unpaused |
| Failed target call | Execution reverts and the transaction remains unexecuted |
| Invalid requirement | Governance cannot set a requirement of zero or above the signer count |
Related
- Capabilities layer overview for how capabilities extend the platform
- SMART Protocol integration (ERC-3643) for the compliance framework
- Custody provider integrations for how external custody providers fit around DALP
- Key flows for a broader view of asset, identity, and transaction flows
- Component catalog for the full platform inventory
Airdrop
The Airdrop capability distributes funded tokens to eligible wallets through time-bound, vesting, or push strategies. Each strategy uses a Merkle root for eligibility and records claims on-chain so recipients cannot claim more than their allocation.
XvP Settlement
The XvP Settlement capability provides atomic cross-party token exchanges with all-or-nothing local execution, per-sender approvals, expiration controls, and optional hashlock coordination for referenced external legs.