Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ classifiers = [
"Programming Language :: Python",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
]
dynamic = [ "version" ]
dependencies = [
Expand Down
17 changes: 13 additions & 4 deletions src/aleph/db/accessors/balances.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,9 +497,12 @@ def update_credit_balances_expense(
"""
Updates credit balances for expense messages (aleph_credit_expense).

Expense messages have negative amounts and only include origin_ref field.
Other fields like ratio, tx_hash, provider, payment_method, token, chain,
origin, and expiration_date are not present.
Expense messages have negative amounts and can include:
- execution_id (mapped to origin)
- node_id (mapped to tx_hash)
- price (mapped to ratio)
- time (skipped for now)
- ref (mapped to origin_ref)
"""

last_update = utc_now()
Expand All @@ -510,8 +513,14 @@ def update_credit_balances_expense(
amount = -abs(int(credit_entry["amount"]))
origin_ref = credit_entry.get("ref", "")

# Map new fields
origin = credit_entry.get("execution_id", "")
tx_hash = credit_entry.get("node_id", "")
ratio = credit_entry.get("price", "")
# Skip time field for now

csv_rows.append(
f"{address};{amount};{message_hash};{index};{message_timestamp};{last_update};;;;;;;ALEPH;{origin_ref};credit_expense"
f"{address};{amount};{message_hash};{index};{message_timestamp};{last_update};{ratio};{tx_hash};;;;{origin};ALEPH;{origin_ref};credit_expense"
)

_bulk_insert_credit_history(session, csv_rows)
Expand Down
52 changes: 52 additions & 0 deletions tests/db/test_credit_balances.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ def test_update_credit_balances_expense(session_factory: DbSessionFactory):
assert expense_record.token is None
assert expense_record.chain is None
assert expense_record.provider == "ALEPH"
assert expense_record.origin is None
assert expense_record.origin_ref == "expense_ref"
assert expense_record.payment_method == "credit_expense"
assert expense_record.credit_ref == "expense_msg_789"
Expand All @@ -111,6 +112,57 @@ def test_update_credit_balances_expense(session_factory: DbSessionFactory):
assert expense_record.message_timestamp == message_timestamp


def test_update_credit_balances_expense_with_new_fields(
session_factory: DbSessionFactory,
):
"""Test direct database insertion for credit expense messages with new fields."""
credits_list = [
{
"address": "0x456",
"amount": 500,
"ref": "expense_ref",
"execution_id": "exec_12345",
"node_id": "node_67890",
"price": "0.001",
"time": 1640995200000, # This will be skipped for now
}
]

message_timestamp = dt.datetime(2023, 1, 2, 12, 0, 0, tzinfo=dt.timezone.utc)

with session_factory() as session:
update_credit_balances_expense(
session=session,
credits_list=credits_list,
message_hash="expense_msg_with_fields_789",
message_timestamp=message_timestamp,
)
session.commit()

# Verify expense record was inserted with new field mappings
expense_record = (
session.query(AlephCreditHistoryDb)
.filter_by(address="0x456", credit_ref="expense_msg_with_fields_789")
.first()
)

assert expense_record is not None
assert expense_record.address == "0x456"
assert expense_record.amount == -500
assert expense_record.ratio == Decimal("0.001") # price mapped to ratio
assert expense_record.tx_hash == "node_67890" # node_id mapped to tx_hash
assert expense_record.token is None
assert expense_record.chain is None
assert expense_record.provider == "ALEPH"
assert expense_record.origin == "exec_12345" # execution_id mapped to origin
assert expense_record.origin_ref == "expense_ref"
assert expense_record.payment_method == "credit_expense"
assert expense_record.credit_ref == "expense_msg_with_fields_789"
assert expense_record.credit_index == 0
assert expense_record.expiration_date is None
assert expense_record.message_timestamp == message_timestamp


def test_update_credit_balances_transfer(session_factory: DbSessionFactory):
"""Test direct database insertion for credit transfer messages."""
credits_list = [
Expand Down
Loading