Skip to content
Back to skills

1531 Transaction Errors F08f2c5a

ASecurity

Common errors when sending transactions and managing accounts on Algorand.

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 11, 2026
developmenttypescriptpythongonodedebuggingapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 1531-transaction-errors_f08f2c5a --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 1531 Transaction Errors F08f2c5a?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 1531 Transaction Errors F08f2c5a
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-1531-transaction-errors-f08f2c5a/badge)](https://www.skillsdirectory.com/skills/tools-only-1531-transaction-errors-f08f2c5a)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Transaction & Account Errors

Common errors when sending transactions and managing accounts on Algorand.

## Table of Contents

- [Transaction Errors](#transaction-errors)
  - [Overspend](#overspend)
  - [Transaction Already in Ledger](#transaction-already-in-ledger)
  - [Transaction Pool Full](#transaction-pool-full)
  - [Fee Too Low](#fee-too-low)
  - [Round Out of Range](#round-out-of-range)
  - [Invalid Group](#invalid-group)
  - [Group Size Limit](#group-size-limit)
- [Asset Errors](#asset-errors)
  - [Asset Not Found](#asset-not-found)
  - [Asset Not Opted In](#asset-not-opted-in)
  - [Asset Frozen](#asset-frozen)
  - [Clawback Not Authorized](#clawback-not-authorized)
  - [Cannot Close Asset](#cannot-close-asset)
- [Account Errors](#account-errors)
  - [Account Not Found](#account-not-found)
  - [Invalid Address](#invalid-address)
  - [Wrong Network](#wrong-network)
- [SDK Errors](#sdk-errors)
- [Application Errors](#application-errors)
- [Debugging Tips](#debugging-tips)

## Transaction Errors

### Overspend

```
TransactionPool.Remember: transaction TXID: overspend (account ADDRESS, data {_struct:{} Status:Offline MicroAlgos:{Raw:1000} ...})
```

**Cause:** Sender account has insufficient balance for amount + fee + minimum balance.

**Minimum balance requirements:**
| Item | MBR |
|------|-----|
| Base account | 100,000 microAlgo |
| Each opted-in asset | +100,000 microAlgo |
| Each created asset | +100,000 microAlgo |
| Each opted-in app | +100,000 microAlgo |
| Each created app | +100,000 microAlgo |
| App local state per schema | Varies |
| Box storage | 2,500 + 400 * size |

**Fix:**
1. Fund the sender account
2. Reduce transaction amount
3. Account for MBR when calculating available balance:

```python
# Calculate available balance
account_info = algorand.account.get_information(address)
available = account_info.amount - account_info.min_balance
```

### Transaction Already in Ledger

```
TransactionPool.Remember: transaction already in ledger: TXID
```

**Cause:** Duplicate transaction submitted (same txn ID).

**Common causes:**
- Retrying a transaction that already succeeded
- Using same lease within validity window
- Network latency causing duplicate submission

**Fix:** Check if transaction exists before retrying:
```typescript
try {
  const result = await algorand.client.algod.pendingTransactionInformation(txId).do()
  // Transaction exists
} catch {
  // Safe to retry
}
```

### Transaction Pool Full

```
TransactionPool.Remember: transaction pool is full
```

**Cause:** Node's transaction pool at capacity.

**Fix:**
1. Wait and retry with exponential backoff
2. Increase fee to prioritize transaction
3. Try a different node

### Fee Too Low

```
TransactionPool.Remember: transaction TXID: fee X below threshold Y
```

**Cause:** Transaction fee below minimum (usually 1000 microAlgo).

**Fix:**
```python
algorand.send.payment(PaymentParams(
    sender=sender,
    receiver=receiver,
    amount=AlgoAmount(algo=1),
    static_fee=AlgoAmount(micro_algo=1000),  # Minimum fee
))
```

### Round Out of Range

```
TransactionPool.Remember: transaction TXID: round X outside of Y-Z range
```

**Cause:** Transaction's validity window expired or is in the future.

**Fix:**
```typescript
// Set appropriate validity window
await algorand.send.payment({
  sender: sender,
  receiver: receiver,
  amount: algo(1),
  validityWindow: 1000,  // Valid for 1000 rounds (~1 hour)
})
```

### Invalid Group

```
TransactionPool.Remember: transaction TXID: bad group assignment
```

**Cause:** Transaction claims to be part of a group but has wrong group ID.

**Fix:** Use AlgoKit Utils for proper grouping:
```typescript
// Correct grouping
await algorand
  .newGroup()
  .addPayment({ sender, receiver, amount: algo(1) })
  .addAssetOptIn({ sender, assetId: 12345n })
  .send()
```

### Group Size Limit

```
cannot send transaction group with more than 16 transactions
```

**Cause:** Transaction group exceeds 16 transaction limit.

**Fix:** Split into multiple groups or optimize to fewer transactions.

## Asset Errors

### Asset Not Found

```
asset ASSET_ID does not exist
```

**Cause:** Asset ID doesn't exist on the network.

**Common causes:**
- Wrong network (TestNet vs MainNet)
- Asset was deleted
- Typo in asset ID

**Fix:** Verify asset exists:
```typescript
const assetInfo = await algorand.client.algod.getAssetByID(assetId).do()
```

### Asset Not Opted In

```
asset ASSET_ID missing from ACCOUNT_ADDRESS
```

**Cause:** Receiving account hasn't opted into the asset.

**Fix:** Opt in before transfer:
```python
algorand.send.asset_opt_in(AssetOptInParams(
    sender=receiver_address,
    asset_id=asset_id,
))
```

### Asset Frozen

```
asset ASSET_ID frozen in ACCOUNT_ADDRESS
```

**Cause:** Account's holding of this asset is frozen.

**Fix:** Asset freeze manager must unfreeze the account.

### Clawback Not Authorized

```
only clawback address can clawback
```

**Cause:** Attempting clawback without being the clawback address.

**Fix:** Only the designated clawback address can perform clawbacks.

### Cannot Close Asset

```
cannot close asset: ACCOUNT_ADDRESS still has X units
```

**Cause:** Trying to opt out while still holding units.

**Fix:** Transfer all units before opting out:
```python
# First transfer all units
algorand.send.asset_transfer(AssetTransferParams(
    sender=account,
    receiver=creator_or_other,
    asset_id=asset_id,
    amount=balance,  # All remaining
))

# Then opt out
algorand.send.asset_opt_out(AssetOptOutParams(
    sender=account,
    asset_id=asset_id,
    creator=creator_address,
))
```

## Account Errors

### Account Not Found

```
account ADDRESS not found
```

**Cause:** Account doesn't exist (never funded).

**Note:** Algorand accounts must receive at least minimum balance to exist.

**Fix:** Fund the account:
```python
algorand.send.payment(PaymentParams(
    sender=funder.address,
    receiver=new_account.address,
    amount=AlgoAmount(micro_algo=100_000),  # Minimum
))
```

### Invalid Address

```
invalid address: ADDRESS
```

**Cause:** Malformed Algorand address.

**Valid address format:**
- 58 characters
- Base32 encoded
- Includes checksum

**Verify address:**
```typescript
import { isValidAddress } from 'algosdk'
if (!isValidAddress(address)) {
  throw new Error('Invalid address')
}
```

### Wrong Network

```
genesis hash mismatch
```

**Cause:** Transaction built for different network than target.

**Fix:** Ensure AlgorandClient connects to correct network:
```typescript
// For TestNet
const algorand = AlgorandClient.testNet()

// For MainNet
const algorand = AlgorandClient.mainNet()

// Check network
const params = await algorand.client.algod.getTransactionParams().do()
console.log('Network:', params.genesisID)  // testnet-v1.0, mainnet-v1.0
```

## SDK Errors

### AlgodHTTPError

```
AlgodHTTPError: Network request error. Received status 401
```

**Common status codes:**
| Status | Meaning | Fix |
|--------|---------|-----|
| 401 | Unauthorized | Check API token |
| 404 | Not found | Check server URL |
| 500 | Server error | Node issue, retry |
| 503 | Unavailable | Node overloaded, retry |

**Fix for 401:**
```python
algorand = AlgorandClient.from_config(
    algod_config=AlgoClientNetworkConfig(
        server="https://testnet-api.algonode.cloud",
        port="443",
        token="",  # AlgoNode doesn't require token
    )
)
```

### Timeout Waiting for Confirmation

```
Timeout waiting for transaction TXID to be confirmed
```

**Cause:** Transaction not confirmed within wait rounds.

**Possible reasons:**
- Transaction rejected (check node logs)
- Fee too low during congestion
- Network issues

**Fix:** Increase wait time or check status:
```typescript
const result = await algorand.send.payment(
  { sender, receiver, amount: algo(1) },
  { maxRoundsToWaitForConfirmation: 10 }  // Wait longer
)
```

### Connection Refused

```
fetch failed: ECONNREFUSED
```

**Cause:** Cannot connect to Algorand node.

**Fix:**
1. For LocalNet: Ensure AlgoKit LocalNet is running (`algokit localnet start`)
2. For public networks: Check internet connection
3. Verify server URL is correct

## Application Errors

### Application Not Found

```
application APPID does not exist
```

**Cause:** App ID doesn't exist on the network.

**Fix:** Verify app exists or deploy it:
```typescript
const appInfo = await algorand.client.algod.getApplicationByID(appId).do()
```

### Not Opted Into Application

```
address ADDRESS has not opted in to application APPID
```

**Cause:** Account trying to access local state without opt-in.

**Fix:**
```python
algorand.send.app_call(AppCallParams(
    sender=user_address,
    app_id=app_id,
    on_complete=OnComplete.OptIn,
))
```

### Application Creator Only

```
cannot update or delete application: only creator can modify
```

**Cause:** Attempting to modify app without being creator.

**Fix:** Only the app creator can update/delete. Check creator:
```python
app_info = algorand.app.get_by_id(app_id)
if sender != app_info.creator:
    raise Error("Only creator can modify")
```

## Debugging Tips

### Enable Verbose Logging

```typescript
import { Config } from '@algorandfoundation/algokit-utils'
Config.configure({ debug: true })
```

### Check Transaction Status

```typescript
// Check pending transaction
const pending = await algorand.client.algod.pendingTransactionInformation(txId).do()
console.log('Pool error:', pending.poolError)

// Check confirmed transaction
const confirmed = await algorand.client.indexer.lookupTransactionByID(txId).do()
```

### Simulate Before Sending

```typescript
const result = await algorand
  .newGroup()
  .addPayment({ sender, receiver, amount: algo(1) })
  .simulate()

if (result.simulateResponse.txnGroups[0].failureMessage) {
  console.error('Would fail:', result.simulateResponse.txnGroups[0].failureMessage)
}
```

## References

- [Transaction Structure](https://dev.algorand.co/concepts/transactions/structure/)
- [Account Management](https://dev.algorand.co/concepts/accounts/)
- [Asset Overview](https://dev.algorand.co/concepts/assets/)
- [AlgoKit Utils Debugging](https://dev.algorand.co/algokit/utils/typescript/debugging/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.