Compare commits

..

23 Commits

Author SHA1 Message Date
nolash
9119c04f1f Handle single dict input to account tx list, add ext module to tasker 2021-03-02 16:49:30 +01:00
nolash
3ceafa90f4 Fix more postgres session leaks in role 2021-03-01 20:35:05 +01:00
nolash
bcf20cbfd3 Bump version 2021-03-01 13:10:34 +01:00
nolash
4af7592212 Rehabilitate import scripts and builds after syncer changes 2021-02-28 11:02:30 +01:00
nolash
4ea3933f07 Handle failed giftercallbacks 2021-02-25 08:36:39 +01:00
nolash
1edacf70cf Rehabilitate faucet and gifter callback 2021-02-25 08:30:24 +01:00
nolash
2720e9ce6a Add missing tracker start shell script 2021-02-24 18:20:45 +01:00
nolash
a0d405f582 Update chain syncer and chain lib 2021-02-24 12:53:08 +01:00
nolash
435bfa88f1 Add cic-types to import script deps 2021-02-24 10:31:09 +01:00
nolash
5b77a2ea20 Upgrade cic-eth 2021-02-24 10:23:19 +01:00
nolash
1124bd2d26 Upgrade chainsyncer 2021-02-24 09:36:42 +01:00
nolash
744c7b6840 Rehabilitate tests after chain spec, syncer and task exception retry handling changes 2021-02-24 08:21:14 +01:00
nolash
841a366a2f Rehabilitate cic seed docker compose container 2021-02-23 14:59:41 +01:00
nolash
12f887c92c Add missing new tracker start script, introduce critical db task 2021-02-23 11:10:06 +01:00
nolash
72fed82bd5 Rename cic-eth manager to tracker 2021-02-23 09:05:52 +01:00
nolash
a766a9de70 Add chainsyncer db migration, use chainsyncer in cluster, rename manager to tracker 2021-02-23 08:55:50 +01:00
nolash
dfd0de32e1 Add chainsyncer db migration, upgrade deps 2021-02-23 06:32:28 +01:00
nolash
7752ab5c5d Add graceful shutdown 2021-02-22 23:38:00 +01:00
nolash
5a6fe7327d Rehabilitate gas filter 2021-02-22 22:22:25 +01:00
nolash
1f126037fe Remove legacy syncer code 2021-02-22 21:53:36 +01:00
nolash
01387993b5 Make manager run with chainsyncer backend 2021-02-22 21:53:05 +01:00
nolash
9d6bfef73d Merge branch 'master' into lash/refactor-syncer 2021-02-22 21:00:52 +01:00
nolash
26c622f42f WIP implement chainsyncer and cic_base for manager 2021-02-21 20:38:09 +01:00
14 changed files with 30 additions and 68 deletions

View File

@@ -312,7 +312,7 @@ class Tracker:
session.close()
(provider, w3) = web3_constructor()
trust = config.get('CIC_TRUST_ADDRESS', "").split(",")
trust = config.get('CIC_TRUST_ADDRESS', []).split(",")
chain_spec = args.i
try:

View File

@@ -490,7 +490,7 @@ class Api:
queue=self.queue,
)
if self.callback_param != None:
s_assemble.link(self.callback_success).on_error(self.callback_error)
s_brief.link(self.callback_success).on_error(self.callback_error)
t = None
if external_task != None:
@@ -515,7 +515,8 @@ class Api:
c = celery.chain(s_external_get, s_external_process)
t = celery.chord([s_local, c])(s_brief)
else:
t = s_local.apply_sync()
s_local.link(s_brief)
t = s_local.apply_async()
return t

View File

