diff --git a/.gitignore b/.gitignore index 28fbdb6..ee6e50c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/ gmon.out *.egg-info .venv/ +.idea \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e02d361..d8c7e89 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,26 +1,67 @@ stages: - test + - run-coverage - slither-analyzer + +variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + +cache: + paths: + - .cache/pip + - venv/ + +before_script: + - python -V # Print out python version for debugging + - pip install virtualenv + - virtualenv venv + - source venv/bin/activate + test: - image: registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-py-alpine:latest - cache: - - key: - files: - - requirements.txt - - test_requirements.txt - paths: - - /root/.cache/pip + image: registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-python:latest script: + # build abi + - 'echo "Running Solc Version: $(solc --version)"' + - cd solidity + - solc --evm-version=byzantium GiftableToken.sol --abi | awk 'NR>3' > GiftableToken.abi.json + # build bin + - solc GiftableToken.sol --bin | awk 'NR>3' > GiftableToken.bin && + truncate -s "$((`stat -t -c "%s" GiftableToken.bin`-1))" GiftableToken.bin + # install test dependencies + - cd ../python + - export PYTHONPATH=. + - pip install --extra-index-url https://pip.grassrootseconomics.net + --extra-index-url https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple + -r requirements.txt -r test_requirements.txt + # run tests + - bash run_tests.sh + +run-coverage: + stage: test + image: registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-python:latest + script: - cd python - - pip install --extra-index-url https://pip.grassrootseconomics.net:8433 -r test_requirements.txt - - pip install --extra-index-url https://pip.grassrootseconomics.net:8433 -r test_requirements.txt - - bash run_tests.sh + - export PYTHONPATH=. + - pip install --extra-index-url https://pip.grassrootseconomics.net + --extra-index-url https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple + -r requirements.txt -r test_requirements.txt + - pip install pytest pytest-cov + - coverage run -m pytest + - coverage html + - coverage report --fail-under=90 + + coverage: '/^TOTAL.+?(\d+\%)$/' + artifacts: + reports: + cobertura: python/htmlcov/index.html - -slither-analize: - image: registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-py-alpine:latest +slither-analyzer: + image: registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-python:latest + allow_failure: true script: - - pip install slither-analyzer - - slither solidity/ + - cd solidity + - slither GiftableToken.sol + - slither GiftableToken.sol --print human-summary + diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index d27678e..0000000 --- a/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM ethereum/solc:0.6.12 - -FROM python:3.8.6-alpine - -COPY --from=0 /usr/bin/solc /usr/bin/solc - -RUN apk update &&\ - apk add gcc bash musl-dev libffi-dev openssl-dev autoconf automake build-base \ - libtool pkgconfig python3-dev cargo - -WORKDIR /usr/src - -# Try to keep everything above here re-usable! - -COPY ./solidity/ /usr/src/giftable_erc20_token/solidity/ -COPY ./python/ /usr/src/giftable_erc20_token/python/ - -RUN chmod +x ./python/run_tests.sh - -RUN cd giftable_erc20_token/solidity && \ - solc GiftableToken.sol --abi | awk 'NR>3' > GiftableToken.abi.json - -RUN cd giftable_erc20_token/solidity && \ - solc GiftableToken.sol --bin | awk 'NR>3' > GiftableToken.bin && \ - truncate -s "$((`stat -t -c "%s" GiftableToken.bin`-1))" GiftableToken.bin - -RUN cd giftable_erc20_token/python && \ - pip install --extra-index-url https://pip.grassrootseconomics.net:8433 . - -RUN pip install slither-analyzer - -# To deploy: -# giftable-token-deploy --contracts-dir giftable_erc20_token/solidity/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..6afe58d --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# ETH-ERC20 Solidity Contract + + +### solidity + +To generate bytecode and tests install solc 8.x.x and run the solc bits below or execute the following: + +``` +docker run -v `pwd`:/src registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-python:latest solc --evm-version=byzantium solidity/GiftableToken.sol --abi +``` + +``` +docker run -v `pwd`:/src registry.gitlab.com/grassrootseconomics/cic-base-images/ci-solc-python:latest solc GiftableToken.sol --bin | awk 'NR>3' > GiftableToken.bin +``` + +### python unit tests + +``` +pip install --extra-index-url https://gitlab.com/api/v4/projects/27624814/packages/pypi/simple \ +--extra-index-url https://pip.grassrootseconomics.net \ +-r requirements.txt -r test_requirements.txt + +bash python/run_tests.sh + +``` diff --git a/python/.coverage b/python/.coverage new file mode 100644 index 0000000..51af88f Binary files /dev/null and b/python/.coverage differ diff --git a/python/.coveragerc b/python/.coveragerc new file mode 100644 index 0000000..1951f90 --- /dev/null +++ b/python/.coveragerc @@ -0,0 +1,7 @@ +[run] +branch = True +[report] +omit = .venv/* + **/runnable/*.py +[html] + diff --git a/python/giftable_erc20_token/factory.py b/python/giftable_erc20_token/factory.py index 3031e5a..54ac868 100644 --- a/python/giftable_erc20_token/factory.py +++ b/python/giftable_erc20_token/factory.py @@ -94,4 +94,4 @@ class GiftableToken(TxFactory): tx = self.template(sender_address, contract_address, use_nonce=True) tx = self.set_code(tx, data) tx = self.finalize(tx, tx_format) - return tx + return tx \ No newline at end of file diff --git a/python/run_tests.sh b/python/run_tests.sh old mode 100644 new mode 100755 diff --git a/python/tests/test_erc20_interface.py b/python/tests/test_erc20_interface.py index 4c586d1..d500bfb 100644 --- a/python/tests/test_erc20_interface.py +++ b/python/tests/test_erc20_interface.py @@ -12,6 +12,7 @@ from chainlib.eth.tx import ( receipt, ) from chainlib.eth.address import to_checksum_address +from hexathon import strip_0x # local imports from giftable_erc20_token import GiftableToken @@ -102,7 +103,7 @@ class TestToken(EthTesterCase): o = transaction(tx_hash) r = self.rpc.do(o) data = c.parse_transfer_request(r['data']) - self.assertEqual(data[0], self.accounts[1]) + self.assertEqual(data[0], strip_0x(self.accounts[1])) self.assertEqual(data[1], 1000) @@ -124,7 +125,7 @@ class TestToken(EthTesterCase): o = transaction(tx_hash) r = self.rpc.do(o) data = c.parse_approve_request(r['data']) - self.assertEqual(data[0], self.accounts[1]) + self.assertEqual(data[0], strip_0x(self.accounts[1])) self.assertEqual(data[1], 1000) nonce_oracle = RPCNonceOracle(self.accounts[1], conn=self.conn) @@ -138,8 +139,8 @@ class TestToken(EthTesterCase): o = transaction(tx_hash) r = self.rpc.do(o) data = c.parse_transfer_from_request(r['data']) - self.assertEqual(data[0], self.accounts[0]) - self.assertEqual(data[1], self.accounts[2]) + self.assertEqual(data[0], strip_0x(self.accounts[0])) + self.assertEqual(data[1], strip_0x(self.accounts[2])) self.assertEqual(data[2], 1001) (tx_hash, o) = c.transfer_from(self.address, self.accounts[1], self.accounts[0], self.accounts[2], 1000) diff --git a/solidity/GiftableToken.sol b/solidity/GiftableToken.sol index 24bcb59..49ba75b 100644 --- a/solidity/GiftableToken.sol +++ b/solidity/GiftableToken.sol @@ -1,4 +1,4 @@ -pragma solidity >0.6.11; +pragma solidity >=0.6.11; // SPDX-License-Identifier: GPL-3.0-or-later // File-Version: 2