Volta Troubleshooting Guide
This guide covers common errors and issues when working with the Volta multi-signature governance contract.
Contract Errors
NotInitialized (Error Code 2)
Message: Contract has not been initialized.
Cause: Attempting to call contract functions before initialization.
Solution: Initialize the contract with a valid configuration:
stellar contract invoke \
--id <CONTRACT_ID> \
--source <SOURCE_ACCOUNT> \
--network <NETWORK> \
-- \
__constructor \
--config '{"owners": ["G...", "G..."], "threshold": 2}'
InvalidOwners (Error Code 5)
Message: Invalid owner configuration.
Cause:
- Fewer than 2 owners provided
- Duplicate addresses in the owners list
Solution: Ensure your configuration includes at least 2 unique owner addresses:
InvalidThreshold (Error Code 6)
Message: Invalid voting threshold.
Cause: Threshold is either:
- Less than 2 (the minimum required)
- Greater than the number of owners
Solution: Set threshold between 2 and your owner count:
- 2 owners → threshold must be 2
- 3 owners → threshold can be 2 or 3
- 5 owners → threshold can be 2, 3, 4, or 5
NotOwner (Error Code 8)
Message: Caller is not an owner.
Cause: A non-owner address attempted to:
- Create a proposal
- Vote on a proposal
- Invoke a contract through Volta
Solution: Ensure the transaction is signed by an address in the contract's owner list. Check current owners:
ProposalNotFound (Error Code 9)
Message: Proposal does not exist.
Cause:
- Proposal ID doesn't exist
- Proposal expired (proposals have a ~1 week TTL)
- Proposal was already executed or rejected
Solution:
- Verify the proposal ID is correct
- Create a new proposal if the original expired
- Check proposal status before voting
VoterAlreadyVoted (Error Code 10)
Message: This owner has already voted on this proposal.
Cause: An owner attempted to vote twice on the same proposal.
Solution: Votes cannot be changed once cast. Each owner gets one vote per proposal. If a mistake was made, the proposal creator can revoke the proposal and create a new one.
ProposalNotPending (Error Code 11)
Message: Proposal is not in pending status.
Cause:
- Attempting to vote on an already executed/rejected/revoked proposal
- Attempting to revoke a proposal that's no longer pending
- Proposal was invalidated by a config change (all proposals before the last config change are invalid)
Solution: Check proposal status. If needed, create a new proposal.
InvokeError (Error Code 12)
Message: Contract invocation failed.
Cause: The target contract call failed during execution. This could be due to:
- Target contract reverted
- Insufficient authorization
- Invalid arguments
- Target contract doesn't exist
Solution:
- Verify the target contract address is correct
- Check that the function name and arguments are valid
- Ensure proper authorization entries are provided
- Test the invocation on testnet first
NoConfigChanges (Error Code 14)
Message: Proposed configuration is identical to current configuration.
Cause: A Config proposal was created with the same owners and threshold as the existing configuration.
Solution: Only create Config proposals when you need to change the owners or threshold.
NotCaller (Error Code 15)
Message: Only the original proposer can perform this action.
Cause: Attempting to revoke a proposal created by a different owner.
Solution: Only the owner who created a proposal can revoke it. Other owners can vote No to reject it instead.
InvokeNotAllowed (Error Code 19)
Message: Invoke proposals cannot be created directly.
Cause: Attempted to use propose() to create an Invoke proposal.
Solution: Use the invoke() function instead of propose() for contract invocations:
stellar contract invoke \
--id <VOLTA_CONTRACT_ID> \
--source <OWNER_ACCOUNT> \
--network <NETWORK> \
-- \
invoke \
--caller <OWNER_ADDRESS> \
--contract <TARGET_CONTRACT> \
--fn_name <FUNCTION_NAME> \
--args '[]' \
--auth_entries '[]'
InvalidUpgrade (Error Code 22)
Message: Invalid upgrade hash.
Cause: Upgrade proposal contains an invalid WASM hash:
- All zeros (
0x0000...0000) - All ones (
0xFFFF...FFFF)
Solution: Provide a valid WASM hash from a contract uploaded to the network:
# Upload new WASM and get hash
stellar contract upload \
--wasm <PATH_TO_WASM> \
--source <SOURCE_ACCOUNT> \
--network <NETWORK>
# Use the returned hash in your upgrade proposal
AddressNotExecutable (Error Code 23)
Message: Target address is not a contract.
Cause: An Invoke proposal targets an address that is not a deployed contract (e.g., a regular Stellar account).
Solution: Ensure the target address is a valid contract address (starts with C on Stellar).
InvalidFunctionName (Error Code 24)
Message: Function name is empty.
Cause: An Invoke proposal was created with an empty function name.
Solution: Provide a valid function name for the target contract.
Common Issues
Proposal Expired Before Voting Completed
Symptom: Proposal returns ProposalNotFound after some time.
Cause: Proposals automatically expire after approximately 1 week (120,960 ledgers).
Solution: Ensure all owners vote within the TTL window. For time-sensitive proposals, coordinate with owners beforehand.
Proposals Invalidated After Config Change
Symptom: Existing proposals return ProposalNotPending after a config change is executed.
Cause: When a Config or Upgrade proposal is executed, all prior pending proposals are invalidated. This is a security feature to ensure proposals are approved by the current owner set.
Solution: Re-create any necessary proposals after config changes. Coordinate config changes to minimize disruption.
Transaction Fails with "Authorization Required"
Symptom: Transaction rejected before reaching the contract.
Cause: Missing or invalid signature from the owner account.
Solution: Ensure you're signing with the correct owner key:
Getting Help
If you encounter issues not covered in this guide:
- Check the contract events for detailed error information
- Verify your transaction on Stellar Expert
- Open an issue on GitHub