commit 5edeecb1fcb48d66422d6ce557a5a785c5979907
parent 6977c61531dee2b7f28a48c1034aa30acc18ed7e
Author: nolash <dev@holbrook.no>
Date: Sat, 8 May 2021 10:45:02 +0200
Add badge contract deploy, package setup
Diffstat:
7 files changed, 249 insertions(+), 1 deletion(-)
diff --git a/python/CHANGELOG b/python/CHANGELOG
@@ -0,0 +1,4 @@
+- 0.0.1
+ * Add erc721 interface
+ * Add BadgeToken contract
+ * Add Minter functions to python interface
diff --git a/python/LICENSE b/python/LICENSE
@@ -0,0 +1,45 @@
+ Bprotocol Foundation (Bancor) LICENSE
+
+1. SUBJECT TO THE PROVISIONS SET FORTH HEREIN, INCLUDING “EFFECTIVE DATE”, YOU CAN
+ USE THIS CODE, FILE AND/OR SOFTWARE (“SOFTWARE”) ONLY IN CONNECTION WITH THE
+ BANCOR LIQUIDITY NETWORK AND/OR THE USE OF BNT ("PERMITTED USE"). ANY OTHER USE IS
+ PROHIBITED UNLESS THE USER SHALL RECEIVE AN EXPLICIT PRIOR WRITTEN APPROVAL FROM
+ BPROTOCOL FOUNDATION (BANCOR) TO DO SO (PLEASE CONTACT license@bancor.network IN
+ THIS REGARD), WHICH APPROVAL, IF GIVEN, MAY REQUIRE THE OBTAINMENT OF SEPARATE
+ LICENSE UNDER A DIFFERENT LICENSING MODEL. USING THIS SOFTWARE NOT IN THE FRAME OF
+ SUCH PERMITTED USE MAY, AMONG OTHERS, ALSO BREACH PATENT RIGHTS CONCERNING PATENTS
+ WHICH ARE EMBODIED/INCORPORATED/USED IN THIS SOFTWARE.
+
+2. ANY SUCH PERMITTED USE SHOULD ALSO COMPLY WITH THE TERMS BELOW.
+
+3. Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+A. Redistributions of source code must retain the above copyright notice, this list
+ of conditions and the following disclaimer.
+B. Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+C. Neither the name of the copyright holder nor the names of its contributors may be
+ used to endorse or promote products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+EFFECTIVE DATE: THIS LICENSE SHALL APPLY ONLY TO SOFTWARE (OR ANY VERSION THEREOF),
+THAT HAS BEEN PUBLISHED AFTER THE DATE AND TIME THIS LICENSE HAS BEEN FIRST PUBLISHED
+(“EFFECTIVE DATE”); Any previous versions published prior to the effective date (“Older Versions”)
+shall remain licensed under the Apache License, Version 2.0 (the "Older Versions License");
+You may obtain a copy of the Older Version License at http://www.apache.org/licenses/LICENSE-2.0
+you may not use this file except in compliance with the Older Version License. Unless
+required by applicable law or agreed to in writing, Older Versions distributed under the
+Older Version License are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, either express or implied. See the Older Version License for the specific
+language governing permissions and limitations under the Older Version License.
diff --git a/python/eth_badge/__init__.py b/python/eth_badge/__init__.py
@@ -0,0 +1 @@
+from .token import BadgeToken
diff --git a/python/eth_badge/runnable/deploy.py b/python/eth_badge/runnable/deploy.py
@@ -0,0 +1,130 @@
+"""Deploys badge NFT
+
+.. moduleauthor:: Louis Holbrook <dev@holbrook.no>
+.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746
+
+"""
+
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# standard imports
+import sys
+import os
+import json
+import argparse
+import logging
+import time
+from enum import Enum
+
+# external imports
+from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer
+from crypto_dev_signer.keystore.dict import DictKeystore
+from chainlib.chain import ChainSpec
+from chainlib.eth.nonce import (
+ RPCNonceOracle,
+ OverrideNonceOracle,
+ )
+from chainlib.eth.gas import (
+ RPCGasOracle,
+ OverrideGasOracle,
+ )
+from chainlib.eth.connection import EthHTTPConnection
+from chainlib.eth.tx import receipt
+from chainlib.eth.constant import ZERO_ADDRESS
+
+# local imports
+from eth_badge import BadgeToken
+
+logging.basicConfig(level=logging.WARNING)
+logg = logging.getLogger()
+
+script_dir = os.path.dirname(__file__)
+data_dir = os.path.join(script_dir, '..', 'data')
+
+
+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='evm:ethereum:1', help='Chain specification string')
+argparser.add_argument('-y', '--key-file', dest='y', type=str, help='Ethereum keystore file to use for signing')
+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('--name', default='Giftable Token', type=str, help='Token name')
+argparser.add_argument('--symbol', default='GFT', type=str, help='Token symbol')
+argparser.add_argument('--declarator-address', dest='declarator_address', type=str, default=ZERO_ADDRESS, help='Token decimals')
+argparser.add_argument('-d', action='store_true', help='Dump RPC calls to terminal and do not send')
+argparser.add_argument('--gas-price', type=int, dest='gas_price', help='Override gas price')
+argparser.add_argument('--nonce', type=int, help='Override transaction nonce')
+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)
+elif args.v:
+ logg.setLevel(logging.INFO)
+
+block_all = args.ww
+block_last = args.w or block_all
+
+passphrase_env = 'ETH_PASSPHRASE'
+if args.env_prefix != None:
+ passphrase_env = args.env_prefix + '_' + passphrase_env
+passphrase = os.environ.get(passphrase_env)
+if passphrase == None:
+ logg.warning('no passphrase given')
+ passphrase=''
+
+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, password=passphrase)
+ logg.debug('now have key for signer address {}'.format(signer_address))
+signer = EIP155Signer(keystore)
+
+chain_spec = ChainSpec.from_chain_str(args.i)
+
+rpc = EthHTTPConnection(args.p)
+nonce_oracle = None
+if args.nonce != None:
+ nonce_oracle = OverrideNonceOracle(signer_address, args.nonce)
+else:
+ nonce_oracle = RPCNonceOracle(signer_address, rpc)
+
+gas_oracle = None
+if args.gas_price !=None:
+ gas_oracle = OverrideGasOracle(price=args.gas_price, conn=rpc, code_callback=BadgeToken.gas)
+else:
+ gas_oracle = RPCGasOracle(rpc, code_callback=BadgeToken.gas)
+
+dummy = args.d
+
+token_name = args.name
+token_symbol = args.symbol
+token_declarator = args.declarator_address
+
+
+def main():
+ c = BadgeToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
+ (tx_hash_hex, o) = c.constructor(signer_address, token_declarator, token_name, token_symbol)
+ if dummy:
+ print(tx_hash_hex)
+ print(o)
+ else:
+ rpc.do(o)
+ if block_last:
+ r = rpc.wait(tx_hash_hex)
+ if r['status'] == 0:
+ sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you')
+ sys.exit(1)
+ # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase)
+ address = r['contractAddress']
+
+ print(address)
+ else:
+ print(tx_hash_hex)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/python/eth_badge/token.py b/python/eth_badge/token.py
@@ -49,7 +49,7 @@ class BadgeToken(ERC721):
@staticmethod
def gas(code=None):
- return 1200000
+ return 2700000
def constructor(self, sender_address, declarator, name, symbol, tx_format=TxFormat.JSONRPC):
diff --git a/python/setup.cfg b/python/setup.cfg
@@ -0,0 +1,42 @@
+[metadata]
+name = eth-erc721
+version = 0.0.1a1
+description = ERC721 interface and simple contract with deployment script providing arbitrary minting of NFTs with freely settable tokenids
+author = Louis Holbrook
+author_email = dev@holbrook.no
+url = https://gitlab.com/cic/eth-erc20
+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]
+include_package_data = True
+python_requires = >= 3.6
+packages =
+ eth_badge
+ eth_badge.runnable
+ eth_badge.data
+ eth_erc721
+ #eth_erc721.data
+ #eth_erc721.runnable
+
+[options.package_data]
+* =
+ data/BadgeToken.json
+ data/BadgeToken.abi
+ #data/ERC721.json
+
+[options.entry_points]
+console_scripts =
+ badge-deploy = eth_badge.runnable.deploy:main
diff --git a/python/setup.py b/python/setup.py
@@ -0,0 +1,26 @@
+from setuptools import setup
+
+requirements = []
+f = open('requirements.txt', 'r')
+while True:
+ l = f.readline()
+ if l == '':
+ break
+ requirements.append(l.rstrip())
+f.close()
+
+test_requirements = []
+f = open('test_requirements.txt', 'r')
+while True:
+ l = f.readline()
+ if l == '':
+ break
+ test_requirements.append(l.rstrip())
+f.close()
+
+
+setup(
+ include_package_data=True,
+ install_requires=requirements,
+ tests_require=test_requirements,
+ )