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-----
|
||||
MIIGJTCCBA2gAwIBAgIUBFEVU1hCUDCKyWld0pxb9I9cznYwDQYJKoZIhvcNAQEL
|
||||
BQAwgaExCzAJBgNVBAYTAktZMQ8wDQYDVQQIDAZLaWxpZmkxEDAOBgNVBAcMB01u
|
||||
YXJhbmkxHTAbBgNVBAoMFEdyYXNzcm9vdHMgRWNvbm9taWNzMQswCQYDVQQLDAJI
|
||||
UTEgMB4GA1UEAwwXZ3Jhc3Nyb290c2Vjb25vbWljcy5vcmcxITAfBgkqhkiG9w0B
|
||||
CQEWEndpbGxAZ3Jhc3NlY29uLm9yZzAeFw0yMDAzMjYyMjE1NTZaFw0yMDA0MjUy
|
||||
MjE1NTZaMIGhMQswCQYDVQQGEwJLWTEPMA0GA1UECAwGS2lsaWZpMRAwDgYDVQQH
|
||||
DAdNbmFyYW5pMR0wGwYDVQQKDBRHcmFzc3Jvb3RzIEVjb25vbWljczELMAkGA1UE
|
||||
CwwCSFExIDAeBgNVBAMMF2dyYXNzcm9vdHNlY29ub21pY3Mub3JnMSEwHwYJKoZI
|
||||
hvcNAQkBFhJ3aWxsQGdyYXNzZWNvbi5vcmcwggIiMA0GCSqGSIb3DQEBAQUAA4IC
|
||||
DwAwggIKAoICAQC1mdCKV1yPYWi8l0DZaVy9JgWqGxbXj8YWcCTMJgfOQ/SuDGU7
|
||||
3C4aEqSrlUg5y3+FBfYGFeUXnnooaZ3WD7kWhCptCDJ1sZQnhPK28YE36bHZXwPO
|
||||
bTJo1o+IArnJD9RpfAQ2zSI1cz9PWHdbL/Fn75hhsxxCqEC29UbIKCZIc7j9AnBq
|
||||
DBv6xBl5wmNh/cvd2nrJJPSfzp0uKzdNvmsWCi0BdIRHSYpAn0VO7tEYcJEDWSFH
|
||||
+eimDBXMVPUp69wkcYXN3Po/Z0x1xh8HJ8LWDqZ6j9o0gXF1/9kMZY+QzzX+Ms+d
|
||||
03BWNVOA3waLTVIGgK6J1F1c5mzZ0oLMHAx/9LtlWtVPFs0wWvp9Vy2dUMNm2835
|
||||
y1R7EytAEKnZKtvQPtCf+ovyVwgJP1qL/jAr0rEURSDfWWEvmAYucOVrT/ZTB5+6
|
||||
ERGOvVuYWgWq7XCC4WkkeB91oC4TZdCOGZttkqOlCYjQxc23w5NBKkRikIPyO+jI
|
||||
9aRG9R4hJguQxsMleN0nfRcfJIU1UobF8uaw59cYbjpD3qwa41/Po0CwdaKhxTps
|
||||
VZ0kftwN4u7FbT/gpPsaoMNo/e5E8EXNi4vatPT4xE23Zl0PNMPtHSOIkdfvHn5Y
|
||||
+XZ6HPuGQRI4E8NkkeHTGy0wCraFD5nca2jnpot5bT+4IolPlGDPSpXaswIDAQAB
|
||||
o1MwUTAdBgNVHQ4EFgQU2bakvIgtqle+KUaljRWBSbzGI+4wHwYDVR0jBBgwFoAU
|
||||
2bakvIgtqle+KUaljRWBSbzGI+4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
|
||||
AQsFAAOCAgEAYtkfzz4YtdeuNjSNKgnA9gQ7KbT9c/F/T89HptRB5Itueps9DUK+
|
||||
KMEzek7X9OL8smdrRqZ8LqAPD7Fp6fIhdxkIsAD4GedfJJJ7+FnWRtsVdAPd0qIH
|
||||
l+NTmPf3qFYH9BmbT79lCVkv0MqBGOSpEhYrzbqY/7rupgdW9BPn36CLW2/3cawK
|
||||
glickUcfDDzk0Y8TPYTQ6x0dDYE7xY+UbQgv9gw0i65OP53fOgb5CJicEP+BBCr1
|
||||
d51waimG6MVrgvh8DyWPumiuxTTKjssZobYNogdS5RAsYv2YhS9+/7N9Cjc+n1I8
|
||||
+cBNoZTkEbZsGUSJwAJut6aKj/hFvwwMnOVmb+rC4db1055VWIbjRnRn42pRw1lV
|
||||
vE5BH6rw/akGUCdcsnnpZD+mbW/nUDLBc+gWdpVsLHlt224fIiw4ivwp8Wo/VbG5
|
||||
frQpovO9epAxuPXcRkQu6AXCdjIGaVkU73mkjK2Vx2cuxOUqd81jomp4lnylnx6o
|
||||
n/TYgEfe/6mryovgIR8ZayOqiswaMuJEBBGQPc+I/QuoRZLXktUjX9d3/97C1aMY
|
||||
kz2N/isBuGB58eeR6tNRnCED3ZhLM8E6UB8WFEwZpJ4YoelhOd/3cB0ndLFJNB94
|
||||
VPshL6lvczYhqqDn+nygFzSOGnOK3FNzMHrPA6Ld0bzabPpRLV0C3H0=
|
||||
-----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