Split out tools, admin and services setup
This commit is contained in:
parent
a075c55957
commit
4897007bf9
5
apps/cic-eth/admin_requirements.txt
Normal file
5
apps/cic-eth/admin_requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
SQLAlchemy==1.3.20
|
||||||
|
cic-eth-registry~=0.5.6a1
|
||||||
|
hexathon~=0.0.1a7
|
||||||
|
chainqueue~=0.0.2b5
|
||||||
|
eth-erc20==0.0.10a2
|
@ -5,4 +5,3 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from .api_task import Api
|
from .api_task import Api
|
||||||
from .api_admin import AdminApi
|
|
||||||
|
@ -8,11 +8,10 @@ import logging
|
|||||||
|
|
||||||
# external imports
|
# external imports
|
||||||
import celery
|
import celery
|
||||||
from cic_eth_registry import CICRegistry
|
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.db.enum import LockEnum
|
from cic_eth.enum import LockEnum
|
||||||
|
|
||||||
app = celery.current_app
|
app = celery.current_app
|
||||||
|
|
||||||
|
@ -1,158 +1 @@
|
|||||||
# standard imports
|
from cic_eth.enum import *
|
||||||
import enum
|
|
||||||
|
|
||||||
|
|
||||||
@enum.unique
|
|
||||||
class StatusBits(enum.IntEnum):
|
|
||||||
"""Individual bit flags that are combined to define the state and legacy of a queued transaction
|
|
||||||
|
|
||||||
"""
|
|
||||||
QUEUED = 0x01 # transaction should be sent to network
|
|
||||||
IN_NETWORK = 0x08 # transaction is in network
|
|
||||||
|
|
||||||
DEFERRED = 0x10 # an attempt to send the transaction to network has failed
|
|
||||||
GAS_ISSUES = 0x20 # transaction is pending sender account gas funding
|
|
||||||
|
|
||||||
LOCAL_ERROR = 0x100 # errors that originate internally from the component
|
|
||||||
NODE_ERROR = 0x200 # errors originating in the node (invalid RLP input...)
|
|
||||||
NETWORK_ERROR = 0x400 # errors that originate from the network (REVERT)
|
|
||||||
UNKNOWN_ERROR = 0x800 # unclassified errors (the should not occur)
|
|
||||||
|
|
||||||
FINAL = 0x1000 # transaction processing has completed
|
|
||||||
OBSOLETE = 0x2000 # transaction has been replaced by a different transaction with higher fee
|
|
||||||
MANUAL = 0x8000 # transaction processing has been manually overridden
|
|
||||||
|
|
||||||
|
|
||||||
@enum.unique
|
|
||||||
class StatusEnum(enum.IntEnum):
|
|
||||||
"""
|
|
||||||
|
|
||||||
- Inactive, not finalized. (<0)
|
|
||||||
* PENDING: The initial state of a newly added transaction record. No action has been performed on this transaction yet.
|
|
||||||
* SENDFAIL: The transaction was not received by the node.
|
|
||||||
* RETRY: The transaction is queued for a new send attempt after previously failing.
|
|
||||||
* READYSEND: The transaction is queued for its first send attempt
|
|
||||||
* OBSOLETED: A new transaction with the same nonce and higher gas has been sent to network.
|
|
||||||
* WAITFORGAS: The transaction is on hold pending gas funding.
|
|
||||||
- Active state: (==0)
|
|
||||||
* SENT: The transaction has been sent to the mempool.
|
|
||||||
- Inactive, finalized. (>0)
|
|
||||||
* FUBAR: Unknown error occurred and transaction is abandoned. Manual intervention needed.
|
|
||||||
* CANCELLED: The transaction was sent, but was not mined and has disappered from the mempool. This usually follows a transaction being obsoleted.
|
|
||||||
* OVERRIDDEN: Transaction has been manually overriden.
|
|
||||||
* REJECTED: The transaction was rejected by the node.
|
|
||||||
* REVERTED: The transaction was mined, but exception occurred during EVM execution. (Block number will be set)
|
|
||||||
* SUCCESS: THe transaction was successfully mined. (Block number will be set)
|
|
||||||
|
|
||||||
"""
|
|
||||||
PENDING = 0
|
|
||||||
|
|
||||||
SENDFAIL = StatusBits.DEFERRED | StatusBits.LOCAL_ERROR
|
|
||||||
RETRY = StatusBits.QUEUED | StatusBits.DEFERRED
|
|
||||||
READYSEND = StatusBits.QUEUED
|
|
||||||
|
|
||||||
OBSOLETED = StatusBits.OBSOLETE | StatusBits.IN_NETWORK
|
|
||||||
|
|
||||||
WAITFORGAS = StatusBits.GAS_ISSUES
|
|
||||||
|
|
||||||
SENT = StatusBits.IN_NETWORK
|
|
||||||
FUBAR = StatusBits.FINAL | StatusBits.UNKNOWN_ERROR
|
|
||||||
CANCELLED = StatusBits.IN_NETWORK | StatusBits.FINAL | StatusBits.OBSOLETE
|
|
||||||
OVERRIDDEN = StatusBits.FINAL | StatusBits.OBSOLETE | StatusBits.MANUAL
|
|
||||||
|
|
||||||
REJECTED = StatusBits.NODE_ERROR | StatusBits.FINAL
|
|
||||||
REVERTED = StatusBits.IN_NETWORK | StatusBits.FINAL | StatusBits.NETWORK_ERROR
|
|
||||||
SUCCESS = StatusBits.IN_NETWORK | StatusBits.FINAL
|
|
||||||
|
|
||||||
|
|
||||||
@enum.unique
|
|
||||||
class LockEnum(enum.IntEnum):
|
|
||||||
"""
|
|
||||||
STICKY: When set, reset is not possible
|
|
||||||
CREATE: Disable creation of accounts
|
|
||||||
SEND: Disable sending to network
|
|
||||||
QUEUE: Disable queueing new or modified transactions
|
|
||||||
"""
|
|
||||||
STICKY=1
|
|
||||||
INIT=2
|
|
||||||
CREATE=4
|
|
||||||
SEND=8
|
|
||||||
QUEUE=16
|
|
||||||
QUERY=32
|
|
||||||
ALL=int(0xfffffffffffffffe)
|
|
||||||
|
|
||||||
|
|
||||||
def status_str(v, bits_only=False):
|
|
||||||
"""Render a human-readable string describing the status
|
|
||||||
|
|
||||||
If the bit field exactly matches a StatusEnum value, the StatusEnum label will be returned.
|
|
||||||
|
|
||||||
If a StatusEnum cannot be matched, the string will be postfixed with "*", unless explicitly instructed to return bit field labels only.
|
|
||||||
|
|
||||||
:param v: Status bit field
|
|
||||||
:type v: number
|
|
||||||
:param bits_only: Only render individual bit labels.
|
|
||||||
:type bits_only: bool
|
|
||||||
:returns: Status string
|
|
||||||
:rtype: str
|
|
||||||
"""
|
|
||||||
s = ''
|
|
||||||
if not bits_only:
|
|
||||||
try:
|
|
||||||
s = StatusEnum(v).name
|
|
||||||
return s
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if v == 0:
|
|
||||||
return 'NONE'
|
|
||||||
|
|
||||||
for i in range(16):
|
|
||||||
b = (1 << i)
|
|
||||||
if (b & 0xffff) & v:
|
|
||||||
n = StatusBits(b).name
|
|
||||||
if len(s) > 0:
|
|
||||||
s += ','
|
|
||||||
s += n
|
|
||||||
if not bits_only:
|
|
||||||
s += '*'
|
|
||||||
return s
|
|
||||||
|
|
||||||
|
|
||||||
def all_errors():
|
|
||||||
"""Bit mask of all error states
|
|
||||||
|
|
||||||
:returns: Error flags
|
|
||||||
:rtype: number
|
|
||||||
"""
|
|
||||||
return StatusBits.LOCAL_ERROR | StatusBits.NODE_ERROR | StatusBits.NETWORK_ERROR | StatusBits.UNKNOWN_ERROR
|
|
||||||
|
|
||||||
|
|
||||||
def is_error_status(v):
|
|
||||||
"""Check if value is an error state
|
|
||||||
|
|
||||||
:param v: Status bit field
|
|
||||||
:type v: number
|
|
||||||
:returns: True if error
|
|
||||||
:rtype: bool
|
|
||||||
"""
|
|
||||||
return bool(v & all_errors())
|
|
||||||
|
|
||||||
|
|
||||||
def dead():
|
|
||||||
"""Bit mask defining whether a transaction is still likely to be processed on the network.
|
|
||||||
|
|
||||||
:returns: Bit mask
|
|
||||||
:rtype: number
|
|
||||||
"""
|
|
||||||
return StatusBits.FINAL | StatusBits.OBSOLETE
|
|
||||||
|
|
||||||
|
|
||||||
def is_alive(v):
|
|
||||||
"""Check if transaction is still likely to be processed on the network.
|
|
||||||
|
|
||||||
The contingency of "likely" refers to the case a transaction has been obsoleted after sent to the network, but the network still confirms the obsoleted transaction. The return value of this method will not change as a result of this, BUT the state itself will (as the FINAL bit will be set).
|
|
||||||
|
|
||||||
:returns:
|
|
||||||
"""
|
|
||||||
return bool(v & dead() == 0)
|
|
||||||
|
158
apps/cic-eth/cic_eth/enum.py
Normal file
158
apps/cic-eth/cic_eth/enum.py
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
# standard imports
|
||||||
|
import enum
|
||||||
|
|
||||||
|
|
||||||
|
@enum.unique
|
||||||
|
class StatusBits(enum.IntEnum):
|
||||||
|
"""Individual bit flags that are combined to define the state and legacy of a queued transaction
|
||||||
|
|
||||||
|
"""
|
||||||
|
QUEUED = 0x01 # transaction should be sent to network
|
||||||
|
IN_NETWORK = 0x08 # transaction is in network
|
||||||
|
|
||||||
|
DEFERRED = 0x10 # an attempt to send the transaction to network has failed
|
||||||
|
GAS_ISSUES = 0x20 # transaction is pending sender account gas funding
|
||||||
|
|
||||||
|
LOCAL_ERROR = 0x100 # errors that originate internally from the component
|
||||||
|
NODE_ERROR = 0x200 # errors originating in the node (invalid RLP input...)
|
||||||
|
NETWORK_ERROR = 0x400 # errors that originate from the network (REVERT)
|
||||||
|
UNKNOWN_ERROR = 0x800 # unclassified errors (the should not occur)
|
||||||
|
|
||||||
|
FINAL = 0x1000 # transaction processing has completed
|
||||||
|
OBSOLETE = 0x2000 # transaction has been replaced by a different transaction with higher fee
|
||||||
|
MANUAL = 0x8000 # transaction processing has been manually overridden
|
||||||
|
|
||||||
|
|
||||||
|
@enum.unique
|
||||||
|
class StatusEnum(enum.IntEnum):
|
||||||
|
"""
|
||||||
|
|
||||||
|
- Inactive, not finalized. (<0)
|
||||||
|
* PENDING: The initial state of a newly added transaction record. No action has been performed on this transaction yet.
|
||||||
|
* SENDFAIL: The transaction was not received by the node.
|
||||||
|
* RETRY: The transaction is queued for a new send attempt after previously failing.
|
||||||
|
* READYSEND: The transaction is queued for its first send attempt
|
||||||
|
* OBSOLETED: A new transaction with the same nonce and higher gas has been sent to network.
|
||||||
|
* WAITFORGAS: The transaction is on hold pending gas funding.
|
||||||
|
- Active state: (==0)
|
||||||
|
* SENT: The transaction has been sent to the mempool.
|
||||||
|
- Inactive, finalized. (>0)
|
||||||
|
* FUBAR: Unknown error occurred and transaction is abandoned. Manual intervention needed.
|
||||||
|
* CANCELLED: The transaction was sent, but was not mined and has disappered from the mempool. This usually follows a transaction being obsoleted.
|
||||||
|
* OVERRIDDEN: Transaction has been manually overriden.
|
||||||
|
* REJECTED: The transaction was rejected by the node.
|
||||||
|
* REVERTED: The transaction was mined, but exception occurred during EVM execution. (Block number will be set)
|
||||||
|
* SUCCESS: THe transaction was successfully mined. (Block number will be set)
|
||||||
|
|
||||||
|
"""
|
||||||
|
PENDING = 0
|
||||||
|
|
||||||
|
SENDFAIL = StatusBits.DEFERRED | StatusBits.LOCAL_ERROR
|
||||||
|
RETRY = StatusBits.QUEUED | StatusBits.DEFERRED
|
||||||
|
READYSEND = StatusBits.QUEUED
|
||||||
|
|
||||||
|
OBSOLETED = StatusBits.OBSOLETE | StatusBits.IN_NETWORK
|
||||||
|
|
||||||
|
WAITFORGAS = StatusBits.GAS_ISSUES
|
||||||
|
|
||||||
|
SENT = StatusBits.IN_NETWORK
|
||||||
|
FUBAR = StatusBits.FINAL | StatusBits.UNKNOWN_ERROR
|
||||||
|
CANCELLED = StatusBits.IN_NETWORK | StatusBits.FINAL | StatusBits.OBSOLETE
|
||||||
|
OVERRIDDEN = StatusBits.FINAL | StatusBits.OBSOLETE | StatusBits.MANUAL
|
||||||
|
|
||||||
|
REJECTED = StatusBits.NODE_ERROR | StatusBits.FINAL
|
||||||
|
REVERTED = StatusBits.IN_NETWORK | StatusBits.FINAL | StatusBits.NETWORK_ERROR
|
||||||
|
SUCCESS = StatusBits.IN_NETWORK | StatusBits.FINAL
|
||||||
|
|
||||||
|
|
||||||
|
@enum.unique
|
||||||
|
class LockEnum(enum.IntEnum):
|
||||||
|
"""
|
||||||
|
STICKY: When set, reset is not possible
|
||||||
|
CREATE: Disable creation of accounts
|
||||||
|
SEND: Disable sending to network
|
||||||
|
QUEUE: Disable queueing new or modified transactions
|
||||||
|
"""
|
||||||
|
STICKY=1
|
||||||
|
INIT=2
|
||||||
|
CREATE=4
|
||||||
|
SEND=8
|
||||||
|
QUEUE=16
|
||||||
|
QUERY=32
|
||||||
|
ALL=int(0xfffffffffffffffe)
|
||||||
|
|
||||||
|
|
||||||
|
def status_str(v, bits_only=False):
|
||||||
|
"""Render a human-readable string describing the status
|
||||||
|
|
||||||
|
If the bit field exactly matches a StatusEnum value, the StatusEnum label will be returned.
|
||||||
|
|
||||||
|
If a StatusEnum cannot be matched, the string will be postfixed with "*", unless explicitly instructed to return bit field labels only.
|
||||||
|
|
||||||
|
:param v: Status bit field
|
||||||
|
:type v: number
|
||||||
|
:param bits_only: Only render individual bit labels.
|
||||||
|
:type bits_only: bool
|
||||||
|
:returns: Status string
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
|
s = ''
|
||||||
|
if not bits_only:
|
||||||
|
try:
|
||||||
|
s = StatusEnum(v).name
|
||||||
|
return s
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if v == 0:
|
||||||
|
return 'NONE'
|
||||||
|
|
||||||
|
for i in range(16):
|
||||||
|
b = (1 << i)
|
||||||
|
if (b & 0xffff) & v:
|
||||||
|
n = StatusBits(b).name
|
||||||
|
if len(s) > 0:
|
||||||
|
s += ','
|
||||||
|
s += n
|
||||||
|
if not bits_only:
|
||||||
|
s += '*'
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
def all_errors():
|
||||||
|
"""Bit mask of all error states
|
||||||
|
|
||||||
|
:returns: Error flags
|
||||||
|
:rtype: number
|
||||||
|
"""
|
||||||
|
return StatusBits.LOCAL_ERROR | StatusBits.NODE_ERROR | StatusBits.NETWORK_ERROR | StatusBits.UNKNOWN_ERROR
|
||||||
|
|
||||||
|
|
||||||
|
def is_error_status(v):
|
||||||
|
"""Check if value is an error state
|
||||||
|
|
||||||
|
:param v: Status bit field
|
||||||
|
:type v: number
|
||||||
|
:returns: True if error
|
||||||
|
:rtype: bool
|
||||||
|
"""
|
||||||
|
return bool(v & all_errors())
|
||||||
|
|
||||||
|
|
||||||
|
def dead():
|
||||||
|
"""Bit mask defining whether a transaction is still likely to be processed on the network.
|
||||||
|
|
||||||
|
:returns: Bit mask
|
||||||
|
:rtype: number
|
||||||
|
"""
|
||||||
|
return StatusBits.FINAL | StatusBits.OBSOLETE
|
||||||
|
|
||||||
|
|
||||||
|
def is_alive(v):
|
||||||
|
"""Check if transaction is still likely to be processed on the network.
|
||||||
|
|
||||||
|
The contingency of "likely" refers to the case a transaction has been obsoleted after sent to the network, but the network still confirms the obsoleted transaction. The return value of this method will not change as a result of this, BUT the state itself will (as the FINAL bit will be set).
|
||||||
|
|
||||||
|
:returns:
|
||||||
|
"""
|
||||||
|
return bool(v & dead() == 0)
|
@ -12,7 +12,7 @@ from chainlib.eth.constant import ZERO_ADDRESS
|
|||||||
from chainlib.eth.address import is_checksum_address
|
from chainlib.eth.address import is_checksum_address
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.api import AdminApi
|
from cic_eth.api.admin import AdminApi
|
||||||
from cic_eth.db.enum import LockEnum
|
from cic_eth.db.enum import LockEnum
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
@ -12,10 +12,8 @@ import confini
|
|||||||
import celery
|
import celery
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.api import (
|
from cic_eth.api import Api
|
||||||
Api,
|
from cic_eth.api.admin import AdminApi
|
||||||
AdminApi,
|
|
||||||
)
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
logging.basicConfig(level=logging.WARNING)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
@ -11,7 +11,7 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainlib.eth.connection import EthHTTPConnection
|
from chainlib.eth.connection import EthHTTPConnection
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.api.api_admin import AdminApi
|
from cic_eth.api.admin import AdminApi
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
logging.basicConfig(level=logging.WARNING)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
@ -12,7 +12,7 @@ from chainlib.chain import ChainSpec
|
|||||||
from xdg.BaseDirectory import xdg_config_home
|
from xdg.BaseDirectory import xdg_config_home
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.api import AdminApi
|
from cic_eth.api.admin import AdminApi
|
||||||
from cic_eth.db import dsn_from_config
|
from cic_eth.db import dsn_from_config
|
||||||
from cic_eth.db.models.base import SessionBase
|
from cic_eth.db.models.base import SessionBase
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ from chainlib.eth.connection import EthHTTPConnection
|
|||||||
from hexathon import add_0x
|
from hexathon import add_0x
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.api import AdminApi
|
from cic_eth.api.admin import AdminApi
|
||||||
from cic_eth.db.enum import (
|
from cic_eth.db.enum import (
|
||||||
StatusEnum,
|
StatusEnum,
|
||||||
status_str,
|
status_str,
|
||||||
|
@ -8,9 +8,9 @@ import semver
|
|||||||
|
|
||||||
version = (
|
version = (
|
||||||
0,
|
0,
|
||||||
11,
|
12,
|
||||||
1,
|
0,
|
||||||
'alpha.3',
|
'alpha.1',
|
||||||
)
|
)
|
||||||
|
|
||||||
version_object = semver.VersionInfo(
|
version_object = semver.VersionInfo(
|
||||||
|
@ -1,25 +1,3 @@
|
|||||||
cic-base==0.1.3a3+build.984b5cff
|
|
||||||
celery==4.4.7
|
celery==4.4.7
|
||||||
crypto-dev-signer~=0.4.14b6
|
chainlib~=0.0.5a1
|
||||||
confini~=0.3.6rc3
|
|
||||||
cic-eth-registry~=0.5.6a1
|
|
||||||
redis==3.5.3
|
|
||||||
alembic==1.4.2
|
|
||||||
websockets==8.1
|
|
||||||
requests~=2.24.0
|
|
||||||
eth_accounts_index~=0.0.12a1
|
|
||||||
erc20-transfer-authorization~=0.3.2a1
|
|
||||||
uWSGI==2.0.19.1
|
|
||||||
semver==2.13.0
|
semver==2.13.0
|
||||||
websocket-client==0.57.0
|
|
||||||
moolb~=0.1.1b2
|
|
||||||
eth-address-index~=0.1.2a1
|
|
||||||
chainlib-eth~=0.0.5a1
|
|
||||||
hexathon~=0.0.1a7
|
|
||||||
chainsyncer[sql]~=0.0.3a3
|
|
||||||
chainqueue~=0.0.2b5
|
|
||||||
sarafu-faucet~=0.0.4a1
|
|
||||||
erc20-faucet~=0.2.2a1
|
|
||||||
coincurve==15.0.0
|
|
||||||
potaahto~=0.0.1a2
|
|
||||||
pycryptodome==3.10.1
|
|
||||||
|
7
apps/cic-eth/services_requirements.txt
Normal file
7
apps/cic-eth/services_requirements.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
chainsyncer[sql]~=0.0.3a3
|
||||||
|
chainqueue~=0.0.2b5
|
||||||
|
alembic==1.4.2
|
||||||
|
confini~=0.3.6rc4
|
||||||
|
redis==3.5.3
|
||||||
|
hexathon~=0.0.1a7
|
||||||
|
pycryptodome==3.10.1
|
@ -45,16 +45,16 @@ scripts =
|
|||||||
[options.entry_points]
|
[options.entry_points]
|
||||||
console_scripts =
|
console_scripts =
|
||||||
# daemons
|
# daemons
|
||||||
cic-eth-taskerd = cic_eth.runnable.daemons.tasker:main
|
cic-eth-taskerd = cic_eth.runnable.daemons.tasker:main [services]
|
||||||
cic-eth-trackerd = cic_eth.runnable.daemons.tracker:main
|
cic-eth-trackerd = cic_eth.runnable.daemons.tracker:main [services]
|
||||||
cic-eth-dispatcherd = cic_eth.runnable.daemons.dispatcher:main
|
cic-eth-dispatcherd = cic_eth.runnable.daemons.dispatcher:main [services]
|
||||||
cic-eth-retrierd = cic_eth.runnable.daemons.retry:main
|
cic-eth-retrierd = cic_eth.runnable.daemons.retry:main [services]
|
||||||
# tools
|
# tools
|
||||||
cic-eth-create = cic_eth.runnable.create:main
|
cic-eth-create = cic_eth.runnable.create:main [tools]
|
||||||
cic-eth-inspect = cic_eth.runnable.view:main
|
cic-eth-inspect = cic_eth.runnable.view:main [tools]
|
||||||
cic-eth-ctl = cic_eth.runnable.ctrl:main
|
cic-eth-ctl = cic_eth.runnable.ctrl:main [tools]
|
||||||
cic-eth-info = cic_eth.runnable.info:main
|
cic-eth-info = cic_eth.runnable.info:main [tools]
|
||||||
# TODO: Merge this with ctl when subcmds sorted to submodules
|
# TODO: Merge this with ctl when subcmds sorted to submodules
|
||||||
cic-eth-tag = cic_eth.runnable.tag:main
|
cic-eth-tag = cic_eth.runnable.tag:main [tools]
|
||||||
cic-eth-resend = cic_eth.runnable.resend:main
|
cic-eth-resend = cic_eth.runnable.resend:main [tools]
|
||||||
cic-eth-transfer = cic_eth.runnable.transfer:main
|
cic-eth-transfer = cic_eth.runnable.transfer:main [tools]
|
||||||
|
@ -11,6 +11,41 @@ while True:
|
|||||||
requirements.append(l.rstrip())
|
requirements.append(l.rstrip())
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
admin_requirements = []
|
||||||
|
f = open('admin_requirements.txt', 'r')
|
||||||
|
while True:
|
||||||
|
l = f.readline()
|
||||||
|
if l == '':
|
||||||
|
break
|
||||||
|
admin_requirements.append(l.rstrip())
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tools_requirements = []
|
||||||
|
f = open('tools_requirements.txt', 'r')
|
||||||
|
while True:
|
||||||
|
l = f.readline()
|
||||||
|
if l == '':
|
||||||
|
break
|
||||||
|
tools_requirements.append(l.rstrip())
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
|
services_requirements = []
|
||||||
|
f = open('services_requirements.txt', 'r')
|
||||||
|
while True:
|
||||||
|
l = f.readline()
|
||||||
|
if l == '':
|
||||||
|
break
|
||||||
|
services_requirements.append(l.rstrip())
|
||||||
|
f.close()
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
install_requires=requirements
|
install_requires=requirements,
|
||||||
|
extras_require = {
|
||||||
|
'tools': tools_requirements,
|
||||||
|
'admin_api': admin_requirements,
|
||||||
|
'services': services_requirements,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
19
apps/cic-eth/tools_requirements.txt
Normal file
19
apps/cic-eth/tools_requirements.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
crypto-dev-signer~=0.4.14b6
|
||||||
|
chainqueue~=0.0.2b5
|
||||||
|
confini~=0.3.6rc4
|
||||||
|
cic-eth-registry~=0.5.6a1
|
||||||
|
redis==3.5.3
|
||||||
|
#websockets==8.1
|
||||||
|
#requests~=2.24.0
|
||||||
|
#eth_accounts_index~=0.0.12a1
|
||||||
|
#erc20-transfer-authorization~=0.3.2a1
|
||||||
|
#websocket-client==0.57.0
|
||||||
|
#moolb~=0.1.1b2
|
||||||
|
#eth-address-index~=0.1.2a1
|
||||||
|
hexathon~=0.0.1a7
|
||||||
|
#sarafu-faucet~=0.0.4a1
|
||||||
|
#erc20-faucet~=0.2.2a1
|
||||||
|
#coincurve==15.0.0
|
||||||
|
#potaahto~=0.0.1a2
|
||||||
|
pycryptodome==3.10.1
|
||||||
|
pyxdg==0.27
|
Loading…
Reference in New Issue
Block a user