Skip to content

Commit

Permalink
migrate move.py tests
Browse files Browse the repository at this point in the history
Ouziel committed Jan 24, 2025
1 parent b3b5e42 commit 79eb7d5
Showing 3 changed files with 139 additions and 11 deletions.
3 changes: 3 additions & 0 deletions counterparty-core/counterpartycore/pytest/mocks/bitcoind.py
Original file line number Diff line number Diff line change
@@ -47,6 +47,9 @@ def get_vin_info(self, vin):
return value, script_pub_key, is_segwit

def get_utxo_address_and_value(self, utxo):
print("get_utxo_address_and_value", utxo)
if utxo == "0000000000000000000000000000000000000000000000000000000000000000:0":
return list(self.source_by_txid.values())[0], int(10 * config.UNIT)
txid, vout = utxo.split(":")

Check warning

Code scanning / pylint

Unused variable 'vout'. Warning

Unused variable 'vout'.
return self.address_and_value_by_utxo[f"{txid}:0"]

Original file line number Diff line number Diff line change
@@ -35,12 +35,16 @@ def test_unpack(defaults):
}


def test_parse_detach_to_destination(ledger_db, blockchain_mock, defaults, test_helpers):
utxo = ledger_db.execute(
def get_utxo(ledger_db, address):
return ledger_db.execute(
"SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0",
(defaults["addresses"][0],),
(address,),
).fetchone()["utxo"]


def test_parse_detach_to_destination(ledger_db, blockchain_mock, defaults, test_helpers):
utxo = get_utxo(ledger_db, defaults["addresses"][0])

tx = blockchain_mock.dummy_tx(ledger_db, defaults["addresses"][0], utxo_source=utxo)
message = bytes(defaults["addresses"][1], "utf-8")
detach.parse(ledger_db, tx, message)
@@ -69,10 +73,7 @@ def test_parse_detach_to_destination(ledger_db, blockchain_mock, defaults, test_


def test_parse_detach_no_destination(ledger_db, blockchain_mock, defaults, test_helpers):
utxo = ledger_db.execute(
"SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0",
(defaults["addresses"][0],),
).fetchone()["utxo"]
utxo = get_utxo(ledger_db, defaults["addresses"][0])

tx = blockchain_mock.dummy_tx(ledger_db, defaults["addresses"][0], utxo_source=utxo)
message = b"0"
@@ -102,10 +103,7 @@ def test_parse_detach_no_destination(ledger_db, blockchain_mock, defaults, test_


def test_parse_detach_invalid_destination(ledger_db, blockchain_mock, defaults, test_helpers):
utxo = ledger_db.execute(
"SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0",
(defaults["addresses"][0],),
).fetchone()["utxo"]
utxo = get_utxo(ledger_db, defaults["addresses"][0])

tx = blockchain_mock.dummy_tx(ledger_db, defaults["addresses"][0], utxo_source=utxo)
message = bytes("invalidadress", "utf-8")
127 changes: 127 additions & 0 deletions counterparty-core/counterpartycore/pytest/units/messages/move_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
from counterpartycore.lib.messages import move

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.backend.bitcoind:[437:454] ==counterpartycore.lib.backend.electrs:[83:100] if len(asm) == 4: # p2pkh # catch unhexlify errs for when asm[1] isn't a pubkey (eg; for P2SH) try: pubkey = asm[3] if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=False).to_string() ): return pubkey if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=True).to_string() ): return pubkey except binascii.Error: pass for vout in tx["vout"]:. Warning

Similar lines in 2 files
==counterpartycore.lib.backend.bitcoind:[437:454]
==counterpartycore.lib.backend.electrs:[83:100]
if len(asm) == 4: # p2pkh
# catch unhexlify errs for when asm[1] isn't a pubkey (eg; for P2SH)
try:
pubkey = asm[3]
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=False).to_string()
):
return pubkey
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=True).to_string()
):
return pubkey
except binascii.Error:
pass
for vout in tx["vout"]:.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.backend.bitcoind:[458:470] ==counterpartycore.lib.backend.electrs:[87:99] if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=False).to_string() ): return pubkey if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=True).to_string() ): return pubkey except binascii.Error: pass. Warning

Similar lines in 2 files
==counterpartycore.lib.backend.bitcoind:[458:470]
==counterpartycore.lib.backend.electrs:[87:99]
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=False).to_string()
):
return pubkey
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=True).to_string()
):
return pubkey
except binascii.Error:
pass.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.backend.bitcoind:[441:453] ==counterpartycore.lib.backend.electrs:[104:116] if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=False).to_string() ): return pubkey if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=True).to_string() ): return pubkey except binascii.Error: pass. Warning

Similar lines in 2 files
==counterpartycore.lib.backend.bitcoind:[441:453]
==counterpartycore.lib.backend.electrs:[104:116]
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=False).to_string()
):
return pubkey
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=True).to_string()
):
return pubkey
except binascii.Error:
pass.

Check warning

Code scanning / pylint

Similar lines in 2 files ==burn_test:[137:148] ==dividend_test:[134:145] "status": "valid", "tx_hash": tx["tx_hash"], "tx_index": tx["tx_index"], }, }, { "table": "credits", "values": { "address": defaults["addresses"][1], "asset": "XCP", "block_index": current_block_index,. Warning

Similar lines in 2 files
==burn_test:[137:148]
==dividend_test:[134:145]
"status": "valid",
"tx_hash": tx["tx_hash"],
"tx_index": tx["tx_index"],
},
},
{
"table": "credits",
"values": {
"address": defaults["addresses"][1],
"asset": "XCP",
"block_index": current_block_index,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.dispense:[182:194] ==counterpartycore.lib.messages.dispenser:[760:772] } ledger.markets.update_dispenser( db, dispenser["rowid"], set_data, { "source": dispenser["source"], "asset": dispenser["asset"], "tx_hash": dispenser["tx_hash"], }, ) # use tx_index=0 for block actions . Warning

Similar lines in 2 files
==counterpartycore.lib.messages.dispense:[182:194]
==counterpartycore.lib.messages.dispenser:[760:772]
}
ledger.markets.update_dispenser(
db,
dispenser["rowid"],
set_data,
{
"source": dispenser["source"],
"asset": dispenser["asset"],
"tx_hash": dispenser["tx_hash"],
},
) # use tx_index=0 for block actions
.

Check warning

Code scanning / pylint

Similar lines in 2 files ==0004.create_and_populate_assets_info:[24:37] ==0005.create_and_populate_events_count:[23:36] if hasattr(db, "row_factory"): db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger_db", (config.DATABASE,)) db.execute(""". Warning

Similar lines in 2 files
==0004.create_and_populate_assets_info:[24:37]
==0005.create_and_populate_events_count:[23:36]
if hasattr(db, "row_factory"):
db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(\*) AS count FROM pragma\_database\_list WHERE name = ?", ("ledger\_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger\_db", (config.DATABASE,)) db.execute(""".

Check warning

Code scanning / pylint

Similar lines in 2 files ==0002.create_and_populate_parsed_events:[23:45] ==0003.create_and_populate_all_expirations:[23:44] if hasattr(db, "row_factory"): db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger_db", (config.DATABASE,)) sqls = [ """ CREATE TABLE all_expirations( type TEXT, object_id TEXT, block_index INTEGER ); """, """. Warning

Similar lines in 2 files
==0002.create_and_populate_parsed_events:[23:45]
==0003.create_and_populate_all_expirations:[23:44]
if hasattr(db, "row_factory"):
db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(\*) AS count FROM pragma\_database\_list WHERE name = ?", ("ledger\_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger\_db", (config.DATABASE,)) sqls = [ """ CREATE TABLE all\_expirations( type TEXT, object\_id TEXT, block\_index INTEGER ); """, """.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[15:31] ==counterpartycore.lib.messages.utxo:[17:33] problems = [] if asset == config.BTC: problems.append("cannot send bitcoins") # Only for parsing. if not isinstance(quantity, int): problems.append("quantity must be in satoshis") return problems if quantity <= 0: problems.append("quantity must be greater than zero") # For SQLite3 if quantity > config.MAX_INT: problems.append("integer overflow") . Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[15:31]
==counterpartycore.lib.messages.utxo:[17:33]
problems = [] if asset == config.BTC: problems.append("cannot send bitcoins") # Only for parsing. if not isinstance(quantity, int): problems.append("quantity must be in satoshis") return problems if quantity <= 0: problems.append("quantity must be greater than zero") # For SQLite3 if quantity > config.MAX_INT: problems.append("integer overflow") .

Check warning

Code scanning / pylint

Similar lines in 2 files ==0003.create_and_populate_all_expirations:[23:35] ==0004.create_and_populate_assets_info:[24:36] if hasattr(db, "row_factory"): db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger_db", (config.DATABASE,)) . Warning

Similar lines in 2 files
==0003.create_and_populate_all_expirations:[23:35]
==0004.create_and_populate_assets_info:[24:36]
if hasattr(db, "row_factory"):
db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(\*) AS count FROM pragma\_database\_list WHERE name = ?", ("ledger\_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger\_db", (config.DATABASE,)) .

Check warning

Code scanning / pylint

Similar lines in 2 files ==0001.create_and_populate_address_events:[22:34] ==0002.create_and_populate_parsed_events:[23:35] if hasattr(db, "row_factory"): db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger_db", (config.DATABASE,)) . Warning

Similar lines in 2 files
==0001.create_and_populate_address_events:[22:34]
==0002.create_and_populate_parsed_events:[23:35]
if hasattr(db, "row_factory"):
db.row_factory = dict_factory attached = ( db.execute( "SELECT COUNT(\*) AS count FROM pragma\_database\_list WHERE name = ?", ("ledger\_db",) ).fetchone()["count"] > 0 ) if not attached: db.execute("ATTACH DATABASE ? AS ledger\_db", (config.DATABASE,)) .

Check warning

Code scanning / pylint

Similar lines in 2 files ==dispense_test:[70:82] ==dispenser_test:[221:235] "address": defaults["addresses"][0], "asset": "XCP", "block_index": current_block_index, "event": tx["tx_hash"], "quantity": 100, }, }, ], ) def test_parse_close_dispenser( ledger_db, blockchain_mock, defaults, test_helpers, current_block_index ):. Warning

Similar lines in 2 files
==dispense_test:[70:82]
==dispenser_test:[221:235]
"address": defaults["addresses"][0],
"asset": "XCP",
"block_index": current_block_index,
"event": tx["tx_hash"],
"quantity": 100,
},
},
],
) def test_parse_close_dispenser(
ledger_db, blockchain_mock, defaults, test_helpers, current_block_index
):.

Check warning

Code scanning / pylint

Similar lines in 2 files ==detach_test:[84:93] ==move_test:[109:118] { "table": "sends", "values": { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "status": "valid", "source": utxo, "source_address": defaults["addresses"][0],. Warning

Similar lines in 2 files
==detach_test:[84:93]
==move_test:[109:118]
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",
"source": utxo,
"source_address": defaults["addresses"][0],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==detach_test:[54:63] ==move_test:[51:60] { "table": "sends", "values": { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "status": "valid", "source": utxo, "source_address": defaults["addresses"][0],. Warning

Similar lines in 2 files
==detach_test:[54:63]
==move_test:[51:60]
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",
"source": utxo,
"source_address": defaults["addresses"][0],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==attach_test:[97:106] ==move_test:[49:58] }, }, { "table": "sends", "values": { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "status": "valid",. Warning

Similar lines in 2 files
==attach_test:[97:106]
==move_test:[49:58]
},
},
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.fairmint:[117:126] ==counterpartycore.lib.messages.fairminter:[359:368] if problems: status = "invalid: " + "; ".join(problems) bindings = { "tx_hash": tx["tx_hash"], "tx_index": tx["tx_index"], "block_index": tx["block_index"], "source": tx["source"], "status": status, }. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.fairmint:[117:126]
==counterpartycore.lib.messages.fairminter:[359:368]
if problems:
status = "invalid: " + "; ".join(problems)
bindings = {
"tx_hash": tx["tx_hash"],
"tx_index": tx["tx_index"],
"block_index": tx["block_index"],
"source": tx["source"],
"status": status,
}.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.detach:[113:122] ==counterpartycore.lib.messages.move:[55:65] balance["asset"], balance["quantity"], tx["tx_index"], action=action, event=tx["tx_hash"], ) bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.detach:[113:122]
==counterpartycore.lib.messages.move:[55:65]
balance["asset"],
balance["quantity"],
tx["tx_index"],
action=action,
event=tx["tx_hash"],
)
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.detach:[101:110] ==counterpartycore.lib.messages.move:[42:52] source_address = ledger.events.debit( db, source, balance["asset"], balance["quantity"], tx["tx_index"], action=action, event=tx["tx_hash"], ) # credit asset to destination. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.detach:[101:110]
==counterpartycore.lib.messages.move:[42:52]
source_address = ledger.events.debit(
db,
source,
balance["asset"],
balance["quantity"],
tx["tx_index"],
action=action,
event=tx["tx_hash"],
)
# credit asset to destination.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[151:161] ==counterpartycore.lib.messages.utxo:[217:227] event=tx["tx_hash"], ) # destroy fee destroy_bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"], "asset": config.XCP, "quantity": fee,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[151:161]
==counterpartycore.lib.messages.utxo:[217:227]
event=tx["tx_hash"],
)
# destroy fee
destroy_bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"source": tx["source"],
"asset": config.XCP,
"quantity": fee,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[192:202] ==counterpartycore.lib.messages.detach:[65:75] status = "valid" if problems: status = "invalid: " + "; ".join(problems) # store the invalid transaction without potentially invalid parameters bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "msg_index": ledger.other.get_send_msg_index(db, tx["tx_hash"]), "block_index": tx["block_index"], "status": status,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[192:202]
==counterpartycore.lib.messages.detach:[65:75]
status = "valid"
if problems:
status = "invalid: " + "; ".join(problems)
# store the invalid transaction without potentially invalid parameters
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"msg_index": ledger.other.get_send_msg_index(db, tx["tx_hash"]),
"block_index": tx["block_index"],
"status": status,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.api.compose:[449:458] ==counterpartycore.lib.messages.fairminter:[40:49] "price": price, "quantity_by_price": quantity_by_price, "max_mint_per_tx": max_mint_per_tx, "hard_cap": hard_cap, "premint_quantity": premint_quantity, "start_block": start_block, "end_block": end_block, "soft_cap": soft_cap, "soft_cap_deadline_block": soft_cap_deadline_block,. Warning

Similar lines in 2 files
==counterpartycore.lib.api.compose:[449:458]
==counterpartycore.lib.messages.fairminter:[40:49]
"price": price,
"quantity_by_price": quantity_by_price,
"max_mint_per_tx": max_mint_per_tx,
"hard_cap": hard_cap,
"premint_quantity": premint_quantity,
"start_block": start_block,
"end_block": end_block,
"soft_cap": soft_cap,
"soft_cap_deadline_block": soft_cap_deadline_block,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==fairmint_test:[111:119] ==fairminter_test:[312:320] "locked": False, "reset": False, "status": "valid", "asset_longname": None, "fair_minting": True, }, }, {. Warning

Similar lines in 2 files
==fairmint_test:[111:119]
==fairminter_test:[312:320]
"locked": False,
"reset": False,
"status": "valid",
"asset_longname": None,
"fair_minting": True,
},
},
{.

Check warning

Code scanning / pylint

Similar lines in 2 files ==burn_test:[177:185] ==issuance_test:[1269:1277] "tx_hash": tx["tx_hash"], "tx_index": tx["tx_index"], }, }, { "table": "credits", "values": { "address": defaults["p2ms_addresses"][0],. Warning

Similar lines in 2 files
==burn_test:[177:185]
==issuance_test:[1269:1277]
"tx_hash": tx["tx_hash"],
"tx_index": tx["tx_index"],
},
},
{
"table": "credits",
"values": {
"address": defaults["p2ms_addresses"][0],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==burn_test:[176:184] ==dividend_test:[134:142] "status": "valid", "tx_hash": tx["tx_hash"], "tx_index": tx["tx_index"], }, }, { "table": "credits", "values": {. Warning

Similar lines in 2 files
==burn_test:[176:184]
==dividend_test:[134:142]
"status": "valid",
"tx_hash": tx["tx_hash"],
"tx_index": tx["tx_index"],
},
},
{
"table": "credits",
"values": {.

Check warning

Code scanning / pylint

Similar lines in 2 files ==attach_test:[88:96] ==move_test:[27:35] "values": { "utxo": utxo, "address": None, "asset": "XCP", "quantity": 100, "event": tx["tx_hash"], "block_index": current_block_index, "tx_index": tx["tx_index"],. Warning

Similar lines in 2 files
==attach_test:[88:96]
==move_test:[27:35]
"values": {
"utxo": utxo,
"address": None,
"asset": "XCP",
"quantity": 100,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.bet:[562:570] ==counterpartycore.lib.messages.order:[779:787] bindings = { "id": helpers.make_id(tx0["tx_hash"], tx["tx_hash"]), "tx0_index": tx0["tx_index"], "tx0_hash": tx0["tx_hash"], "tx0_address": tx0["source"], "tx1_index": tx1["tx_index"], "tx1_hash": tx1["tx_hash"], "tx1_address": tx1["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.bet:[562:570]
==counterpartycore.lib.messages.order:[779:787]
bindings = {
"id": helpers.make_id(tx0["tx_hash"], tx["tx_hash"]),
"tx0_index": tx0["tx_index"],
"tx0_hash": tx0["tx_hash"],
"tx0_address": tx0["source"],
"tx1_index": tx1["tx_index"],
"tx1_hash": tx1["tx_hash"],
"tx1_address": tx1["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[225:236] ==counterpartycore.lib.messages.detach:[115:126] tx["tx_index"], action=action, event=tx["tx_hash"], ) bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "msg_index": ledger.other.get_send_msg_index(db, tx["tx_hash"]), "block_index": tx["block_index"], "status": "valid", "source": source,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[225:236]
==counterpartycore.lib.messages.detach:[115:126]
tx["tx_index"],
action=action,
event=tx["tx_hash"],
)
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"msg_index": ledger.other.get_send_msg_index(db, tx["tx_hash"]),
"block_index": tx["block_index"],
"status": "valid",
"source": source,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==fairmint_test:[102:109] ==fairminter_test:[303:310] "divisible": True, "source": defaults["addresses"][0], "issuer": defaults["addresses"][0], "transfer": False, "callable": False, "call_date": 0, "call_price": 0,. Warning

Similar lines in 2 files
==fairmint_test:[102:109]
==fairminter_test:[303:310]
"divisible": True,
"source": defaults["addresses"][0],
"issuer": defaults["addresses"][0],
"transfer": False,
"callable": False,
"call_date": 0,
"call_price": 0,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==attach_test:[99:106] ==detach_test:[54:61] { "table": "sends", "values": { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "status": "valid",. Warning

Similar lines in 2 files
==attach_test:[99:106]
==detach_test:[54:61]
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.sweep:[95:103] ==counterpartycore.lib.messages.versions.enhancedsend:[20:29] try: # account for memo bytes memo_bytes_length = len(message) - LENGTH if memo_bytes_length < 0: raise exceptions.UnpackError("invalid message length") if memo_bytes_length > MAX_MEMO_LENGTH: raise exceptions.UnpackError("memo too long") struct_format = FORMAT + f"{memo_bytes_length}s". Warning

Similar lines in 2 files
==counterpartycore.lib.messages.sweep:[95:103]
==counterpartycore.lib.messages.versions.enhancedsend:[20:29]
try:
# account for memo bytes
memo_bytes_length = len(message) - LENGTH
if memo_bytes_length < 0:
raise exceptions.UnpackError("invalid message length")
if memo_bytes_length > MAX_MEMO_LENGTH:
raise exceptions.UnpackError("memo too long") struct_format = FORMAT + f"{memo_bytes_length}s".

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.order:[442:451] ==counterpartycore.lib.messages.versions.send1:[169:178] event=tx["tx_hash"], ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.order:[442:451]
==counterpartycore.lib.messages.versions.send1:[169:178]
event=tx["tx_hash"],
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.fairmint:[92:102] ==counterpartycore.lib.messages.fairminter:[234:244] ] ] ).encode("utf-8") data += struct.pack(f">{len(data_content)}s", data_content) return (source, [], data) def unpack(message, return_dict=False): try: data_content = struct.unpack(f">{len(message)}s", message)[0].decode("utf-8").split("|"). Warning

Similar lines in 2 files
==counterpartycore.lib.messages.fairmint:[92:102]
==counterpartycore.lib.messages.fairminter:[234:244]
]
]
).encode("utf-8")
data += struct.pack(f">{len(data_content)}s", data_content)
return (source, [], data) def unpack(message, return_dict=False):
try:
data_content = struct.unpack(f">{len(message)}s", message)[0].decode("utf-8").split("|").

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.dividend:[278:287] ==counterpartycore.lib.messages.issuance:[808:816] ) bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"], "asset": asset,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.dividend:[278:287]
==counterpartycore.lib.messages.issuance:[808:816]
) bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"], "asset": asset,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.btcpay:[165:174] ==counterpartycore.lib.messages.versions.send1:[170:179] ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"], "destination": tx["destination"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.btcpay:[165:174]
==counterpartycore.lib.messages.versions.send1:[170:179]
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"], "destination": tx["destination"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.bet:[358:367] ==counterpartycore.lib.messages.dividend:[277:286] event=tx["tx_hash"], ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.bet:[358:367]
==counterpartycore.lib.messages.dividend:[277:286]
event=tx["tx_hash"],
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[37:45] ==counterpartycore.lib.messages.utxo:[69:77] asset_balance = ledger.balances.get_balance(db, source, asset) if asset == config.XCP: # fee is always paid in XCP if asset_balance < quantity + fee: problems.append("insufficient funds for transfer and fee") else: if asset_balance < quantity: problems.append("insufficient funds for transfer"). Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[37:45]
==counterpartycore.lib.messages.utxo:[69:77]
asset_balance = ledger.balances.get_balance(db, source, asset)
if asset == config.XCP:
# fee is always paid in XCP
if asset_balance < quantity + fee:
problems.append("insufficient funds for transfer and fee")
else:
if asset_balance < quantity:
problems.append("insufficient funds for transfer").

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[225:232] ==counterpartycore.lib.messages.move:[57:65] tx["tx_index"], action=action, event=tx["tx_hash"], ) # store the move in the sends table bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[225:232]
==counterpartycore.lib.messages.move:[57:65]
tx["tx_index"],
action=action,
event=tx["tx_hash"],
)
# store the move in the sends table
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[92:101] ==counterpartycore.lib.messages.fairmint:[83:92] data = struct.pack(config.SHORT_TXTYPE_FORMAT, ID) # to optimize the data size (avoiding fixed sizes per parameter) we use a simple # string of characters separated by |. data_content = "|".join( [ str(value) for value in [ asset, quantity,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[92:101]
==counterpartycore.lib.messages.fairmint:[83:92]
data = struct.pack(config.SHORT_TXTYPE_FORMAT, ID)
# to optimize the data size (avoiding fixed sizes per parameter) we use a simple
# string of characters separated by |.
data_content = "|".join(
[
str(value)
for value in [
asset,
quantity,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.backend.bitcoind:[455:474] ==counterpartycore.lib.backend.electrs:[101:120] if len(asm) == 3: # p2pk try: pubkey = asm[1] if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=False).to_string() ): return pubkey if ( pubkeyhash == PublicKey.from_hex(pubkey).get_address(compressed=True).to_string() ): return pubkey except binascii.Error: pass return None def list_unspent(source, allow_unconfirmed_inputs):. Warning

Similar lines in 2 files
==counterpartycore.lib.backend.bitcoind:[455:474]
==counterpartycore.lib.backend.electrs:[101:120]
if len(asm) == 3: # p2pk
try:
pubkey = asm[1]
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=False).to_string()
):
return pubkey
if (
pubkeyhash
== PublicKey.from_hex(pubkey).get_address(compressed=True).to_string()
):
return pubkey
except binascii.Error:
pass
return None def list_unspent(source, allow_unconfirmed_inputs):.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.api.compose:[46:53] ==counterpartycore.lib.messages.bet:[278:285] "bet_type": bet_type, "deadline": deadline, "wager_quantity": wager_quantity, "counterwager_quantity": counterwager_quantity, "target_value": target_value, "leverage": leverage, "expiration": expiration,. Warning

Similar lines in 2 files
==counterpartycore.lib.api.compose:[46:53]
==counterpartycore.lib.messages.bet:[278:285]
"bet_type": bet_type,
"deadline": deadline,
"wager_quantity": wager_quantity,
"counterwager_quantity": counterwager_quantity,
"target_value": target_value,
"leverage": leverage,
"expiration": expiration,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==attach_test:[90:96] ==move_test:[42:48] "address": None, "asset": "XCP", "quantity": 100, "event": tx["tx_hash"], "block_index": current_block_index, "tx_index": tx["tx_index"],. Warning

Similar lines in 2 files
==attach_test:[90:96]
==move_test:[42:48]
"address": None,
"asset": "XCP",
"quantity": 100,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.versions.enhancedsend:[122:134] ==counterpartycore.lib.messages.versions.send1:[98:109] asset = ledger.issuances.resolve_subasset_longname(db, asset) # quantity must be in int satoshi (not float, string, etc) if not isinstance(quantity, int): raise exceptions.ComposeError("quantity must be an int (in satoshi)") # Only for outgoing (incoming will overburn). balance = ledger.balances.get_balance(db, source, asset) if balance < quantity and not skip_validation: raise exceptions.ComposeError("insufficient funds") # convert memo to memo_bytes based on memo_is_hex setting. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.versions.enhancedsend:[122:134]
==counterpartycore.lib.messages.versions.send1:[98:109]
asset = ledger.issuances.resolve_subasset_longname(db, asset) # quantity must be in int satoshi (not float, string, etc) if not isinstance(quantity, int): raise exceptions.ComposeError("quantity must be an int (in satoshi)") # Only for outgoing (incoming will overburn). balance = ledger.balances.get_balance(db, source, asset) if balance < quantity and not skip_validation: raise exceptions.ComposeError("insufficient funds") # convert memo to memo_bytes based on memo_is_hex setting.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.versions.enhancedsend:[89:95] ==counterpartycore.lib.messages.versions.send1:[59:65] results = ledger.other.get_addresses(db, address=destination) if results: result = results[0] if result and helpers.active_options( result["options"], config.ADDRESS_OPTION_REQUIRE_MEMO ):. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.versions.enhancedsend:[89:95]
==counterpartycore.lib.messages.versions.send1:[59:65]
results = ledger.other.get_addresses(db, address=destination)
if results:
result = results[0]
if result and helpers.active_options(
result["options"], config.ADDRESS_OPTION_REQUIRE_MEMO
):.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.sweep:[253:259] ==counterpartycore.lib.messages.versions.enhancedsend:[214:220] bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"], "destination": destination,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.sweep:[253:259]
==counterpartycore.lib.messages.versions.enhancedsend:[214:220]
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"source": tx["source"],
"destination": destination,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.issuance:[808:815] ==counterpartycore.lib.messages.order:[443:451] ) bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.issuance:[808:815]
==counterpartycore.lib.messages.order:[443:451]
) bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.dividend:[278:286] ==counterpartycore.lib.messages.versions.enhancedsend:[211:219] ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.dividend:[278:286]
==counterpartycore.lib.messages.versions.enhancedsend:[211:219]
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.dividend:[257:263] ==counterpartycore.lib.messages.issuance:[873:879] ledger.events.debit( db, tx["source"], config.XCP, fee, tx["tx_index"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.dividend:[257:263]
==counterpartycore.lib.messages.issuance:[873:879]
ledger.events.debit(
db,
tx["source"],
config.XCP,
fee,
tx["tx_index"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.detach:[113:119] ==counterpartycore.lib.messages.move:[45:52] balance["asset"], balance["quantity"], tx["tx_index"], action=action, event=tx["tx_hash"], ) # credit asset to destination. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.detach:[113:119]
==counterpartycore.lib.messages.move:[45:52]
balance["asset"],
balance["quantity"],
tx["tx_index"],
action=action,
event=tx["tx_hash"],
)
# credit asset to destination.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.detach:[104:110] ==counterpartycore.lib.messages.move:[55:62] balance["asset"], balance["quantity"], tx["tx_index"], action=action, event=tx["tx_hash"], ). Warning

Similar lines in 2 files
==counterpartycore.lib.messages.detach:[104:110]
==counterpartycore.lib.messages.move:[55:62]
balance["asset"],
balance["quantity"],
tx["tx_index"],
action=action,
event=tx["tx_hash"],
).

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.destroy:[114:120] ==counterpartycore.lib.messages.dividend:[281:287] bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"], "asset": asset,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.destroy:[114:120]
==counterpartycore.lib.messages.dividend:[281:287]
bindings = {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"source": tx["source"],
"asset": asset,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.bet:[183:190] ==counterpartycore.lib.messages.order:[273:280] if expiration < 0: problems.append("negative expiration") if expiration == 0 and not protocol.after_block_or_test_network( block_index, 317500 ): # Protocol change. problems.append("zero expiration") . Warning

Similar lines in 2 files
==counterpartycore.lib.messages.bet:[183:190]
==counterpartycore.lib.messages.order:[273:280]
if expiration < 0:
problems.append("negative expiration")
if expiration == 0 and not protocol.after_block_or_test_network(
block_index, 317500
): # Protocol change.
problems.append("zero expiration")
.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.bet:[358:366] ==counterpartycore.lib.messages.move:[59:66] event=tx["tx_hash"], ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.bet:[358:366]
==counterpartycore.lib.messages.move:[59:66]
event=tx["tx_hash"],
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.bet:[359:367] ==counterpartycore.lib.messages.btcpay:[165:173] ) # Add parsed transaction to message-type–specific table. bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], "source": tx["source"],. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.bet:[359:367]
==counterpartycore.lib.messages.btcpay:[165:173]
) # Add parsed transaction to message-type–specific table. bindings = { "tx\_index": tx["tx\_index"], "tx\_hash": tx["tx\_hash"], "block\_index": tx["block\_index"], "source": tx["source"],.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[15:24] ==counterpartycore.lib.messages.versions.send1:[35:44] problems = [] if asset == config.BTC: problems.append("cannot send bitcoins") # Only for parsing. if not isinstance(quantity, int): problems.append("quantity must be in satoshis") return problems . Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[15:24]
==counterpartycore.lib.messages.versions.send1:[35:44]
problems = [] if asset == config.BTC: problems.append("cannot send bitcoins") # Only for parsing. if not isinstance(quantity, int): problems.append("quantity must be in satoshis") return problems .

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[223:229] ==counterpartycore.lib.messages.utxo:[238:245] asset, quantity, tx["tx_index"], action=action, event=tx["tx_hash"], ). Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[223:229]
==counterpartycore.lib.messages.utxo:[238:245]
asset,
quantity,
tx["tx_index"],
action=action,
event=tx["tx_hash"],
).

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[111:118] ==counterpartycore.lib.messages.move:[24:31] value = config.DEFAULT_UTXO_VALUE if utxo_value is not None: try: value = int(utxo_value) except ValueError as e: raise exceptions.ComposeError(["utxo_value must be an integer"]) from e # else we use the source address as the destination. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[111:118]
==counterpartycore.lib.messages.move:[24:31]
value = config.DEFAULT_UTXO_VALUE
if utxo_value is not None:
try:
value = int(utxo_value)
except ValueError as e:
raise exceptions.ComposeError(["utxo_value must be an integer"]) from e
# else we use the source address as the destination.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.messages.attach:[92:100] ==counterpartycore.lib.messages.fairminter:[209:218] data = struct.pack(config.SHORT_TXTYPE_FORMAT, ID) # to optimize the data size (avoiding fixed sizes per parameter) we use a simple # string of characters separated by |. data_content = "|".join( [ str(value) for value in [ asset,. Warning

Similar lines in 2 files
==counterpartycore.lib.messages.attach:[92:100]
==counterpartycore.lib.messages.fairminter:[209:218]
data = struct.pack(config.SHORT_TXTYPE_FORMAT, ID)
# to optimize the data size (avoiding fixed sizes per parameter) we use a simple
# string of characters separated by |.
data_content = "|".join(
[
str(value)
for value in [
asset,.

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.ledger.markets:[105:120] ==counterpartycore.lib.ledger.other:[186:201] WHERE expire_index = ? - 1 GROUP BY tx_hash ) WHERE status = ? ORDER BY tx_index, tx_hash """ bindings = (block_index, "open") cursor.execute(query, bindings) return cursor.fetchall() def get_matching_bets(db, feed_address, bet_type): cursor = db.cursor() query = """ SELECT * FROM ( SELECT *, MAX(rowid). Warning

Similar lines in 2 files
==counterpartycore.lib.ledger.markets:[105:120]
==counterpartycore.lib.ledger.other:[186:201]
WHERE expire_index = ? - 1
GROUP BY tx_hash
) WHERE status = ?
ORDER BY tx_index, tx_hash
"""
bindings = (block_index, "open")
cursor.execute(query, bindings)
return cursor.fetchall() def get_matching_bets(db, feed_address, bet_type):
cursor = db.cursor()
query = """
SELECT * FROM (
SELECT *, MAX(rowid).

Check warning

Code scanning / pylint

Similar lines in 2 files ==counterpartycore.lib.api.compose:[306:312] ==counterpartycore.lib.messages.order:[367:373] "give_asset": give_asset, "give_quantity": give_quantity, "get_asset": get_asset, "get_quantity": get_quantity, "expiration": expiration, "fee_required": fee_required,. Warning

Similar lines in 2 files
==counterpartycore.lib.api.compose:[306:312]
==counterpartycore.lib.messages.order:[367:373]
"give_asset": give_asset,
"give_quantity": give_quantity,
"get_asset": get_asset,
"get_quantity": get_quantity,
"expiration": expiration,
"fee_required": fee_required,.

DUMMY_UTXO = 64 * "0" + ":0"


def get_utxo(ledger_db, address, asset="XCP"):
return ledger_db.execute(
"SELECT * FROM balances WHERE utxo_address = ? and asset = ? AND quantity > 0",
(
address,
asset,
),
).fetchone()["utxo"]


def test_move_assets_xcp(ledger_db, defaults, blockchain_mock, test_helpers, current_block_index):
utxo = get_utxo(ledger_db, defaults["addresses"][0])
tx = blockchain_mock.dummy_tx(
ledger_db, defaults["addresses"][0], utxo_source=utxo, utxo_destination=DUMMY_UTXO
)
move.move_assets(ledger_db, tx)

test_helpers.check_records(
ledger_db,
[
{
"table": "debits",
"values": {
"utxo": utxo,
"address": None,
"asset": "XCP",
"quantity": 100,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],
"action": "utxo move",
},
},
{
"table": "credits",
"values": {
"utxo": DUMMY_UTXO,
"address": None,
"asset": "XCP",
"quantity": 100,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],
"calling_function": "utxo move",
},
},
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",
"source": utxo,
"source_address": defaults["addresses"][0],
"destination": DUMMY_UTXO,
"destination_address": defaults["addresses"][0],
"asset": "XCP",
"quantity": 100,
"fee_paid": 0,
},
},
],
)