@@ -204,9 +204,8 @@ def register(self, account_address, chain_str, writer_address=None):
txf = AccountTxFactory(writer_address, c)
tx_add = txf.add(account_address, chain_spec, session=session)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_account_data', session=session)
session.close()
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_account_data')
gas_budget = tx_add['gas'] * tx_add['gasPrice']
@@ -242,14 +241,12 @@ def gift(self, account_address, chain_str):
c = RpcClient(chain_spec, holder_address=account_address)
txf = AccountTxFactory(account_address, c)
session = SessionBase.create_session()
tx_add = txf.gift(account_address, chain_spec, session=session)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_gift_data', session=session)
session.close()
tx_add = txf.gift(account_address, chain_spec)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_add, chain_str, queue, 'cic_eth.eth.account.cache_gift_data')
gas_budget = tx_add['gas'] * tx_add['gasPrice']
logg.debug('gift user tx {}'.format(tx_hash_hex))
logg.debug('register user tx {}'.format(tx_hash_hex))
s = create_check_gas_and_send_task(
[tx_signed_raw_hex],
chain_str,

View File

@@ -46,7 +46,6 @@ class TokenTxFactory(TxFactory):
spender_address,
amount,
chain_spec,
session=None,
):
"""Create an ERC20 "approve" transaction
@@ -74,7 +73,7 @@ class TokenTxFactory(TxFactory):
'gas': source_token_gas,
'gasPrice': self.gas_price,
'chainId': chain_spec.chain_id(),
'nonce': self.next_nonce(session=session),
'nonce': self.next_nonce(),
})
return tx_approve
@@ -85,7 +84,6 @@ class TokenTxFactory(TxFactory):
receiver_address,
value,
chain_spec,
session=None,
):
"""Create an ERC20 "transfer" transaction
@@ -114,7 +112,7 @@ class TokenTxFactory(TxFactory):
'gas': source_token_gas,
'gasPrice': self.gas_price,
'chainId': chain_spec.chain_id(),
'nonce': self.next_nonce(session=session),
'nonce': self.next_nonce(),
})
return tx_transfer
@@ -246,11 +244,9 @@ def transfer(self, tokens, holder_address, receiver_address, value, chain_str):
c = RpcClient(chain_spec, holder_address=holder_address)
txf = TokenTxFactory(holder_address, c)
session = SessionBase.create_session()
tx_transfer = txf.transfer(t['address'], receiver_address, value, chain_spec, session=session)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_transfer, chain_str, queue, cache_task='cic_eth.eth.token.otx_cache_transfer', session=session)
session.close()
tx_transfer = txf.transfer(t['address'], receiver_address, value, chain_spec)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_transfer, chain_str, queue, cache_task='cic_eth.eth.token.otx_cache_transfer')
gas_budget = tx_transfer['gas'] * tx_transfer['gasPrice']
@@ -303,10 +299,8 @@ def approve(self, tokens, holder_address, spender_address, value, chain_str):
txf = TokenTxFactory(holder_address, c)
session = SessionBase.create_session()
tx_transfer = txf.approve(t['address'], spender_address, value, chain_spec, session=session)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_transfer, chain_str, queue, cache_task='cic_eth.eth.token.otx_cache_approve', session=session)
session.close()
tx_transfer = txf.approve(t['address'], spender_address, value, chain_spec)
(tx_hash_hex, tx_signed_raw_hex) = sign_and_register_tx(tx_transfer, chain_str, queue, cache_task='cic_eth.eth.token.otx_cache_approve')
gas_budget = tx_transfer['gas'] * tx_transfer['gasPrice']
@@ -465,7 +459,6 @@ def cache_approve_data(
return (tx_hash_hex, cache_id)
# TODO: Move to dedicated metadata package
class ExtendedTx:
_default_decimals = 6

View File

@@ -387,7 +387,6 @@ def send(self, txs, chain_str):
# TODO: if this method fails the nonce will be out of sequence. session needs to be extended to include the queue create, so that nonce is rolled back if the second sql query fails. Better yet, split each state change into separate tasks.
# TODO: method is too long, factor out code for clarity
@celery_app.task(bind=True, throws=(web3.exceptions.TransactionNotFound,), base=CriticalWeb3Task)
def refill_gas(self, recipient_address, chain_str):
"""Executes a native token transaction to fund the recipient's gas expenditures.
@@ -410,8 +409,8 @@ def refill_gas(self, recipient_address, chain_str):
q = q.filter(TxCache.from_value!=0)
q = q.filter(TxCache.recipient==recipient_address)
c = q.count()
session.close()
if c > 0:
session.close()
raise AlreadyFillingGasError(recipient_address)
queue = self.request.delivery_info['routing_key']
@@ -421,7 +420,7 @@ def refill_gas(self, recipient_address, chain_str):
logg.debug('refill gas from provider address {}'.format(c.gas_provider()))
default_nonce = c.w3.eth.getTransactionCount(c.gas_provider(), 'pending')
nonce_generator = NonceOracle(c.gas_provider(), default_nonce)
nonce = nonce_generator.next(session=session)
nonce = nonce_generator.next()
gas_price = c.gas_price()
gas_limit = c.default_gas_limit
refill_amount = c.refill_amount()
@@ -450,9 +449,7 @@ def refill_gas(self, recipient_address, chain_str):
tx_hash_hex,
tx_send_gas_signed['raw'],
chain_str,
session=session,
)
session.close()
s_tx_cache = celery.signature(
'cic_eth.eth.tx.cache_gas_refill_data',
@@ -495,8 +492,8 @@ def resend_with_higher_gas(self, txold_hash_hex, chain_str, gas=None, default_fa
q = session.query(Otx)
q = q.filter(Otx.tx_hash==txold_hash_hex)
otx = q.first()
session.close()
if otx == None:
session.close()
raise NotLocalTxError(txold_hash_hex)
chain_spec = ChainSpec.from_chain_str(chain_str)
@@ -531,10 +528,8 @@ def resend_with_higher_gas(self, txold_hash_hex, chain_str, gas=None, default_fa
tx_hash_hex,
tx_signed_raw_hex,
chain_str,
session=session,
)
TxCache.clone(txold_hash_hex, tx_hash_hex, session=session)
session.close()
TxCache.clone(txold_hash_hex, tx_hash_hex)
s = create_check_gas_and_send_task(
[tx_signed_raw_hex],
@@ -551,13 +546,6 @@ def resend_with_higher_gas(self, txold_hash_hex, chain_str, gas=None, default_fa
@celery_app.task(bind=True, throws=(web3.exceptions.TransactionNotFound,), base=CriticalWeb3Task)
def sync_tx(self, tx_hash_hex, chain_str):
"""Force update of network status of a simgle transaction
:param tx_hash_hex: Transaction hash
:type tx_hash_hex: str, 0x-hex
:param chain_str: Chain spec string representation
:type chain_str: str
"""
queue = self.request.delivery_info['routing_key']

View File

@@ -149,6 +149,9 @@ def tx_collate(tx_batches, chain_str, offset, limit, newest_first=True):
txs_by_block = {}
chain_spec = ChainSpec.from_chain_str(chain_str)
if isinstance(tx_batches, dict):
tx_batches = [tx_batches]
for b in tx_batches:
for v in b.values():
tx = None

View File

@@ -40,6 +40,8 @@ from cic_eth.callbacks import redis
from cic_eth.db.models.base import SessionBase
from cic_eth.db.models.otx import Otx
from cic_eth.db import dsn_from_config
from cic_eth.ext import tx
from cic_eth.ext import address
logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger()

View File

@@ -1,6 +1,5 @@
node_modules
dist
dist-web
dist-server
scratch
tests

View File

@@ -1,7 +1,6 @@
* 0.0.7-pending
- Add immutable content
- Add db lock on server
- Add ArgPair and KeyStore to src exports
* 0.0.6
- Add server build
* 0.0.5

View File

@@ -1,6 +1,6 @@
{
"name": "cic-client-meta",
"version": "0.0.7-alpha.3",
"version": "0.0.7-alpha.2",
"description": "Signed CRDT metadata graphs for the CIC network",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -32,12 +32,6 @@
"webpack-cli": "^4.2.0"
},
"author": "Louis Holbrook <dev@holbrook.no>",
"contributors": [
{
"name": "Spencer Ofwiti",
"email": "maxspencer56@gmail.com"
}
],
"license": "GPL-3.0-or-later",
"engines": {
"node": "~15.3.0"

View File

@@ -101,18 +101,6 @@ function parseDigest(url) {
async function processRequest(req, res) {
let digest = undefined;
const headers = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS, POST, GET, PUT",
"Access-Control-Max-Age": 2592000, // 30 days
"Access-Control-Allow-Headers": 'Access-Control-Allow-Origin, Content-Type, x-cic-automerge'
};
if (req.method === "OPTIONS") {
res.writeHead(200, headers);
res.end();
return;
}
if (!['PUT', 'GET', 'POST'].includes(req.method)) {
res.writeHead(405, {"Content-Type": "text/plain"});
@@ -213,7 +201,6 @@ async function processRequest(req, res) {
const responseContentLength = (new TextEncoder().encode(content)).length;
res.writeHead(200, {
"Access-Control-Allow-Origin": "*",
"Content-Type": contentType,
"Content-Length": responseContentLength,
});

View File

@@ -1,5 +1,5 @@
export { PGPSigner, PGPKeyStore, Signer, KeyStore } from './auth';
export { ArgPair,  Envelope, Syncable } from './sync';
export { PGPSigner, PGPKeyStore } from './auth';
export { Envelope, Syncable } from './sync';
export { User } from './assets/user';
export { Phone } from './assets/phone';
export { Config } from './config';

View File

@@ -93,7 +93,7 @@ function orderDict(src) {
return dst;
}
class Syncable implements JSONSerializable, Authoritative, Signable {
class Syncable implements JSONSerializable, Authoritative {
id: string
timestamp: number

View File

@@ -40,12 +40,11 @@ before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" $CI_REGISTRY --password-stdin
variables:
CI_DEBUG_TRACE: "true"
IMAGE_TAG_BASE: $CI_REGISTRY_IMAGE/$APP_NAME:$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA
IMAGE_TAG: $CI_REGISTRY_IMAGE/$APP_NAME:$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA
LATEST_TAG: $CI_REGISTRY_IMAGE/$APP_NAME:latest
script:
- export IMAGE_TAG="$IMAGE_TAG_BASE-$(date +%F.%H%M%S)"
- docker build -t $IMAGE_TAG -f $DOCKERFILE_PATH .
- docker push "$IMAGE_TAG
- docker push $IMAGE_TAG
- docker tag $IMAGE_TAG $LATEST_TAG
- docker push $LATEST_TAG
rules: