Skip to content

Commit 69798e9

Browse files
author
Andrey Voloshin
committed
merge
2 parents db98d44 + 5cbce09 commit 69798e9

24 files changed

+336
-294
lines changed

.buildkite/pipeline.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ steps:
5959
FTS_IMAGE: neonlabsorg/full_test_suite:develop
6060
agents:
6161
queue: "testing"
62+
artifact_paths:
63+
- "proxy.log"
64+
- "solana.log"
65+
- "measurements.log"
66+
- "evm_loader.log"
67+
- "dbcreation.log"
68+
- "faucet.log"
69+
- "airdropper.log"
70+
- "indexer.log"
6271

6372
- wait
6473

.buildkite/steps/deploy-test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ function cleanup_docker {
4444

4545
if docker logs solana >solana.log 2>&1; then echo "solana logs saved"; fi
4646
if docker logs evm_loader >evm_loader.log 2>&1; then echo "evm_loader logs saved"; fi
47+
if docker logs dbcreation >dbcreation.log 2>&1; then echo "dbcreation logs saved"; fi
4748
if docker logs faucet >faucet.log 2>&1; then echo "faucet logs saved"; fi
4849
if docker logs airdropper >airdropper.log 2>&1; then echo "airdropper logs saved"; fi
4950
if docker logs indexer >indexer.log 2>&1; then echo "indexer logs saved"; fi

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ WORKDIR /opt
1313

1414
RUN apt update && \
1515
DEBIAN_FRONTEND=noninteractive apt install -y git software-properties-common openssl curl parallel \
16-
ca-certificates python3-pip python3-venv && \
16+
ca-certificates python3-pip python3-venv postgresql-client && \
1717
python3 -m venv venv && \
1818
pip3 install --upgrade pip && \
1919
/bin/bash -c "source venv/bin/activate" && \

proxy/__main__.py

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,19 @@
99
:license: BSD, see LICENSE for more details.
1010
"""
1111

12-
from solana.publickey import PublicKey
1312
from .proxy import entry_point
1413
import os
15-
from .indexer.airdropper import run_airdropper
1614
from .indexer.indexer import run_indexer
1715

1816
if __name__ == '__main__':
19-
airdropper_mode = os.environ.get('AIRDROPPER_MODE', 'False').lower() in [1, 'true', 'True']
20-
indexer_mode = os.environ.get('INDEXER_MODE', 'False').lower() in [1, 'true', 'True']
21-
if airdropper_mode:
22-
print("Will run in airdropper mode")
23-
solana_url = os.environ['SOLANA_URL']
24-
pyth_mapping_account = PublicKey(os.environ['PYTH_MAPPING_ACCOUNT'])
25-
faucet_url = os.environ['FAUCET_URL']
26-
wrapper_whitelist = os.environ['INDEXER_ERC20_WRAPPER_WHITELIST']
27-
if wrapper_whitelist != 'ANY':
28-
wrapper_whitelist = wrapper_whitelist.split(',')
29-
neon_decimals = int(os.environ.get('NEON_DECIMALS', '9'))
17+
solana_url = os.environ['SOLANA_URL']
18+
evm_loader_id = os.environ['EVM_LOADER']
19+
print(f"Will run with SOLANA_URL={solana_url}; EVM_LOADER={evm_loader_id}")
3020

31-
pp_solana_url = os.environ.get('PP_SOLANA_URL', None)
32-
max_conf = float(os.environ.get('MAX_CONFIDENCE_INTERVAL', 0.02))
21+
indexer_mode = os.environ.get('INDEXER_MODE', 'False').lower() in [1, 'true', 'True']
3322

34-
run_airdropper(solana_url,
35-
pyth_mapping_account,
36-
faucet_url,
37-
wrapper_whitelist,
38-
neon_decimals,
39-
pp_solana_url,
40-
max_conf)
41-
elif indexer_mode:
23+
if indexer_mode:
4224
print("Will run in indexer mode")
43-
44-
solana_url = os.environ['SOLANA_URL']
45-
4625
run_indexer(solana_url)
4726
else:
4827
entry_point()

proxy/airdropper/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .airdropper import Airdropper, AIRDROP_AMOUNT_SOL, NEON_PRICE_USD
2+
from .airdropper_app import AirdropperApp

proxy/airdropper/__main__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from . import AirdropperApp
2+
3+
if __name__ == '__main__':
4+
airdropper_app = AirdropperApp()
5+
exit_code = airdropper_app.run()
6+
exit(exit_code)
Lines changed: 8 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
from solana.publickey import PublicKey
2-
from proxy.indexer.indexer_base import IndexerBase
3-
from proxy.indexer.pythnetwork import PythNetworkClient
4-
from proxy.indexer.base_db import BaseDB
5-
from proxy.indexer.utils import check_error
6-
from proxy.indexer.sql_dict import SQLDict
72
import requests
83
import base58
94
import traceback
105
from datetime import datetime
116
from decimal import Decimal
127
from logged_groups import logged_group
8+
139
from ..environment import NEON_PRICE_USD, EVM_LOADER_ID
1410
from ..common_neon.solana_interactor import SolanaInteractor
11+
from ..indexer.indexer_base import IndexerBase
12+
from ..indexer.pythnetwork import PythNetworkClient
13+
from ..indexer.base_db import BaseDB
14+
from ..indexer.utils import check_error
15+
from ..indexer.sql_dict import SQLDict
1516

1617

1718
ACCOUNT_CREATION_PRICE_SOL = Decimal('0.00472692')
@@ -20,18 +21,7 @@
2021

2122
class FailedAttempts(BaseDB):
2223
def __init__(self) -> None:
23-
BaseDB.__init__(self)
24-
25-
def _create_table_sql(self) -> str:
26-
self._table_name = 'failed_airdrop_attempts'
27-
return f'''
28-
CREATE TABLE IF NOT EXISTS {self._table_name} (
29-
attempt_time BIGINT,
30-
eth_address TEXT,
31-
reason TEXT
32-
);
33-
CREATE INDEX IF NOT EXISTS failed_attempt_time_idx ON {self._table_name} (attempt_time);
34-
'''
24+
BaseDB.__init__(self, 'failed_airdrop_attempts')
3525

3626
def airdrop_failed(self, eth_address, reason):
3727
with self._conn.cursor() as cur:
@@ -43,19 +33,7 @@ def airdrop_failed(self, eth_address, reason):
4333

4434
class AirdropReadySet(BaseDB):
4535
def __init__(self):
46-
BaseDB.__init__(self)
47-
48-
def _create_table_sql(self) -> str:
49-
self._table_name = 'airdrop_ready'
50-
return f'''
51-
CREATE TABLE IF NOT EXISTS {self._table_name} (
52-
eth_address TEXT UNIQUE,
53-
scheduled_ts BIGINT,
54-
finished_ts BIGINT,
55-
duration INTEGER,
56-
amount_galans INTEGER
57-
)
58-
'''
36+
BaseDB.__init__(self, 'airdrop_ready')
5937

6038
def register_airdrop(self, eth_address: str, airdrop_info: dict):
6139
finished = int(datetime.now().timestamp())
@@ -293,34 +271,3 @@ def process_receipts(self):
293271
self.process_trx_airdropper_mode(trx)
294272
self.latest_processed_slot = max(self.latest_processed_slot, max_slot)
295273
self._constants['latest_processed_slot'] = self.latest_processed_slot
296-
297-
298-
@logged_group("neon.Airdropper")
299-
def run_airdropper(solana_url,
300-
pyth_mapping_account: PublicKey,
301-
faucet_url,
302-
wrapper_whitelist = 'ANY',
303-
neon_decimals = 9,
304-
pp_solana_url = None,
305-
max_conf = 0.1, *, logger):
306-
logger.info(f"""Running indexer with params:
307-
solana_url: {solana_url},
308-
evm_loader_id: {EVM_LOADER_ID},
309-
pyth.network mapping account: {pyth_mapping_account},
310-
faucet_url: {faucet_url},
311-
wrapper_whitelist: {wrapper_whitelist},
312-
NEON decimals: {neon_decimals},
313-
Price provider solana: {pp_solana_url},
314-
Max confidence interval: {max_conf}""")
315-
316-
try:
317-
airdropper = Airdropper(solana_url,
318-
pyth_mapping_account,
319-
faucet_url,
320-
wrapper_whitelist,
321-
neon_decimals,
322-
pp_solana_url,
323-
max_conf)
324-
airdropper.run()
325-
except Exception as err:
326-
logger.error(f'Failed to start Airdropper: {err}')

proxy/airdropper/airdropper_app.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import os
2+
from logged_groups import logged_group
3+
from solana.publickey import PublicKey
4+
5+
from ..environment import EVM_LOADER_ID
6+
7+
from .airdropper import Airdropper
8+
9+
10+
@logged_group("neon.Airdropper")
11+
class AirdropperApp:
12+
13+
def __init__(self):
14+
self.info("Airdropper application is starting ...")
15+
pyth_mapping_account = PublicKey(os.environ['PYTH_MAPPING_ACCOUNT'])
16+
faucet_url = os.environ['FAUCET_URL']
17+
wrapper_whitelist = os.environ['INDEXER_ERC20_WRAPPER_WHITELIST']
18+
if wrapper_whitelist != 'ANY':
19+
wrapper_whitelist = wrapper_whitelist.split(',')
20+
neon_decimals = int(os.environ.get('NEON_DECIMALS', '9'))
21+
22+
pp_solana_url = os.environ.get('PP_SOLANA_URL', None)
23+
max_conf = float(os.environ.get('MAX_CONFIDENCE_INTERVAL', 0.02))
24+
solana_url = os.environ['SOLANA_URL']
25+
26+
self.info(f"""Construct Airdropper with params:
27+
solana_url: {solana_url},
28+
evm_loader_id: {EVM_LOADER_ID},
29+
pyth.network mapping account: {pyth_mapping_account},
30+
faucet_url: {faucet_url},
31+
wrapper_whitelist: {wrapper_whitelist},
32+
NEON decimals: {neon_decimals},
33+
Price provider solana: {pp_solana_url},
34+
Max confidence interval: {max_conf}""")
35+
36+
self._airdropper = Airdropper(solana_url, pyth_mapping_account, faucet_url, wrapper_whitelist, neon_decimals,
37+
pp_solana_url, max_conf)
38+
39+
def run(self) -> int:
40+
try:
41+
self._airdropper.run()
42+
except Exception as err:
43+
self.error(f'Failed to start Airdropper: {err}')
44+
return 1
45+
return 0

proxy/common_neon/costs.py

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,7 @@
66

77
class SQLCost(BaseDB):
88
def __init__(self):
9-
BaseDB.__init__(self)
10-
11-
def _create_table_sql(self) -> str:
12-
self._table_name = 'OPERATOR_COST'
13-
return f"""
14-
CREATE TABLE IF NOT EXISTS {self._table_name} (
15-
id SERIAL PRIMARY KEY,
16-
hash char(64),
17-
cost bigint,
18-
used_gas bigint,
19-
sender char(40),
20-
to_address char(40) ,
21-
sig char(100),
22-
status varchar(100),
23-
reason varchar(100)
24-
);
25-
"""
9+
BaseDB.__init__(self, 'OPERATOR_COST')
2610

2711
def insert(self, hash, cost, used_gas, sender, to_address, sig, status, reason):
2812
with self._conn.cursor() as cur:

0 commit comments

Comments
 (0)