def test_move_assets_divisible(
ledger_db, defaults, blockchain_mock, test_helpers, current_block_index
):
utxo = get_utxo(ledger_db, defaults["addresses"][0], "DIVISIBLE")
tx = blockchain_mock.dummy_tx(
ledger_db, defaults["addresses"][0], utxo_source=utxo, utxo_destination=DUMMY_UTXO
)
move.move_assets(ledger_db, tx)

test_helpers.check_records(
ledger_db,
[
{
"table": "debits",
"values": {
"utxo": utxo,
"address": None,
"asset": "DIVISIBLE",
"quantity": 1,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],
"action": "utxo move",
},
},
{
"table": "credits",
"values": {
"utxo": DUMMY_UTXO,
"address": None,
"asset": "DIVISIBLE",
"quantity": 1,
"event": tx["tx_hash"],
"block_index": current_block_index,
"tx_index": tx["tx_index"],
"calling_function": "utxo move",
},
},
{
"table": "sends",
"values": {
"tx_index": tx["tx_index"],
"tx_hash": tx["tx_hash"],
"block_index": tx["block_index"],
"status": "valid",
"source": utxo,
"source_address": defaults["addresses"][0],
"destination": DUMMY_UTXO,
"destination_address": defaults["addresses"][0],
"asset": "DIVISIBLE",
"quantity": 1,
"fee_paid": 0,
},
},
],
)

0 comments on commit 79eb7d5

Please sign in to comment.