init
This commit is contained in:
commit
8a8458ac8b
7
.gitlab-ci.yml
Normal file
7
.gitlab-ci.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
include:
|
||||||
|
- local: 'ci_templates/.cic-base.yml'
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- build
|
||||||
|
- test
|
||||||
|
- release
|
23
README.md
Normal file
23
README.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# cic-internal-integration
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
start cluster
|
||||||
|
```
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
stop cluster
|
||||||
|
```
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
delete data
|
||||||
|
```
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
rebuild all the images
|
||||||
|
```
|
||||||
|
docker-compose build --no-cache
|
||||||
|
```
|
34
apps/cic-base-os/Dockerfile
Normal file
34
apps/cic-base-os/Dockerfile
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# The solc image messes up the alpine environment, so we have to go all over again
|
||||||
|
FROM python:3.8.6-slim-buster
|
||||||
|
|
||||||
|
LABEL authors="Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746"
|
||||||
|
LABEL spdx-license-identifier="GPL-3.0-or-later"
|
||||||
|
LABEL description="Base layer for buiding development images for the cic component suite"
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y git gcc g++ libpq-dev && \
|
||||||
|
apt-get install -y vim gawk jq telnet openssl iputils-ping curl wget gnupg socat bash procps make python2 postgresql-client
|
||||||
|
|
||||||
|
|
||||||
|
RUN echo installing nodejs tooling
|
||||||
|
|
||||||
|
COPY ./dev/nvm.sh /root/
|
||||||
|
|
||||||
|
# Install nvm with node and npm
|
||||||
|
# https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker
|
||||||
|
ENV NVM_DIR /root/.nvm
|
||||||
|
ENV NODE_VERSION 15.3.0
|
||||||
|
ENV BANCOR_NODE_VERSION 10.16.0
|
||||||
|
|
||||||
|
RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash \
|
||||||
|
&& . $NVM_DIR/nvm.sh \
|
||||||
|
&& nvm install $NODE_VERSION \
|
||||||
|
&& nvm alias default $NODE_VERSION \
|
||||||
|
&& nvm use $NODE_VERSION \
|
||||||
|
# So many ridiculously stupid issues with node in docker that take oceans of absolutely wasted time to resolve
|
||||||
|
# owner of these files is "1001" by default - wtf
|
||||||
|
&& chown -R root:root "$NVM_DIR/versions/node/v$NODE_VERSION"
|
||||||
|
|
||||||
|
ENV NODE_PATH $NVM_DIR/versions/node//v$NODE_VERSION/lib/node_modules
|
||||||
|
ENV PATH $NVM_DIR/versions/node//v$NODE_VERSION/bin:$PATH
|
||||||
|
|
1
apps/cic-base-os/README.md
Normal file
1
apps/cic-base-os/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
## this is an example base image if we wanted one for all the other apps. Its just OS level things
|
175
apps/contract-migration/Dockerfile
Normal file
175
apps/contract-migration/Dockerfile
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#FROM ethereum/solc:0.6.12
|
||||||
|
FROM ethereum/solc:0.8.0
|
||||||
|
|
||||||
|
# The solc image messes up the alpine environment, so we have to go all over again
|
||||||
|
FROM alpine
|
||||||
|
COPY --from=0 /usr/bin/solc /usr/bin/solc
|
||||||
|
|
||||||
|
RUN apk update && \
|
||||||
|
apk add make git
|
||||||
|
|
||||||
|
WORKDIR /usr/src
|
||||||
|
|
||||||
|
ARG cic_config_commit=2fa9fd511f6782a0a527d730edb52a3fe86f571b
|
||||||
|
ARG cic_config_url=https://gitlab.com/grassrootseconomics/cic-config.git/
|
||||||
|
RUN echo Install confini schema files && \
|
||||||
|
git clone --depth 1 $cic_config_url cic-config && \
|
||||||
|
cd cic-config && \
|
||||||
|
git fetch --depth 1 origin $cic_config_commit && \
|
||||||
|
git checkout $cic_config_commit && \
|
||||||
|
mkdir -vp /usr/local/etc/cic && \
|
||||||
|
cp -v *.ini /usr/local/etc/cic/
|
||||||
|
ENV CONFINI_DIR /usr/local/etc/cic
|
||||||
|
|
||||||
|
|
||||||
|
ARG cic_contracts_commit=698ef3a30fde8d7f2c498f1208fb0ff45d665501
|
||||||
|
ARG cic_contracts_url=https://gitlab.com/grassrootseconomics/cic-contracts.git/
|
||||||
|
RUN echo Install ABI collection for solidity interfaces used across all components && \
|
||||||
|
git clone --depth 1 $cic_contracts_url cic-contracts && \
|
||||||
|
cd cic-contracts && \
|
||||||
|
git fetch --depth 1 origin $cic_contracts_commit && \
|
||||||
|
git checkout $cic_contracts_commit && \
|
||||||
|
make install
|
||||||
|
|
||||||
|
#COPY ./Makefile ./cic-contracts/Makefile
|
||||||
|
#COPY ./*.sol ./cic-contracts/
|
||||||
|
|
||||||
|
#RUN cd cic-contracts && \
|
||||||
|
# make -B && make install -B
|
||||||
|
|
||||||
|
FROM python:3.8.6-slim-buster
|
||||||
|
|
||||||
|
COPY --from=1 /usr/local/share/cic/ /usr/local/share/cic/
|
||||||
|
|
||||||
|
LABEL authors="Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746"
|
||||||
|
LABEL spdx-license-identifier="GPL-3.0-or-later"
|
||||||
|
LABEL description="Base layer for buiding development images for the cic component suite"
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y git gcc g++ libpq-dev && \
|
||||||
|
apt-get install -y vim gawk jq telnet openssl iputils-ping curl wget gnupg socat bash procps make python2 postgresql-client
|
||||||
|
|
||||||
|
|
||||||
|
RUN echo installing nodejs tooling
|
||||||
|
|
||||||
|
COPY ./dev/nvm.sh /root/
|
||||||
|
|
||||||
|
# Install nvm with node and npm
|
||||||
|
# https://stackoverflow.com/questions/25899912/how-to-install-nvm-in-docker
|
||||||
|
ENV NVM_DIR /root/.nvm
|
||||||
|
ENV NODE_VERSION 15.3.0
|
||||||
|
ENV BANCOR_NODE_VERSION 10.16.0
|
||||||
|
|
||||||
|
RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash \
|
||||||
|
&& . $NVM_DIR/nvm.sh \
|
||||||
|
&& nvm install $NODE_VERSION \
|
||||||
|
&& nvm alias default $NODE_VERSION \
|
||||||
|
&& nvm use $NODE_VERSION \
|
||||||
|
# So many ridiculously stupid issues with node in docker that take oceans of absolutely wasted time to resolve
|
||||||
|
# owner of these files is "1001" by default - wtf
|
||||||
|
&& chown -R root:root "$NVM_DIR/versions/node/v$NODE_VERSION"
|
||||||
|
|
||||||
|
ENV NODE_PATH $NVM_DIR/versions/node//v$NODE_VERSION/lib/node_modules
|
||||||
|
ENV PATH $NVM_DIR/versions/node//v$NODE_VERSION/bin:$PATH
|
||||||
|
|
||||||
|
|
||||||
|
ARG pip_extra_index_url=https://pip.grassrootseconomics.net:8433
|
||||||
|
|
||||||
|
# This is a temporary solution for building the Bancor contracts using the bancor protocol repository truffle setup
|
||||||
|
# We should instead flatten the files ourselves and build them with solc in the first image layer in this file
|
||||||
|
ARG cic_bancor_commit=a04c7ae6882ea515938d852cc861d59a35070094
|
||||||
|
ARG cic_bancor_url=https://gitlab.com/grassrootseconomics/cic-bancor.git/
|
||||||
|
ARG cic_bancor_contracts_url=https://github.com/bancorprotocol/contracts-solidity
|
||||||
|
RUN echo Compile and install bancor protocol contracts && \
|
||||||
|
git clone --depth 1 $cic_bancor_url cic-bancor && \
|
||||||
|
cd cic-bancor && \
|
||||||
|
git fetch --depth 1 origin $cic_bancor_commit && \
|
||||||
|
git checkout $cic_bancor_commit && \
|
||||||
|
# Apparently the git version here doesn't have set-url as a command. *sigh*
|
||||||
|
#if [ ! -z $cic_bancor_contracts_url ]; then
|
||||||
|
# git submodule set-url bancor $cic_bancor_contracts_url
|
||||||
|
#fi
|
||||||
|
git submodule init && \
|
||||||
|
git submodule update
|
||||||
|
RUN cd root && \
|
||||||
|
. $NVM_DIR/nvm.sh &&\
|
||||||
|
nvm install $BANCOR_NODE_VERSION && \
|
||||||
|
nvm use $BANCOR_NODE_VERSION && \
|
||||||
|
cd - && \
|
||||||
|
cd cic-bancor/bancor && \
|
||||||
|
npm install --python=/usr/bin/python2 && \
|
||||||
|
node_modules/truffle/build/cli.bundled.js compile && \
|
||||||
|
mkdir -vp /usr/local/share/cic/bancor/solidity/build && \
|
||||||
|
cp -vR solidity/build/contracts /usr/local/share/cic/bancor/solidity/build/
|
||||||
|
RUN cd cic-bancor/python && \
|
||||||
|
pip install --extra-index-url $pip_extra_index_url .
|
||||||
|
|
||||||
|
ARG cryptocurrency_cli_tools_version=0.0.4
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url cryptocurrency-cli-tools==$cryptocurrency_cli_tools_version
|
||||||
|
|
||||||
|
ARG giftable_erc20_token_version=0.0.7b1
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url giftable-erc20-token==$giftable_erc20_token_version
|
||||||
|
|
||||||
|
ARG eth_accounts_index_version=0.0.10a2
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url eth-accounts-index==$eth_accounts_index_version
|
||||||
|
|
||||||
|
ARG erc20_approval_escrow_version=0.3.0a1
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url erc20-approval-escrow==$erc20_approval_escrow_version
|
||||||
|
|
||||||
|
ARG erc20_single_shot_faucet_version=0.2.0a1
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url erc20-single-shot-faucet==$erc20_single_shot_faucet_version
|
||||||
|
|
||||||
|
ARG eth_address_index_version==0.1.0a1
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url eth-address-index==$eth_address_index_version
|
||||||
|
|
||||||
|
# RUN echo Install cic specific python packages
|
||||||
|
ARG cic_registry_version=0.5.3a4
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url cic-registry==$cic_registry_version
|
||||||
|
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url crypto-dev-signer==0.4.13b9
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
# RUN pip install --extra-index-url $pip_extra_index_url crypto-dev-signer==0.4.12
|
||||||
|
|
||||||
|
RUN pip install --extra-index-url $pip_extra_index_url \
|
||||||
|
cryptocurrency-cli-tools==$cryptocurrency_cli_tools_version \
|
||||||
|
giftable-erc20-token==$giftable_erc20_token_version \
|
||||||
|
eth-accounts-index==$eth_accounts_index_version \
|
||||||
|
erc20-approval-escrow==$erc20_approval_escrow_version \
|
||||||
|
erc20-single-shot-faucet==$erc20_single_shot_faucet_version \
|
||||||
|
cic-registry==$cic_registry_version \
|
||||||
|
crypto-dev-signer==0.4.13b9
|
||||||
|
|
||||||
|
|
||||||
|
COPY testdata/pgp testdata/pgp
|
||||||
|
|
||||||
|
RUN mkdir -vp /tmp/cic/pgp
|
||||||
|
COPY testdata/pgp/* /tmp/cic/pgp/
|
||||||
|
|
||||||
|
# COPY .env_config_template .env_config_template
|
||||||
|
# COPY .env_dockercompose_template .env_dockercompose_template
|
||||||
|
|
||||||
|
COPY reset.sh .
|
||||||
|
# COPY data.sh data.sh
|
||||||
|
COPY keystore keystore
|
||||||
|
COPY wait-for-it.sh .
|
||||||
|
RUN chmod +x reset.sh wait-for-it.sh
|
||||||
|
|
||||||
|
LABEL version="4"
|
||||||
|
|
||||||
|
# DEFAULTS ASSUME THE FOLLOWING MNEMONIC ON GANACHE-CLI
|
||||||
|
# history stumble mystery avoid embark arrive mom foil pledge keep grain dice
|
||||||
|
ENV DEV_ETH_ACCOUNT_RESERVE_OWNER="0xc14958CD9A605AB0d9A36850362AaD2b9D42DF97"
|
||||||
|
ENV DEV_ETH_ACCOUNT_RESERVE_MINTER="0xe3C4db5947409Aff0FF8D643047EA41515cA4B8e"
|
||||||
|
ENV DEV_ETH_ACCOUNT_CONTRACT_DEPLOYER="0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C"
|
||||||
|
ENV DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_OWNER="0x1AB26f3AAaaa884B651E213508592F3Ec6BfCe74"
|
||||||
|
ENV DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER="0xACB0BC74E1686D62dE7DC6414C999EA60C09F0eA"
|
||||||
|
ENV DEV_ETH_RESERVE_AMOUNT="1000000000000000000000000"
|
||||||
|
ENV CIC_CHAIN_SPEC="Bloxberg:8995"
|
||||||
|
ENV CIC_DATA_DIR="/tmp/cic/config"
|
||||||
|
|
||||||
|
# populated internally when running provisioning script (reset.sh)
|
||||||
|
# ENV DEV_ETH_RESERVE_ADDRESS
|
||||||
|
# ENV BANCOR_REGISTRY_ADDRESS
|
||||||
|
# ENV DEV_ETH_ACCOUNTS_INDEX_ADDRESS
|
||||||
|
|
674
apps/contract-migration/LICENSE.txt
Normal file
674
apps/contract-migration/LICENSE.txt
Normal file
@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
53
apps/contract-migration/README.md
Normal file
53
apps/contract-migration/README.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Contract Migration
|
||||||
|
|
||||||
|
Common docker artifacts and bootstrap scripts
|
||||||
|
|
||||||
|
## How this repo works
|
||||||
|
|
||||||
|
This repo builds contracts and deploys them to a chain
|
||||||
|
|
||||||
|
First, bring up an eth evm provider
|
||||||
|
```
|
||||||
|
docker-compose up eth
|
||||||
|
```
|
||||||
|
|
||||||
|
Now build this repo's image and run it against the 'eth' service (ganache, for example). You will need to bind to the docker-compose network (cic-network) and mount the special contract output folder that dependent services use to get deployed contract addresses.
|
||||||
|
|
||||||
|
Here is how to do that in one shot:
|
||||||
|
```
|
||||||
|
docker build -t registry.gitlab.com/grassrootseconomics/cic-docker-internal . && docker run --env ETH_PROVIDER=http://eth:8545 --net cic-network -v cic-docker-internal_contract-config:/tmp/cic/config --rm -it registry.gitlab.com/grassrootseconomics/cic-docker-internal reset.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Stop the containers and bring down the services with
|
||||||
|
```
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want a fresh start to the dev environment then bring down the services and delete their associated volumes with
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
A goal is to go through all of these containers and create a default non-root user a la:
|
||||||
|
https://vsupalov.com/docker-shared-permissions/
|
||||||
|
|
||||||
|
## Tips and Tricks
|
||||||
|
|
||||||
|
Sometimes you just want to hold a container open in docker compose so you can exec into it and poke around. Replace "command" with
|
||||||
|
|
||||||
|
```
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
tail -f /dev/null
|
||||||
|
```
|
||||||
|
then
|
||||||
|
|
||||||
|
```
|
||||||
|
docker exec -it [IMAGE_NANE] sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
2
apps/contract-migration/config_template/bancor.ini
Normal file
2
apps/contract-migration/config_template/bancor.ini
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[bancor]
|
||||||
|
dir = /usr/local/share/cic/bancor
|
3
apps/contract-migration/config_template/celery.ini
Normal file
3
apps/contract-migration/config_template/celery.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[celery]
|
||||||
|
broker_url = redis://redis:6379
|
||||||
|
result_url = redis://redis:6379
|
7
apps/contract-migration/config_template/cic.ini
Normal file
7
apps/contract-migration/config_template/cic.ini
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[cic]
|
||||||
|
registry_address =
|
||||||
|
token_index_address =
|
||||||
|
accounts_index_address =
|
||||||
|
declarator_address =
|
||||||
|
approval_escrow_address =
|
||||||
|
chain_spec = Bloxberg:8996
|
8
apps/contract-migration/config_template/database.ini
Normal file
8
apps/contract-migration/config_template/database.ini
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[database]
|
||||||
|
user = postgres
|
||||||
|
password = tralala
|
||||||
|
name =
|
||||||
|
host = postgres
|
||||||
|
port = 5432
|
||||||
|
engine = postgres
|
||||||
|
driver = psycopg2
|
33
apps/contract-migration/config_template/dev.ini
Normal file
33
apps/contract-migration/config_template/dev.ini
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
[dev]
|
||||||
|
mnemonic = "history stumble mystery avoid embark arrive mom foil pledge keep grain dice"
|
||||||
|
eth_reserve_address =
|
||||||
|
eth_accounts_index_address =
|
||||||
|
# 10m * 10^18 (10^7 * 10^18)
|
||||||
|
eth_reserve_amount = 1000000000000000000000000
|
||||||
|
|
||||||
|
eth_account_contract_deployer=0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C
|
||||||
|
eth_account_gas_provider=0xFfe6E610d1Ea184AEE71c6B39828ecE921f04a7F
|
||||||
|
eth_account_gas_gifter=0xFfe6E610d1Ea184AEE71c6B39828ecE921f04a7F
|
||||||
|
eth_account_reserve_owner=0xc14958CD9A605AB0d9A36850362AaD2b9D42DF97
|
||||||
|
eth_account_reserve_minter=0xe3C4db5947409Aff0FF8D643047EA41515cA4B8e
|
||||||
|
eth_account_accounts_index_owner=0x1AB26f3AAaaa884B651E213508592F3Ec6BfCe74
|
||||||
|
eth_account_accounts_index_writer=0xACB0BC74E1686D62dE7DC6414C999EA60C09F0eA
|
||||||
|
eth_account_sarafu_owner=0x5567139c7a1C2977A391f51D8cA45B1D6700f5F6
|
||||||
|
eth_account_sarafu_gifter=0x1149D55B3495CdC8FcfaF2816384AafaeFfaEa24
|
||||||
|
eth_account_approval_escrow_owner=0x8754122F5718dC02Db5062c62fD4a63A5448623E
|
||||||
|
eth_account_single_shot_faucet_owner=0x34C85E47f45b0bea09F37c83e2fb02ECBC3a395d
|
||||||
|
|
||||||
|
eth_sarafu_token_address =
|
||||||
|
eth_token_index_address =
|
||||||
|
eth_sarafu_faucet_address =
|
||||||
|
eth_erc20_approval_escrow_address =
|
||||||
|
|
||||||
|
eth_sarafu_token_name=Sarafu
|
||||||
|
eth_sarafu_token_symbol=SRF
|
||||||
|
eth_sarafu_token_decimals=18
|
||||||
|
|
||||||
|
pgp_publickeys_active_file = publickeys.asc
|
||||||
|
pgp_publickeys_trusted_file =
|
||||||
|
pgp_publickeys_encrypt_file =
|
||||||
|
|
||||||
|
faucet_amount = 1000000
|
3
apps/contract-migration/config_template/eth.ini
Normal file
3
apps/contract-migration/config_template/eth.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[eth]
|
||||||
|
provider = http://eth:8545
|
||||||
|
abi_dir = /usr/local/share/cic/solidity/abi
|
2
apps/contract-migration/config_template/meta.ini
Normal file
2
apps/contract-migration/config_template/meta.ini
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[meta]
|
||||||
|
provider = http://cic-meta-server:80
|
4
apps/contract-migration/config_template/pgp.ini
Normal file
4
apps/contract-migration/config_template/pgp.ini
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[pgp]
|
||||||
|
exports_dir = /tmp/cic/pgp
|
||||||
|
privatekey_file = ge.priv.asc
|
||||||
|
passphrase = ge
|
3
apps/contract-migration/config_template/signer.ini
Normal file
3
apps/contract-migration/config_template/signer.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[signer]
|
||||||
|
socket_path = /tmp/cic/signer/jsonrpc.ipc
|
||||||
|
secret = deadbeef
|
2
apps/contract-migration/config_template/syncer.ini
Normal file
2
apps/contract-migration/config_template/syncer.ini
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[syncer]
|
||||||
|
loop_interval =
|
5
apps/contract-migration/config_template/tasks.ini
Normal file
5
apps/contract-migration/config_template/tasks.ini
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[tasks]
|
||||||
|
africastalking = cic_notify.tasks.sms.africastalking
|
||||||
|
sms_db = cic_notify.tasks.sms.db
|
||||||
|
log = cic_notify.tasks.sms.log
|
||||||
|
transfer_callbacks=cic-ussd:cic_ussd.tasks.callback_handler.process_incoming_transfer_callback
|
58
apps/contract-migration/dev/balance.py
Normal file
58
apps/contract-migration/dev/balance.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#!python3
|
||||||
|
|
||||||
|
"""Gas transfer script
|
||||||
|
|
||||||
|
.. moduleauthor:: Louis Holbrook <dev@holbrook.no>
|
||||||
|
.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
import web3
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
logging.getLogger('web3').setLevel(logging.WARNING)
|
||||||
|
logging.getLogger('urllib3').setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
default_abi_dir = os.environ.get('ETH_ABI_DIR', '/usr/share/local/cic/solidity/abi')
|
||||||
|
default_eth_provider = os.environ.get('ETH_PROVIDER', 'http://localhost:8545')
|
||||||
|
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-p', '--provider', dest='p', default=default_eth_provider, type=str, help='Web3 provider url (http only)')
|
||||||
|
argparser.add_argument('-t', '--token-address', dest='t', type=str, help='Token address. If not set, will return gas balance')
|
||||||
|
argparser.add_argument('--abi-dir', dest='abi_dir', type=str, default=default_abi_dir, help='Directory containing bytecode and abi (default {})'.format(default_abi_dir))
|
||||||
|
argparser.add_argument('-v', action='store_true', help='Be verbose')
|
||||||
|
argparser.add_argument('account', type=str, help='Account address')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
if args.v:
|
||||||
|
logg.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
w3 = web3.Web3(web3.Web3.HTTPProvider(args.p))
|
||||||
|
|
||||||
|
balance = None
|
||||||
|
if args.t != None:
|
||||||
|
f = open(os.path.join(args.abi_dir, 'ERC20.json'))
|
||||||
|
abi = json.load(f)
|
||||||
|
f.close()
|
||||||
|
c = w3.eth.contract(abi=abi, address=args.t)
|
||||||
|
balance = c.functions.balanceOf(args.account).call()
|
||||||
|
else:
|
||||||
|
balance =w3.eth.getBalance(args.account)
|
||||||
|
|
||||||
|
print(balance)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
47
apps/contract-migration/dev/create.py
Normal file
47
apps/contract-migration/dev/create.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import celery
|
||||||
|
from cic_eth.api import Api
|
||||||
|
import confini
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger('create_account_script')
|
||||||
|
logging.getLogger('confini').setLevel(logging.WARNING)
|
||||||
|
logging.getLogger('gnupg').setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
config_dir = os.environ.get('CONFINI_DIR', '/usr/local/etc/cic')
|
||||||
|
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('--no-register', dest='no_register', action='store_true', help='Do not register new account in on-chain accounts index')
|
||||||
|
argparser.add_argument('-v', action='store_true', help='Be verbose')
|
||||||
|
argparser.add_argument('-vv', action='store_true', help='Be more verbose')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
if args.vv:
|
||||||
|
logg.setLevel(logging.DEBUG)
|
||||||
|
if args.v:
|
||||||
|
logg.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
config = confini.Config(config_dir, os.environ.get('CONFINI_ENV_PREFIX'))
|
||||||
|
config.process()
|
||||||
|
|
||||||
|
celery_app = celery.Celery(broker=config.get('CELERY_BROKER_URL'), backend=config.get('CELERY_RESULT_URL'))
|
||||||
|
|
||||||
|
api = Api(config.get('CIC_CHAIN_SPEC'))
|
||||||
|
|
||||||
|
registration_account = None
|
||||||
|
#t = api.create_account(registration_account=registration_account)
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
registration_account = config.get('DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER', None)
|
||||||
|
|
||||||
|
logg.debug('accounts index writer NOT USED {}'.format(registration_account))
|
||||||
|
|
||||||
|
register = not args.no_register
|
||||||
|
logg.debug('register {}'.format(register))
|
||||||
|
t = api.create_account(register=register)
|
||||||
|
|
||||||
|
print(t.get())
|
48
apps/contract-migration/dev/decode.py
Normal file
48
apps/contract-migration/dev/decode.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#!python3
|
||||||
|
|
||||||
|
"""Decode raw transaction
|
||||||
|
|
||||||
|
.. moduleauthor:: Louis Holbrook <dev@holbrook.no>
|
||||||
|
.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
from cic_eth.eth.util import unpack_signed_raw_tx
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
default_abi_dir = os.environ.get('ETH_ABI_DIR', '/usr/share/local/cic/solidity/abi')
|
||||||
|
default_eth_provider = os.environ.get('ETH_PROVIDER', 'http://localhost:8545')
|
||||||
|
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-v', action='store_true', help='Be verbose')
|
||||||
|
argparser.add_argument('-i', '--chain-id', dest='i', type=int, help='Numeric network id')
|
||||||
|
argparser.add_argument('tx', type=str, help='hex-encoded signed raw transaction')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
if args.v:
|
||||||
|
logg.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
tx_raw = args.tx
|
||||||
|
if tx_raw[:2] == '0x':
|
||||||
|
tx_raw = tx_raw[2:]
|
||||||
|
tx_raw_bytes = bytes.fromhex(tx_raw)
|
||||||
|
tx = unpack_signed_raw_tx(tx_raw_bytes, args.i)
|
||||||
|
for k in tx.keys():
|
||||||
|
print('{}: {}'.format(k, tx[k]))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
24
apps/contract-migration/dev/env.sh
Normal file
24
apps/contract-migration/dev/env.sh
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cic_data_dir=${CIC_DATA_DIR:-/tmp/cic}
|
||||||
|
t=${1:-$(mktemp)}
|
||||||
|
prefix=''
|
||||||
|
if [ ! -z $2 ]; then
|
||||||
|
prefix="${2}_"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "#!/bin/bash" > $t
|
||||||
|
echo "set +a" >> $t
|
||||||
|
cat $cic_data_dir/.env | sed -e "s/^\([A-Z]\)/export ${prefix}\1/g" >> $t
|
||||||
|
|
||||||
|
#if [ -f $cic_data_dir/.env ]; then
|
||||||
|
#cat $cic_data_dir/.env | sed -e "s/^\([A-Z]\)/export ${prefix}\1/g" >> $t
|
||||||
|
#fi
|
||||||
|
echo "export CONFINI_DIR=$(dirname $(realpath .))/config_template" >> $t
|
||||||
|
source $t
|
||||||
|
echo "export CELERY_BROKER_URL=redis://localhost:${HTTP_PORT_REDIS}" >> $t
|
||||||
|
echo "export CELERY_RESULT_URL=redis://localhost:${HTTP_PORT_REDIS}" >> $t
|
||||||
|
echo "export ETH_PROVIDER=http://localhost:${HTTP_PORT_ETH}" >> $t
|
||||||
|
echo "export META_PROVIDER=http://localhost:${HTTP_PORT_CIC_META}" >> $t
|
||||||
|
echo "set -a" >> $t
|
||||||
|
echo $t
|
105
apps/contract-migration/dev/gas.py
Normal file
105
apps/contract-migration/dev/gas.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#!python3
|
||||||
|
|
||||||
|
"""Gas transfer script
|
||||||
|
|
||||||
|
.. moduleauthor:: Louis Holbrook <dev@holbrook.no>
|
||||||
|
.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
import web3
|
||||||
|
from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer
|
||||||
|
from crypto_dev_signer.keystore import DictKeystore
|
||||||
|
from crypto_dev_signer.eth.helper import EthTxExecutor
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
logging.getLogger('web3').setLevel(logging.WARNING)
|
||||||
|
logging.getLogger('urllib3').setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
default_abi_dir = '/usr/share/local/cic/solidity/abi'
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-p', '--provider', dest='p', default='http://localhost:8545', type=str, help='Web3 provider url (http only)')
|
||||||
|
argparser.add_argument('-w', action='store_true', help='Wait for the last transaction to be confirmed')
|
||||||
|
argparser.add_argument('-ww', action='store_true', help='Wait for every transaction to be confirmed')
|
||||||
|
argparser.add_argument('-i', '--chain-spec', dest='i', type=str, default='Ethereum:1', help='Chain specification string')
|
||||||
|
argparser.add_argument('-a', '--signer-address', dest='a', type=str, help='Signing address')
|
||||||
|
argparser.add_argument('-y', '--key-file', dest='y', type=str, help='Ethereum keystore file to use for signing')
|
||||||
|
argparser.add_argument('-v', action='store_true', help='Be verbose')
|
||||||
|
argparser.add_argument('-vv', action='store_true', help='Be more verbose')
|
||||||
|
argparser.add_argument('recipient', type=str, help='Ethereum address of recipient')
|
||||||
|
argparser.add_argument('amount', type=int, help='Amount of tokens to mint and gift')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
if args.vv:
|
||||||
|
logg.setLevel(logging.DEBUG)
|
||||||
|
elif args.v:
|
||||||
|
logg.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
block_last = args.w
|
||||||
|
block_all = args.ww
|
||||||
|
|
||||||
|
w3 = web3.Web3(web3.Web3.HTTPProvider(args.p))
|
||||||
|
|
||||||
|
signer_address = None
|
||||||
|
keystore = DictKeystore()
|
||||||
|
if args.y != None:
|
||||||
|
logg.debug('loading keystore file {}'.format(args.y))
|
||||||
|
signer_address = keystore.import_keystore_file(args.y)
|
||||||
|
logg.debug('now have key for signer address {}'.format(signer_address))
|
||||||
|
signer = EIP155Signer(keystore)
|
||||||
|
|
||||||
|
chain_pair = args.i.split(':')
|
||||||
|
chain_id = int(chain_pair[1])
|
||||||
|
|
||||||
|
helper = EthTxExecutor(
|
||||||
|
w3,
|
||||||
|
signer_address,
|
||||||
|
signer,
|
||||||
|
chain_id,
|
||||||
|
block=args.ww,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_gas_transaction(recipient, value):
|
||||||
|
def builder(tx):
|
||||||
|
tx['to'] = recipient
|
||||||
|
tx['value'] = value
|
||||||
|
tx['data'] = '0x'
|
||||||
|
return tx
|
||||||
|
return builder
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
recipient = args.recipient
|
||||||
|
value = args.amount
|
||||||
|
|
||||||
|
logg.debug('sender {} balance before: {}'.format(signer_address, w3.eth.getBalance(signer_address)))
|
||||||
|
logg.debug('recipient {} balance before: {}'.format(recipient, w3.eth.getBalance(recipient)))
|
||||||
|
(tx_hash, rcpt) = helper.sign_and_send(
|
||||||
|
[
|
||||||
|
build_gas_transaction(recipient, value),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
logg.debug('sender {} balance after: {}'.format(signer_address, w3.eth.getBalance(signer_address)))
|
||||||
|
logg.debug('recipient {} balance after: {}'.format(recipient, w3.eth.getBalance(recipient)))
|
||||||
|
|
||||||
|
if block_last:
|
||||||
|
helper.wait_for()
|
||||||
|
|
||||||
|
print(tx_hash)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
101
apps/contract-migration/dev/js/register_users.js
Normal file
101
apps/contract-migration/dev/js/register_users.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const cic = require('cic-client-meta');
|
||||||
|
const http = require('http');
|
||||||
|
const confini = require('confini');
|
||||||
|
|
||||||
|
console.debug('sorry this script doesnt read cli flags, set all in env vars');
|
||||||
|
|
||||||
|
let config_data_dir = process.env.CONFINI_DIR;
|
||||||
|
if (config_data_dir === undefined) {
|
||||||
|
config_data_dir = '/usr/local/etc/cic';
|
||||||
|
}
|
||||||
|
const config = new confini.Config(config_data_dir, process.env.CONFINI_ENV_PREFIX);
|
||||||
|
config.process();
|
||||||
|
Object.keys(config.store).forEach((k) => {
|
||||||
|
console.debug(k, config.get(k));
|
||||||
|
});
|
||||||
|
|
||||||
|
// flatten file list from directories recursively
|
||||||
|
// cheekily though gratefully stolen from https://coderrocketfuel.com/article/recursively-list-all-the-files-in-a-directory-using-node-js
|
||||||
|
const getAllFiles = function(dirPath, arrayOfFiles) {
|
||||||
|
files = fs.readdirSync(dirPath)
|
||||||
|
|
||||||
|
arrayOfFiles = arrayOfFiles || []
|
||||||
|
|
||||||
|
files.forEach(function(file) {
|
||||||
|
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
|
||||||
|
arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles)
|
||||||
|
} else {
|
||||||
|
arrayOfFiles.push(path.join(dirPath, "/", file))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return arrayOfFiles
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendit(uid, envelope) {
|
||||||
|
const d = envelope.toJSON();
|
||||||
|
|
||||||
|
const opts = {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Content-Length': d.length,
|
||||||
|
'X-CIC-AUTOMERGE': 'client',
|
||||||
|
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let url = config.get('META_PROVIDER'); //['archiveUrl'];
|
||||||
|
url = url.replace(new RegExp('^(.+://[^/]+)/*$'), '$1/');
|
||||||
|
const req = http.request(url + uid, opts, (res) => {
|
||||||
|
res.on('data', process.stdout.write);
|
||||||
|
res.on('end', () => {
|
||||||
|
console.log('result', res.statusCode, res.headers);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
req.write(d);
|
||||||
|
req.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
function doit(keystore) {
|
||||||
|
dataDir = 'data';
|
||||||
|
if (process.argv.length > 2) {
|
||||||
|
dataDir = process.argv[2];
|
||||||
|
}
|
||||||
|
console.log('argv', process.argv);
|
||||||
|
console.log('datadir', path.join(dataDir, 'person'));
|
||||||
|
getAllFiles(path.join(dataDir, 'person')).forEach((filename) => {
|
||||||
|
console.debug('person file', filename);
|
||||||
|
const signer = new cic.PGPSigner(keystore);
|
||||||
|
const parts = filename.split('.');
|
||||||
|
const uid = path.basename(parts[0]);
|
||||||
|
|
||||||
|
const d = fs.readFileSync(filename, 'utf-8');
|
||||||
|
const o = JSON.parse(d);
|
||||||
|
|
||||||
|
const s = new cic.Syncable(uid, o);
|
||||||
|
console.log(s);
|
||||||
|
s.setSigner(signer);
|
||||||
|
s.onwrap = (env) => {
|
||||||
|
console.log('env', env);
|
||||||
|
//console.log('sign', s.m.signature.digest);
|
||||||
|
sendit(uid, env);
|
||||||
|
};
|
||||||
|
s.sign();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pk = fs.readFileSync(path.join(config.get('PGP_EXPORTS_DIR'), config.get('PGP_PRIVATEKEY_FILE')));
|
||||||
|
pubk = fs.readFileSync(path.join(config.get('PGP_EXPORTS_DIR'), config.get('DEV_PGP_PUBLICKEYS_ACTIVE_FILE')));
|
||||||
|
|
||||||
|
new cic.PGPKeyStore(
|
||||||
|
process.env['PGP_PASSPHRASE'],
|
||||||
|
pk,
|
||||||
|
pubk,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
doit,
|
||||||
|
);
|
||||||
|
|
26
apps/contract-migration/dev/keys.sh
Normal file
26
apps/contract-migration/dev/keys.sh
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
mkdir -vp .tmp
|
||||||
|
echo -n '' > .tmp/.env_accounts
|
||||||
|
account_labels=(
|
||||||
|
DEV_ETH_ACCOUNT_BANCOR_DEPLOYER
|
||||||
|
DEV_ETH_ACCOUNT_GAS_PROVIDER
|
||||||
|
DEV_ETH_ACCOUNT_RESERVE_OWNER
|
||||||
|
DEV_ETH_ACCOUNT_RESERVE_MINTER
|
||||||
|
DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_OWNER
|
||||||
|
DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER
|
||||||
|
DEV_ETH_ACCOUNT_SARAFU_OWNER
|
||||||
|
DEV_ETH_ACCOUNT_SARAFU_GIFTER
|
||||||
|
DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER
|
||||||
|
DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER
|
||||||
|
)
|
||||||
|
bip39gen -n ${#account_labels[@]} "$DEV_MNEMONIC"
|
||||||
|
i=0
|
||||||
|
for a in `bip39gen -n ${#account_labels[@]} "$DEV_MNEMONIC" | jq -r .address[]`; do
|
||||||
|
exportline=${account_labels[$i]}=$a
|
||||||
|
export $exportline
|
||||||
|
echo $exportline >> .tmp/.env_accounts
|
||||||
|
echo exportline $exportline
|
||||||
|
i=$(($i+1))
|
||||||
|
done
|
||||||
|
|
4
apps/contract-migration/dev/nvm.sh
Normal file
4
apps/contract-migration/dev/nvm.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export NVM_DIR="$HOME/.nvm"
|
||||||
|
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
|
||||||
|
[ -s "$NVM_DIR/bash_completion" ] && source "$NVM_DIR/bash_completion"
|
||||||
|
|
4
apps/contract-migration/dev/python/scripts/setup.py
Normal file
4
apps/contract-migration/dev/python/scripts/setup.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
)
|
150
apps/contract-migration/dev/python/scripts/tx_driver.py
Normal file
150
apps/contract-migration/dev/python/scripts/tx_driver.py
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import argparse
|
||||||
|
import re
|
||||||
|
import json
|
||||||
|
import signal
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
import confini
|
||||||
|
import web3
|
||||||
|
from cic_registry.chain import ChainSpec
|
||||||
|
from cic_registry.chain import ChainRegistry
|
||||||
|
from cic_registry import CICRegistry
|
||||||
|
from eth_token_index import TokenUniqueSymbolIndex as TokenIndex
|
||||||
|
from eth_accounts_index import AccountRegistry
|
||||||
|
|
||||||
|
from cic_eth.api import Api
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
logging.getLogger('websockets.protocol').setLevel(logging.CRITICAL)
|
||||||
|
logging.getLogger('web3.RequestManager').setLevel(logging.CRITICAL)
|
||||||
|
logging.getLogger('web3.providers.WebsocketProvider').setLevel(logging.CRITICAL)
|
||||||
|
logging.getLogger('web3.providers.HTTPProvider').setLevel(logging.CRITICAL)
|
||||||
|
|
||||||
|
default_data_dir = '/usr/local/share/cic/solidity/abi'
|
||||||
|
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-c', type=str, default='./config', help='config file')
|
||||||
|
argparser.add_argument('-i', '--chain-spec', dest='i', type=str, help='chain spec')
|
||||||
|
argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration')
|
||||||
|
argparser.add_argument('--abi-dir', dest='abi_dir', type=str, default=default_data_dir, help='Directory containing bytecode and abi (default: {})'.format(default_data_dir))
|
||||||
|
argparser.add_argument('-v', action='store_true', help='be verbose')
|
||||||
|
argparser.add_argument('-vv', action='store_true', help='be more verbose')
|
||||||
|
argparser.add_argument('--wait-max', dest='wait_max', default=2.0, type=float, help='maximum time in decimal seconds to wait between transactions')
|
||||||
|
argparser.add_argument('--account-index-address', dest='account_index', type=str, help='Contract address of accounts index')
|
||||||
|
argparser.add_argument('--token-index-address', dest='token_index', type=str, help='Contract address of token index')
|
||||||
|
argparser.add_argument('--approval-escrow-address', dest='approval_escrow', type=str, help='Contract address for transfer approvals')
|
||||||
|
argparser.add_argument('--declarator-address', dest='declarator', type=str, help='Address of declarations contract to perform lookup against')
|
||||||
|
argparser.add_argument('-a', '--accounts-index-writer', dest='a', type=str, help='Address of account with access to add to accounts index')
|
||||||
|
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
if args.vv:
|
||||||
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
elif args.v:
|
||||||
|
logging.getLogger().setLevel(logging.INFO)
|
||||||
|
|
||||||
|
config = confini.Config(args.c, args.env_prefix)
|
||||||
|
config.process()
|
||||||
|
args_override = {
|
||||||
|
'ETH_ABI_DIR': getattr(args, 'abi_dir'),
|
||||||
|
'CIC_CHAIN_SPEC': getattr(args, 'i'),
|
||||||
|
'DEV_ETH_ACCOUNTS_INDEX_ADDRESS': getattr(args, 'account_index'),
|
||||||
|
'DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER': getattr(args, 'a'),
|
||||||
|
'DEV_ETH_ERC20_APPROVAL_ESCROW_ADDRESS': getattr(args, 'approval_escrow'),
|
||||||
|
'DEV_ETH_TOKEN_INDEX_ADDRESS': getattr(args, 'token_index'),
|
||||||
|
}
|
||||||
|
config.dict_override(args_override, 'cli flag')
|
||||||
|
config.validate()
|
||||||
|
config.censor('PASSWORD', 'DATABASE')
|
||||||
|
config.censor('PASSWORD', 'SSL')
|
||||||
|
logg.debug('config:\n{}'.format(config))
|
||||||
|
|
||||||
|
re_websocket = r'^wss?:'
|
||||||
|
re_http = r'^https?:'
|
||||||
|
blockchain_provider = None
|
||||||
|
if re.match(re_websocket, config.get('ETH_PROVIDER')):
|
||||||
|
blockchain_provider = web3.Web3.WebsocketProvider(config.get('ETH_PROVIDER'))
|
||||||
|
elif re.match(re_http, config.get('ETH_PROVIDER')):
|
||||||
|
blockchain_provider = web3.Web3.HTTPProvider(config.get('ETH_PROVIDER'))
|
||||||
|
w3 = web3.Web3(blockchain_provider)
|
||||||
|
|
||||||
|
|
||||||
|
chain_spec = ChainSpec.from_chain_str(config.get('CIC_CHAIN_SPEC'))
|
||||||
|
CICRegistry.init(w3, config.get('CIC_REGISTRY_ADDRESS'), chain_spec)
|
||||||
|
CICRegistry.add_path(config.get('ETH_ABI_DIR'))
|
||||||
|
|
||||||
|
chain_registry = ChainRegistry(chain_spec)
|
||||||
|
CICRegistry.add_chain_registry(chain_registry, True)
|
||||||
|
|
||||||
|
run = True
|
||||||
|
|
||||||
|
def inthandler(name, frame):
|
||||||
|
logg.warning('got {}, stopping'.format(name))
|
||||||
|
global run
|
||||||
|
run = False
|
||||||
|
|
||||||
|
signal.signal(signal.SIGTERM, inthandler)
|
||||||
|
signal.signal(signal.SIGINT, inthandler)
|
||||||
|
|
||||||
|
api = Api(str(chain_spec))
|
||||||
|
|
||||||
|
f = open(os.path.join(config.get('ETH_ABI_DIR'), 'ERC20.json'))
|
||||||
|
erc20_abi = json.load(f)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def get_tokens():
|
||||||
|
tokens = []
|
||||||
|
token_index = TokenIndex(w3, config.get('CIC_TOKEN_INDEX_ADDRESS'))
|
||||||
|
token_count = token_index.count()
|
||||||
|
for i in range(token_count):
|
||||||
|
tokens.append(token_index.get_index(i))
|
||||||
|
logg.debug('tokens {}'.format(tokens))
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
def get_addresses():
|
||||||
|
address_index = AccountRegistry(w3, config.get('CIC_ACCOUNTS_INDEX_ADDRESS'))
|
||||||
|
address_count = address_index.count()
|
||||||
|
addresses = address_index.last(address_count-1)
|
||||||
|
logg.debug('addresses {} {}'.format(address_count, addresses))
|
||||||
|
return addresses
|
||||||
|
|
||||||
|
random.seed()
|
||||||
|
|
||||||
|
while run:
|
||||||
|
n = random.randint(0, 255)
|
||||||
|
|
||||||
|
# some of the time do other things than transfers
|
||||||
|
if n & 0xf8 == 0xf8:
|
||||||
|
t = api.create_account()
|
||||||
|
logg.info('create account {}'.format(t))
|
||||||
|
|
||||||
|
else:
|
||||||
|
tokens = get_tokens()
|
||||||
|
addresses = get_addresses()
|
||||||
|
address_pair = random.choices(addresses, k=2)
|
||||||
|
sender = address_pair[0]
|
||||||
|
recipient = address_pair[1]
|
||||||
|
token = random.choice(tokens)
|
||||||
|
|
||||||
|
c = w3.eth.contract(abi=erc20_abi, address=token)
|
||||||
|
sender_balance = c.functions.balanceOf(sender).call()
|
||||||
|
token_symbol = c.functions.symbol().call()
|
||||||
|
amount = int(random.random() * (sender_balance / 2))
|
||||||
|
|
||||||
|
n = random.randint(0, 255)
|
||||||
|
|
||||||
|
if n & 0xc0 == 0xc0:
|
||||||
|
t = api.transfer_request(sender, recipient, config.get('CIC_APPROVAL_ESCROW_ADDRESS'), amount, token_symbol)
|
||||||
|
logg.info('transfer REQUEST {} {} from {} to {} => {}'.format(amount, token_symbol, sender, recipient, t))
|
||||||
|
else:
|
||||||
|
t = api.transfer(sender, recipient, amount, token_symbol)
|
||||||
|
logg.info('transfer {} {} from {} to {} => {}'.format(amount, token_symbol, sender, recipient, t))
|
||||||
|
|
||||||
|
time.sleep(random.random() * args.wait_max)
|
51
apps/contract-migration/dev/python/scripts/tx_seed.py
Normal file
51
apps/contract-migration/dev/python/scripts/tx_seed.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import logging
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
import web3
|
||||||
|
import confini
|
||||||
|
|
||||||
|
from cic_registry import CICRegistry
|
||||||
|
from cic_eth.api import Api
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
confini_default_dir = os.environ.get('CONFINI_DIR', '/usr/local/etc/cic')
|
||||||
|
|
||||||
|
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-c', type=str, default=confini_default_dir, help='config data dir')
|
||||||
|
argparser.add_argument('-a', '--token-gifter-address', dest='a', type=str, help='Token gifter address')
|
||||||
|
argparser.add_argument('-i', '--chain-spec', dest='i', type=str, help='chain spec')
|
||||||
|
argparser.add_argument('-s', '--token-symbol', dest='s', type=str, help='Token symbol')
|
||||||
|
argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration')
|
||||||
|
argparser.add_argument('-v', action='store_true', help='be verbose')
|
||||||
|
argparser.add_argument('-vv', action='store_true', help='be more verbose')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
if args.vv:
|
||||||
|
logging.getLogger().setLevel(logging.DEBUG)
|
||||||
|
elif args.v:
|
||||||
|
logging.getLogger().setLevel(logging.INFO)
|
||||||
|
|
||||||
|
config = confini.Config(args.c, args.env_prefix)
|
||||||
|
config.process()
|
||||||
|
args_override = {
|
||||||
|
'CIC_CHAIN_SPEC': getattr(args, 'i'),
|
||||||
|
}
|
||||||
|
cic_eth_api = Api(config.get('CIC_CHAIN_SPEC'))
|
||||||
|
|
||||||
|
token_gifter_address = args.a
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
f = open('./data/amounts', 'r')
|
||||||
|
cr = csv.reader(f)
|
||||||
|
for r in cr:
|
||||||
|
logg.info('sending {} {} from {} to {}'.format(r[1], args.s, token_gifter_address, r[0]))
|
||||||
|
cic_eth_api.transfer(token_gifter_address, r[0], int(r[1]), args.s)
|
||||||
|
f.close()
|
212
apps/contract-migration/dev/python/scripts/users.py
Normal file
212
apps/contract-migration/dev/python/scripts/users.py
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import datetime
|
||||||
|
import random
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import base64
|
||||||
|
import hashlib
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import vobject
|
||||||
|
|
||||||
|
import celery
|
||||||
|
import web3
|
||||||
|
from faker import Faker
|
||||||
|
import cic_registry
|
||||||
|
import confini
|
||||||
|
from cic_eth.api import Api
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
fake = Faker(['sl', 'en_US', 'no', 'de', 'ro'])
|
||||||
|
|
||||||
|
#f = open('cic.conf', 'r')
|
||||||
|
#config = json.load(f)
|
||||||
|
#f.close()
|
||||||
|
#
|
||||||
|
|
||||||
|
config_dir = os.environ.get('CONFINI_DIR', '/usr/local/etc/cic')
|
||||||
|
|
||||||
|
config = confini.Config(config_dir, os.environ.get('CONFINI_ENV_PREFIX'))
|
||||||
|
config.process()
|
||||||
|
logg.info('loaded config\n{}'.format(config))
|
||||||
|
|
||||||
|
|
||||||
|
w3s = None
|
||||||
|
w3s = web3.Web3(web3.Web3.IPCProvider(config.get('SIGNER_SOCKET_PATH')))
|
||||||
|
#w3s = web3.Web3(web3.Web3.IPCProvider(config['signer']['provider']))
|
||||||
|
#w3 = web3.Web3(web3.Web3.WebsocketProvider(config['eth']['provider']))
|
||||||
|
|
||||||
|
dt_now = datetime.datetime.utcnow()
|
||||||
|
dt_then = dt_now - datetime.timedelta(weeks=150)
|
||||||
|
ts_now = int(dt_now.timestamp())
|
||||||
|
ts_then = int(dt_then.timestamp())
|
||||||
|
|
||||||
|
celery_app = celery.Celery(broker=config.get('CELERY_BROKER_URL'), backend=config.get('CELERY_RESULT_URL'))
|
||||||
|
|
||||||
|
api = Api(config.get('CIC_CHAIN_SPEC'))
|
||||||
|
|
||||||
|
gift_max = 10000
|
||||||
|
gift_factor = (10**9)
|
||||||
|
|
||||||
|
categories = [
|
||||||
|
"food/water",
|
||||||
|
"fuel/energy",
|
||||||
|
"education",
|
||||||
|
"health",
|
||||||
|
"shop",
|
||||||
|
"environment",
|
||||||
|
"transport",
|
||||||
|
"farming/labor",
|
||||||
|
"savingsgroup",
|
||||||
|
]
|
||||||
|
|
||||||
|
phone_idx = []
|
||||||
|
|
||||||
|
|
||||||
|
def genPhoneIndex(phone):
|
||||||
|
h = hashlib.new('sha256')
|
||||||
|
h.update(phone.encode('utf-8'))
|
||||||
|
h.update(b'cic.msisdn')
|
||||||
|
return h.digest().hex()
|
||||||
|
|
||||||
|
|
||||||
|
def genId(addr, typ):
|
||||||
|
h = hashlib.new('sha256')
|
||||||
|
h.update(bytes.fromhex(addr[2:]))
|
||||||
|
h.update(typ.encode('utf-8'))
|
||||||
|
return h.digest().hex()
|
||||||
|
|
||||||
|
|
||||||
|
def genDate():
|
||||||
|
|
||||||
|
logg.info(ts_then)
|
||||||
|
ts = random.randint(ts_then, ts_now)
|
||||||
|
return datetime.datetime.fromtimestamp(ts).timestamp()
|
||||||
|
|
||||||
|
|
||||||
|
def genPhone():
|
||||||
|
return fake.msisdn()
|
||||||
|
|
||||||
|
|
||||||
|
def genPersonal(phone):
|
||||||
|
fn = fake.first_name()
|
||||||
|
ln = fake.last_name()
|
||||||
|
e = fake.email()
|
||||||
|
|
||||||
|
v = vobject.vCard()
|
||||||
|
first_name = fake.first_name()
|
||||||
|
last_name = fake.last_name()
|
||||||
|
v.add('n')
|
||||||
|
v.n.value = vobject.vcard.Name(family=last_name, given=first_name)
|
||||||
|
v.add('fn')
|
||||||
|
v.fn.value = '{} {}'.format(first_name, last_name)
|
||||||
|
v.add('tel')
|
||||||
|
v.tel.typ_param = 'CELL'
|
||||||
|
v.tel.value = phone
|
||||||
|
v.add('email')
|
||||||
|
v.email.value = fake.email()
|
||||||
|
|
||||||
|
vcard_serialized = v.serialize()
|
||||||
|
vcard_base64 = base64.b64encode(vcard_serialized.encode('utf-8'))
|
||||||
|
|
||||||
|
return vcard_base64.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def genCats():
|
||||||
|
i = random.randint(0, 3)
|
||||||
|
return random.choices(categories, k=i)
|
||||||
|
|
||||||
|
|
||||||
|
def genAmount():
|
||||||
|
return random.randint(0, gift_max) * gift_factor
|
||||||
|
|
||||||
|
|
||||||
|
def gen():
|
||||||
|
old_blockchain_address = '0x' + os.urandom(20).hex()
|
||||||
|
accounts_index_account = config.get('DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER')
|
||||||
|
if not accounts_index_account:
|
||||||
|
accounts_index_account = None
|
||||||
|
logg.debug('accounts indexwriter {}'.format(accounts_index_account))
|
||||||
|
t = api.create_account()
|
||||||
|
new_blockchain_address = t.get()
|
||||||
|
gender = random.choice(['female', 'male', 'other'])
|
||||||
|
phone = genPhone()
|
||||||
|
v = genPersonal(phone)
|
||||||
|
o = {
|
||||||
|
'date_registered': genDate(),
|
||||||
|
'vcard': v,
|
||||||
|
'gender': gender,
|
||||||
|
'key': {
|
||||||
|
'ethereum': [
|
||||||
|
old_blockchain_address,
|
||||||
|
new_blockchain_address,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'location': {
|
||||||
|
'latitude': str(fake.latitude()),
|
||||||
|
'longitude': str(fake.longitude()),
|
||||||
|
'external': { # add osm lookup
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'selling': genCats(),
|
||||||
|
}
|
||||||
|
uid = genId(new_blockchain_address, 'cic.person')
|
||||||
|
|
||||||
|
#logg.info('gifting {} to {}'.format(amount, new_blockchain_address))
|
||||||
|
|
||||||
|
return (uid, phone, o)
|
||||||
|
|
||||||
|
|
||||||
|
def prepareLocalFilePath(datadir, address):
|
||||||
|
parts = [
|
||||||
|
address[:2],
|
||||||
|
address[2:4],
|
||||||
|
]
|
||||||
|
dirs = '{}/{}/{}'.format(
|
||||||
|
datadir,
|
||||||
|
parts[0],
|
||||||
|
parts[1],
|
||||||
|
)
|
||||||
|
os.makedirs(dirs, exist_ok=True)
|
||||||
|
return dirs
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
os.makedirs('data/person', exist_ok=True)
|
||||||
|
os.makedirs('data/phone', exist_ok=True)
|
||||||
|
|
||||||
|
fa = open('./data/amounts', 'w')
|
||||||
|
fb = open('./data/addresses', 'w')
|
||||||
|
|
||||||
|
#for i in range(10):
|
||||||
|
for i in range(int(sys.argv[1])):
|
||||||
|
|
||||||
|
(uid, phone, o) = gen()
|
||||||
|
eth = o['key']['ethereum'][1]
|
||||||
|
|
||||||
|
print(o)
|
||||||
|
|
||||||
|
d = prepareLocalFilePath('./data/person', uid)
|
||||||
|
f = open('{}/{}'.format(d, uid), 'w')
|
||||||
|
json.dump(o, f)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
pidx = genPhoneIndex(phone)
|
||||||
|
d = prepareLocalFilePath('./data/phone', uid)
|
||||||
|
f = open('{}/{}'.format(d, pidx), 'w')
|
||||||
|
f.write(eth)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
amount = genAmount()
|
||||||
|
fa.write('{},{}\n'.format(eth,amount))
|
||||||
|
fb.write('{}\n'.format(eth))
|
||||||
|
logg.debug('pidx {}, uid {}, eth {}, amount {}'.format(pidx, uid, eth, amount))
|
||||||
|
|
||||||
|
fb.close()
|
||||||
|
fa.close()
|
40
apps/contract-migration/dev/python/setup.cfg
Normal file
40
apps/contract-migration/dev/python/setup.cfg
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
[metadata]
|
||||||
|
name = cic-dev-fake
|
||||||
|
version = 0.0.1
|
||||||
|
description = Fake data generator tools
|
||||||
|
author = Louis Holbrook
|
||||||
|
author_email = dev@holbrook.no
|
||||||
|
url = https://gitlab.com/nolash/simple-multisig
|
||||||
|
keywords =
|
||||||
|
ethereum
|
||||||
|
classifiers =
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Operating System :: OS Independent
|
||||||
|
Development Status :: 3 - Alpha
|
||||||
|
Environment :: No Input/Output (Daemon)
|
||||||
|
Intended Audience :: Developers
|
||||||
|
License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
||||||
|
Topic :: Internet
|
||||||
|
#Topic :: Blockchain :: EVM
|
||||||
|
license = GPL3
|
||||||
|
licence_files =
|
||||||
|
LICENSE
|
||||||
|
|
||||||
|
[options]
|
||||||
|
python_requires = >= 3.6
|
||||||
|
install_requires =
|
||||||
|
web3==5.12.2
|
||||||
|
vobject==0.9.6.1
|
||||||
|
faker==4.17.1
|
||||||
|
tests_require =
|
||||||
|
eth-tester==0.5.0b2
|
||||||
|
py-evm==0.3.0a20
|
||||||
|
scripts =
|
||||||
|
scripts/users.py
|
||||||
|
scripts/tx_generator.py
|
||||||
|
scripts/tx_seed.py
|
||||||
|
|
||||||
|
[options.extras_require]
|
||||||
|
testing =
|
||||||
|
eth-tester==0.5.0b2
|
||||||
|
py-evm==0.3.0a20
|
4
apps/contract-migration/dev/python/setup.py
Normal file
4
apps/contract-migration/dev/python/setup.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
)
|
10
apps/contract-migration/dev/requirements.txt
Normal file
10
apps/contract-migration/dev/requirements.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
cryptocurrency-cli-tools~=0.0.4
|
||||||
|
giftable-erc20-token~=0.0.7b1
|
||||||
|
eth-accounts-index~=0.0.10a2
|
||||||
|
erc20-single-shot-faucet~=0.2.0a1
|
||||||
|
erc20-approval-escrow~=0.3.0a1
|
||||||
|
cic-eth==0.10.0a5
|
||||||
|
vobject==0.9.6.1
|
||||||
|
faker==4.17.1
|
||||||
|
eth-address-index~=0.1.0a1
|
||||||
|
crypto-dev-signer~=0.4.13b9
|
18
apps/contract-migration/dev/sarafu_declaration.json
Normal file
18
apps/contract-migration/dev/sarafu_declaration.json
Normal file
File diff suppressed because one or more lines are too long
BIN
apps/contract-migration/dev/sarafu_logo.png
Normal file
BIN
apps/contract-migration/dev/sarafu_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
138
apps/contract-migration/dev/setup.sh
Normal file
138
apps/contract-migration/dev/setup.sh
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Debug flag
|
||||||
|
#debug='-v'
|
||||||
|
keystore_file=../keystore/UTC--2021-01-08T17-18-44.521011372Z--eb3907ecad74a0013c259d5874ae7f22dcbcc95c
|
||||||
|
|
||||||
|
debug=''
|
||||||
|
abi_dir=${ETH_ABI_DIR:-/usr/local/share/cic/solidity/abi}
|
||||||
|
|
||||||
|
# Determine token amount
|
||||||
|
token_amount=${DEV_ETH_RESERVE_AMOUNT:0:-1}
|
||||||
|
|
||||||
|
# Determine gas amount
|
||||||
|
#gas_amount=20000000000000000000
|
||||||
|
gas_amount=2000000000000000000
|
||||||
|
|
||||||
|
export DATABASE_NAME=$DATABASE_NAME_CIC_ETH
|
||||||
|
export DATABASE_PORT=$HTTP_PORT_POSTGRES
|
||||||
|
export DATABASE_HOST=localhost
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -a
|
||||||
|
|
||||||
|
old_gas_provider=$DEV_ETH_ACCOUNT_GAS_PROVIDER
|
||||||
|
DEV_ETH_ACCOUNT_GAS_GIFTER=`python ./create.py --no-register`
|
||||||
|
echo DEV_ETH_ACCOUNT_GAS_GIFTER=$DEV_ETH_ACCOUNT_GAS_GIFTER
|
||||||
|
export DEV_ETH_ACCOUNT_GAS_GIFTER=$DEV_ETH_ACCOUNT_GAS_GIFTER
|
||||||
|
cic-eth-tag GAS_GIFTER $DEV_ETH_ACCOUNT_GAS_GIFTER
|
||||||
|
|
||||||
|
DEV_ETH_ACCOUNT_SARAFU_GIFTER=`python ./create.py --no-register`
|
||||||
|
echo DEV_ETH_ACCOUNT_SARAFU_GIFTER=$DEV_ETH_ACCOUNT_SARAFU_GIFTER
|
||||||
|
export DEV_ETH_ACCOUNT_SARAFU_GIFTER=$DEV_ETH_ACCOUNT_SARAFU_GIFTER
|
||||||
|
cic-eth-tag SARAFU_GIFTER $DEV_ETH_ACCOUNT_SARAFU_GIFTER
|
||||||
|
|
||||||
|
|
||||||
|
DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER=`python ./create.py --no-register`
|
||||||
|
echo DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER=$DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER
|
||||||
|
export DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER=$DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER
|
||||||
|
cic-eth-tag TRANSFER_APPROVAL_OWNER $DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER
|
||||||
|
|
||||||
|
|
||||||
|
DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER=`python ./create.py --no-register`
|
||||||
|
echo DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER=$DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER
|
||||||
|
export DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER=$DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER
|
||||||
|
cic-eth-tag FAUCET_OWNER $DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER
|
||||||
|
|
||||||
|
|
||||||
|
DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER=`python ./create.py --no-register`
|
||||||
|
echo DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER=$DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER
|
||||||
|
export DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER=$DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER
|
||||||
|
cic-eth-tag ACCOUNTS_INDEX_WRITER $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER
|
||||||
|
|
||||||
|
|
||||||
|
# Transfer gas to custodial gas provider adddress
|
||||||
|
#echo $old_gas_provider
|
||||||
|
>&2 echo gift gas to gas gifter
|
||||||
|
>&2 echo "python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_GAS_GIFTER $gas_amount"
|
||||||
|
>&2 python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_GAS_GIFTER $gas_amount
|
||||||
|
|
||||||
|
>&2 echo gift gas to sarafu token owner
|
||||||
|
>&2 echo "python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_SARAFU_OWNER $gas_amount"
|
||||||
|
>&2 python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_SARAFU_OWNER $gas_amount
|
||||||
|
|
||||||
|
>&2 echo gift gas to account index owner
|
||||||
|
>&2 echo "python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_OWNER $gas_amount"
|
||||||
|
>&2 python gas.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_OWNER $gas_amount
|
||||||
|
|
||||||
|
|
||||||
|
# Send reserve to token creator
|
||||||
|
>&2 giftable-token-gift -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -a $DEV_ETH_RESERVE_ADDRESS --recipient $DEV_ETH_ACCOUNT_SARAFU_OWNER -w $debug $token_amount
|
||||||
|
|
||||||
|
|
||||||
|
# Create token
|
||||||
|
#DEV_ETH_SARAFU_TOKEN_ADDRESS=`cic-bancor-token -p $ETH_PROVIDER -r $CIC_REGISTRY_ADDRESS -z $DEV_ETH_RESERVE_ADDRESS -o $DEV_ETH_ACCOUNT_SARAFU_OWNER -n $DEV_ETH_SARAFU_TOKEN_NAME -s $DEV_ETH_SARAFU_TOKEN_SYMBOL -d $DEV_ETH_SARAFU_TOKEN_DECIMALS -i $CIC_CHAIN_SPEC $debug $token_amount`
|
||||||
|
DEV_ETH_SARAFU_TOKEN_ADDRESS=$DEV_ETH_RESERVE_ADDRESS
|
||||||
|
echo DEV_ETH_SARAFU_TOKEN_ADDRESS=$DEV_ETH_SARAFU_TOKEN_ADDRESS
|
||||||
|
export DEV_ETH_SARAFU_TOKEN_ADDRESS=$DEV_ETH_SARAFU_TOKEN_ADDRESS
|
||||||
|
|
||||||
|
|
||||||
|
# Transfer tokens to gifter address
|
||||||
|
>&2 python transfer.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER --token-address $DEV_ETH_SARAFU_TOKEN_ADDRESS --abi-dir $abi_dir -w $debug $DEV_ETH_ACCOUNT_SARAFU_GIFTER ${token_amount:0:-1}
|
||||||
|
|
||||||
|
# Deploy transfer approval contract
|
||||||
|
CIC_APPROVAL_ESCROW_ADDRESS=`erc20-approval-escrow-deploy -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER --approver $DEV_ETH_ACCOUNT_APPROVAL_ESCROW_OWNER -w $debug`
|
||||||
|
echo CIC_APPROVAL_ESCROW_ADDRESS=$CIC_APPROVAL_ESCROW_ADDRESS
|
||||||
|
export CIC_APPROVAL_ESCROW_ADDRESS=$CIC_APPROVAL_ESCROW_ADDRESS
|
||||||
|
|
||||||
|
# Register transfer approval contract
|
||||||
|
>&2 cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -k TransferApproval -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $CIC_APPROVAL_ESCROW_ADDRESS
|
||||||
|
|
||||||
|
# Deploy one-time token faucet for newly created token
|
||||||
|
DEV_ETH_SARAFU_FAUCET_ADDRESS=`erc20-single-shot-faucet-deploy -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER --token-address $DEV_ETH_SARAFU_TOKEN_ADDRESS --editor $DEV_ETH_ACCOUNT_SINGLE_SHOT_FAUCET_OWNER --set-amount 1048576 -w $debug`
|
||||||
|
echo DEV_ETH_SARAFU_FAUCET_ADDRESS=$DEV_ETH_SARAFU_FAUCET_ADDRESS
|
||||||
|
export DEV_ETH_SARAFU_FAUCET_ADDRESS=$DEV_ETH_SARAFU_FAUCET_ADDRESS
|
||||||
|
|
||||||
|
# Transfer tokens to faucet contract
|
||||||
|
>&2 python transfer.py -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER --token-address $DEV_ETH_SARAFU_TOKEN_ADDRESS --abi-dir $abi_dir -w $debug $DEV_ETH_SARAFU_FAUCET_ADDRESS ${token_amount:0:-1}
|
||||||
|
|
||||||
|
# Registry faucet entry
|
||||||
|
>&2 cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -k Faucet -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $DEV_ETH_SARAFU_FAUCET_ADDRESS
|
||||||
|
|
||||||
|
# Deploy token endorser registry
|
||||||
|
#DEV_ETH_TOKEN_ENDORSER_ADDRESS=`eth-token-endorser-deploy -p $ETH_PROVIDER -o $DEV_ETH_ACCOUNT_SARAFU_OWNER $debug`
|
||||||
|
#echo DEV_ETH_TOKEN_ENDORSER_ADDRESS=$DEV_ETH_TOKEN_ENDORSER_ADDRESS
|
||||||
|
#export DEV_ETH_TOKEN_ENDORSER_ADDRESS=$DEV_ETH_TOKEN_ENDORSER_ADDRESS
|
||||||
|
#ENDORSEMENT_MSG=`echo -n 'very cool token' | sha256sum | awk '{print $1;}'`
|
||||||
|
#>&2 eth-token-endorser-add -p $ETH_PROVIDER -a $DEV_ETH_TOKEN_ENDORSER_ADDRESS -t $DEV_ETH_SARAFU_TOKEN_ADDRESS -o $DEV_ETH_ACCOUNT_SARAFU_OWNER $debug $ENDORSEMENT_MSG
|
||||||
|
CIC_TOKEN_INDEX_ADDRESS=`eth-token-index-deploy -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug`
|
||||||
|
echo CIC_TOKEN_INDEX_ADDRESS=$CIC_TOKEN_INDEX_ADDRESS
|
||||||
|
export CIC_TOKEN_INDEX_ADDRESS=$CIC_TOKEN_INDEX_ADDRESS
|
||||||
|
>&2 eth-token-index-add -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -r $CIC_TOKEN_INDEX_ADDRESS -w $debug $DEV_ETH_SARAFU_TOKEN_ADDRESS
|
||||||
|
|
||||||
|
# Register token registry
|
||||||
|
>&2 cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -k TokenRegistry -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER $CIC_TOKEN_INDEX_ADDRESS
|
||||||
|
|
||||||
|
# Deploy address declarator registry
|
||||||
|
declarator_description=0x546869732069732074686520434943206e6574776f726b000000000000000000
|
||||||
|
CIC_DECLARATOR_ADDRESS=`eth-address-declarator-deploy -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -w $debug $declarator_description`
|
||||||
|
echo CIC_DECLARATOR_ADDRESS=$CIC_DECLARATOR_ADDRESS
|
||||||
|
export CIC_DECLARATOR_ADDRESS=$CIC_DECLARATOR_ADDRESS
|
||||||
|
token_description_one=`sha256sum sarafu_declaration.json | awk '{ print $1; }'`
|
||||||
|
token_description_two=0x54686973206973207468652053617261667520746f6b656e0000000000000000
|
||||||
|
>&2 eth-address-declarator-add -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -r $CIC_DECLARATOR_ADDRESS -w $debug $DEV_ETH_SARAFU_TOKEN_ADDRESS $token_description_one
|
||||||
|
>&2 eth-address-declarator-add -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -r $CIC_DECLARATOR_ADDRESS -w $debug $DEV_ETH_SARAFU_TOKEN_ADDRESS $token_description_two
|
||||||
|
|
||||||
|
|
||||||
|
# Register address declarator
|
||||||
|
>&2 cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -k AddressDeclarator -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER $CIC_DECLARATOR_ADDRESS
|
||||||
|
|
||||||
|
# We're done with the registry at this point, seal it off
|
||||||
|
>&2 cic-registry-seal -y $keystore_file -i $CIC_CHAIN_SPEC -r $CIC_REGISTRY_ADDRESS -p $ETH_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
|
# Add accounts index writer with key from keystore
|
||||||
|
>&2 eth-accounts-index-add -y $keystore_file -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -r $CIC_ACCOUNTS_INDEX_ADDRESS --writer $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER -w $debug
|
||||||
|
|
||||||
|
set +a
|
||||||
|
set +e
|
31
apps/contract-migration/dev/tests/create.py
Normal file
31
apps/contract-migration/dev/tests/create.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!python3
|
||||||
|
|
||||||
|
# Author: Louis Holbrook <dev@holbrook.no> 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
# File-version: 1
|
||||||
|
# Description: Smoke test for cic-eth create account api
|
||||||
|
|
||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
import celery
|
||||||
|
import confini
|
||||||
|
|
||||||
|
# platform imports
|
||||||
|
from cic_eth import Api
|
||||||
|
|
||||||
|
script_dir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
config_dir = os.environ.get('CONFINI_DIR', '/usr/local/etc/cic/')
|
||||||
|
|
||||||
|
config = confini.Config(config_dir)
|
||||||
|
config.process()
|
||||||
|
|
||||||
|
a = Api()
|
||||||
|
t = a.create_account()
|
||||||
|
logg.debug('create account task uuid {}'.format(t))
|
105
apps/contract-migration/dev/transfer.py
Normal file
105
apps/contract-migration/dev/transfer.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#!python3
|
||||||
|
|
||||||
|
"""Token transfer script
|
||||||
|
|
||||||
|
.. moduleauthor:: Louis Holbrook <dev@holbrook.no>
|
||||||
|
.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
# standard imports
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
|
||||||
|
# third-party imports
|
||||||
|
import web3
|
||||||
|
from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer
|
||||||
|
from crypto_dev_signer.keystore import DictKeystore
|
||||||
|
from crypto_dev_signer.eth.helper import EthTxExecutor
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.WARNING)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
logging.getLogger('web3').setLevel(logging.WARNING)
|
||||||
|
logging.getLogger('urllib3').setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
default_abi_dir = '/usr/share/local/cic/solidity/abi'
|
||||||
|
argparser = argparse.ArgumentParser()
|
||||||
|
argparser.add_argument('-p', '--provider', dest='p', default='http://localhost:8545', type=str, help='Web3 provider url (http only)')
|
||||||
|
argparser.add_argument('-w', action='store_true', help='Wait for the last transaction to be confirmed')
|
||||||
|
argparser.add_argument('-ww', action='store_true', help='Wait for every transaction to be confirmed')
|
||||||
|
argparser.add_argument('-i', '--chain-spec', dest='i', type=str, default='Ethereum:1', help='Chain specification string')
|
||||||
|
argparser.add_argument('--token-address', required='True', dest='t', type=str, help='Token address')
|
||||||
|
argparser.add_argument('-a', '--sender-address', dest='s', type=str, help='Sender account address')
|
||||||
|
argparser.add_argument('-y', '--key-file', dest='y', type=str, help='Ethereum keystore file to use for signing')
|
||||||
|
argparser.add_argument('--abi-dir', dest='abi_dir', type=str, default=default_abi_dir, help='Directory containing bytecode and abi (default {})'.format(default_abi_dir))
|
||||||
|
argparser.add_argument('-v', action='store_true', help='Be verbose')
|
||||||
|
argparser.add_argument('-vv', action='store_true', help='Be more verbose')
|
||||||
|
argparser.add_argument('recipient', type=str, help='Recipient account address')
|
||||||
|
argparser.add_argument('amount', type=int, help='Amount of tokens to mint and gift')
|
||||||
|
args = argparser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
if args.vv:
|
||||||
|
logg.setLevel(logging.DEBUG)
|
||||||
|
elif args.v:
|
||||||
|
logg.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
block_last = args.w
|
||||||
|
block_all = args.ww
|
||||||
|
|
||||||
|
w3 = web3.Web3(web3.Web3.HTTPProvider(args.p))
|
||||||
|
|
||||||
|
signer_address = None
|
||||||
|
keystore = DictKeystore()
|
||||||
|
if args.y != None:
|
||||||
|
logg.debug('loading keystore file {}'.format(args.y))
|
||||||
|
signer_address = keystore.import_keystore_file(args.y)
|
||||||
|
logg.debug('now have key for signer address {}'.format(signer_address))
|
||||||
|
signer = EIP155Signer(keystore)
|
||||||
|
|
||||||
|
chain_pair = args.i.split(':')
|
||||||
|
chain_id = int(chain_pair[1])
|
||||||
|
|
||||||
|
helper = EthTxExecutor(
|
||||||
|
w3,
|
||||||
|
signer_address,
|
||||||
|
signer,
|
||||||
|
chain_id,
|
||||||
|
block=args.ww,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# TODO: Add pure ERC20 abi to collection
|
||||||
|
f = open(os.path.join(args.abi_dir, 'ERC20.json'), 'r')
|
||||||
|
abi = json.load(f)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
c = w3.eth.contract(abi=abi, address=args.t)
|
||||||
|
|
||||||
|
recipient = args.recipient
|
||||||
|
value = args.amount
|
||||||
|
|
||||||
|
logg.debug('sender {} balance before: {}'.format(signer_address, c.functions.balanceOf(signer_address).call()))
|
||||||
|
logg.debug('recipient {} balance before: {}'.format(recipient, c.functions.balanceOf(recipient).call()))
|
||||||
|
(tx_hash, rcpt) = helper.sign_and_send(
|
||||||
|
[
|
||||||
|
c.functions.transfer(recipient, value).buildTransaction,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
logg.debug('sender {} balance after: {}'.format(signer_address, c.functions.balanceOf(signer_address).call()))
|
||||||
|
logg.debug('recipient {} balance after: {}'.format(recipient, c.functions.balanceOf(recipient).call()))
|
||||||
|
|
||||||
|
if block_last:
|
||||||
|
helper.wait_for()
|
||||||
|
|
||||||
|
print(tx_hash)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
110
apps/contract-migration/doc/cluster.dot
Normal file
110
apps/contract-migration/doc/cluster.dot
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
digraph {
|
||||||
|
overlap="false";
|
||||||
|
blockchain [ label="bloxberg", shape="doublecircle" ];
|
||||||
|
db [ label="postgres", shape="cylinder" ];
|
||||||
|
kv [ label="redis", shape="cylinder" ];
|
||||||
|
|
||||||
|
subgraph client {
|
||||||
|
cic_staff_gui [ label="cic-staff-gui", shape="box" ];
|
||||||
|
AT [ shape="box" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cic_eth {
|
||||||
|
{
|
||||||
|
cic_eth_mq [ label="celery cic-eth queue", shape="ellipse" ];
|
||||||
|
|
||||||
|
cic_eth_server [ label="cic-eth-server", shape="box" ];
|
||||||
|
cic_eth_tasker [ label="cic-eth-tasker", shape="box" ];
|
||||||
|
cic_eth_manager_head [ label="cic-eth-manager-head", shape="box" ];
|
||||||
|
cic_eth_manager_history [ label="cic-eth-manager-history", shape="box" ];
|
||||||
|
cic_eth_dispatcher [ label="cic-eth-dispatcher", shape="box" ];
|
||||||
|
cic_eth_retrier [ label="cic-eth-retrier", shape="box" ];
|
||||||
|
|
||||||
|
cic_eth_server_api_transferrequest [ label="/transferrequest", shape="ellipse" ];
|
||||||
|
|
||||||
|
cic_eth_celery_api_transfer [ label="transfer", shape="ellipse" ];
|
||||||
|
cic_eth_celery_api_convert [ label="convert", shape="ellipse" ];
|
||||||
|
cic_eth_celery_api_createaccount [ label="createaccount", shape="ellipse" ];
|
||||||
|
cic_eth_celery_api_balance [ label="balance", shape="ellipse" ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cic_ussd {
|
||||||
|
{
|
||||||
|
cic_ussd_mq [ label="celery cic-ussd queue", shape="ellipse" ];
|
||||||
|
cic_ussd_tasker [ label="cic-ussd-tasker", shape="box" ];
|
||||||
|
cic_ussd_server [ label="cic-ussd-server", shape="box" ];
|
||||||
|
cic_ussd_server_api_ussd [ label="/ussd", shape="ellipse" ];
|
||||||
|
cic_ussd_server_api_pin [ label="/pin", shape="ellipse" ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph files {
|
||||||
|
{
|
||||||
|
api_files [ label="/", shape="ellipse" ];
|
||||||
|
cic_meta_server [ label="cic-meta-server", shape="box" ];
|
||||||
|
swarm [ label="swarm", shape="box" ];
|
||||||
|
ipfs [ label="ipfs", shape="box" ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cic_notify {
|
||||||
|
cic_notify_mq [ label="celery cic-notify queue", shape="ellipse" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cic_cache {
|
||||||
|
{
|
||||||
|
cic_cache_tracker [ label="cic-cache-tracker", shape="box" ];
|
||||||
|
cic_cache_server [ label="cic-cache-server", shape="box" ];
|
||||||
|
cic_cache_server_api_tx [ label="/tx", shape="ellipse" ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
kv -> cic_eth_mq;
|
||||||
|
cic_eth_mq -> kv;
|
||||||
|
|
||||||
|
kv -> cic_ussd_mq;
|
||||||
|
cic_ussd_mq -> kv;
|
||||||
|
|
||||||
|
cic_staff_gui -> cic_eth_server_api_transferrequest -> cic_eth_server -> cic_eth_mq;
|
||||||
|
|
||||||
|
cic_eth_mq -> cic_eth_tasker -> db;
|
||||||
|
|
||||||
|
db -> cic_eth_dispatcher -> blockchain;
|
||||||
|
db -> cic_eth_retrier -> blockchain;
|
||||||
|
|
||||||
|
blockchain -> cic_eth_manager_head -> db;
|
||||||
|
cic_eth_manager_head -> cic_eth_mq;
|
||||||
|
cic_eth_manager_head -> cic_ussd_mq;
|
||||||
|
|
||||||
|
blockchain -> cic_eth_manager_history -> db;
|
||||||
|
cic_eth_manager_history -> cic_eth_mq;
|
||||||
|
cic_eth_manager_history -> cic_ussd_mq;
|
||||||
|
|
||||||
|
cic_ussd_server -> cic_eth_celery_api_transfer -> cic_eth_mq;
|
||||||
|
cic_ussd_server -> cic_eth_celery_api_balance -> cic_eth_mq;
|
||||||
|
cic_ussd_server -> cic_eth_celery_api_convert -> cic_eth_mq;
|
||||||
|
cic_ussd_server -> cic_eth_celery_api_createaccount -> cic_eth_mq;
|
||||||
|
cic_ussd_server -> db;
|
||||||
|
cic_ussd_server -> kv;
|
||||||
|
cic_ussd_server -> api_files;
|
||||||
|
cic_ussd_tasker -> db;
|
||||||
|
|
||||||
|
cic_ussd_mq -> cic_ussd_tasker -> cic_notify_mq;
|
||||||
|
|
||||||
|
cic_staff_gui -> cic_ussd_server_api_pin -> cic_ussd_server;
|
||||||
|
AT -> cic_ussd_server_api_ussd -> cic_ussd_server;
|
||||||
|
|
||||||
|
// comment
|
||||||
|
blockchain -> cic_cache_tracker -> db;
|
||||||
|
cic_staff_gui -> cic_cache_server_api_tx -> cic_cache_server -> db;
|
||||||
|
|
||||||
|
cic_ussd_tasker -> cic_notify_mq;
|
||||||
|
|
||||||
|
cic_staff_gui -> api_files;
|
||||||
|
api_files -> swarm;
|
||||||
|
api_files -> ipfs;
|
||||||
|
api_files -> cic_meta_server -> db;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
{"address":"eb3907ecad74a0013c259d5874ae7f22dcbcc95c","crypto":{"cipher":"aes-128-ctr","ciphertext":"b0f70a8af4071faff2267374e2423cbc7a71012096fd2215866d8de7445cc215","cipherparams":{"iv":"9ac89383a7793226446dcb7e1b45cdf3"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"299f7b5df1d08a0a7b7f9c9eb44fe4798683b78da3513fcf9603fd913ab3336f"},"mac":"6f4ed36c11345a9a48353cd2f93f1f92958c96df15f3112a192bc994250e8d03"},"id":"61a9dd88-24a9-495c-9a51-152bd1bfaa5b","version":3}
|
55
apps/contract-migration/reset.sh
Normal file
55
apps/contract-migration/reset.sh
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
keystore_file=$(realpath ./keystore/UTC--2021-01-08T17-18-44.521011372Z--eb3907ecad74a0013c259d5874ae7f22dcbcc95c)
|
||||||
|
|
||||||
|
echo "environment:"
|
||||||
|
printenv
|
||||||
|
echo \n
|
||||||
|
|
||||||
|
# This is a grassroots team convention for building the Bancor contracts using the bancor protocol repository truffle setup
|
||||||
|
# Running this in docker-internal dev container (built from Docker folder in this repo) will write a
|
||||||
|
# source-able env file to CIC_DATA_DIR. Services dependent on these contracts can mount this file OR
|
||||||
|
# define these parameters at runtime
|
||||||
|
# pushd /usr/src
|
||||||
|
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Abort on any error (including if wait-for-it fails).
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Wait for the backend to be up, if we know where it is.
|
||||||
|
if [[ -n "${ETH_PROVIDER}" ]]; then
|
||||||
|
echo "waiting for ${ETH_PROVIDER}..."
|
||||||
|
./wait-for-it.sh "${ETH_PROVIDER_HOST}:${ETH_PROVIDER_PORT}"
|
||||||
|
|
||||||
|
#DEV_ETH_RESERVE_ADDRESS=`giftable-token-deploy -p $ETH_PROVIDER -o $DEV_ETH_ACCOUNT_RESERVE_OWNER -m $DEV_ETH_ACCOUNT_RESERVE_MINTER $DEV_ETH_RESERVE_AMOUNT`
|
||||||
|
DEV_ETH_RESERVE_ADDRESS=`giftable-token-deploy -p $ETH_PROVIDER -y $keystore_file -i $CIC_CHAIN_SPEC --minter $DEV_ETH_ACCOUNT_RESERVE_MINTER -v -w --name "Sarafu" --symbol "SRF" $DEV_ETH_RESERVE_AMOUNT`
|
||||||
|
|
||||||
|
#BANCOR_REGISTRY_ADDRESS=`cic-bancor-deploy --bancor-dir /usr/local/share/cic/bancor -z $DEV_ETH_RESERVE_ADDRESS -p $ETH_PROVIDER -o $DEV_ETH_ACCOUNT_CONTRACT_DEPLOYER`
|
||||||
|
|
||||||
|
CIC_ACCOUNTS_INDEX_ADDRESS=`eth-accounts-index-deploy -i $CIC_CHAIN_SPEC -p $ETH_PROVIDER -y $keystore_file --writer $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER -vv -w`
|
||||||
|
|
||||||
|
CIC_REGISTRY_ADDRESS=`cic-registry-deploy -i $CIC_CHAIN_SPEC -y $keystore_file -k CICRegistry -k BancorRegistry -k AccountRegistry -k TokenRegistry -k AddressDeclarator -k Faucet -k TransferApproval -p $ETH_PROVIDER -vv -w`
|
||||||
|
cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -i $CIC_CHAIN_SPEC -k CICRegistry -p $ETH_PROVIDER $CIC_REGISTRY_ADDRESS -vv
|
||||||
|
#cic-registry-set -r $CIC_REGISTRY_ADDRESS -i $CIC_CHAIN_SPEC -k BancorRegistry -p $ETH_PROVIDER $BANCOR_REGISTRY_ADDRESS -vv
|
||||||
|
cic-registry-set -y $keystore_file -r $CIC_REGISTRY_ADDRESS -i $CIC_CHAIN_SPEC -k AccountRegistry -p $ETH_PROVIDER $CIC_ACCOUNTS_INDEX_ADDRESS -vv
|
||||||
|
else
|
||||||
|
echo "\$ETH_PROVIDER not set!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p $CIC_DATA_DIR
|
||||||
|
|
||||||
|
# this is consumed in downstream services to set environment variables
|
||||||
|
cat << EOF > $CIC_DATA_DIR/.env
|
||||||
|
export DEV_ETH_RESERVE_ADDRESS=$DEV_ETH_RESERVE_ADDRESS
|
||||||
|
export DEV_ETH_RESERVE_AMOUNT=$DEV_ETH_RESERVE_AMOUNT
|
||||||
|
export DEV_ETH_ACCOUNTS_INDEX_ADDRESS=$DEV_ETH_ACCOUNTS_INDEX_ADDRESS
|
||||||
|
export BANCOR_REGISTRY_ADDRESS=$BANCOR_REGISTRY_ADDRESS
|
||||||
|
export CIC_REGISTRY_ADDRESS=$CIC_REGISTRY_ADDRESS
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# popd
|
||||||
|
|
||||||
|
exec "$@"
|
83
apps/contract-migration/testdata/pgp/alice.priv.asc
vendored
Normal file
83
apps/contract-migration/testdata/pgp/alice.priv.asc
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
=zMNq
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
41
apps/contract-migration/testdata/pgp/alice.pub.asc
vendored
Normal file
41
apps/contract-migration/testdata/pgp/alice.pub.asc
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
xgjhMwawpFV3APdc0dOIvUdZAFQ=
|
||||||
|
=BKz+
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
83
apps/contract-migration/testdata/pgp/bob.priv.asc
vendored
Normal file
83
apps/contract-migration/testdata/pgp/bob.priv.asc
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
=qmcx
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
41
apps/contract-migration/testdata/pgp/bob.pub.asc
vendored
Normal file
41
apps/contract-migration/testdata/pgp/bob.pub.asc
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
n0OSM7kpK5v6VPdtByaN6w==
|
||||||
|
=EmWr
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
83
apps/contract-migration/testdata/pgp/ge.priv.asc
vendored
Normal file
83
apps/contract-migration/testdata/pgp/ge.priv.asc
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
=B12U
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
41
apps/contract-migration/testdata/pgp/ge.pub.asc
vendored
Normal file
41
apps/contract-migration/testdata/pgp/ge.pub.asc
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
32d1dwRCBUARSk9jwmwsycaIC9eupit1mLY=
|
||||||
|
=vg+T
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
114
apps/contract-migration/testdata/pgp/publickeys.asc
vendored
Normal file
114
apps/contract-migration/testdata/pgp/publickeys.asc
vendored
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
wmwsycaIC9eupit1mLY=
|
||||||
|
=1aEW
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
29
apps/contract-migration/testdata/ssl/client.crt
vendored
Normal file
29
apps/contract-migration/testdata/ssl/client.crt
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIE4DCCAsgCAQMwDQYJKoZIhvcNAQELBQAwgaExCzAJBgNVBAYTAktZMQ8wDQYD
|
||||||
|
VQQIDAZLaWxpZmkxEDAOBgNVBAcMB01uYXJhbmkxHTAbBgNVBAoMFEdyYXNzcm9v
|
||||||
|
dHMgRWNvbm9taWNzMQswCQYDVQQLDAJIUTEgMB4GA1UEAwwXZ3Jhc3Nyb290c2Vj
|
||||||
|
b25vbWljcy5vcmcxITAfBgkqhkiG9w0BCQEWEndpbGxAZ3Jhc3NlY29uLm9yZzAe
|
||||||
|
Fw0yMDAzMjgwMDE3MzRaFw0yMjEyMjQwMDE3MzRaMIHJMQswCQYDVQQGEwJNTjEU
|
||||||
|
MBIGA1UECgwLVGhlIE1vbmdvbHMxGzAZBgNVBAMMEnd3dy51bGFhbmJhYXRhci5t
|
||||||
|
bjEVMBMGA1UEKQwMS2h1YmxhaSBLaGFuMR8wHQYJKoZIhvcNAQkBFhBmb29Ac2Vj
|
||||||
|
aG9zdC5pbmZvMRAwDgYDVQQqDAdLaHVibGFpMQ0wCwYDVQQEDARLaGFuMRQwEgYD
|
||||||
|
VQQHDAtVbGFhbmJhYXRhcjEYMBYGA1UECAwPVGhlIFdob2xlIFdvcmxkMIIBIjAN
|
||||||
|
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtT1IP3Ls0ha5cX5RiMnyjPzjGjvS
|
||||||
|
GrWhDU579+qQ4T4k9ONq8fxNv95ZdxkccUyXZVR24pq+ALxmV65soCAGNJHb00lE
|
||||||
|
XWY3mQ9Jd10pC8UQPqfQ4Ez/J0Q+oIwpTdUCQStIe8QHz6sh8AVmPrTKWphjD5Up
|
||||||
|
PuWjFz4qs6h46hzNDoc90HPr4rqnxzBIo4Phs4a8/46FWvphufybKgorz+B5uWeB
|
||||||
|
Uzi3fOOKNAk8UmZK8fWB8DMIm8NFcOZV7METJmMBH1v5sY6zQWNBOHJmin02VkCW
|
||||||
|
rie16Ll+vfWp1jQEh442qgBFk0NiZBoGWJamYa7RmwH5d4LPGLiDUVgsnwIDAQAB
|
||||||
|
MA0GCSqGSIb3DQEBCwUAA4ICAQBy0DIHBXVDPy4dTrmjcr78ytxy26p+8kjlzTQF
|
||||||
|
w9a9F+CPsRNV4KAmXJKUlyBTPiVocVhhSmj2Mz9OtI9FFWkSleKzxUtWlDEjIwGj
|
||||||
|
PRqWKhj/Y8LJsgdcUGCBtraBMCD5D1xyNx3n+zwhNp+HNB4ThVlV0iGCoOOq7XZu
|
||||||
|
4QHwkuy0ILcXt3NU6tWNXXsP544BxsCFHgyu+Ks+JkJzSFzGe+ybEMblXyHJZtOC
|
||||||
|
uyCLQN2Uo44Mtdo728p00mRGSFlouFfQWMu/7lQPNYouQ7XiLXy+mNeNN0CYUjpg
|
||||||
|
a7wfPExMljJEkgYyWT4JMuTB5RTsjQqw41aGtfy021L7yCZnVR2GG3pmeRQtqe4r
|
||||||
|
+V+WHV3YOkW5vObd5RE3ykntFkbrZNodBzxp6qKF4qsfqQH6WJFVXh0b36VmOdSa
|
||||||
|
qWxidz+SeCI379nemy93bcusQxRDXc+j5hbpW2pTtz2uxN5Y86DWEdSjpmiu6ExT
|
||||||
|
eBUyoK/5Zes/oZ3R9vj0V9jhpGN1/FahkXfkjZcuwXXFXuwk8rODU9DKGOEqFPKI
|
||||||
|
P/MZSVkfNvkBhiNozBXx1X/vJ2QoQKqE9zPfXlmvZkLiUaMjqd+h3qRe0vqXlQU+
|
||||||
|
ZH8NrKTi5xS/2VGtz4ksGlQp7GMZ0XFWL23BGhUfQVRLKMPCqta+GTuJUo3r5HVL
|
||||||
|
YiI4dw==
|
||||||
|
-----END CERTIFICATE-----
|
30
apps/contract-migration/testdata/ssl/client.key
vendored
Normal file
30
apps/contract-migration/testdata/ssl/client.key
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
Proc-Type: 4,ENCRYPTED
|
||||||
|
DEK-Info: AES-256-CBC,A748148F1C16F6129F04A346A324170A
|
||||||
|
|
||||||
|
k5K2EMTBDsaa9LqsnWnDV2Ocd14fZ6lXsNBoPZR1axrOV+zNZtDDIQwFP0FHmTN6
|
||||||
|
KrxDuDvPjkhoebMiLkRyWc6d4fslWQnr3vASi8gONYGT3pXKbuPNEMSXJeRfxvzC
|
||||||
|
CAcSh9rItcVxKv7m8+vuUWUy8m6TGBLRpDwiYf/9KTjGaPO2fnDBLHPlBuHVEmQW
|
||||||
|
xa0MOknleWnMucGMAtNdsiOVULgyljnoexgbES0VAosegnCKaRA5mRt47V0XUFDl
|
||||||
|
cFxXsHlZ4Wo4R9BowkWhpxX+IBVBmr1Rbmhkl8Z/k3SWfmAd2PNqHckl4oZsG0NN
|
||||||
|
kfi/x5RvMFXGwfW0q5XK/4oK1KbxV7UTn/lozkyvixSWDrN+2jETNCJyL//oXUcS
|
||||||
|
ZTr1+qic92fAAonx1JkX1QwQlNTb0ogmgpJzvAKqGqlNpSL3D0xySNTsSM0fEeZV
|
||||||
|
1qEnWTp1WpoyxG1CeiV0MDN9wkh9aV+KYm0FFo8PEqG6L1jsVNJKMtySeCXmWETK
|
||||||
|
S6iUBwiNf8atQwERfWx0wqSwHtJs9+zqUasskqYWJcO9T3TGqdc8UBaeVGAGdWFF
|
||||||
|
soGsBqrVyU8TEAuK6UReJyFQtHqXbm7kFIJ8J6fgc/QG4Dhy4laBKpR5Lg1W3fCa
|
||||||
|
g+o4OvkWr0Mvu0/y528qL0cqb3JoxvAtsZ8cHiiy1g3AiSr9ehlvtVboyg1ViP5d
|
||||||
|
cZZyU0NaeEUYOIULeBap4LNUBPQUSN5lw15C7N/reI8uuTNp8u8/6ITXKH3tknJr
|
||||||
|
n6Jhd6uFuYNImRhHgQ5rKgai5+Nhc6RqdO5K05fVMt8wIng5RkShQzQEZtaynWyg
|
||||||
|
3VbmJrKXjYesMxYFuKYP4efEVH/9tUeHiqlgVBF2N2Ntd4vKYied3mllthAo8BVC
|
||||||
|
0S0A+cZ2K65MKSoh/FHxxqfXo3AF6dL58DC+9jnzhKNgErVSTti0/Ps6pxrloNuN
|
||||||
|
ILUVeUQNhVlZu7KpJHININCnicohj8wAJDVZo7bb3iZfRGDIAFfgKuEALk+CRd0H
|
||||||
|
D6PukualFGd9w+KDLmUVdpkUTq9+UaZcJMXqGAN1ihIz44Xvk4QgFRN+9Szz4HbL
|
||||||
|
j5rTNqRmXjWjPahk90D/cOQuuE81GsVdiLnFzEacAlDGoGgV+Wcr/lQ06H099Hz1
|
||||||
|
v9hSwXoI+EbeQTjoqenQV62V7wuOiAKg3SpekGsYAsuuPElCBwYGTzWvotf9BBFe
|
||||||
|
LxhfVTCXD1cOQo3pgC8nHBwQSJ6TEXMrR52lgIkOZq/EPhPAYyO5A6ab2tKD1Zah
|
||||||
|
7qlkDDov7f4eTJrXfPnOu/tl3voN+VOxVbxFqsJuMPRCDc/DI18mOi+4yeUFK22W
|
||||||
|
pOCa+Etv7tGa3KlOuU/VWQfGTsICC8ejCIBgwmcbJ5HndEtzrPQv0ESziIcy/ybr
|
||||||
|
zkmlKJ7n7MZLNx/if5Ly9rxg+Y1al5JkOWpIqGKIhP075M2H9Kcg08TqHY6YoG5w
|
||||||
|
eJuudcyosGggxo/oTCCPrHNnPSvaauaZRynF02AQ1hle83V7T1Sy0jbtoGRXM7Hq
|
||||||
|
7AyQDLAcCregAkUuCMF/pktcJLQ2rY738RzNyaR3OiaTgKjko553QkciLP28qwZh
|
||||||
|
-----END RSA PRIVATE KEY-----
|
35
apps/contract-migration/testdata/ssl/ge.crt
vendored
Normal file
35
apps/contract-migration/testdata/ssl/ge.crt
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
182
apps/contract-migration/wait-for-it.sh
Normal file
182
apps/contract-migration/wait-for-it.sh
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Use this script to test if a given TCP host/port are available
|
||||||
|
|
||||||
|
WAITFORIT_cmdname=${0##*/}
|
||||||
|
|
||||||
|
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
|
||||||
|
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
cat << USAGE >&2
|
||||||
|
Usage:
|
||||||
|
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
|
||||||
|
-h HOST | --host=HOST Host or IP under test
|
||||||
|
-p PORT | --port=PORT TCP port under test
|
||||||
|
Alternatively, you specify the host and port as host:port
|
||||||
|
-s | --strict Only execute subcommand if the test succeeds
|
||||||
|
-q | --quiet Don't output any status messages
|
||||||
|
-t TIMEOUT | --timeout=TIMEOUT
|
||||||
|
Timeout in seconds, zero for no timeout
|
||||||
|
-- COMMAND ARGS Execute command with args after the test finishes
|
||||||
|
USAGE
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for()
|
||||||
|
{
|
||||||
|
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
|
||||||
|
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
|
||||||
|
else
|
||||||
|
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
|
||||||
|
fi
|
||||||
|
WAITFORIT_start_ts=$(date +%s)
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
|
||||||
|
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
|
||||||
|
WAITFORIT_result=$?
|
||||||
|
else
|
||||||
|
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
|
||||||
|
WAITFORIT_result=$?
|
||||||
|
fi
|
||||||
|
if [[ $WAITFORIT_result -eq 0 ]]; then
|
||||||
|
WAITFORIT_end_ts=$(date +%s)
|
||||||
|
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
return $WAITFORIT_result
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_wrapper()
|
||||||
|
{
|
||||||
|
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
|
||||||
|
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
|
||||||
|
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
|
||||||
|
else
|
||||||
|
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
|
||||||
|
fi
|
||||||
|
WAITFORIT_PID=$!
|
||||||
|
trap "kill -INT -$WAITFORIT_PID" INT
|
||||||
|
wait $WAITFORIT_PID
|
||||||
|
WAITFORIT_RESULT=$?
|
||||||
|
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
|
||||||
|
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
|
||||||
|
fi
|
||||||
|
return $WAITFORIT_RESULT
|
||||||
|
}
|
||||||
|
|
||||||
|
# process arguments
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
*:* )
|
||||||
|
WAITFORIT_hostport=(${1//:/ })
|
||||||
|
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
|
||||||
|
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
--child)
|
||||||
|
WAITFORIT_CHILD=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-q | --quiet)
|
||||||
|
WAITFORIT_QUIET=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-s | --strict)
|
||||||
|
WAITFORIT_STRICT=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-h)
|
||||||
|
WAITFORIT_HOST="$2"
|
||||||
|
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--host=*)
|
||||||
|
WAITFORIT_HOST="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-p)
|
||||||
|
WAITFORIT_PORT="$2"
|
||||||
|
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--port=*)
|
||||||
|
WAITFORIT_PORT="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-t)
|
||||||
|
WAITFORIT_TIMEOUT="$2"
|
||||||
|
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--timeout=*)
|
||||||
|
WAITFORIT_TIMEOUT="${1#*=}"
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
WAITFORIT_CLI=("$@")
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echoerr "Unknown argument: $1"
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
|
||||||
|
echoerr "Error: you need to provide a host and port to test."
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
|
||||||
|
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
|
||||||
|
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
|
||||||
|
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
|
||||||
|
|
||||||
|
# Check to see if timeout is from busybox?
|
||||||
|
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
|
||||||
|
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
|
||||||
|
|
||||||
|
WAITFORIT_BUSYTIMEFLAG=""
|
||||||
|
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
|
||||||
|
WAITFORIT_ISBUSY=1
|
||||||
|
# Check if busybox timeout uses -t flag
|
||||||
|
# (recent Alpine versions don't support -t anymore)
|
||||||
|
if timeout &>/dev/stdout | grep -q -e '-t '; then
|
||||||
|
WAITFORIT_BUSYTIMEFLAG="-t"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
WAITFORIT_ISBUSY=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
|
||||||
|
wait_for
|
||||||
|
WAITFORIT_RESULT=$?
|
||||||
|
exit $WAITFORIT_RESULT
|
||||||
|
else
|
||||||
|
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
|
||||||
|
wait_for_wrapper
|
||||||
|
WAITFORIT_RESULT=$?
|
||||||
|
else
|
||||||
|
wait_for
|
||||||
|
WAITFORIT_RESULT=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $WAITFORIT_CLI != "" ]]; then
|
||||||
|
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
|
||||||
|
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
|
||||||
|
exit $WAITFORIT_RESULT
|
||||||
|
fi
|
||||||
|
exec "${WAITFORIT_CLI[@]}"
|
||||||
|
else
|
||||||
|
exit $WAITFORIT_RESULT
|
||||||
|
fi
|
22
ci_templates/.cic-base.yml
Normal file
22
ci_templates/.cic-base.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.py-build
|
||||||
|
stage: build
|
||||||
|
image: docker:19.03.13
|
||||||
|
variables:
|
||||||
|
# docker host
|
||||||
|
DOCKER_HOST: tcp://docker:2376
|
||||||
|
# container, thanks to volume mount from config.toml
|
||||||
|
DOCKER_TLS_CERTDIR: "/certs"
|
||||||
|
# These are usually specified by the entrypoint, however the
|
||||||
|
# Kubernetes executor doesn't run entrypoints
|
||||||
|
# https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4125
|
||||||
|
DOCKER_TLS_VERIFY: 1
|
||||||
|
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
||||||
|
services:
|
||||||
|
- docker:19.03.13-dind
|
||||||
|
before_script:
|
||||||
|
- docker info
|
||||||
|
- cd $CONTEXT
|
||||||
|
script:
|
||||||
|
- docker build -t $CI_PROJECT_PATH_SLUG:$CI_COMMIT_SHORT_SHA .
|
||||||
|
|
||||||
|
|
384
docker-compose.yml
Normal file
384
docker-compose.yml
Normal file
@ -0,0 +1,384 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
ganache-db: {}
|
||||||
|
postgres-db: {}
|
||||||
|
contract-config: {}
|
||||||
|
bee-data: {}
|
||||||
|
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: cic-network
|
||||||
|
|
||||||
|
services:
|
||||||
|
eth:
|
||||||
|
image: trufflesuite/ganache-cli
|
||||||
|
ports:
|
||||||
|
- ${HTTP_PORT_ETH:-8545}
|
||||||
|
- ${WS_PORT_ETH:-8546}
|
||||||
|
# Note! -e switch doesnt work, whatever you put there, it will be 100
|
||||||
|
command: "-i 8995 -e 100 -l 9000000 -m '${DEV_MNEMONIC:-\"history stumble mystery avoid embark arrive mom foil pledge keep grain dice\"}' -v --db /tmp/cic/ganache/ganache.db --noVMErrorsOnRPCResponse"
|
||||||
|
volumes:
|
||||||
|
- ganache-db:/tmp/cic/ganache
|
||||||
|
|
||||||
|
# See contents of /initdb/create_db.sql for app user, password and databases
|
||||||
|
postgres:
|
||||||
|
image: postgres:12.5-alpine
|
||||||
|
environment:
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust # for postgres user access w/o password. Obvioulsy not safe but allows easy elevated debugging.
|
||||||
|
PGDATA: /tmp/cic/postgres
|
||||||
|
ports:
|
||||||
|
- ${HTTP_PORT_POSTGRES:-5432}
|
||||||
|
volumes:
|
||||||
|
- ./scripts/initdb/create_db.sql:/docker-entrypoint-initdb.d/1-create_all_db.sql # init db scripts will run in order at container start
|
||||||
|
- postgres-db:/tmp/cic/postgres
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:6.0.9-alpine
|
||||||
|
ports:
|
||||||
|
- ${HTTP_PORT_REDIS:-6379}
|
||||||
|
command: "--loglevel verbose"
|
||||||
|
|
||||||
|
bee:
|
||||||
|
image: ethersphere/bee:0.4.1
|
||||||
|
container_name: bee
|
||||||
|
environment:
|
||||||
|
BEE_NETWORK_ID: ${BEE_NETWORK_ID:-313}
|
||||||
|
BEE_PASSWORD: $BEE_PASSWORD
|
||||||
|
ports:
|
||||||
|
- 1633
|
||||||
|
- 1635
|
||||||
|
command: "start --swap-enable=false --standalone"
|
||||||
|
volumes:
|
||||||
|
- bee-data:/tmp/cic/bee
|
||||||
|
|
||||||
|
contract-migration:
|
||||||
|
build: apps/contract-migration
|
||||||
|
environment:
|
||||||
|
# ETH_PROVIDER should be broken out into host/port but cic-eth expects this
|
||||||
|
ETH_PROVIDER: http://eth:8545
|
||||||
|
# And these two are for wait-for-it (could parse this)
|
||||||
|
ETH_PROVIDER_HOST: eth
|
||||||
|
ETH_PROVIDER_PORT: 8545
|
||||||
|
command: ["./reset.sh"]
|
||||||
|
depends_on:
|
||||||
|
- eth
|
||||||
|
volumes:
|
||||||
|
- contract-config:/tmp/cic/config
|
||||||
|
|
||||||
|
cic-cache-tracker:
|
||||||
|
# image: registry.gitlab.com/grassrootseconomics/cic-cache:master-latest
|
||||||
|
build: apps/cic-cache
|
||||||
|
environment:
|
||||||
|
CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS # supplied at contract-config after contract provisioning
|
||||||
|
ETH_PROVIDER: ${ETH_PROVIDER:-http://eth:8545}
|
||||||
|
BANCOR_DIR: ${BANCOR_DIR:-/usr/local/share/cic/bancor}
|
||||||
|
DATABASE_USER: ${DATABASE_USER:-grassroots}
|
||||||
|
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-tralala} # this is is set at initdb see: postgres/initdb/create_db.sql
|
||||||
|
DATABASE_HOST: ${DATABASE_HOST:-postgres}
|
||||||
|
DATABASE_PORT: ${DATABASE_PORT:-5432}
|
||||||
|
DATABASE_NAME: ${DATABASE_NAME_CIC_CACHE:-cic_cache}
|
||||||
|
DATABASE_ENGINE: ${DATABASE_ENGINE:-postgres}
|
||||||
|
DATABASE_DRIVER: ${DATABASE_DRIVER:-psycopg2}
|
||||||
|
ETH_ABI_DIR: ${ETH_ABI_DIR:-/usr/local/share/cic/solidity/abi}
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
condition: on-failure
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
- eth
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
|
||||||
|
/usr/local/bin/cic-cache-tracker -vv
|
||||||
|
volumes:
|
||||||
|
- contract-config:/tmp/cic/config/:ro
|
||||||
|
# entrypoint: ["/usr/local/bin/cic-cache-tracker", "-vv"]
|
||||||
|
# command: "/usr/local/bin/cic-cache-tracker -vv"
|
||||||
|
|
||||||
|
# cic-cache-server:
|
||||||
|
# image: grassrootseconomics:cic-cache-uwsgi
|
||||||
|
# environment:
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_CACHE
|
||||||
|
# PGPASSWORD: $DATABASE_PASSWORD
|
||||||
|
# SERVER_PORT: 80
|
||||||
|
# ports:
|
||||||
|
# - ${HTTP_PORT_CIC_CACHE}:80
|
||||||
|
# depends_on:
|
||||||
|
# - postgres
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_uwsgi.sh"
|
||||||
|
|
||||||
|
# cic-eth-tasker:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# ETH_ABI_DIR: $ETH_ABI_DIR
|
||||||
|
# ETH_GAS_PROVIDER_ADDRESS: $DEV_ETH_ACCOUNT_GAS_PROVIDER
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# PGPASSWORD: $DATABASE_PASSWORD
|
||||||
|
# CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# SIGNER_SOCKET_PATH: $SIGNER_SOCKET_PATH
|
||||||
|
# SIGNER_SECRET: $SIGNER_SECRET
|
||||||
|
# ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER: $DEV_ETH_ACCOUNT_ACCOUNTS_INDEX_WRITER
|
||||||
|
# depends_on:
|
||||||
|
# - eth
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# volumes:
|
||||||
|
# - ${LOCAL_VOLUME_DIR:-/tmp/cic}/signer:/tmp/cic/signer
|
||||||
|
# command: "/root/start_tasker.sh -q cic-eth -vv"
|
||||||
|
|
||||||
|
# cic-eth-manager-head:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# TASKS_TRANSFER_CALLBACKS: $TASKS_TRANSFER_CALLBACKS
|
||||||
|
# depends_on:
|
||||||
|
# - eth
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_manager.sh head -vv"
|
||||||
|
|
||||||
|
# cic-eth-manager-history:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# depends_on:
|
||||||
|
# - eth
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# #deploy:
|
||||||
|
# #restart_policy:
|
||||||
|
# # condition: on-failure
|
||||||
|
# command: "/root/start_manager.sh history -vv"
|
||||||
|
|
||||||
|
# cic-eth-dispatcher:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# depends_on:
|
||||||
|
# - eth
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_dispatcher.sh -q cic-eth -vv"
|
||||||
|
|
||||||
|
|
||||||
|
# cic-eth-retrier:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# depends_on:
|
||||||
|
# - eth
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_retry.sh -q cic-eth -vv"
|
||||||
|
|
||||||
|
|
||||||
|
# cic-eth-server:
|
||||||
|
# image: grassrootseconomics:cic-eth-service
|
||||||
|
# environment:
|
||||||
|
# # ETH_PROVIDER: $ETH_PROVIDER
|
||||||
|
# # DATABASE_USER: $DATABASE_USER
|
||||||
|
# # DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# # DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# # DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# # DATABASE_NAME: $DATABASE_NAME_CIC_ETH
|
||||||
|
# # DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# # DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# # CIC_REGISTRY_ADDRESS: $CIC_REGISTRY_ADDRESS
|
||||||
|
# CIC_CHAIN_SPEC: $CIC_CHAIN_SPEC
|
||||||
|
# # BANCOR_DIR: $BANCOR_DIR
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# SERVER_PORT: 80
|
||||||
|
# ports:
|
||||||
|
# - ${HTTP_PORT_CIC_ETH}:80
|
||||||
|
# depends_on:
|
||||||
|
# # - eth
|
||||||
|
# # - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# #command: "/bin/bash-c uwsgi --wsgi-file /usr/src/cic-eth/cic_eth/runnable/server_agent.py --http :80 --pyargv '-vv'"
|
||||||
|
# #command: "uwsgi"
|
||||||
|
# entrypoint:
|
||||||
|
# - "/usr/local/bin/uwsgi"
|
||||||
|
# - "--wsgi-file"
|
||||||
|
# - "/usr/src/cic-eth/cic_eth/runnable/server_agent.py"
|
||||||
|
# - "--http"
|
||||||
|
# - ":80"
|
||||||
|
# command: "--pyargv -vv"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# cic-notify-tasker:
|
||||||
|
# image: grassrootseconomics:cic-notify-service
|
||||||
|
# environment:
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_NOTIFY
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# PGPASSWORD: $DATABASE_PASSWORD
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# TASKS_AFRICASTALKING: $TASKS_AFRICASTALKING
|
||||||
|
# TASKS_SMS_DB: $TASKS_SMS_DB
|
||||||
|
# TASKS_LOG: $TASKS_LOG
|
||||||
|
# depends_on:
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_tasker.sh -q cic-notify"
|
||||||
|
|
||||||
|
|
||||||
|
# cic-meta-server:
|
||||||
|
# image: grassrootseconomics:cic-meta-server
|
||||||
|
# environment:
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_META
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# DATABASE_SCHEMA_SQL_PATH: $DATABASE_SCHEMA_SQL_PATH_CIC_META
|
||||||
|
# SERVER_PORT: 80
|
||||||
|
# PGP_PASSPHRASE: $PGP_PASSPHRASE
|
||||||
|
# PGP_EXPORTS_DIR: $PGP_EXPORTS_DIR
|
||||||
|
# PGP_PRIVATEKEY_FILE: $PGP_PRIVATEKEY_FILE
|
||||||
|
# ports:
|
||||||
|
# - ${HTTP_PORT_CIC_META}:80
|
||||||
|
# depends_on:
|
||||||
|
# - postgres
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# volumes:
|
||||||
|
# - ${LOCAL_VOLUME_DIR:-/tmp/cic}/pgp:/tmp/cic/pgp
|
||||||
|
# command: "/root/start_server.sh -vv"
|
||||||
|
|
||||||
|
# cic-ussd-server:
|
||||||
|
# image: grassrootseconomics:cic-ussd
|
||||||
|
# environment:
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_USSD
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# SERVER_PORT: 80
|
||||||
|
# ports:
|
||||||
|
# - ${HTTP_PORT_CIC_USSD}:80
|
||||||
|
# depends_on:
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_uwsgi.sh"
|
||||||
|
|
||||||
|
# cic-ussd-tasker:
|
||||||
|
# image: grassrootseconomics:cic-ussd
|
||||||
|
# environment:
|
||||||
|
# DATABASE_USER: $DATABASE_USER
|
||||||
|
# DATABASE_HOST: $DATABASE_HOST
|
||||||
|
# DATABASE_PORT: $DATABASE_PORT
|
||||||
|
# DATABASE_PASSWORD: $DATABASE_PASSWORD
|
||||||
|
# DATABASE_NAME: $DATABASE_NAME_CIC_USSD
|
||||||
|
# DATABASE_ENGINE: $DATABASE_ENGINE
|
||||||
|
# DATABASE_DRIVER: $DATABASE_DRIVER
|
||||||
|
# CELERY_BROKER_URL: $CELERY_BROKER_URL
|
||||||
|
# CELERY_RESULT_URL: $CELERY_RESULT_URL
|
||||||
|
# depends_on:
|
||||||
|
# - postgres
|
||||||
|
# - redis
|
||||||
|
# deploy:
|
||||||
|
# restart_policy:
|
||||||
|
# condition: on-failure
|
||||||
|
# command: "/root/start_tasker.sh -q cic-ussd"
|
44
requirements.txt
Normal file
44
requirements.txt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
africastalking==1.2.3
|
||||||
|
alembic==1.4.2
|
||||||
|
bcrypt==3.2.0
|
||||||
|
celery==4.4.7
|
||||||
|
confini==0.3.6a1
|
||||||
|
crypto-dev-signer==0.4.13b10
|
||||||
|
cryptography==3.2.1
|
||||||
|
ecuth==0.4.5a1
|
||||||
|
eth-accounts-index==0.0.10a5
|
||||||
|
eth-address-index==0.1.0a5
|
||||||
|
eth-tester==0.5.0b3
|
||||||
|
erc20-approval-escrow==0.3.0a3
|
||||||
|
erc20-single-shot-faucet==0.2.0a4
|
||||||
|
faker==4.17.1
|
||||||
|
http-hoba-auth==0.2.0
|
||||||
|
moolb==0.1.0
|
||||||
|
phonenumbers==8.12.12
|
||||||
|
psycopg2==2.8.6
|
||||||
|
py-eth==0.1.1
|
||||||
|
py-evm==0.3.0a20
|
||||||
|
pytest==6.0.1
|
||||||
|
pytest-alembic==0.2.5
|
||||||
|
pytest-celery==0.0.0a1
|
||||||
|
pytest-cov==2.10.1
|
||||||
|
pytest-mock==3.3.1
|
||||||
|
pytest-redis==2.0.0
|
||||||
|
python-i18n==0.3.9
|
||||||
|
PyYAML==5.3.1
|
||||||
|
redis==3.5.3
|
||||||
|
requests==2.24.0
|
||||||
|
semver==2.13.0
|
||||||
|
SQLAlchemy==1.3.20
|
||||||
|
sqlparse==0.4.1
|
||||||
|
tinydb==4.2.0
|
||||||
|
transitions==0.8.4
|
||||||
|
uWSGI==2.0.19.1
|
||||||
|
vobject==0.9.6.1
|
||||||
|
web3==5.12.2
|
||||||
|
websockets==8.1
|
||||||
|
yaml-acl==0.0.1
|
||||||
|
semver==2.13.0
|
||||||
|
rlp==2.0.1
|
||||||
|
cryptocurrency-cli-tools==0.0.4
|
||||||
|
giftable-erc20-token==0.0.7b5
|
9
scripts/initdb/create_db.sql
Normal file
9
scripts/initdb/create_db.sql
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
CREATE USER grassroots WITH PASSWORD 'tralala' CREATEDB;
|
||||||
|
CREATE DATABASE "cic-cache";
|
||||||
|
CREATE DATABASE "cic-eth";
|
||||||
|
CREATE DATABASE "cic-notify";
|
||||||
|
CREATE DATABASE "cic-meta";
|
||||||
|
CREATE DATABASE "cic-signer";
|
||||||
|
GRANT ALL PRIVILEGES
|
||||||
|
ON DATABASE "cic-cache", "cic-eth", "cic-notify", "cic-meta", "cic-signer"
|
||||||
|
TO grassroots;
|
Loading…
Reference in New Issue
Block a user