Skip to content

Commit 5fa8c99

Browse files
committed
feat: Added support for fetchin apps from debank
1 parent ba81368 commit 5fa8c99

6 files changed

Lines changed: 535 additions & 2 deletions

File tree

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"python.testing.pytestEnabled": true
3+
}

blockapi/test/v2/api/debank/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from blockapi.test.v2.api.conftest import read_file, read_json_file
77
from blockapi.v2.api.debank import (
88
DebankApi,
9+
DebankAppParser,
910
DebankBalanceParser,
1011
DebankChain,
1112
DebankPortfolioParser,
@@ -58,6 +59,11 @@ def portfolio_parser(protocol_parser, balance_parser):
5859
return DebankPortfolioParser(protocol_parser, balance_parser)
5960

6061

62+
@pytest.fixture
63+
def app_parser():
64+
return DebankAppParser()
65+
66+
6167
@pytest.fixture
6268
def balance_item():
6369
return BalanceItem.from_api(
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
from decimal import Decimal
2+
3+
import pytest
4+
5+
from blockapi.v2.api.debank import (
6+
DebankApp,
7+
DebankAppDeposit,
8+
DebankPrediction,
9+
)
10+
11+
12+
@pytest.fixture
13+
def polymarket_response():
14+
"""Sample response from get_complex_app_list for Polymarket."""
15+
return [
16+
{
17+
"id": "polymarket",
18+
"name": "Polymarket",
19+
"site_url": "https://polymarket.com/",
20+
"logo_url": "https://static.debank.com/image/project/logo_url/app_polymarket/265aca8cef9212e094ef24c71a01c175.png",
21+
"has_supported_portfolio": True,
22+
"portfolio_item_list": [
23+
{
24+
"stats": {
25+
"asset_usd_value": 290915.13432776055,
26+
"debt_usd_value": 0,
27+
"net_usd_value": 290915.13432776055,
28+
},
29+
"asset_dict": {"be0eecf639f4e6a57e375123e46ed7b4": 290595.12768},
30+
"asset_token_list": [
31+
{
32+
"id": "be0eecf639f4e6a57e375123e46ed7b4",
33+
"name": "USDC",
34+
"symbol": "USDC",
35+
"decimals": 6,
36+
"logo_url": "https://static.debank.com/image/app_token/logo_url/polymarket/fc98c076b66fa798bcd8755cd859032e.png",
37+
"app_id": "polymarket",
38+
"price": 1.0011012113324658,
39+
"amount": 290595.12768,
40+
}
41+
],
42+
"update_at": 1768998504.1334498,
43+
"name": "Deposit",
44+
"detail_types": ["common"],
45+
"detail": {
46+
"supply_token_list": [
47+
{
48+
"id": "be0eecf639f4e6a57e375123e46ed7b4",
49+
"name": "USDC",
50+
"symbol": "USDC",
51+
"decimals": 6,
52+
"logo_url": "https://static.debank.com/image/app_token/logo_url/polymarket/fc98c076b66fa798bcd8755cd859032e.png",
53+
"app_id": "polymarket",
54+
"price": 1.0011012113324658,
55+
"amount": 290595.12768,
56+
}
57+
]
58+
},
59+
"proxy_detail": {},
60+
"position_index": "cash_0x5c23dead9ecf271448411096f349133e0bb9c465",
61+
},
62+
{
63+
"stats": {
64+
"asset_usd_value": 27068.1993,
65+
"debt_usd_value": 0,
66+
"net_usd_value": 27068.1993,
67+
},
68+
"asset_dict": {},
69+
"asset_token_list": [],
70+
"update_at": 1768998504.1336002,
71+
"name": "Prediction",
72+
"detail_types": ["prediction"],
73+
"detail": {
74+
"name": "Lighter market cap (FDV) >$1B one day after launch?",
75+
"side": "Yes",
76+
"amount": 27068.1993,
77+
"price": 1,
78+
"claimable": True,
79+
"event_end_at": None,
80+
"is_market_closed": False,
81+
},
82+
"proxy_detail": {},
83+
"position_index": "0x5c23dead9ecf271448411096f349133e0bb9c465_108054592060808479303370270554306028883916458239782628449790057811735078958789",
84+
},
85+
{
86+
"stats": {
87+
"asset_usd_value": 5099.9924519999995,
88+
"debt_usd_value": 0,
89+
"net_usd_value": 5099.9924519999995,
90+
},
91+
"asset_dict": {},
92+
"asset_token_list": [],
93+
"update_at": 1768998504.1336374,
94+
"name": "Prediction",
95+
"detail_types": ["prediction"],
96+
"detail": {
97+
"name": "Gensyn FDV above $600M one day after launch?",
98+
"side": "Yes",
99+
"amount": 19999.9704,
100+
"price": 0.255,
101+
"claimable": False,
102+
"event_end_at": None,
103+
"is_market_closed": False,
104+
},
105+
"proxy_detail": {},
106+
"position_index": "0x5c23dead9ecf271448411096f349133e0bb9c465_101101625858935510994152869873088213062714890530116131353411379193297614599911",
107+
},
108+
],
109+
}
110+
]
111+
112+
113+
def test_empty_response(app_parser):
114+
parsed_apps = app_parser.parse([])
115+
assert parsed_apps == []
116+
117+
118+
def test_parse_polymarket_app(app_parser, polymarket_response):
119+
parsed_apps = app_parser.parse(polymarket_response)
120+
assert len(parsed_apps) == 1
121+
122+
app = parsed_apps[0]
123+
assert isinstance(app, DebankApp)
124+
assert app.app_id == "polymarket"
125+
assert app.name == "Polymarket"
126+
assert app.site_url == "https://polymarket.com/"
127+
assert app.has_supported_portfolio is True
128+
129+
130+
def test_parse_polymarket_deposits(app_parser, polymarket_response):
131+
"""Deposits should be parsed as DebankAppDeposit objects."""
132+
parsed_apps = app_parser.parse(polymarket_response)
133+
app = parsed_apps[0]
134+
135+
# Should have 1 deposit
136+
assert len(app.deposits) == 1
137+
deposit = app.deposits[0]
138+
139+
assert isinstance(deposit, DebankAppDeposit)
140+
assert deposit.name == "Deposit"
141+
assert deposit.asset_usd_value == Decimal("290915.13432776055")
142+
assert deposit.debt_usd_value == Decimal("0")
143+
assert deposit.net_usd_value == Decimal("290915.13432776055")
144+
assert deposit.position_index == "cash_0x5c23dead9ecf271448411096f349133e0bb9c465"
145+
146+
# Should have 1 token (USDC)
147+
assert len(deposit.tokens) == 1
148+
assert deposit.tokens[0]["symbol"] == "USDC"
149+
assert deposit.token_symbols == ["USDC"]
150+
151+
152+
def test_parse_polymarket_predictions(app_parser, polymarket_response):
153+
"""Predictions should be parsed as DebankPrediction objects."""
154+
parsed_apps = app_parser.parse(polymarket_response)
155+
app = parsed_apps[0]
156+
157+
# Should have 2 predictions
158+
assert len(app.predictions) == 2
159+
160+
pred1 = app.predictions[0]
161+
assert isinstance(pred1, DebankPrediction)
162+
assert (
163+
pred1.prediction_name == "Lighter market cap (FDV) >$1B one day after launch?"
164+
)
165+
assert pred1.side == "Yes"
166+
assert pred1.amount == Decimal("27068.1993")
167+
assert pred1.price == Decimal("1")
168+
assert pred1.usd_value == Decimal("27068.1993")
169+
assert pred1.claimable is True
170+
assert pred1.is_market_closed is False
171+
172+
pred2 = app.predictions[1]
173+
assert pred2.prediction_name == "Gensyn FDV above $600M one day after launch?"
174+
assert pred2.side == "Yes"
175+
assert pred2.amount == Decimal("19999.9704")
176+
assert pred2.price == Decimal("0.255")
177+
assert pred2.claimable is False
178+
179+
180+
def test_prediction_stores_raw(app_parser, polymarket_response):
181+
"""Predictions should store raw data for debugging."""
182+
parsed_apps = app_parser.parse(polymarket_response)
183+
pred = parsed_apps[0].predictions[0]
184+
185+
assert pred.raw is not None
186+
assert "stats" in pred.raw
187+
assert "detail" in pred.raw
188+
189+
190+
def test_parse_multiple_apps(app_parser):
191+
"""Test parsing multiple apps."""
192+
response = [
193+
{
194+
"id": "app1",
195+
"name": "App 1",
196+
"has_supported_portfolio": True,
197+
"portfolio_item_list": [
198+
{
199+
"stats": {
200+
"asset_usd_value": 100,
201+
"debt_usd_value": 0,
202+
"net_usd_value": 100,
203+
},
204+
"name": "Prediction",
205+
"detail_types": ["prediction"],
206+
"detail": {
207+
"name": "Test prediction",
208+
"side": "Yes",
209+
"amount": 100,
210+
"price": 0.5,
211+
"claimable": False,
212+
"is_market_closed": False,
213+
},
214+
}
215+
],
216+
},
217+
{
218+
"id": "app2",
219+
"name": "App 2",
220+
"has_supported_portfolio": False,
221+
"portfolio_item_list": [],
222+
},
223+
]
224+
225+
parsed_apps = app_parser.parse(response)
226+
assert len(parsed_apps) == 2
227+
assert parsed_apps[0].app_id == "app1"
228+
assert parsed_apps[1].app_id == "app2"

blockapi/v2/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
BlockchairDogecoinApi,
66
BlockchairLitecoinApi,
77
)
8-
from blockapi.v2.api.debank import DebankApi
8+
from blockapi.v2.api.debank import DebankApi, DebankApp, DebankAppDeposit, DebankPrediction
99
from blockapi.v2.api.ethplorer import EthplorerApi
1010
from blockapi.v2.api.optimistic_etherscan import OptimismEtherscanApi
1111
from blockapi.v2.api.perpetual import PerpetualApi, perp_contract_address

0 commit comments

Comments
 (0)