def create_contract_transfer_tx(c_address, cur, c_method, c_args=None, send_pairs=None, sender=C.ANT_UNKNOWN, gas_price=None, retention=10800): assert isinstance(c_method, str) if sender in (C.ANT_OUTSIDE, C.ANT_RESERVED): raise BlockChainError('Not allowed inner account.') if c_args is None: c_args = tuple() else: c_args = tuple(c_args) redeem_address = create_new_user_keypair(read_user2name(sender, cur), cur) msg_body = bjson.dumps((c_address, c_method, redeem_address, c_args), compress=False) send_pairs = send_pairs_format_check(c_address=c_address, send_pairs=send_pairs) tx = send_many(sender=sender, send_pairs=send_pairs, cur=cur, fee_coin_id=0, gas_price=gas_price, msg_type=C.MSG_BYTE, msg_body=msg_body, retention=retention) return tx
def create_contract_update_tx(c_address, cur, c_bin=None, c_extra_imports=None, c_settings=None, send_pairs=None, sender=C.ANT_UNKNOWN, gas_price=None, retention=10800): assert c_bin or c_extra_imports or c_settings if sender in (C.ANT_OUTSIDE, C.ANT_RESERVED): raise BlockChainError('Not allowed inner account.') c_method = contract.M_UPDATE c_args = (c_bin, c_extra_imports, c_settings) redeem_address = create_new_user_keypair(read_user2name(sender, cur), cur) msg_body = bjson.dumps((c_address, c_method, redeem_address, c_args), compress=False) send_pairs = send_pairs_format_check(c_address=c_address, send_pairs=send_pairs) tx = send_many(sender=sender, send_pairs=send_pairs, cur=cur, fee_coin_id=0, gas_price=gas_price, msg_type=C.MSG_BYTE, msg_body=msg_body, retention=retention) return tx
def check_related_address(address_list): r = list() with closing(create_db(V.DB_ACCOUNT_PATH)) as db: cur = db.cursor() for address in address_list: user = read_address2user(address=address, cur=cur) if user: r.append((read_user2name(user, cur), address)) return r
def issue_mintcoin(name, unit, digit, amount, cur, description=None, image=None, additional_issue=True, change_address=True, gas_price=None, sender=C.ANT_UNKNOWN, retention=10800): mint_id = get_new_coin_id() sender_name = read_user2name(user=sender, cur=cur) mint_address = create_new_user_keypair(name=sender_name, cur=cur) params = { "name": name, "unit": unit, "digit": digit, "address": mint_address, "description": description, "image": image } setting = { "additional_issue": additional_issue, "change_address": change_address } m_before = get_mintcoin_object(coin_id=mint_id) result = check_mintcoin_new_format(m_before=m_before, new_params=params, new_setting=setting) if isinstance(result, str): raise BlockChainError('check_mintcoin_new_format(): {}'.format(result)) msg_body = bjson.dumps((mint_id, params, setting), compress=False) tx = TX( tx={ 'type': C.TX_MINT_COIN, 'inputs': list(), 'outputs': [(MINTCOIN_DUMMY_ADDRESS, 0, amount)], 'gas_price': gas_price or V.COIN_MINIMUM_PRICE, 'gas_amount': 1, 'message_type': C.MSG_BYTE, 'message': msg_body }) tx.update_time(retention) additional_gas = C.MINTCOIN_GAS tx.gas_amount = tx.size + C.SIGNATURE_GAS + additional_gas tx.serialize() # fill unspents fee_coin_id = 0 input_address = fill_inputs_outputs(tx=tx, cur=cur, fee_coin_id=fee_coin_id, additional_gas=additional_gas) # input_address.add(mint_address) fee_coins = Balance(coin_id=fee_coin_id, amount=tx.gas_price * tx.gas_amount) # check amount check_enough_amount(sender=sender, send_coins=Balance(0, amount), fee_coins=fee_coins) # replace dummy address replace_redeem_dummy_address(tx=tx, cur=cur) # replace dummy mint_id replace_mint_dummy_address(tx=tx, mint_address=mint_address, mint_id=mint_id, f_raise=True) # setup signature tx.serialize() setup_signature(tx=tx, input_address=input_address) # movement movements = Accounting() minting_coins = Balance(mint_id, amount) movements[sender] += minting_coins movements[C.ANT_OUTSIDE] -= minting_coins movements[sender] -= fee_coins movements[C.ANT_OUTSIDE] += fee_coins insert_log(movements, cur, tx.type, tx.time, tx.hash) return mint_id, tx