Compare 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
+1 -1
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:
+3 -2
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
+4 -7
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,
+7 -14
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
+4 -16
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']
+3
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
@@ -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()
-1
View File
@@ -1,6 +1,5 @@
node_modules
dist
dist-web
dist-server
scratch
tests
-1
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
+1 -7
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"
-13
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,
});
+2 -2
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';
+1 -1
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
+2 -3
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: