- Potlock Indexer (Django / Poetry / Celery / NEAR Lake Framework)
- Stack:
- Steps to run:
- API Basics
- API Endpoints
- Accountendpoints- ✅ Get all accounts: GET /accounts(paginated)
- ✅ Get account by ID (address): GET /accounts/{ACCOUNT_ID}
- ✅ Get donations received for account: GET /accounts/{ACCOUNT_ID}/donations_received(paginated)
- ✅ Get donations sent for account: GET /accounts/{ACCOUNT_ID}/donations_sent(paginated)
- ✅ Get pots for account: GET /accounts/{ACCOUNT_ID}/active_pots(paginated)
- ✅ Get applications for account: GET /accounts/{ACCOUNT_ID}/pot_applications(paginated)
- ✅ Get registrations to lists by account: GET /accounts/{ACCOUNT_ID}/list-registrations(paginated)
 
- ✅ Get all accounts: 
- Listendpoints
- Donate Contract Config endpoint
- Donorsendpoints
- Potsendpoints
- Statsendpoints
 
 
- Django w/ Poetry
- Celery for background indexer task
- NEAR Data Lake Framework for fetching/listening for blocks
- Set up env vars via ~/.bashrcor~/.zshrc(see below)
- Install poetry
- Install redis
- Install postgres
- Create postgres database potlockfor userpostgres
- Activate poetry shell (poetry shell)
- Install dependencies (poetry install)
- Run migrations (python manage.py migrate)
- Update indexer_app.tasks.listen_to_near_eventswith desired network & start block (if desired)
- Start celery worker with logger (celery -A base worker --loglevel=info)
- Start indexer (python manage.py runindexer)
- Kill indexer (python manage.py killindexer)- If for some reason this doesn't kill any active celery tasks, run ps auxww | grep 'celery' | grep -v grepand kill resulting PIDs
 
- If for some reason this doesn't kill any active celery tasks, run 
Extra commands that might come in useful:
- Purge celery queue (celery -A base purge)
export PL_AWS_ACCESS_KEY_ID=
export PL_AWS_SECRET_ACCESS_KEY=
export PL_CACHALOT_ENABLED=False
export PL_DEBUG=True
export PL_ENVIRONMENT=local
export PL_LOG_LEVEL=debug
export PL_POSTGRES_DB=potlock
export PL_POSTGRES_HOST=127.0.0.1
export PL_POSTGRES_PASS=
export PL_POSTGRES_PORT=5432
export PL_POSTGRES_USER=$USER
export PL_REDIS_HOST=
export PL_REDIS_PORT=6379
export PL_SENTRY_DSN=
dev (mainnet): https://dev.potlock.io/api/v1/
testnet: https://test-dev.potlock.io/api/v1/
This is a public, read-only API and as such does not currently implement authentication or authorization.
Rate limits of 500 requests/min are enforced to ensure service for all users.
An error response (status code not within range 200-299) will always contain an object body with a message string property containing more information about the error.
Possible Error Codes:
- 400(Bad Request)- Error in client request
 
- 404(Not found)- Requested resource could not be located
 
- 500(Internal Error)- Check messagestring for more information
 
- Check 
Pagination available using page and page_size as query param on endpoints that specify paginated. Default page_size is 30.
Endpoints that support pagination will return a success response containing the following:
- count(int) - total number of items available
- next(str | null) - pre-populated endpoint link to the next page of results
- previous(str | null) - pre-populated endpoint link to the previous page of results
- results(any[]) - array of results
NB: These endpoints are what is required to integrate with BOS app & replace current RPC calls, but more endpoints can easily be added as needed.
Can specify status=live query param to retrieve only pots that are currently active (live matching round)
Can specify status={PotApplicationStatus} query param to retrieve applications with a given status:
enum PotApplicationStatus {
  Pending,
  Approved,
  Rejected,
  InReview,
}Can specify status to filter by using status query param if desired, e.g. status=Approved
Can specify status to filter by using status query param if desired, e.g. status=Approved
Can also specify project category to filter by using category query param if desired, e.g. category=Education
Can specify status to filter by using status query param if desired, e.g. status=Approved
Returns all accounts that have sent at least one donation.
Optional query params:
- sort(currently only allowed value is- most_donated_usd, which returns results in the order of most to least donated in USD) e.g.- ?sort=most_donated_usd
NB: POT_ID == on-chain Pot address
Returns:
- total_donations_usd
- total_payouts_usd
- total_donations_count
- total_donors_count
- total_recipients_count