craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Info | Log | Files | Refs | README

publish.py (3817B)


      1 """Publish a new NFT smart contract to the network
      2 
      3 .. moduleauthor:: Louis Holbrook <dev@holbrook.no>
      4 .. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 
      5 
      6 """
      7 
      8 # SPDX-License-Identifier: GPL-3.0-or-later
      9 
     10 # standard imports
     11 import sys
     12 import os
     13 import json
     14 import argparse
     15 import logging
     16 import time
     17 import hashlib
     18 from enum import Enum
     19 
     20 # external imports
     21 import chainlib.eth.cli
     22 from chainlib.chain import ChainSpec
     23 from chainlib.eth.constant import ZERO_ADDRESS
     24 from chainlib.settings import ChainSettings
     25 from chainlib.eth.settings import process_settings
     26 from chainlib.eth.cli.arg import Arg
     27 from chainlib.eth.cli.arg import ArgFlag
     28 from chainlib.eth.cli.arg import process_args
     29 from chainlib.eth.cli.log import process_log
     30 from chainlib.eth.cli.config import Config
     31 from chainlib.eth.cli.config import process_config
     32 from chainlib.eth.constant import ZERO_CONTENT
     33 from hexathon import strip_0x
     34 
     35 # local imports
     36 from craft_nft import CraftNFT
     37 
     38 logg = logging.getLogger()
     39 
     40 
     41 def process_config_local(config, arg, args, flags):
     42     config.add(args.name, '_TOKEN_NAME', False)
     43     config.add(args.symbol, '_TOKEN_SYMBOL', False)
     44 
     45 #    declaration_hash = ZERO_CONTENT
     46 #    if args.declaration_file != None:
     47 #        f = open(args.declaration_file, 'r')
     48 #        declaration = f.read()
     49 #        f.close()
     50 #        h = hashlib.sha256()
     51 #        h.update(declaration.encode('utf-8'))
     52 #        z = h.digest()
     53 #        declaration_hash = z.hex()
     54 #    declaration_hash = strip_0x(declaration_hash)
     55 #    config.add(declaration_hash, '_TOKEN_DECLARATIONÍ„', False)
     56 #    logg.debug('declaration hash is {}'.format(declaration_hash))
     57     if args.fee_limit == None:
     58         config.add(CraftNFT.gas(), '_FEE_LIMIT', True)
     59 
     60     return config
     61 
     62 arg_flags = ArgFlag()
     63 arg = Arg(arg_flags)
     64 flags = arg_flags.STD_WRITE | arg_flags.WALLET | arg_flags.VALUE | arg_flags.TAB
     65 
     66 argparser = chainlib.eth.cli.ArgumentParser()
     67 argparser.add_argument('--name', type=str, required=True, help='Token name')
     68 argparser.add_argument('--symbol', type=str, required=True, help='Token symbol')
     69 #argparser.add_argument('--declaration-file', dest='declaration_file', type=str, help='File describing the purpose and terms of the token')
     70 argparser = process_args(argparser, arg, flags)
     71 args = argparser.parse_args(sys.argv[1:])
     72 
     73 logg = process_log(args, logg)
     74 
     75 config = Config()
     76 config = process_config(config, arg, args, flags)
     77 config = process_config_local(config, arg, args, flags)
     78 logg.debug('config loaded:\n{}'.format(config))
     79 
     80 settings = ChainSettings()
     81 settings = process_settings(settings, config)
     82 logg.debug('settings loaded:\n{}'.format(settings))
     83 
     84 
     85 def main():
     86     token_name = config.get('_TOKEN_NAME')
     87     token_symbol = config.get('_TOKEN_SYMBOL')
     88     #token_declaration = config.get('_TOKEN_DECLARATIONÍ„')
     89     conn = settings.get('CONN')
     90 
     91     c = CraftNFT(
     92             settings.get('CHAIN_SPEC'),
     93             signer=settings.get('SIGNER'),
     94             gas_oracle=settings.get('FEE_ORACLE'),
     95             nonce_oracle=settings.get('NONCE_ORACLE')
     96             )
     97 
     98     (tx_hash_hex, o) = c.constructor(
     99             settings.get('SENDER_ADDRESS'),
    100             token_name,
    101             token_symbol,
    102             #token_declaration,
    103             #enumeration=True,
    104             )
    105     if config.get('_RPC_SEND'):
    106         conn.do(o)
    107         if config.true('_WAIT'):
    108             r = conn.wait(tx_hash_hex)
    109             if r['status'] == 0:
    110                 sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you')
    111                 sys.exit(1)
    112             # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase)
    113             address = r['contractAddress']
    114 
    115             print(address)
    116         else:
    117             print(tx_hash_hex)
    118     else:
    119         print(o)
    120 
    121 if __name__ == '__main__':
    122     main()