diff --git a/.github/workflows/pytest_action.yml b/.github/workflows/pytest_action.yml index 0d5e1774a7..c4b08bc613 100644 --- a/.github/workflows/pytest_action.yml +++ b/.github/workflows/pytest_action.yml @@ -42,10 +42,21 @@ jobs: uses: actions/cache/restore@v4 with: path: ~/.cache/counterparty-integration-cache/${{ inputs.integration_cache_network }} - # Cache key version: increment to invalidate corrupted caches - key: integration-v2-${{ inputs.integration_cache_network }}-${{ github.run_id }} + # Cache key version: increment to invalidate incompatible caches + # v5: addresses normalized to a compact `address_id` FK (`address_list`) + # and `utxo` TEXT split into `(utxo_tx_hash BLOB, utxo_vout)`, folded + # into migration 0010. yoyo never re-applies an already-applied 0010, + # so v4 cached DBs lack `address_list`/the split utxo columns and the + # state migration 0004 then fails with `no such table: ledger_db.address_list`. + # v4: asset names normalized to a compact `asset_index` FK, folded + # into migration 0010. yoyo never re-applies an already-applied 0010, + # so v3 cached DBs stay on the pre-`asset_index` schema and the state + # migration 0004 then fails with `no such column: a.asset_index`. + # v3: compact-hash match tables re-keyed on (tx0_index, tx1_index); + # the v2 cached DBs carry the old TEXT `id` schema and are incompatible. + key: integration-v5-${{ inputs.integration_cache_network }}-${{ github.run_id }} restore-keys: | - integration-v2-${{ inputs.integration_cache_network }}- + integration-v5-${{ inputs.integration_cache_network }}- - name: Set up Python uses: actions/setup-python@v3 @@ -104,8 +115,9 @@ jobs: uses: actions/cache/save@v4 with: path: ~/.cache/counterparty-integration-cache/${{ inputs.integration_cache_network }} - # Cache key version: increment to invalidate corrupted caches - key: integration-v2-${{ inputs.integration_cache_network }}-${{ github.run_id }} + # Cache key version: increment to invalidate incompatible caches + # (must match the restore key above). + key: integration-v5-${{ inputs.integration_cache_network }}-${{ github.run_id }} - name: Upload coverage uses: codecov/codecov-action@v5 diff --git a/counterparty-core/counterpartycore/lib/api/apiwatcher.py b/counterparty-core/counterpartycore/lib/api/apiwatcher.py index 70de556b60..377a539d27 100644 --- a/counterparty-core/counterpartycore/lib/api/apiwatcher.py +++ b/counterparty-core/counterpartycore/lib/api/apiwatcher.py @@ -6,7 +6,7 @@ from counterpartycore.lib import config, exceptions from counterpartycore.lib.api import dbbuilder from counterpartycore.lib.parser import utxosinfo -from counterpartycore.lib.utils import database +from counterpartycore.lib.utils import database, hashcodec from counterpartycore.lib.utils.helpers import format_duration logger = logging.getLogger(config.LOGGER_NAME) @@ -14,13 +14,13 @@ UPDATE_EVENTS_ID_FIELDS = { "BLOCK_PARSED": ["block_index"], "TRANSACTION_PARSED": ["tx_hash"], - "BET_MATCH_UPDATE": ["id"], + "BET_MATCH_UPDATE": ["tx0_index", "tx1_index"], "BET_UPDATE": ["tx_hash"], "DISPENSER_UPDATE": ["tx_hash"], "ORDER_FILLED": ["tx_hash"], - "ORDER_MATCH_UPDATE": ["id"], + "ORDER_MATCH_UPDATE": ["tx0_index", "tx1_index"], "ORDER_UPDATE": ["tx_hash"], - "RPS_MATCH_UPDATE": ["id"], + "RPS_MATCH_UPDATE": ["tx0_index", "tx1_index"], "RPS_UPDATE": ["tx_hash"], "ADDRESS_OPTIONS_UPDATE": ["address"], "FAIRMINTER_UPDATE": ["tx_hash"], @@ -161,9 +161,111 @@ def get_event_bindings(event): return event_bindings -def insert_event_to_sql(event): +# Tables in ``STATE_DB_TABLES`` whose schema (mirrored from ``ledger_db``) +# replaced a legacy hex hash column with a ``*_tx_index`` integer FK. The +# event JSON still carries the legacy hash (consensus-stable), so the +# apiwatcher must resolve hex_tx_hash -> tx_index against ``ledger_db. +# transactions`` before binding into the state_db schema. +# +# This map mirrors ``ledger.events.HASH_TO_TX_INDEX_FK`` defensively: tables +# not in ``STATE_DB_TABLES`` today (cancels, dispenses, dispenser_refills, +# fairmints) are listed here so that adding them to ``STATE_DB_TABLES`` +# later does not silently break replication. +_STATE_DB_HASH_FK_RESOLUTION = { + "cancels": {"offer_hash": "offer_tx_index"}, + "dispenses": {"dispenser_tx_hash": "dispenser_tx_index"}, + "dispenser_refills": {"dispenser_tx_hash": "dispenser_tx_index"}, + "fairmints": {"fairminter_tx_hash": "fairminter_tx_index"}, + "pool_matches": {"order_tx_hash": "order_tx_index"}, +} + + +def _resolve_state_db_fk_columns(ledger_db, table, event_bindings): + """For tables in ``_STATE_DB_HASH_FK_RESOLUTION``, replace legacy + ``*_tx_hash`` keys with their resolved ``*_tx_index`` integer FK so the + INSERT/UPDATE targets the migrated state_db schema.""" + fk_map = _STATE_DB_HASH_FK_RESOLUTION.get(table) + if not fk_map or ledger_db is None: + return + cursor = ledger_db.cursor() + for hash_key, index_key in fk_map.items(): + if hash_key not in event_bindings: + continue + hex_value = event_bindings.pop(hash_key) + if hex_value is None: + event_bindings[index_key] = None + continue + blob = hashcodec.hash_to_db(hex_value) + row = cursor.execute( + "SELECT tx_index FROM transactions WHERE tx_hash = ?", (blob,) + ).fetchone() + event_bindings[index_key] = row["tx_index"] if row else None + cursor.close() + + +# Match tables replicated into the State DB whose composite TEXT ``id`` was +# dropped (the State DB mirrors the migrated ledger schema). The event JSON +# still carries ``id`` (consensus-stable); the apiwatcher strips it and uses +# the ``(tx0_index, tx1_index)`` pair instead. INSERT events (ORDER_MATCH ...) +# already carry the pair; UPDATE events (ORDER_MATCH_UPDATE ...) carry only +# ``{id, status}`` so the pair is derived by splitting/resolving the id. +# (``btcpays`` / ``*_match_expirations`` / ``*_resolutions`` are NOT in +# ``STATE_DB_TABLES`` -- they are not replicated -- so they need no handling.) +_STATE_DB_MATCH_ID_TABLES = ("order_matches", "bet_matches", "rps_matches") + + +def _resolve_match_id_to_indexes(ledger_db, match_id): + """Split a composite ``tx0hash_tx1hash`` match id and resolve each half to + its ``tx_index`` via ``ledger_db.transactions``. Returns ``(None, None)`` + for a ``None``/malformed id.""" + if ledger_db is None or not isinstance(match_id, str) or match_id.count("_") != 1: + return None, None + part0, part1 = match_id.split("_") + cursor = ledger_db.cursor() + try: + indexes = [] + for part in (part0, part1): + blob = hashcodec.hash_to_db(part) + row = cursor.execute( + "SELECT tx_index FROM transactions WHERE tx_hash = ?", (blob,) + ).fetchone() + indexes.append(row["tx_index"] if row else None) + finally: + cursor.close() + return indexes[0], indexes[1] + + +def _resolve_state_db_match_id_columns(ledger_db, table, event_bindings): + """For the replicated match tables, derive the ``(tx0_index, tx1_index)`` + pair when only the composite ``id`` is present (UPDATE events) and drop the + dropped TEXT ``id``/``*_match_id`` keys so the INSERT/UPDATE targets the + migrated state_db schema.""" + if table not in _STATE_DB_MATCH_ID_TABLES: + return + if "tx0_index" not in event_bindings and "id" in event_bindings: + tx0_index, tx1_index = _resolve_match_id_to_indexes(ledger_db, event_bindings["id"]) + event_bindings["tx0_index"] = tx0_index + event_bindings["tx1_index"] = tx1_index + for dropped in ("id", "order_match_id", "bet_match_id", "rps_match_id"): + event_bindings.pop(dropped, None) + + +def _normalize_event_bindings_for_state_db(event_bindings): + """Convert any hash-typed values from hex-string (JSON form) to BLOB(32) + so they can be bound against state_db columns that mirror the BLOB + schema of ledger_db after the size-optimization migration.""" + for key in list(event_bindings.keys()): + if key in hashcodec.HASH_COLUMN_NAMES: + event_bindings[key] = hashcodec.hash_to_db(event_bindings[key]) + return event_bindings + + +def insert_event_to_sql(event, ledger_db=None): event_bindings = get_event_bindings(event) event_bindings["block_index"] = event["block_index"] + _resolve_state_db_fk_columns(ledger_db, event["category"], event_bindings) + _resolve_state_db_match_id_columns(ledger_db, event["category"], event_bindings) + _normalize_event_bindings_for_state_db(event_bindings) sql_bindings = [] sql = f"INSERT INTO {event['category']} " names = [] @@ -174,13 +276,17 @@ def insert_event_to_sql(event): return sql, sql_bindings -def update_event_to_sql(event): +def update_event_to_sql(event, ledger_db=None): event_bindings = get_event_bindings(event) event_bindings["block_index"] = event["block_index"] if event_bindings["block_index"] == config.MEMPOOL_BLOCK_INDEX: return None, [] + _resolve_state_db_fk_columns(ledger_db, event["category"], event_bindings) + _resolve_state_db_match_id_columns(ledger_db, event["category"], event_bindings) + _normalize_event_bindings_for_state_db(event_bindings) + id_field_names = UPDATE_EVENTS_ID_FIELDS[event["event"]] sql_bindings = [] @@ -205,11 +311,11 @@ def update_event_to_sql(event): return sql, sql_bindings -def event_to_sql(event): +def event_to_sql(event, ledger_db=None): if event["command"] == "insert": - return insert_event_to_sql(event) + return insert_event_to_sql(event, ledger_db=ledger_db) if event["command"] in ["update", "parse"]: - return update_event_to_sql(event) + return update_event_to_sql(event, ledger_db=ledger_db) return None, [] @@ -498,15 +604,19 @@ def update_fairminters(state_db, event): earned_quantity = COALESCE(earned_quantity, 0) + :earn_quantity, commission = COALESCE(commission, 0) + :commission, paid_quantity = COALESCE(paid_quantity, 0) + :paid_quantity - WHERE tx_hash = :fairminter_tx_hash + WHERE tx_hash = :fairminter_tx_hash_blob """ - cursor.execute(sql, event_bindings) + bindings = dict(event_bindings) + bindings["fairminter_tx_hash_blob"] = hashcodec.hash_to_db( + event_bindings.get("fairminter_tx_hash") + ) + cursor.execute(sql, bindings) -def update_consolidated_tables(state_db, event): +def update_consolidated_tables(state_db, event, ledger_db=None): if event["category"] in STATE_DB_TABLES: cursor = state_db.cursor() - sql, sql_bindings = event_to_sql(event) + sql, sql_bindings = event_to_sql(event, ledger_db=ledger_db) if sql is not None: cursor.execute(sql, sql_bindings) # because no event for balance update @@ -516,12 +626,12 @@ def update_consolidated_tables(state_db, event): update_fairminters(state_db, event) -def update_state_db_tables(state_db, event): +def update_state_db_tables(state_db, event, ledger_db=None): if event["event"] not in SKIP_EVENTS: update_address_events(state_db, event) update_all_expiration(state_db, event) update_assets_info(state_db, event) - update_consolidated_tables(state_db, event) + update_consolidated_tables(state_db, event, ledger_db=ledger_db) def update_last_parsed_events_cache(state_db, event=None): @@ -586,10 +696,10 @@ def get_last_block_parsed(state_db, no_cache=False): return 0 -def parse_event(state_db, event): +def parse_event(state_db, event, ledger_db=None): with state_db: logger.trace(f"Parsing event: {event}") - update_state_db_tables(state_db, event) + update_state_db_tables(state_db, event, ledger_db=ledger_db) update_last_parsed_events(state_db, event) update_events_count(state_db, event) update_transaction_types_count(state_db, event) @@ -605,7 +715,7 @@ def catch_up(ledger_db, state_db, watcher=None): event_parsed = 0 next_event = get_next_event_to_parse(ledger_db, state_db) while next_event and (watcher is None or not watcher.stop_event.is_set()): - parse_event(state_db, next_event) + parse_event(state_db, next_event, ledger_db=ledger_db) event_parsed += 1 if event_parsed % 50000 == 0: duration = time.time() - start_time @@ -672,7 +782,7 @@ def parse_next_event(ledger_db, state_db): if next_event is None: raise exceptions.NoEventToParse("No event to parse") - parse_event(state_db, next_event) + parse_event(state_db, next_event, ledger_db=ledger_db) class APIWatcher(threading.Thread): diff --git a/counterparty-core/counterpartycore/lib/api/composer.py b/counterparty-core/counterpartycore/lib/api/composer.py index 923a798263..74252059ee 100644 --- a/counterparty-core/counterpartycore/lib/api/composer.py +++ b/counterparty-core/counterpartycore/lib/api/composer.py @@ -32,7 +32,7 @@ messages, ) from counterpartycore.lib.parser import deserialize, messagetype, utxosinfo -from counterpartycore.lib.utils import helpers, multisig, script +from counterpartycore.lib.utils import database, helpers, multisig, script MAX_INPUTS_SET = 100 MAX_BTC_OUTPUT_VALUE = 21_000_000 * config.UNIT @@ -319,9 +319,13 @@ def is_ordinal_envelope_script(envelope_script): def utxo_to_address(db, utxo): - # first try with the database - sql = "SELECT utxo_address FROM balances WHERE utxo = ? LIMIT 1" - balance = db.execute(sql, (utxo,)).fetchone() + # first try with the database (the ledger DB). ``utxo`` is stored as the + # compact ``(utxo_tx_hash BLOB, utxo_vout)`` pair; split the string to + # filter. ``utxo_address`` is the ``address_id`` FK, decoded back to the + # address string by the rowtracer. + utxo_tx_hash, utxo_vout = database.split_utxo(utxo) + sql = "SELECT utxo_address FROM balances WHERE utxo_tx_hash = ? AND utxo_vout = ? LIMIT 1" + balance = db.execute(sql, (utxo_tx_hash, utxo_vout)).fetchone() if balance: return balance["utxo_address"] # then try with Bitcoin Core diff --git a/counterparty-core/counterpartycore/lib/api/dbbuilder.py b/counterparty-core/counterpartycore/lib/api/dbbuilder.py index 16dfea3cf1..e54a557ff3 100644 --- a/counterparty-core/counterpartycore/lib/api/dbbuilder.py +++ b/counterparty-core/counterpartycore/lib/api/dbbuilder.py @@ -13,6 +13,18 @@ logger = logging.getLogger(config.LOGGER_NAME) MIGRATIONS_AFTER_ROLLBACK = [ + # 0002 / 0003 are included so that pre-existing state DBs built before the + # compact-hash storage migration get rebuilt with the ``hex_lower(...)`` + # projection on the next rollback: + # - 0002 populates ``parsed_events.event_hash`` (TEXT) from + # ``ledger_db.messages.event_hash`` (now BLOB(32)); without the + # ``hex_lower`` projection, BLOBs end up stored in the TEXT column. + # - 0003 has the same problem on ``all_expirations.object_id``. + # ``parsed_events`` and ``all_expirations`` are also in ``ROLLBACKABLE_TABLES`` + # (DELETE-only path); the DELETE is harmless since the table is dropped + # and recreated by the migration apply. + "0002.create_and_populate_parsed_events", + "0003.create_and_populate_all_expirations", "0004.create_and_populate_assets_info", "0005.create_and_populate_events_count", "0006.create_and_populate_consolidated_tables", @@ -99,9 +111,22 @@ def build_state_db(): if os.path.exists(config.STATE_DATABASE + ext): os.unlink(config.STATE_DATABASE + ext) + # The State DB migrations read from the Ledger DB schema (e.g. migration + # 0006 references ``fairmints.fairminter_tx_index``, introduced by ledger + # migration 0010). Make sure the Ledger DB is fully migrated before + # building the State DB so this command works against bootstrap snapshots + # that predate the latest Ledger DB migrations. + with log.Spinner("Applying Ledger DB migrations"): + database.apply_outstanding_migration(config.DATABASE, config.LEDGER_DB_MIGRATIONS_DIR) + with log.Spinner("Applying migrations"): database.apply_outstanding_migration(config.STATE_DATABASE, config.STATE_DB_MIGRATIONS_DIR) + with log.Spinner("Vacuuming State DB..."): + state_db = database.get_db_connection(config.STATE_DATABASE, read_only=False) + database.vacuum(state_db) + state_db.close() + logger.info("State DB built in %.2f seconds", time.time() - start_time) diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0002.create_and_populate_parsed_events.py b/counterparty-core/counterpartycore/lib/api/migrations/0002.create_and_populate_parsed_events.py index f063b1ce89..800e9fcc47 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0002.create_and_populate_parsed_events.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0002.create_and_populate_parsed_events.py @@ -1,6 +1,7 @@ # # file: counterpartycore/lib/api/migrations/0002.create_and_populate_parsed_events.py # +import binascii import logging import time @@ -17,6 +18,23 @@ def dict_factory(cursor, row): return dict(zip(fields, row, strict=True)) +def _hex_lower_udf(value): + """SQLite UDF: BLOB/text -> 64-char lowercase hex string, NULL->NULL. + + ``ledger_db.messages.event_hash`` is BLOB(32) after the compact-hash + storage migration. ``parsed_events.event_hash`` is declared TEXT, and + SQLite does NOT implicitly coerce BLOB -> TEXT on INSERT, so we must + explicitly hex-encode the value to keep the on-disk shape consistent + with rows inserted at runtime via ``update_last_parsed_events`` (which + binds 64-char hex strings). + """ + if value is None: + return None + if isinstance(value, str): + return value.lower() + return binascii.hexlify(value).decode("ascii") + + def apply(db): start_time = time.time() logger.debug("Populating the `parsed_events` table...") @@ -24,6 +42,16 @@ def apply(db): if hasattr(db, "row_factory"): db.row_factory = dict_factory + # Register hex_lower so the ``event_hash`` projection produces lowercase + # hex strings even though the underlying ledger column is BLOB(32). The + # apsw-registered ``hex_lower`` UDF on the main connection is not visible + # to the yoyo stdlib sqlite3 connection, so register a local shim. + try: + db.create_function("hex_lower", 1, _hex_lower_udf) + except AttributeError: + # apsw path: ``createscalarfunction`` instead of ``create_function``. + db.createscalarfunction("hex_lower", _hex_lower_udf, 1) + attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) @@ -42,9 +70,12 @@ def apply(db): block_index INTEGER ); """, + # ``ledger_db.messages.event_hash`` is BLOB(32); hex-encode it so + # the TEXT column stays consistent with rows produced at runtime + # (which bind hex strings via ``update_last_parsed_events``). """ INSERT INTO parsed_events (event_index, event, event_hash, block_index) - SELECT message_index AS event_index, event, event_hash, block_index + SELECT message_index AS event_index, event, hex_lower(event_hash) AS event_hash, block_index FROM ledger_db.messages """, """ diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0003.create_and_populate_all_expirations.py b/counterparty-core/counterpartycore/lib/api/migrations/0003.create_and_populate_all_expirations.py index fd483b73b7..4f8986ea7c 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0003.create_and_populate_all_expirations.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0003.create_and_populate_all_expirations.py @@ -1,6 +1,7 @@ # # file: counterpartycore/lib/api/migrations/0003.create_and_populate_all_expirations.py # +import binascii import logging import time @@ -17,6 +18,22 @@ def dict_factory(cursor, row): return dict(zip(fields, row, strict=True)) +def _hex_lower_udf(value): + """SQLite UDF: BLOB/text -> 64-char lowercase hex string, NULL->NULL. + + The state DB attaches the (already migrated) ledger DB and reads + ``*_hash`` columns that are now BLOB(32). Yoyo connects via the stdlib + sqlite3 driver, so the apsw-registered ``hex_lower`` UDF on the main + state-DB connection is not visible here; we register the same shim on + the migration connection. + """ + if value is None: + return None + if isinstance(value, str): + return value.lower() + return binascii.hexlify(value).decode("ascii") + + def apply(db): start_time = time.time() logger.debug("Populating the `all_expirations` table...") @@ -24,6 +41,14 @@ def apply(db): if hasattr(db, "row_factory"): db.row_factory = dict_factory + # Register hex_lower so the ``object_id`` projection produces lowercase + # hex strings even though the underlying columns are BLOB(32). + try: + db.create_function("hex_lower", 1, _hex_lower_udf) + except AttributeError: + # apsw path: ``createscalarfunction`` instead of ``create_function``. + db.createscalarfunction("hex_lower", _hex_lower_udf, 1) + attached = ( db.execute( "SELECT COUNT(*) AS count FROM pragma_database_list WHERE name = ?", ("ledger_db",) @@ -41,35 +66,51 @@ def apply(db): block_index INTEGER ); """, + # ``*_hash`` columns on the ledger DB are now BLOB(32); convert to + # lowercase hex via the ``hex_lower`` UDF so ``object_id`` stays a + # 64-char hex string (matching the runtime path that gets the value + # via ``json.loads(event["bindings"])``). """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT order_hash AS object_id, block_index, 'order' AS type + SELECT hex_lower(order_hash) AS object_id, block_index, 'order' AS type FROM ledger_db.order_expirations """, + # ``*_match_id`` was replaced by a ``(*_tx0_index, *_tx1_index)`` pair; + # reconstruct the composite ``tx0hash_tx1hash`` object_id by joining the + # two tx indexes back to ``transactions``. """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT order_match_id AS object_id, block_index, 'order_match' AS type - FROM ledger_db.order_match_expirations + SELECT hex_lower(t0.tx_hash) || '_' || hex_lower(t1.tx_hash) AS object_id, + e.block_index, 'order_match' AS type + FROM ledger_db.order_match_expirations e + JOIN ledger_db.transactions t0 ON t0.tx_index = e.order_match_tx0_index + JOIN ledger_db.transactions t1 ON t1.tx_index = e.order_match_tx1_index """, """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT bet_hash AS object_id, block_index, 'bet' AS type + SELECT hex_lower(bet_hash) AS object_id, block_index, 'bet' AS type FROM ledger_db.bet_expirations """, """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT bet_match_id AS object_id, block_index, 'bet_match' AS type - FROM ledger_db.bet_match_expirations + SELECT hex_lower(t0.tx_hash) || '_' || hex_lower(t1.tx_hash) AS object_id, + e.block_index, 'bet_match' AS type + FROM ledger_db.bet_match_expirations e + JOIN ledger_db.transactions t0 ON t0.tx_index = e.bet_match_tx0_index + JOIN ledger_db.transactions t1 ON t1.tx_index = e.bet_match_tx1_index """, """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT rps_hash AS object_id, block_index, 'rps' AS type + SELECT hex_lower(rps_hash) AS object_id, block_index, 'rps' AS type FROM ledger_db.rps_expirations """, """ INSERT INTO all_expirations (object_id, block_index, type) - SELECT rps_match_id AS object_id, block_index, 'rps_match' AS type - FROM ledger_db.rps_match_expirations + SELECT hex_lower(t0.tx_hash) || '_' || hex_lower(t1.tx_hash) AS object_id, + e.block_index, 'rps_match' AS type + FROM ledger_db.rps_match_expirations e + JOIN ledger_db.transactions t0 ON t0.tx_index = e.rps_match_tx0_index + JOIN ledger_db.transactions t1 ON t1.tx_index = e.rps_match_tx1_index """, """ CREATE INDEX all_expirations_type_idx ON all_expirations (type) diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0004.create_and_populate_assets_info.py b/counterparty-core/counterpartycore/lib/api/migrations/0004.create_and_populate_assets_info.py index 1ae4fb5487..546fbd5330 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0004.create_and_populate_assets_info.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0004.create_and_populate_assets_info.py @@ -79,54 +79,56 @@ def apply(db): a.asset_id, a.asset_longname, ( - SELECT i.issuer FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + SELECT (SELECT al.address FROM ledger_db.address_list al WHERE al.address_id = i.issuer) + FROM ledger_db.issuances i + WHERE i.asset = a.asset_index AND i.status = 'valid' ORDER BY i.rowid ASC LIMIT 1 ) AS issuer, ( - SELECT i.issuer FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + SELECT (SELECT al.address FROM ledger_db.address_list al WHERE al.address_id = i.issuer) + FROM ledger_db.issuances i + WHERE i.asset = a.asset_index AND i.status = 'valid' ORDER BY i.rowid DESC LIMIT 1 ) AS owner, ( SELECT i.divisible FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ORDER BY i.rowid DESC LIMIT 1 ) AS divisible, COALESCE(( SELECT MAX(i.locked) FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ), 0) AS locked, COALESCE(( SELECT SUM(i.quantity) FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ), 0) AS supply, ( SELECT i.description FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ORDER BY i.rowid DESC LIMIT 1 ) AS description, COALESCE(( SELECT MAX(i.description_locked) FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ), 0) AS description_locked, ( SELECT MIN(i.block_index) FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ) AS first_issuance_block_index, ( SELECT MAX(i.block_index) FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ) AS last_issuance_block_index, ( SELECT i.mime_type FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ORDER BY i.rowid DESC LIMIT 1 ) AS mime_type FROM ledger_db.assets a WHERE EXISTS ( SELECT 1 FROM ledger_db.issuances i - WHERE i.asset = a.asset_name AND i.status = 'valid' + WHERE i.asset = a.asset_index AND i.status = 'valid' ); """ cursor = db.cursor() @@ -157,13 +159,22 @@ def apply(db): start_time_supply = time.time() logger.debug("Updating the `supply` field...") + # ``issuances``/``destructions`` resolve to ``ledger_db`` (the State DB has + # no such tables) where ``asset`` is the compact ``asset_index``; decode to + # the asset name so the supply UPDATE below matches ``assets_info.asset``. db.execute(""" CREATE TEMP TABLE issuances_quantity AS - SELECT asset, SUM(quantity) AS quantity FROM issuances WHERE status = 'valid' GROUP BY asset + SELECT a.asset_name AS asset, SUM(i.quantity) AS quantity + FROM ledger_db.issuances i + JOIN ledger_db.assets a ON a.asset_index = i.asset + WHERE i.status = 'valid' GROUP BY i.asset """) db.execute(""" CREATE TEMP TABLE destructions_quantity AS - SELECT asset, SUM(quantity) AS quantity FROM destructions WHERE status = 'valid' GROUP BY asset + SELECT a.asset_name AS asset, SUM(d.quantity) AS quantity + FROM ledger_db.destructions d + JOIN ledger_db.assets a ON a.asset_index = d.asset + WHERE d.status = 'valid' GROUP BY d.asset """) db.execute(""" diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0006.create_and_populate_consolidated_tables.py b/counterparty-core/counterpartycore/lib/api/migrations/0006.create_and_populate_consolidated_tables.py index e81b4073b4..89f10a7ef7 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0006.create_and_populate_consolidated_tables.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0006.create_and_populate_consolidated_tables.py @@ -5,6 +5,10 @@ import time from counterpartycore.lib import config +from counterpartycore.lib.utils.database import ( + ADDRESS_INDEX_COLUMN_NAMES, + ASSET_INDEX_COLUMN_NAMES, +) from yoyo import step logger = logging.getLogger(config.LOGGER_NAME) @@ -13,15 +17,19 @@ CONSOLIDATED_TABLES = { "fairminters": "tx_hash", - "balances": "address, utxo, asset", + # ``utxo`` is the compact ``(utxo_tx_hash, utxo_vout)`` ledger pair; group + # by both halves (the State DB stores the reconstructed ``utxo`` string). + "balances": "address, utxo_tx_hash, utxo_vout, asset", "addresses": "address", "dispensers": "source, asset, tx_hash", - "bet_matches": "id", + # match tables: the composite TEXT ``id`` was dropped; the match is keyed + # by the ``(tx0_index, tx1_index)`` pair (compact-hash storage migration). + "bet_matches": "tx0_index, tx1_index", "bets": "tx_hash", - "order_matches": "id", + "order_matches": "tx0_index, tx1_index", "orders": "tx_hash", "rps": "tx_hash", - "rps_matches": "id", + "rps_matches": "tx0_index, tx1_index", } ADDITONAL_COLUMNS = { @@ -42,19 +50,19 @@ earned_quantity = ( SELECT SUM(earn_quantity) FROM fairmints - WHERE fairmints.fairminter_tx_hash = fairminters.tx_hash + WHERE fairmints.fairminter_tx_index = fairminters.tx_index AND fairmints.status = 'valid' ), paid_quantity = ( SELECT SUM(paid_quantity) FROM fairmints - WHERE fairmints.fairminter_tx_hash = fairminters.tx_hash + WHERE fairmints.fairminter_tx_index = fairminters.tx_index AND fairmints.status = 'valid' ), commission = ( SELECT SUM(commission) FROM fairmints - WHERE fairmints.fairminter_tx_hash = fairminters.tx_hash + WHERE fairmints.fairminter_tx_index = fairminters.tx_index AND fairmints.status = 'valid' ); """, @@ -98,7 +106,15 @@ def build_consolidated_table(state_db, table_name): sqls.append(sql["sql"]) for sql in sqls: - state_db.execute(sql) + create_sql = sql + if table_name == "balances": + # The State DB keeps the ``utxo`` string (reconstructed below) rather + # than the compact ledger ``(utxo_tx_hash, utxo_vout)`` pair, so it + # can read its own rows without ``ledger_db`` attached. + create_sql = create_sql.replace("utxo_tx_hash BLOB,", "utxo TEXT,").replace( + "utxo_vout INTEGER,", "" + ) + state_db.execute(create_sql) state_db.execute(f""" CREATE TEMP TABLE latest_ids AS @@ -111,9 +127,31 @@ def build_consolidated_table(state_db, table_name): CREATE INDEX temp.latest_ids_idx ON latest_ids(max_id) """) - columns = [ - f"b.{column['name']}" for column in state_db.execute(f"PRAGMA table_info({table_name})") - ] + # The State DB stores asset *names* (it must read its own rows without the + # Ledger DB attached). Asset columns are stored as the compact + # ``asset_index`` in ``ledger_db``, so decode them back to names here while + # ``ledger_db`` is attached (the INSERT ... SELECT bypasses the rowtracer). + columns = [] + for column in state_db.execute(f"PRAGMA table_info({table_name})"): + col = column["name"] + if col in ASSET_INDEX_COLUMN_NAMES: + columns.append( + f"(SELECT asset_name FROM ledger_db.assets WHERE asset_index = b.{col}) AS {col}" # noqa: S608 # nosec B608 + ) + elif col in ADDRESS_INDEX_COLUMN_NAMES: + # decode the compact ``address_id`` back to the address string + columns.append( + f"(SELECT address FROM ledger_db.address_list WHERE address_id = b.{col}) AS {col}" # noqa: S608 # nosec B608 + ) + elif col == "utxo" and table_name == "balances": + # reconstruct the ``tx_hash:vout`` string from the compact ledger + # ``(utxo_tx_hash, utxo_vout)`` pair (``lower(hex(...))`` yields the + # lowercase hex the utxo string used; a NULL tx_hash -> NULL utxo). + columns.append( + "lower(hex(b.utxo_tx_hash)) || ':' || b.utxo_vout AS utxo" # noqa: S608 # nosec B608 + ) + else: + columns.append(f"b.{col}") select_fields = ", ".join(columns) state_db.execute(f""" @@ -136,7 +174,13 @@ def build_consolidated_table(state_db, table_name): state_db.execute(post_query) for sql_index in indexes: - state_db.execute(sql_index) + index_sql = sql_index + if table_name == "balances": + # the State DB balances keeps a single ``utxo`` TEXT column, so the + # ledger's composite ``(utxo_tx_hash, utxo_vout)`` indexes map onto + # ``utxo``. + index_sql = index_sql.replace("utxo_tx_hash, utxo_vout", "utxo") + state_db.execute(index_sql) logger.debug( "Copied consolidated table `%s` in %.2f seconds", table_name, time.time() - start_time ) diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0007.create_views.py b/counterparty-core/counterpartycore/lib/api/migrations/0007.create_views.py index 5bead335d5..4e16b38d82 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0007.create_views.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0007.create_views.py @@ -17,29 +17,32 @@ def apply(db): start_time = time.time() logger.debug("Building views...") + # ``tx_hash`` is stored as BLOB(32) after the compact-hash storage + # migration; expose the legacy 64-char lowercase hex via the ``hex_lower`` + # UDF so the API surface (``escrow`` field on holder rows) stays unchanged. db.execute(""" CREATE VIEW IF NOT EXISTS asset_holders AS SELECT asset, address, quantity, NULL AS escrow, ('balances_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'balances' AS holding_type, NULL AS status FROM balances UNION ALL - SELECT give_asset AS asset, source AS address, give_remaining AS quantity, tx_hash AS escrow, + SELECT give_asset AS asset, source AS address, give_remaining AS quantity, hex_lower(tx_hash) AS escrow, ('open_order_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_order' AS holding_type, status FROM orders WHERE status = 'open' UNION ALL SELECT forward_asset AS asset, tx0_address AS address, forward_quantity AS quantity, - id AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_order_match' AS holding_type, status FROM order_matches WHERE status = 'pending' UNION ALL SELECT backward_asset AS asset, tx1_address AS address, backward_quantity AS quantity, - id AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_order_match' AS holding_type, status FROM order_matches WHERE status = 'pending' UNION ALL SELECT asset, source AS address, give_remaining AS quantity, - tx_hash AS escrow, ('open_dispenser_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_dispenser_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_dispenser' AS holding_type, status FROM dispensers WHERE status = 0; """) @@ -49,32 +52,32 @@ def apply(db): SELECT * FROM asset_holders UNION ALL SELECT 'XCP' AS asset, source AS address, wager_remaining AS quantity, - tx_hash AS escrow, ('open_bet_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_bet_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_bet' AS holding_type, status FROM bets WHERE status = 'open' UNION ALL SELECT 'XCP' AS asset, tx0_address AS address, forward_quantity AS quantity, - id AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_bet_match' AS holding_type, status FROM bet_matches WHERE status = 'pending' UNION ALL SELECT 'XCP' AS asset, tx1_address AS address, backward_quantity AS quantity, - id AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_bet_match' AS holding_type, status FROM bet_matches WHERE status = 'pending' UNION ALL SELECT 'XCP' AS asset, source AS address, wager AS quantity, - tx_hash AS escrow, ('open_rps_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_rps_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_rps' AS holding_type, status FROM rps WHERE status = 'open' UNION ALL SELECT 'XCP' AS asset, tx0_address AS address, wager AS quantity, - id AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_rps_match' AS holding_type, status FROM rps_matches WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') UNION ALL SELECT 'XCP' AS asset, tx1_address AS address, wager AS quantity, - id AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_rps_match' AS holding_type, status FROM rps_matches WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') """) diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0012.add_event_column_to_address_events.py b/counterparty-core/counterpartycore/lib/api/migrations/0012.add_event_column_to_address_events.py index 8539e08142..0f5405d09f 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0012.add_event_column_to_address_events.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0012.add_event_column_to_address_events.py @@ -8,6 +8,7 @@ import time from counterpartycore.lib import config +from counterpartycore.lib.utils import hashcodec from yoyo import step logger = logging.getLogger(config.LOGGER_NAME) @@ -25,6 +26,12 @@ def apply(db): if hasattr(db, "row_factory"): db.row_factory = dict_factory + # The ``ALTER TABLE ... RENAME TO address_events`` below triggers SQLite + # view re-validation; ``xcp_holders`` / ``asset_holders`` reference + # ``hex_lower(...)``, which is only registered on apsw connections by + # default. Register it on the yoyo-provided stdlib sqlite3 connection too. + hashcodec.register_db_functions(db) + # Attach ledger_db if not already attached attached = ( db.execute( @@ -75,6 +82,9 @@ def apply(db): def rollback(db): + # See ``apply`` for why the UDFs need to be registered on this connection. + hashcodec.register_db_functions(db) + cursor = db.cursor() # Create table without event column diff --git a/counterparty-core/counterpartycore/lib/api/migrations/0014.add_pool_consolidated_tables.py b/counterparty-core/counterpartycore/lib/api/migrations/0014.add_pool_consolidated_tables.py index b688e1a071..43a762e24f 100644 --- a/counterparty-core/counterpartycore/lib/api/migrations/0014.add_pool_consolidated_tables.py +++ b/counterparty-core/counterpartycore/lib/api/migrations/0014.add_pool_consolidated_tables.py @@ -5,6 +5,10 @@ import time from counterpartycore.lib import config +from counterpartycore.lib.utils.database import ( + ADDRESS_INDEX_COLUMN_NAMES, + ASSET_INDEX_COLUMN_NAMES, +) from yoyo import step logger = logging.getLogger(config.LOGGER_NAME) @@ -58,7 +62,23 @@ def build_table(state_db, table_name, group_by): """) # noqa: S608 # nosec B608 state_db.execute("CREATE INDEX temp.latest_ids_idx ON latest_ids(max_id)") - columns = [f"b.{col['name']}" for col in state_db.execute(f"PRAGMA table_info({table_name})")] + # The State DB stores asset *names*; decode the compact ``asset_index`` back + # to names while ``ledger_db`` is attached (the INSERT ... SELECT bypasses + # the rowtracer). ``lp_asset`` is not normalized, so it is copied verbatim. + columns = [] + for col in state_db.execute(f"PRAGMA table_info({table_name})"): + name = col["name"] + if name in ASSET_INDEX_COLUMN_NAMES: + columns.append( + f"(SELECT asset_name FROM ledger_db.assets WHERE asset_index = b.{name}) AS {name}" # noqa: S608 # nosec B608 + ) + elif name in ADDRESS_INDEX_COLUMN_NAMES: + # decode the compact ``address_id`` back to the address string + columns.append( + f"(SELECT address FROM ledger_db.address_list WHERE address_id = b.{name}) AS {name}" # noqa: S608 # nosec B608 + ) + else: + columns.append(f"b.{name}") select_fields = ", ".join(columns) # table_name comes from POOL_TABLES dict; select_fields is built from PRAGMA table_info results @@ -118,43 +138,46 @@ def apply(db): db.execute("DROP VIEW IF EXISTS xcp_holders") db.execute("DROP VIEW IF EXISTS asset_holders") unspendable = config.UNSPENDABLE + # ``tx_hash`` is stored as BLOB(32) after the compact-hash storage + # migration; convert to lowercase hex via the ``hex_lower`` UDF when + # projecting the legacy ``escrow`` column. asset_holders_sql = """ CREATE VIEW IF NOT EXISTS asset_holders AS SELECT asset, address, quantity, NULL AS escrow, ('balances_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'balances' AS holding_type, NULL AS status FROM balances UNION ALL - SELECT give_asset AS asset, source AS address, give_remaining AS quantity, tx_hash AS escrow, + SELECT give_asset AS asset, source AS address, give_remaining AS quantity, hex_lower(tx_hash) AS escrow, ('open_order_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_order' AS holding_type, status FROM orders WHERE status = 'open' UNION ALL SELECT forward_asset AS asset, tx0_address AS address, forward_quantity AS quantity, - id AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_order_match' AS holding_type, status FROM order_matches WHERE status = 'pending' UNION ALL SELECT backward_asset AS asset, tx1_address AS address, backward_quantity AS quantity, - id AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('order_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_order_match' AS holding_type, status FROM order_matches WHERE status = 'pending' UNION ALL SELECT asset, source AS address, give_remaining AS quantity, - tx_hash AS escrow, ('open_dispenser_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_dispenser_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_dispenser' AS holding_type, status FROM dispensers WHERE status = 0 UNION ALL SELECT asset_a AS asset, '""" asset_holders_sql += unspendable asset_holders_sql += """' AS address, reserve_a AS quantity, - tx_hash AS escrow, ('pool_reserve_a_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('pool_reserve_a_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pool_reserve' AS holding_type, NULL AS status FROM pools WHERE reserve_a > 0 UNION ALL SELECT asset_b AS asset, '""" asset_holders_sql += unspendable asset_holders_sql += """' AS address, reserve_b AS quantity, - tx_hash AS escrow, ('pool_reserve_b_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('pool_reserve_b_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pool_reserve' AS holding_type, NULL AS status FROM pools WHERE reserve_b > 0; """ @@ -164,32 +187,32 @@ def apply(db): SELECT * FROM asset_holders UNION ALL SELECT 'XCP' AS asset, source AS address, wager_remaining AS quantity, - tx_hash AS escrow, ('open_bet_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_bet_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_bet' AS holding_type, status FROM bets WHERE status = 'open' UNION ALL SELECT 'XCP' AS asset, tx0_address AS address, forward_quantity AS quantity, - id AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_bet_match' AS holding_type, status FROM bet_matches WHERE status = 'pending' UNION ALL SELECT 'XCP' AS asset, tx1_address AS address, backward_quantity AS quantity, - id AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('bet_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_bet_match' AS holding_type, status FROM bet_matches WHERE status = 'pending' UNION ALL SELECT 'XCP' AS asset, source AS address, wager AS quantity, - tx_hash AS escrow, ('open_rps_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx_hash) AS escrow, ('open_rps_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'open_rps' AS holding_type, status FROM rps WHERE status = 'open' UNION ALL SELECT 'XCP' AS asset, tx0_address AS address, wager AS quantity, - id AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_rps_match' AS holding_type, status FROM rps_matches WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') UNION ALL SELECT 'XCP' AS asset, tx1_address AS address, wager AS quantity, - id AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, ('rps_match_' || CAST(rowid AS VARCHAR)) AS cursor_id, 'pending_rps_match' AS holding_type, status FROM rps_matches WHERE status IN ('pending', 'pending and resolved', 'resolved and pending'); """) diff --git a/counterparty-core/counterpartycore/lib/api/queries.py b/counterparty-core/counterpartycore/lib/api/queries.py index f5880e24c3..99bcd66cbe 100644 --- a/counterparty-core/counterpartycore/lib/api/queries.py +++ b/counterparty-core/counterpartycore/lib/api/queries.py @@ -3,10 +3,13 @@ import ast import inspect import json +import re import textwrap import typing +import weakref from typing import Literal +import apsw from sentry_sdk import start_span as start_sentry_span from counterpartycore.lib.ledger.markets import ( @@ -17,7 +20,300 @@ pool_has_liquidity, sort_pair, ) -from counterpartycore.lib.utils.helpers import divide +from counterpartycore.lib.utils import database, hashcodec +from counterpartycore.lib.utils.helpers import MATCH_ID_SQL, divide + + +def _convert_hash_value(field, value): + """If the WHERE clause targets a hash column and the caller passes a hex + string, convert it to BLOB so it can match the at-rest representation.""" + if value is None: + return value + if isinstance(value, bytes): + return value + if field in hashcodec.HASH_COLUMN_NAMES and isinstance(value, str): + try: + return hashcodec.hash_to_db(value) + except ValueError: + return value + return value + + +# Legacy hash filter keys in callers that have been replaced by +# ``*_tx_index`` foreign keys. ``select_rows`` rewrites the WHERE clause so the +# existing API surface (which still accepts hex tx_hash query params) can +# resolve via a transactions subquery. +_HASH_FK_WHERE_REWRITE = { + "dispenser_tx_hash": "dispenser_tx_index", + "fairminter_tx_hash": "fairminter_tx_index", + "order_tx_hash": "order_tx_index", + "offer_hash": "offer_tx_index", +} + +# For tables where a legacy hash column was dropped and replaced by a +# ``*_tx_index`` FK, ``select_rows`` rewrites ``SELECT *`` to re-expose the +# legacy hash via a JOIN against ``transactions`` so the API response shape is +# preserved. The mapping uses ``ledger_db.transactions`` so it also works when +# the query targets a State DB connection (which ATTACHes the Ledger DB as +# ``ledger_db`` at read-only open time). +_HASH_FK_PROJECTIONS = { + "dispenses": ("dispenser_tx_index", "dispenser_tx_hash"), + "dispenser_refills": ("dispenser_tx_index", "dispenser_tx_hash"), + "fairmints": ("fairminter_tx_index", "fairminter_tx_hash"), + "pool_matches": ("order_tx_index", "order_tx_hash"), + "cancels": ("offer_tx_index", "offer_hash"), +} + +# Match tables that dropped the composite TEXT ``id`` column. ``select_rows`` +# re-exposes ``id`` from the local ``tx0_hash``/``tx1_hash`` BLOB columns the +# tables still carry (no JOIN needed) via the ``hex_lower`` UDF. +_MATCH_ID_LOCAL_TABLES = frozenset({"order_matches", "bet_matches", "rps_matches"}) + +# Tables (read from the Ledger DB) whose single TEXT ``*_match_id`` column was +# replaced by a ``(*_tx0_index, *_tx1_index)`` integer pair. ``select_rows`` +# hides the two FK columns and re-exposes the legacy id via two correlated +# subqueries against ``transactions`` so the API row shape is preserved. +# Mapping: table -> (tx0_index_col, tx1_index_col, legacy_id_col) +_MATCH_ID_FK_PROJECTIONS = { + "btcpays": ("order_match_tx0_index", "order_match_tx1_index", "order_match_id"), + "bet_match_resolutions": ("bet_match_tx0_index", "bet_match_tx1_index", "bet_match_id"), + "rpsresolves": ("rps_match_tx0_index", "rps_match_tx1_index", "rps_match_id"), +} + +# Pseudo WHERE keys used by match-id callers: the value is a single tx_hash that +# must match either leg of the composite match id. ``select_rows`` resolves the +# hash to a tx_index and ORs it against both ``*_tx0_index``/``*_tx1_index`` +# columns (the old ``*_match_id LIKE '%hash%'`` matched either half). +# Mapping: key -> (tx0_index_col, tx1_index_col) +_MATCH_ID_HASH_WHERE = { + "order_match_hash": ("order_match_tx0_index", "order_match_tx1_index"), + "bet_match_hash": ("bet_match_tx0_index", "bet_match_tx1_index"), + "rps_match_hash": ("rps_match_tx0_index", "rps_match_tx1_index"), +} + + +# Per-connection cache so we run the schema probe at most once per pooled +# connection instead of on every ``select_rows`` call. Using a +# ``WeakKeyDictionary`` lets the entry disappear automatically when the +# connection is garbage-collected. +_TX_TABLE_NAME_CACHE: "weakref.WeakKeyDictionary" = weakref.WeakKeyDictionary() + +_ALLOWED_TX_TABLE_NAMES = frozenset({"transactions", "ledger_db.transactions"}) + + +def _safe_tx_table(table_name): + if table_name not in _ALLOWED_TX_TABLE_NAMES: + raise ValueError(f"Unexpected transactions table name: {table_name!r}") + return table_name + + +def _probe_transactions_table(cursor, qualified_name): + """Return ``qualified_name`` if the cursor can SELECT from it, else None. + + The absence of the table is the expected negative path here (e.g. early + bootstrap before the Ledger DB exists, or when ``ledger_db`` is not + ATTACHed). Returning ``None`` lets the caller try the next candidate. + + ``qualified_name`` is always a hard-coded constant from this module + (``transactions`` or ``ledger_db.transactions``); the f-string is safe. + """ + try: + cursor.execute(f"SELECT 1 FROM {qualified_name} LIMIT 0") # nosec B608 # noqa: S608 + except apsw.SQLError: + return None + return qualified_name + + +def _resolve_transactions_table_name(db): + """Return ``transactions`` if the connection sees that table directly, + ``ledger_db.transactions`` if ``ledger_db`` is attached and contains it, + or ``None`` otherwise (in which case hash-FK projections are skipped). + + The result is cached per connection: API hot paths read from ``messages`` + and the ``_HASH_FK_PROJECTIONS`` tables on every call; without the cache + each call would issue 1-2 extra SQL probes against the connection. + """ + cached = _TX_TABLE_NAME_CACHE.get(db) + if cached is not None: + return cached if cached != "" else None + + cursor = db.cursor() + resolved = _probe_transactions_table(cursor, "transactions") + if resolved is None: + resolved = _probe_transactions_table(cursor, "ledger_db.transactions") + + # Cache an empty sentinel for the negative result so we don't keep + # re-probing connections that won't see ``transactions`` (e.g. early + # bootstrap before the Ledger DB exists). The None case is short-lived + # in practice and the cache entry will be replaced on the next attach. + _TX_TABLE_NAME_CACHE[db] = resolved if resolved is not None else "" + return resolved + + +# Cache of table -> list of public columns (everything except the internal +# ``*_tx_index`` FK that replaced the legacy hash). Populated lazily on first +# projection. +_HASH_FK_PUBLIC_COLUMNS: dict[str, tuple[str, ...]] = {} + + +# Columns shared between a main table and the joined ``transactions`` table +# that need explicit ``__m.`` qualification when ``select_rows`` adds the +# JOIN for ``messages`` / ``_HASH_FK_PROJECTIONS`` tables. Lifted out of the +# function body so the tuple isn't reallocated on every API call. +_AMBIGUOUS_COLS = frozenset( + { + "block_index", + "tx_index", + "rowid", + "tx_hash", + "source", + "destination", + "block_time", + "btc_amount", + "fee", + "data", + "supported", + "utxos_info", + "transaction_type", + } +) +_MESSAGES_QUALIFY_M_FIELDS = frozenset({"block_index", "tx_index", "rowid", "message_index"}) + +# Views whose ``COUNT(*)`` can be safely answered by counting rows from a +# single underlying table (the LEFT JOINs in the view's definition do not +# multiply rows because they all join on a unique key on the right side). +# Mapping: view_name -> (main_table, columns_only_on_main_table). When the +# caller's WHERE filter is restricted to those columns we can replace the +# view's FROM with ``main_table`` and skip its internal JOINs entirely. +# ``all_transactions_with_status`` is omitted on purpose: it counts over +# ``mempool_transactions UNION ALL transactions`` and there is no single +# underlying table to substitute. +_COUNT_FROM_OVERRIDE = { + "transactions_with_status": ( + "transactions", + frozenset( + { + "tx_index", + "tx_hash", + "block_index", + "block_time", + "source", + "destination", + "btc_amount", + "fee", + "data", + "supported", + "utxos_info", + "transaction_type", + } + ), + ), +} + + +def _hash_fk_public_columns(db, table): + """Return the list of column names to expose to the API for a table + where the legacy hash was replaced by a ``*_tx_index`` FK, i.e. every + column of the underlying table *except* that internal FK. + + The legacy hash column is re-hydrated separately by the caller via a + ``LEFT JOIN`` against ``transactions``. + """ + cached = _HASH_FK_PUBLIC_COLUMNS.get(table) + if cached is not None: + return cached + index_col, _hash_col = _HASH_FK_PROJECTIONS[table] + cursor = db.cursor() + rows = cursor.execute(f"PRAGMA table_info({table})").fetchall() # nosec B608 # noqa: S608 + cols = [] + for row in rows: + if isinstance(row, dict): + name = row["name"] + else: + name = row[1] + if name == index_col: + continue + cols.append(name) + cols_tuple = tuple(cols) + _HASH_FK_PUBLIC_COLUMNS[table] = cols_tuple + return cols_tuple + + +# Cache of table -> public columns for ``_MATCH_ID_FK_PROJECTIONS`` tables +# (everything except the two ``*_tx_index`` FK columns that replaced the +# legacy ``*_match_id``). +_MATCH_ID_PUBLIC_COLUMNS: dict[str, tuple[str, ...]] = {} + + +def _match_id_public_columns(db, table): + """Return the columns to expose for a ``_MATCH_ID_FK_PROJECTIONS`` table: + every column except the two internal ``*_tx_index`` FK columns that + replaced the legacy ``*_match_id`` (which the caller re-hydrates via two + correlated subqueries against ``transactions``).""" + cached = _MATCH_ID_PUBLIC_COLUMNS.get(table) + if cached is not None: + return cached + tx0_col, tx1_col, _id_col = _MATCH_ID_FK_PROJECTIONS[table] + cursor = db.cursor() + rows = cursor.execute(f"PRAGMA table_info({table})").fetchall() # nosec B608 # noqa: S608 + cols = [] + for row in rows: + name = row["name"] if isinstance(row, dict) else row[1] + if name in (tx0_col, tx1_col): + continue + cols.append(name) + cols_tuple = tuple(cols) + _MATCH_ID_PUBLIC_COLUMNS[table] = cols_tuple + return cols_tuple + + +def _project_messages_tx_hash(select_clause): + """Rewrite identifiers in a ``SELECT`` clause targeting the joined + ``messages``/``transactions`` view (``messages.tx_hash`` was dropped in + favour of an FK on ``transactions``): + + - ``tx_hash`` -> ``__txh.tx_hash AS tx_hash`` (the column alias keeps + ``tx_hash``, which is in ``hashcodec.HASH_COLUMN_NAMES`` so the + connection rowtracer converts BLOB -> hex without a per-row UDF). + - bare ``block_index`` -> ``__m.block_index AS block_index`` + (both ``messages`` and ``transactions`` have ``block_index``; without + a qualifier the join is ambiguous). + - bare ``rowid`` -> ``__m.rowid AS rowid`` + (both tables have an implicit ``rowid``; the join needs an explicit + qualifier). + + Uses word-boundary safe rewrites so ``last_status_tx_hash`` etc. are not + touched. + """ + rewritten = re.sub( + r"(?index subquery rewrite. + try: + db.cursor().execute("SELECT 1 FROM main.assets LIMIT 0") + _assets_index_table = "main.assets" + except apsw.SQLError: + _assets_index_table = None + + def _is_asset_index_col(field): + return _assets_index_table is not None and field in database.ASSET_INDEX_COLUMN_NAMES + + # Address columns are stored as the compact integer ``address_id`` on Ledger + # DB tables, while the State DB consolidated tables keep the string. Detect a + # Ledger DB connection by probing for a *local* ``main.address_list`` (mirror + # the asset probe above). Only Ledger DB address filters need the + # string->id subquery rewrite. + try: + db.cursor().execute("SELECT 1 FROM main.address_list LIMIT 0") + _address_index_table = "main.address_list" + except apsw.SQLError: + _address_index_table = None + + def _is_address_index_col(field): + return _address_index_table is not None and field in database.ADDRESS_INDEX_COLUMN_NAMES + or_where = [] for where_dict in where: where_field = [] for key, value in where_dict.items(): if key.endswith("__gt"): - where_field.append(f"{key[:-4]} > ?") - bindings.append(value) + field = key[:-4] + where_field.append(f"{_qualify(field)} > ?") + bindings.append(_convert_hash_value(field, value)) elif key.endswith("__like"): - where_field.append(f"{key[:-6]} LIKE ?") + field = key[:-6] + if _is_asset_index_col(field): + where_field.append( + f"{_qualify(field)} IN (SELECT asset_index FROM {_assets_index_table} WHERE asset_name LIKE ?)" # noqa: S608 # nosec B608 + ) + elif _is_address_index_col(field): + where_field.append( + f"{_qualify(field)} IN (SELECT address_id FROM {_address_index_table} WHERE address LIKE ?)" # noqa: S608 # nosec B608 + ) + else: + where_field.append(f"{_qualify(field)} LIKE ?") bindings.append(value) elif key.endswith("__notlike"): - where_field.append(f"{key[:-9]} NOT LIKE ?") + field = key[:-9] + if _is_asset_index_col(field): + where_field.append( + f"{_qualify(field)} NOT IN (SELECT asset_index FROM {_assets_index_table} WHERE asset_name LIKE ?)" # noqa: S608 # nosec B608 + ) + elif _is_address_index_col(field): + where_field.append( + f"{_qualify(field)} NOT IN (SELECT address_id FROM {_address_index_table} WHERE address LIKE ?)" # noqa: S608 # nosec B608 + ) + else: + where_field.append(f"{_qualify(field)} NOT LIKE ?") bindings.append(value) elif key.endswith("__in"): - where_field.append(f"{key[:-4]} IN ({','.join(['?'] * len(value))})") - bindings += value + field = key[:-4] + if field in _HASH_FK_WHERE_REWRITE: + new_field = _HASH_FK_WHERE_REWRITE[field] + if _where_tx_table is None: + where_field.append("(0 = 1)") + else: + placeholders = ",".join( + [ + f"(SELECT tx_index FROM {_safe_tx_table(_where_tx_table)} WHERE tx_hash = ?)" # noqa: S608 # nosec B608 + ] + * len(value) + ) + where_field.append(f"{new_field} IN ({placeholders})") + bindings += [hashcodec.hash_to_db(v) for v in value] + # ``field`` becomes the resolved FK column so the + # ``_COUNT_FROM_OVERRIDE`` gate sees the actual schema + # column rather than the legacy hex hash alias. + field = new_field + elif _is_asset_index_col(field): + where_field.append( + f"{_qualify(field)} IN (SELECT asset_index FROM {_assets_index_table} " # noqa: S608 # nosec B608 + f"WHERE asset_name IN ({','.join(['?'] * len(value))}))" + ) + bindings += list(value) + elif _is_address_index_col(field): + where_field.append( + f"{_qualify(field)} IN (SELECT address_id FROM {_address_index_table} " # noqa: S608 # nosec B608 + f"WHERE address IN ({','.join(['?'] * len(value))}))" + ) + bindings += list(value) + else: + where_field.append(f"{_qualify(field)} IN ({','.join(['?'] * len(value))})") + bindings += [_convert_hash_value(field, v) for v in value] elif key.endswith("__notnull"): - where_field.append(f"{key[:-9]} IS NOT NULL") + field = key[:-9] + where_field.append(f"{_qualify(field)} IS NOT NULL") elif key.endswith("__null"): - where_field.append(f"{key[:-6]} IS NULL") + field = key[:-6] + where_field.append(f"{_qualify(field)} IS NULL") elif key.endswith("__nocase"): - where_field.append(f"{key[:-8]} = ? COLLATE NOCASE") - bindings.append(value) + field = key[:-8] + where_field.append(f"{_qualify(field)} = ? COLLATE NOCASE") + bindings.append(_convert_hash_value(field, value)) else: - if key in ADDRESS_FIELDS and len(value.split(",")) > 1: + if key in _MATCH_ID_HASH_WHERE: + # ``*_match_hash``: resolve the hex tx_hash to a tx_index and + # OR it against both legs of the composite match id (the old + # ``*_match_id LIKE '%hash%'`` matched either half). + tx0_col, tx1_col = _MATCH_ID_HASH_WHERE[key] + if _where_tx_table is None: + where_field.append("(0 = 1)") + else: + subq = f"(SELECT tx_index FROM {_safe_tx_table(_where_tx_table)} WHERE tx_hash = ?)" # noqa: S608 # nosec B608 + where_field.append(f"({tx0_col} = {subq} OR {tx1_col} = {subq})") + bindings.append(hashcodec.hash_to_db(value)) + bindings.append(hashcodec.hash_to_db(value)) + field = key + elif key in _HASH_FK_WHERE_REWRITE: + new_field = _HASH_FK_WHERE_REWRITE[key] + if _where_tx_table is None: + where_field.append("(0 = 1)") + else: + where_field.append( + f"{new_field} = (SELECT tx_index FROM {_safe_tx_table(_where_tx_table)} WHERE tx_hash = ?)" # noqa: S608 # nosec B608 + ) + bindings.append(hashcodec.hash_to_db(value)) + # ``key`` is the legacy hex hash column (e.g. + # ``dispenser_tx_hash``); record the *resolved* FK column + # name so the override gate sees the actual schema column. + field = new_field + elif _is_address_index_col(key): + # Ledger DB: address columns store the compact ``address_id``; + # rewrite the (possibly comma-separated) address value(s) to + # an ``address_list`` subquery. On a State DB connection + # ``_is_address_index_col`` is False and the TEXT branches + # below handle it. + values = value.split(",") if isinstance(value, str) else [value] + if len(values) > 1: + where_field.append( + f"{_qualify(key)} IN (SELECT address_id FROM {_address_index_table} " # noqa: S608 # nosec B608 + f"WHERE address IN ({','.join(['?'] * len(values))}))" + ) + bindings += values + else: + where_field.append( + f"{_qualify(key)} = (SELECT address_id FROM {_address_index_table} WHERE address = ?)" # noqa: S608 # nosec B608 + ) + bindings.append(value) + field = key + elif ( + key == "utxo" + and _address_index_table is not None + and isinstance(value, str) + and ":" in value + ): + # Ledger DB: ``utxo`` is stored as the compact + # ``(utxo_tx_hash BLOB, utxo_vout)`` pair; split the filter. + tx_hash_hex, _, vout = value.partition(":") + where_field.append("utxo_tx_hash = ? AND utxo_vout = ?") + bindings.append(hashcodec.hash_to_db(tx_hash_hex)) + bindings.append(int(vout)) + field = key + elif key in ADDRESS_FIELDS and len(value.split(",")) > 1: where_field.append(f"{key} IN ({','.join(['?'] * len(value.split(',')))})") bindings += value.split(",") - else: - where_field.append(f"{key} = ?") + field = key + elif _is_asset_index_col(key): + where_field.append( + f"{_qualify(key)} = (SELECT asset_index FROM {_assets_index_table} WHERE asset_name = ?)" # noqa: S608 # nosec B608 + ) bindings.append(value) + field = key + else: + where_field.append(f"{_qualify(key)} = ?") + bindings.append(_convert_hash_value(key, value)) + field = key + # Track the base field name and whether the WHERE references a + # column that only exists on a joined table. + where_fields_used.add(field) + if rewrite_messages_tx_hash and field == "tx_hash": + where_needs_join = True and_where_clause = "" if where_field: @@ -379,13 +867,14 @@ def select_rows( where_clause_count = "" bindings_count = list(bindings) + cursor_field_qualified = _qualify(cursor_field) if offset is None and last_cursor is not None: if where_clause != "": where_clause = f"({where_clause}) AND " if order == "ASC": - where_clause += f" {cursor_field} >= ?" + where_clause += f" {cursor_field_qualified} >= ?" else: - where_clause += f" {cursor_field} <= ?" + where_clause += f" {cursor_field_qualified} <= ?" bindings.append(last_cursor) if where_clause: @@ -398,9 +887,9 @@ def select_rows( group_by_clause = f"GROUP BY {group_by}" if select == "*": - select = f"*, {cursor_field} AS {cursor_field}" + select = f"*, {cursor_field_qualified} AS {cursor_field}" elif cursor_field not in select: - select = f"{select}, {cursor_field} AS {cursor_field}" + select = f"{select}, {cursor_field_qualified} AS {cursor_field}" if ( table in [ @@ -413,7 +902,11 @@ def select_rows( ] and "COUNT(*)" not in select ): - select += ", NULLIF(destination, '') AS destination" + # When ``dispenses`` rows are read through the hash-FK JOIN, the + # outer ``transactions`` row also contains a ``destination`` column; + # qualify the reference so SQLite knows we mean the dispense row. + dest_ref = "__m.destination" if table_has_hash_fk else "destination" + select += f", NULLIF({dest_ref}, '') AS destination" # `credits` and `debits` rows carry no natural unique key: several identical # rows can be written within a single transaction (e.g. an MPMA send or a # dividend crediting the same address+asset more than once). The rows are @@ -424,23 +917,171 @@ def select_rows( if table in ["credits", "debits"] and "COUNT(*)" not in select: select += f", rowid AS {table[:-1]}_index" - query = f"SELECT {select} FROM {table} {where_clause} {group_by_clause}" # nosec B608 # noqa: S608 # nosec B608 - query_count = f"SELECT {select} FROM {table} {where_clause_count} {group_by_clause}" # nosec B608 # noqa: S608 # nosec B608 + # Rewrite ``SELECT ... tx_hash ... FROM messages`` to project + # ``transactions.tx_hash`` through the join we set up above. + if rewrite_messages_tx_hash: + txtable = _resolve_transactions_table_name(db) + if txtable is None: + from_clause = "messages AS __m" + # Word-boundary safe substitution so embedded substrings such as + # ``last_status_tx_hash`` (not a column on ``messages`` today, but + # this branch is shared with future schema additions) are not + # corrupted by a naive ``str.replace``. + select_rewritten = re.sub( + r"(? ?") + field = key[:-4] + wrap_where_field.append(f"{field} > ?") else: - wrap_where_field.append(f"{key} = ?") - bindings.append(value) - bindings_count.append(value) + field = key + wrap_where_field.append(f"{field} = ?") + converted = _convert_hash_value(field, value) + bindings.append(converted) + bindings_count.append(converted) wrap_where_clause = " AND ".join(wrap_where_field) wrap_where_clause = f"WHERE {wrap_where_clause}" query = f"SELECT * FROM ({query}) {wrap_where_clause}" # nosec B608 # noqa: S608 # nosec B608 query_count = f"SELECT COUNT(*) AS count FROM ({query_count}) {wrap_where_clause}" # nosec B608 # noqa: S608 # nosec B608 - else: + elif count_fast_from is None: + # ``group_by`` path: COUNT(*) over the grouped sub-select. query_count = f"SELECT COUNT(*) AS count FROM ({query_count})" # nosec B608 # noqa: S608 # nosec B608 order_by = [] @@ -3601,7 +4242,7 @@ def get_btcpays_by_order( return select_rows( ledger_db, "btcpays", - where={"order_match_id__like": f"%{order_hash}%"}, + where={"order_match_hash": order_hash}, last_cursor=cursor, limit=limit, offset=offset, @@ -3662,7 +4303,7 @@ def get_resolutions_by_bet( return select_rows( ledger_db, "bet_match_resolutions", - where={"bet_match_id__like": f"%{bet_hash}%"}, + where={"bet_match_hash": bet_hash}, last_cursor=cursor, limit=limit, offset=offset, diff --git a/counterparty-core/counterpartycore/lib/api/verbose.py b/counterparty-core/counterpartycore/lib/api/verbose.py index 81aa760dc3..5536937c4a 100644 --- a/counterparty-core/counterpartycore/lib/api/verbose.py +++ b/counterparty-core/counterpartycore/lib/api/verbose.py @@ -11,7 +11,7 @@ ) from counterpartycore.lib.api import compose from counterpartycore.lib.ledger.currentstate import CurrentState -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.utils import hashcodec, helpers D = decimal.Decimal logger = logging.getLogger(config.LOGGER_NAME) @@ -530,13 +530,21 @@ def inject_transactions_events(ledger_db, state_db, result_list): "INCREMENT_TRANSACTION_COUNT", "NEW_TRANSACTION_OUTPUT", ] + # ``messages.tx_hash`` was dropped in favour of a ``tx_index`` FK; + # resolve via ``transactions``. The result column is aliased ``tx_hash``, + # which is in ``hashcodec.HASH_COLUMN_NAMES`` so the connection rowtracer + # converts the BLOB to 64-char lowercase hex without a per-row Python + # UDF callback. sql = f""" - SELECT message_index AS event_index, event, bindings AS params, tx_hash, block_index - FROM messages - WHERE tx_hash IN ({",".join("?" * len(transaction_hashes))}) - AND event NOT IN ({",".join("?" * len(exclude_events))}) + SELECT m.message_index AS event_index, m.event, m.bindings AS params, + t.tx_hash AS tx_hash, m.block_index + FROM messages m + LEFT JOIN transactions t ON t.tx_index = m.tx_index + WHERE t.tx_hash IN ({",".join("?" * len(transaction_hashes))}) + AND m.event NOT IN ({",".join("?" * len(exclude_events))}) """ # noqa S608 # nosec B608 - events = cursor.execute(sql, transaction_hashes + exclude_events).fetchall() + bindings = [hashcodec.hash_to_db(h) for h in transaction_hashes] + exclude_events + events = cursor.execute(sql, bindings).fetchall() for event in events: event["params"] = json.loads(event["params"]) diff --git a/counterparty-core/counterpartycore/lib/cli/server.py b/counterparty-core/counterpartycore/lib/cli/server.py index 776ea7ee9f..91ae63c83c 100755 --- a/counterparty-core/counterpartycore/lib/cli/server.py +++ b/counterparty-core/counterpartycore/lib/cli/server.py @@ -173,6 +173,14 @@ def run_server(self): # Initialise database database.apply_outstanding_migration(config.DATABASE, config.LEDGER_DB_MIGRATIONS_DIR) self.db = database.initialise_db() + # Ensure the ``messages`` table has its read indexes even when + # ``--api-only`` skips the parser's ``catch_up()`` path. Migration + # 0010 rebuilt the table without these indexes for legacy DBs + # carrying the ``EVENTS_INDEXES_CREATED`` flag, so without this + # call the API would full-scan ``messages`` on every read. + # ``CREATE INDEX IF NOT EXISTS`` is idempotent, so this is a no-op + # for fully-indexed databases. + blocks.create_events_indexes(self.db) CurrentState().set_current_block_index(ledger.blocks.last_db_index(self.db)) blocks.check_database_version(self.db) database.optimize(self.db) @@ -401,9 +409,12 @@ def rollback(block_index=None): def vacuum(): - db = database.initialise_db() - with log.Spinner("Vacuuming database..."): - database.vacuum(db) + ledger_db = database.initialise_db() + state_db = database.get_db_connection(config.STATE_DATABASE, read_only=False) + with log.Spinner("Vacuuming Ledger DB..."): + database.vacuum(ledger_db) + with log.Spinner("Vacuuming State DB..."): + database.vacuum(state_db) def check_database(): diff --git a/counterparty-core/counterpartycore/lib/ledger/balances.py b/counterparty-core/counterpartycore/lib/ledger/balances.py index 8ec602982a..14855f2d79 100644 --- a/counterparty-core/counterpartycore/lib/ledger/balances.py +++ b/counterparty-core/counterpartycore/lib/ledger/balances.py @@ -3,24 +3,35 @@ from counterpartycore.lib import config, exceptions from counterpartycore.lib.ledger.caches import UTXOBalancesCache from counterpartycore.lib.parser import protocol, utxosinfo +from counterpartycore.lib.utils import database logger = logging.getLogger(config.LOGGER_NAME) +def _holder_filter(db, address): + """Build the (where_clause, bindings) for a single address-or-utxo balance + lookup. An address resolves to its compact ``address_id``; a UTXO string is + split into the stored ``(utxo_tx_hash, utxo_vout)`` pair. Returns the + SELECT/GROUP-BY target columns too (``address`` vs ``utxo_tx_hash, + utxo_vout``) so the rowtracer can reconstruct the ``utxo`` string.""" + if protocol.enabled("utxo_support") and utxosinfo.is_utxo_format(address): + tx_hash, vout = database.split_utxo(address) + return "utxo_tx_hash, utxo_vout", "(utxo_tx_hash = ? AND utxo_vout = ?)", [tx_hash, vout] + return "address", "address = ?", [database.address_index_from_name(db, address)] + + def get_balance(db, address, asset, raise_error_if_no_balance=False, return_list=False): """Get balance of contract or address.""" cursor = db.cursor() - field_name = "address" - if protocol.enabled("utxo_support") and utxosinfo.is_utxo_format(address): - field_name = "utxo" + _target, where_clause, where_bindings = _holder_filter(db, address) query = f""" SELECT * FROM balances - WHERE ({field_name} = ? AND asset = ?) + WHERE ({where_clause} AND asset = ?) ORDER BY rowid DESC LIMIT 1 """ # noqa: S608 # nosec B608 - bindings = (address, asset) + bindings = (*where_bindings, database.asset_index_from_name(db, asset)) balances = list(cursor.execute(query, bindings)) cursor.close() if return_list: @@ -43,18 +54,24 @@ def get_address_balances(db, address: str): """ cursor = db.cursor() - field_name = "address" - if protocol.enabled("utxo_support") and utxosinfo.is_utxo_format(address): - field_name = "utxo" + target, where_clause, where_bindings = _holder_filter(db, address) + # ``asset`` is stored as the compact asset_index; ordering by it would + # return assets in index order, but the iteration order here is + # consensus-relevant: move/detach/sweep handlers process each balance in + # this order (msg_index, debit/credit -> ledger_hash). Order by the + # resolved asset *name* to reproduce the exact pre-normalization ordering + # (the GROUP BY previously emitted rows in asset-name order). The WHERE pins + # a single address/utxo, so address ordering is irrelevant here. The + # ``utxo_tx_hash, utxo_vout`` target lets the rowtracer rebuild ``utxo``. query = f""" - SELECT {field_name}, asset, quantity, utxo_address, MAX(rowid) + SELECT {target}, asset, quantity, utxo_address, MAX(rowid) FROM balances - WHERE {field_name} = ? - GROUP BY {field_name}, asset + WHERE {where_clause} + GROUP BY {target}, asset + ORDER BY (SELECT asset_name FROM assets WHERE asset_index = asset) """ # noqa: S608 # nosec B608 - bindings = (address,) - cursor.execute(query, bindings) + cursor.execute(query, where_bindings) return cursor.fetchall() @@ -65,38 +82,32 @@ def get_utxo_balances(db, utxo: str): def get_address_assets(db, address): cursor = db.cursor() - field_name = "address" - if protocol.enabled("utxo_support") and utxosinfo.is_utxo_format(address): - field_name = "utxo" + _target, where_clause, where_bindings = _holder_filter(db, address) query = f""" SELECT DISTINCT asset FROM balances - WHERE {field_name}=:address + WHERE {where_clause} GROUP BY asset """ # noqa: S608 # nosec B608 - bindings = {"address": address} - cursor.execute(query, bindings) + cursor.execute(query, where_bindings) return cursor.fetchall() def get_balances_count(db, address): cursor = db.cursor() - field_name = "address" - if protocol.enabled("utxo_support") and utxosinfo.is_utxo_format(address): - field_name = "utxo" + _target, where_clause, where_bindings = _holder_filter(db, address) query = f""" SELECT COUNT(*) AS cnt FROM ( SELECT DISTINCT asset FROM balances - WHERE {field_name}=:address + WHERE {where_clause} GROUP BY asset ) """ # noqa: S608 # nosec B608 - bindings = {"address": address} - cursor.execute(query, bindings) + cursor.execute(query, where_bindings) return cursor.fetchall() @@ -107,12 +118,15 @@ def get_asset_balances(db, asset: str, exclude_zero_balances: bool = True): :param bool exclude_zero_balances: Whether to exclude zero balances (e.g. True) """ cursor = db.cursor() + # ``address`` is the compact address_id; ordering by it would sort by id, + # not by the address string. Order by the resolved string to reproduce the + # pre-normalization ordering (callers may iterate this; keep it stable). query = """ SELECT address, asset, quantity, MAX(rowid) FROM balances WHERE asset = ? GROUP BY address, asset - ORDER BY address + ORDER BY (SELECT al.address FROM address_list al WHERE al.address_id = balances.address) """ if exclude_zero_balances: query = f""" @@ -120,6 +134,6 @@ def get_asset_balances(db, asset: str, exclude_zero_balances: bool = True): {query} ) WHERE quantity > 0 """ # nosec B608 # noqa: S608 # nosec B608 - bindings = (asset,) + bindings = (database.asset_index_from_name(db, asset),) cursor.execute(query, bindings) return cursor.fetchall() diff --git a/counterparty-core/counterpartycore/lib/ledger/blocks.py b/counterparty-core/counterpartycore/lib/ledger/blocks.py index 22d3281f73..1c718a57ba 100644 --- a/counterparty-core/counterpartycore/lib/ledger/blocks.py +++ b/counterparty-core/counterpartycore/lib/ledger/blocks.py @@ -1,4 +1,5 @@ from counterpartycore.lib import config +from counterpartycore.lib.utils import hashcodec def get_block(db, block_index: int): @@ -39,7 +40,7 @@ def get_block_by_hash(db, block_hash: str): SELECT * FROM blocks WHERE block_hash = ? """ - bindings = (block_hash,) + bindings = (hashcodec.hash_to_db(block_hash),) cursor = db.cursor() cursor.execute(query, bindings) return cursor.fetchone() @@ -78,31 +79,49 @@ def get_blocks_time(db, block_indexes): blocks = cursor.fetchall() result = {} for block in blocks: - result[block["block_index"]] = block["block_time"] + result[block["block_index"]] = int(block["block_time"]) return result def get_vouts(db, tx_hash): cursor = db.cursor() + # ``transaction_outputs.tx_hash`` was dropped in favour of an integer + # ``tx_index`` FK. Resolve from the hex ``tx_hash`` via the + # ``transactions`` table and expose ``tx_hash`` (hex, via rowtracer) + # for backwards-compatibility. query = """ - SELECT txs.source AS source, txs_outs.* + SELECT txs.source AS source, txs.tx_hash AS tx_hash, txs_outs.* FROM transaction_outputs txs_outs - LEFT JOIN transactions txs ON txs.tx_hash = txs_outs.tx_hash - WHERE txs_outs.tx_hash=:tx_hash + LEFT JOIN transactions txs ON txs.tx_index = txs_outs.tx_index + WHERE txs_outs.tx_index = (SELECT tx_index FROM transactions WHERE tx_hash = ?) ORDER BY txs_outs.out_index """ - bindings = {"tx_hash": tx_hash} + bindings = (hashcodec.hash_to_db(tx_hash),) cursor.execute(query, bindings) return cursor.fetchall() +def tx_index_of(db, tx_hash): + """Resolve a hex ``tx_hash`` to its ``tx_index`` via the transactions + table. Returns ``None`` if not found.""" + if tx_hash is None: + return None + cursor = db.cursor() + cursor.execute( + "SELECT tx_index FROM transactions WHERE tx_hash = ?", + (hashcodec.hash_to_db(tx_hash),), + ) + row = cursor.fetchone() + return row["tx_index"] if row else None + + def get_transactions(db, tx_hash=None, tx_index=None): cursor = db.cursor() where = [] bindings = [] if tx_hash is not None: where.append("tx_hash = ?") - bindings.append(tx_hash) + bindings.append(hashcodec.hash_to_db(tx_hash)) if tx_index is not None: where.append("tx_index = ?") bindings.append(tx_index) diff --git a/counterparty-core/counterpartycore/lib/ledger/caches.py b/counterparty-core/counterpartycore/lib/ledger/caches.py index de53ce1fc4..b01ec95425 100644 --- a/counterparty-core/counterpartycore/lib/ledger/caches.py +++ b/counterparty-core/counterpartycore/lib/ledger/caches.py @@ -4,7 +4,7 @@ from counterpartycore.lib import config from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.parser.known_sources import KNOWN_SOURCES -from counterpartycore.lib.utils import database, helpers +from counterpartycore.lib.utils import database, hashcodec, helpers logger = logging.getLogger(config.LOGGER_NAME) @@ -81,7 +81,16 @@ def get_asset(self, asset_name): ORDER BY tx_index DESC LIMIT 1 """ # nosec B608 # noqa: S608 - cursor.execute(sql, (asset_name,)) + # ``asset_longname`` stays TEXT; the ``asset`` column is now the compact + # ``asset_index`` FK, so resolve the name to its index before binding + # (mirrors ``issuances.get_asset``). An unregistered asset resolves to + # NULL and matches nothing, correctly returning no issuance. + bind_asset = ( + asset_name + if name_field == "asset_longname" + else database.asset_index_from_name(self.db, asset_name) + ) + cursor.execute(sql, (bind_asset,)) result = cursor.fetchone() if result: @@ -124,8 +133,14 @@ def __init__(self, db): cursor = db.cursor() - # Load UTXOs with balance from the balances table - sql = "SELECT utxo, asset, quantity, MAX(rowid) FROM balances WHERE utxo IS NOT NULL GROUP BY utxo, asset" + # Load UTXOs with balance from the balances table. ``utxo`` is stored as + # the compact ``(utxo_tx_hash, utxo_vout)`` pair; selecting both lets + # the rowtracer reconstruct the ``utxo`` string so the cache key is + # unchanged. + sql = ( + "SELECT utxo_tx_hash, utxo_vout, asset, quantity, MAX(rowid) FROM balances " + "WHERE utxo_tx_hash IS NOT NULL GROUP BY utxo_tx_hash, utxo_vout, asset" + ) cursor.execute(sql) utxo_balances = cursor.fetchall() for utxo_balance in utxo_balances: @@ -161,7 +176,7 @@ def _add_known_sources_descendants(self, cursor): if source != "": tx = cursor.execute( "SELECT utxos_info, transaction_type FROM transactions WHERE tx_hash = ?", - (tx_hash,), + (hashcodec.hash_to_db(tx_hash),), ).fetchone() if tx: utxos_info = tx["utxos_info"].split(" ") @@ -207,11 +222,13 @@ def has_balance(self, utxo): if utxo in self.utxos_with_balance: return self.utxos_with_balance[utxo] - # Cache miss - query database + # Cache miss - query database. ``utxo`` is stored as the compact + # ``(utxo_tx_hash, utxo_vout)`` pair; split the string to filter. cursor = self.db.cursor() + utxo_tx_hash, utxo_vout = database.split_utxo(utxo) cursor.execute( - "SELECT 1 FROM balances WHERE utxo = ? AND quantity > 0 LIMIT 1", - (utxo,), + "SELECT 1 FROM balances WHERE utxo_tx_hash = ? AND utxo_vout = ? AND quantity > 0 LIMIT 1", + (utxo_tx_hash, utxo_vout), ) result = cursor.fetchone() is not None @@ -254,6 +271,23 @@ def cleanup_if_exists(cls): class OrdersCache(metaclass=helpers.SingletonMeta): + """In-memory shadow of the ``orders`` table for fast matching. + + NOTE on hash encoding: the cache table keeps ``tx_hash`` as ``TEXT`` + (64-char lowercase hex), unlike the persisted ledger schema which stores + it as ``BLOB(32)`` after the compact-hash storage migration. This is + intentional because the cache is populated and consumed exclusively + via the rowtracer / Python layer where hashes are already normalised + to hex strings (see ``utils/database.rowtracer``). + + Callers MUST pass hex strings to ``insert_order``, ``update_order``, + ``get_matching_orders``, etc. Passing raw ``bytes`` would silently + fail to match (SQLite would compare a BLOB against a TEXT column). + If a caller ever needs to bind a value coming from a raw SQL fetch + that bypassed the rowtracer, normalise it first via + ``hashcodec.hash_from_db``. + """ + def __init__(self, db) -> None: logger.debug("Initialising orders cache...") self.last_cleaning_block_index = 0 diff --git a/counterparty-core/counterpartycore/lib/ledger/events.py b/counterparty-core/counterpartycore/lib/ledger/events.py index ce408c0c5d..6a403cab75 100644 --- a/counterparty-core/counterpartycore/lib/ledger/events.py +++ b/counterparty-core/counterpartycore/lib/ledger/events.py @@ -8,8 +8,231 @@ from counterpartycore.lib.ledger.balances import get_balance from counterpartycore.lib.ledger.caches import AssetCache, UTXOBalancesCache from counterpartycore.lib.ledger.currentstate import ConsensusHashBuilder, CurrentState +from counterpartycore.lib.ledger.migration_data.compact_hash_tables import ( + ADDRESS_NAME_COLUMNS, + ASSET_NAME_COLUMNS, + UTXO_SPLIT_COLUMNS, +) from counterpartycore.lib.parser import protocol, utxosinfo -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.utils import database, hashcodec, helpers + +# Per-table list of BLOB hash columns that need automatic ``hex -> bytes`` +# normalization at insert time. The values are still passed around as hex +# strings inside Python (consensus, API, tests); this mapping is consulted by +# ``insert_record`` to write the binary form to disk. +# +# Tables not listed here either have no hash columns (e.g. ``balances``) or +# their hash columns have been replaced by a ``tx_index`` FK and legacy +# ``*_tx_hash`` bindings are *resolved* before insert; see +# ``HASH_TO_TX_INDEX_FK`` below. +HASH_COLUMNS_BY_TABLE = { + "blocks": [ + "block_hash", + "previous_block_hash", + "ledger_hash", + "txlist_hash", + "messages_hash", + ], + "transactions": ["tx_hash"], + "mempool_transactions": ["tx_hash"], # block_hash is TEXT sentinel "mempool", not a real hash + "mempool": ["tx_hash"], + "messages": ["event_hash"], + "transaction_outputs": [], + "orders": ["tx_hash"], + "order_matches": ["tx0_hash", "tx1_hash"], + "order_expirations": ["order_hash"], + "bets": ["tx_hash"], + "bet_matches": ["tx0_hash", "tx1_hash"], + "bet_expirations": ["bet_hash"], + "rps": ["tx_hash", "move_random_hash"], + "rps_matches": [ + "tx0_hash", + "tx1_hash", + "tx0_move_random_hash", + "tx1_move_random_hash", + ], + "rps_expirations": ["rps_hash"], + "rpsresolves": ["tx_hash"], + "issuances": ["tx_hash"], + "broadcasts": ["tx_hash"], + "btcpays": ["tx_hash"], + "burns": ["tx_hash"], + "cancels": ["tx_hash"], + "dividends": ["tx_hash"], + "destructions": ["tx_hash"], + "sweeps": ["tx_hash"], + "sends": ["tx_hash"], + "dispensers": ["tx_hash", "last_status_tx_hash"], + "dispenses": ["tx_hash"], + "dispenser_refills": ["tx_hash"], + "fairminters": ["tx_hash"], + "fairmints": ["tx_hash"], + "pools": ["tx_hash"], + "pool_deposits": ["tx_hash"], + "pool_withdrawals": ["tx_hash"], + "pool_matches": ["tx_hash"], +} + + +# Legacy ``hex tx_hash`` columns that have been replaced by a ``tx_index`` +# FK in the optimized schema. ``insert_record`` resolves the hex value to +# its tx_index via the ``transactions`` table just before issuing the +# INSERT, so callers (message handlers) can keep using the legacy field +# names without modification. +# +# Mapping: table -> {legacy_hex_column: new_index_column} +HASH_TO_TX_INDEX_FK = { + "dispenses": {"dispenser_tx_hash": "dispenser_tx_index"}, + "dispenser_refills": {"dispenser_tx_hash": "dispenser_tx_index"}, + "fairmints": {"fairminter_tx_hash": "fairminter_tx_index"}, + "pool_matches": {"order_tx_hash": "order_tx_index"}, + "cancels": {"offer_hash": "offer_tx_index"}, +} + + +# Match tables whose composite TEXT ``id`` (``tx0hash_tx1hash``) has been +# dropped in the optimized schema: the match is keyed by the existing +# ``(tx0_index, tx1_index)`` pair. ``insert_record`` strips the ``id`` binding +# before INSERT; the journal keeps it (consensus-critical). +MATCH_ID_TABLES = ("order_matches", "bet_matches", "rps_matches") + + +# Tables that referenced a match through a single TEXT ``*_match_id`` column. +# That column is replaced by a ``(*_tx0_index, *_tx1_index)`` integer pair; +# ``insert_record`` splits the hex id and resolves each half to its tx_index +# just before INSERT, so message handlers keep passing the legacy field. +# +# Mapping: table -> (legacy_id_column, tx0_index_column, tx1_index_column) +MATCH_ID_TO_TX_INDEX_FK = { + "order_match_expirations": ( + "order_match_id", + "order_match_tx0_index", + "order_match_tx1_index", + ), + "bet_match_expirations": ("bet_match_id", "bet_match_tx0_index", "bet_match_tx1_index"), + "rps_match_expirations": ("rps_match_id", "rps_match_tx0_index", "rps_match_tx1_index"), + "bet_match_resolutions": ("bet_match_id", "bet_match_tx0_index", "bet_match_tx1_index"), + "btcpays": ("order_match_id", "order_match_tx0_index", "order_match_tx1_index"), + "rpsresolves": ("rps_match_id", "rps_match_tx0_index", "rps_match_tx1_index"), +} + + +def _resolve_tx_index(db, tx_hash_hex): + """Look up ``tx_index`` for a hex ``tx_hash``. Returns ``None`` if the + value is ``None`` or the tx is not (yet) in the table; callers must + tolerate the latter (e.g. dispenser refresh references the dispenser's + own row inserted earlier in the same block).""" + if tx_hash_hex is None: + return None + blob = hashcodec.hash_to_db(tx_hash_hex) + cursor = db.cursor() + cursor.execute("SELECT tx_index FROM transactions WHERE tx_hash = ?", (blob,)) + row = cursor.fetchone() + cursor.close() + if row is None: + return None + return row["tx_index"] + + +def _resolve_match_indexes(db, match_id): + """Split a composite ``tx0hash_tx1hash`` match id and resolve each half to + its ``tx_index``. Returns ``(None, None)`` when the id is ``None`` or + malformed (mirrors the permissive ``_resolve_tx_index`` contract: an + unresolvable id -- e.g. an invalid btcpay -- yields NULL indexes).""" + if match_id is None: + return None, None + parts = match_id.split(helpers.ID_SEPARATOR) + if len(parts) != 2: + return None, None + return _resolve_tx_index(db, parts[0]), _resolve_tx_index(db, parts[1]) + + +def _address_id(db, address): + """Resolve an address string to its compact ``address_id``, creating the + ``address_list`` row first if needed. ``None`` (and any non-str) passes + through unchanged (e.g. the ``address`` column on a UTXO balance is NULL).""" + if address is None or not isinstance(address, str): + return address + ensure_address(db, address) + return database.address_index_from_name(db, address) + + +def _split_utxo(utxo): + """Split a ``tx_hash:vout`` UTXO string into ``(utxo_tx_hash, utxo_vout)`` + (BLOB tx_hash + int vout). Delegates to ``database.split_utxo`` (the single + shared choke point).""" + return database.split_utxo(utxo) + + +def _prepare_record_for_insert(db, table_name, record): + """Return a copy of ``record`` with hash columns normalized to BLOB and + any legacy hash columns resolved to their new ``*_tx_index`` FK form.""" + out = dict(record) + + # Resolve legacy hex hash -> tx_index and drop the legacy field. + fk_map = HASH_TO_TX_INDEX_FK.get(table_name) + if fk_map: + for legacy_col, new_col in fk_map.items(): + if legacy_col in out and new_col not in out: + out[new_col] = _resolve_tx_index(db, out.pop(legacy_col)) + elif legacy_col in out and new_col in out: + out.pop(legacy_col) + + # Drop the composite TEXT ``id`` on match tables (the match is keyed by + # the existing ``(tx0_index, tx1_index)`` pair, which the handlers already + # supply in the bindings). + if table_name in MATCH_ID_TABLES: + out.pop("id", None) + + # Split the legacy composite ``*_match_id`` into its ``(tx0_index, + # tx1_index)`` pair on referencing tables. + match_fk = MATCH_ID_TO_TX_INDEX_FK.get(table_name) + if match_fk: + legacy_col, tx0_col, tx1_col = match_fk + if legacy_col in out: + tx0_index, tx1_index = _resolve_match_indexes(db, out.pop(legacy_col)) + out.setdefault(tx0_col, tx0_index) + out.setdefault(tx1_col, tx1_index) + + # Convert hex strings to BLOB for known hash columns. We tolerate + # both bytes (already converted) and None. + hash_cols = HASH_COLUMNS_BY_TABLE.get(table_name) + if hash_cols: + for col in hash_cols: + if col in out: + out[col] = hashcodec.hash_to_db(out[col]) + + # Convert asset *name* columns to the compact integer ``asset_index`` FK. + # The journal keeps the original ``record`` (names), so the consensus + # ``bindings_string`` stays name-based; only the stored row uses the index. + # An unregistered name (invalid record) resolves to NULL. + asset_cols = ASSET_NAME_COLUMNS.get(table_name) + if asset_cols: + for col in asset_cols: + if col in out and isinstance(out[col], str): + out[col] = database.asset_index_from_name(db, out[col]) + + # Convert address columns to the compact integer ``address_id`` FK. The + # address row is created first if needed (``ensure_address``); the journal + # keeps the original ``record`` (strings) so consensus is unchanged. A + # ``None`` address (e.g. the ``address`` column on a UTXO balance) stays + # NULL. + address_cols = ADDRESS_NAME_COLUMNS.get(table_name) + if address_cols: + for col in address_cols: + if col in out and isinstance(out[col], str): + out[col] = _address_id(db, out[col]) + + # Split the legacy ``utxo`` TEXT (``tx_hash:vout``) into the compact + # ``(utxo_tx_hash, utxo_vout)`` pair. The journal keeps the original + # ``utxo`` string, so consensus is unchanged. + utxo_split = UTXO_SPLIT_COLUMNS.get(table_name) + if utxo_split: + legacy_col, tx_hash_col, vout_col = utxo_split + if legacy_col in out: + out[tx_hash_col], out[vout_col] = _split_utxo(out.pop(legacy_col)) + + return out @contextmanager @@ -21,13 +244,49 @@ def get_cursor(db): cursor.close() +def ensure_asset(db, asset_id, asset_name, block_index, asset_longname): + """Create the ``assets`` row (DB only, no journal) if it does not exist + yet, so records inserted *before* their ``ASSET_CREATION`` event -- e.g. a + fairminter referencing the asset it is about to mint -- can still resolve + the compact ``asset_index``. The subsequent ``ASSET_CREATION`` insert is + idempotent (``INSERT OR IGNORE`` on ``assets``), so the consensus event + order is preserved while the storage row exists early.""" + with get_cursor(db) as cursor: + cursor.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name, block_index, asset_longname) " + "VALUES (?, ?, ?, ?)", + (str(asset_id), asset_name, block_index, asset_longname), + ) + + +def ensure_address(db, address): + """Create the ``address_list`` row (DB only, no journal) for ``address`` if + it does not exist yet, so the compact ``address_id`` always resolves at + write time. Addresses have no creation event -- they are first-seen-on-use + -- so this is called from the write path (``_address_id``) for every address + column just before INSERT. ``INSERT OR IGNORE`` keeps it idempotent and + monotonic (the ``address_id`` is assigned once, on first sighting).""" + if address is None: + return + with get_cursor(db) as cursor: + cursor.execute( + "INSERT OR IGNORE INTO address_list (address) VALUES (?)", + (address,), + ) + + def insert_record(db, table_name, record, event, event_info=None): - fields = list(record.keys()) + record_for_db = _prepare_record_for_insert(db, table_name, record) + fields = list(record_for_db.keys()) placeholders = ", ".join(["?" for _ in fields]) - query = f"INSERT INTO {table_name} ({', '.join(fields)}) VALUES ({placeholders})" # noqa: S608 # nosec B608 + # ``assets`` may have been pre-created (DB only) by ``ensure_asset`` so an + # earlier record could resolve its ``asset_index``; tolerate the duplicate + # while still emitting the ASSET_CREATION journal entry below. + or_ignore = "OR IGNORE " if table_name == "assets" else "" + query = f"INSERT {or_ignore}INTO {table_name} ({', '.join(fields)}) VALUES ({placeholders})" # noqa: S608 # nosec B608 with get_cursor(db) as cursor: - cursor.execute(query, list(record.values())) + cursor.execute(query, list(record_for_db.values())) if table_name in ["issuances", "destructions"] and not CurrentState().parsing_mempool(): cursor.execute("SELECT last_insert_rowid() AS rowid") inserted_rowid = cursor.fetchone()["rowid"] @@ -58,15 +317,45 @@ def insert_record(db, table_name, record, event, event_info=None): # order updates and retrieve the row with the current data. def insert_update(db, table_name, id_name, id_value, update_data, event, event_info=None): # noqa: B006 cursor = db.cursor() - # select records to update - select_query = f""" - SELECT *, rowid - FROM {table_name} - WHERE {id_name} = ? - ORDER BY rowid DESC - LIMIT 1 - """ # nosec B608 # noqa: S608 # nosec B608 - bindings = (id_value,) + # The id may be a hex hash and the underlying column may be BLOB; convert + # consistently so SQLite can match the at-rest representation. + # ``hash_to_db`` is permissive: it passes ``bytes``/``None`` through, hex + # strings -> BLOB(32), and non-hex strings -> UTF-8 bytes (consistent + # with INSERT paths for synthetic test fixtures). Only triggered for + # ``id_name``s that are actually hash columns; non-hash ids like + # ``rowid`` / ``id`` (composite text) / ``address`` are bound as-is. + if table_name in MATCH_ID_TABLES and id_name == "id": + # The composite TEXT ``id`` is no longer a stored column; match on the + # ``(tx0_index, tx1_index)`` pair resolved from the text id. The + # journal below still records the original text id (consensus). + tx0_index, tx1_index = _resolve_match_indexes(db, id_value) + select_query = f""" + SELECT *, rowid + FROM {table_name} + WHERE tx0_index = ? AND tx1_index = ? + ORDER BY rowid DESC + LIMIT 1 + """ # nosec B608 # noqa: S608 # nosec B608 + bindings = (tx0_index, tx1_index) + else: + if id_name in hashcodec.HASH_COLUMN_NAMES: + id_bind = hashcodec.hash_to_db(id_value) + elif id_name in database.ADDRESS_INDEX_COLUMN_NAMES: + # The matched column is now an ``address_id`` INTEGER FK (e.g. the + # ``addresses`` options table keyed on ``address``); resolve the + # string id to its compact index so the WHERE matches the at-rest + # representation. + id_bind = database.address_index_from_name(db, id_value) + else: + id_bind = id_value + select_query = f""" + SELECT *, rowid + FROM {table_name} + WHERE {id_name} = ? + ORDER BY rowid DESC + LIMIT 1 + """ # nosec B608 # noqa: S608 # nosec B608 + bindings = (id_bind,) need_update_record = cursor.execute(select_query, bindings).fetchone() # update record @@ -83,6 +372,7 @@ def insert_update(db, table_name, id_name, id_value, update_data, event, event_i # insert new record if "rowid" in new_record: del new_record["rowid"] + new_record = _prepare_record_for_insert(db, table_name, new_record) fields_name = ", ".join(new_record.keys()) fields_values = ", ".join([f":{key}" for key in new_record.keys()]) # no sql injection here @@ -99,11 +389,14 @@ def insert_update(db, table_name, id_name, id_value, update_data, event, event_i def last_message(db): - """Return latest message from the db.""" + """Return latest message from the db. Exposes the legacy ``tx_hash`` hex + string by joining on ``transactions`` (``messages.tx_index`` is the + storage column after the compact-hash migration).""" cursor = db.cursor() query = """ - SELECT * FROM messages - WHERE message_index = ( + SELECT m.*, (SELECT t.tx_hash FROM transactions t WHERE t.tx_index = m.tx_index) AS tx_hash + FROM messages m + WHERE m.message_index = ( SELECT MAX(message_index) from messages ) """ @@ -127,11 +420,22 @@ def add_to_journal(db, block_index, command, category, event, bindings): try: previous_message = last_message(db) message_index = previous_message["message_index"] + 1 - previous_event_hash = previous_message["event_hash"] or "" + # The rowtracer already converts BLOB event_hash back to hex, but be + # defensive in case the row trace is bypassed somewhere. + prev_eh = previous_message["event_hash"] + previous_event_hash = ( + hashcodec.hash_from_db(prev_eh) if isinstance(prev_eh, bytes) else (prev_eh or "") + ) except exceptions.DatabaseError: message_index = 0 previous_event_hash = "" + # The consensus-critical ``bindings_string`` JSON MUST stay byte-identical + # to the pre-optimization release: hashes (which the message handlers + # always pass as hex strings) must remain hex; ``bytes`` values found in + # ``data`` style fields must be hex-encoded; ``None`` stays None. The + # original implementation converts bytes -> hex which already covers both + # cases (BLOB hashes coming from row dicts and binary ``data`` payloads). items = { key: binascii.hexlify(value).decode("ascii") if isinstance(value, bytes) else value for key, value in bindings.items() @@ -152,6 +456,15 @@ def add_to_journal(db, block_index, command, category, event, bindings): ] ) event_hash = binascii.hexlify(helpers.dhash(event_hash_content)).decode("ascii") + # ``messages.tx_hash`` has been replaced by ``messages.tx_index`` + # (INTEGER FK into ``transactions``). Resolve from the in-flight tx_hash + # via CurrentState. For block-level events (BLOCK_PARSED, EXPIRE_*) the + # tx context is None, so tx_index stays NULL. + current_tx_hash_hex = CurrentState().current_tx_hash() + tx_index = None + if current_tx_hash_hex is not None: + tx_index = _resolve_tx_index(db, current_tx_hash_hex) + event_hash_blob = hashcodec.hash_to_db(event_hash) message_bindings = { "message_index": message_index, "block_index": block_index, @@ -160,11 +473,11 @@ def add_to_journal(db, block_index, command, category, event, bindings): "bindings": bindings_string, "timestamp": current_time, "event": event, - "tx_hash": CurrentState().current_tx_hash(), - "event_hash": event_hash, + "tx_index": tx_index, + "event_hash": event_hash_blob, } query = """INSERT INTO messages ( - message_index, block_index, command, category, bindings, timestamp, event, tx_hash, event_hash + message_index, block_index, command, category, bindings, timestamp, event, tx_index, event_hash ) VALUES ( :message_index, :block_index, @@ -173,7 +486,7 @@ def add_to_journal(db, block_index, command, category, event, bindings): :bindings, :timestamp, :event, - :tx_hash, + :tx_index, :event_hash )""" cursor = db.cursor() @@ -211,18 +524,26 @@ def remove_from_balance(db, address, asset, quantity, tx_index, utxo_address=Non UTXOBalancesCache(db).remove_balance(utxo) if not no_balance: # don't create balance if quantity is 0 and there is no balance + # ``balances`` is written with raw SQL (it bypasses + # ``_prepare_record_for_insert``), so resolve the address/utxo_address + # to ``address_id`` and split the ``utxo`` string into the BLOB + # tx_hash + vout pair here, mirroring the asset_index resolution. + utxo_tx_hash, utxo_vout = _split_utxo(utxo) bindings = { "quantity": balance, - "address": balance_address, - "utxo": utxo, - "utxo_address": utxo_address, - "asset": asset, + "address": _address_id(db, balance_address), + "utxo_tx_hash": utxo_tx_hash, + "utxo_vout": utxo_vout, + "utxo_address": _address_id(db, utxo_address), + # balances stores the compact ``asset_index``; the name always + # resolves here (a balance only exists for an issued asset). + "asset": database.asset_index_from_name(db, asset), "block_index": CurrentState().current_block_index(), "tx_index": tx_index, } query = """ - INSERT INTO balances (address, asset, quantity, block_index, tx_index, utxo, utxo_address) - VALUES (:address, :asset, :quantity, :block_index, :tx_index, :utxo, :utxo_address) + INSERT INTO balances (address, asset, quantity, block_index, tx_index, utxo_tx_hash, utxo_vout, utxo_address) + VALUES (:address, :asset, :quantity, :block_index, :tx_index, :utxo_tx_hash, :utxo_vout, :utxo_address) """ balance_cursor.execute(query, bindings) @@ -293,18 +614,24 @@ def add_to_balance(db, address, asset, quantity, tx_index, utxo_address=None): if not CurrentState().parsing_mempool() and balance > 0: UTXOBalancesCache(db).add_balance(utxo) + # ``balances`` is written with raw SQL (it bypasses + # ``_prepare_record_for_insert``), so resolve the address/utxo_address to + # ``address_id`` and split the ``utxo`` string into the BLOB tx_hash + vout. + utxo_tx_hash, utxo_vout = _split_utxo(utxo) bindings = { "quantity": balance, - "address": balance_address, - "utxo": utxo, - "utxo_address": utxo_address, - "asset": asset, + "address": _address_id(db, balance_address), + "utxo_tx_hash": utxo_tx_hash, + "utxo_vout": utxo_vout, + "utxo_address": _address_id(db, utxo_address), + # balances stores the compact ``asset_index`` (resolved from the name). + "asset": database.asset_index_from_name(db, asset), "block_index": CurrentState().current_block_index(), "tx_index": tx_index, } query = """ - INSERT INTO balances (address, asset, quantity, block_index, tx_index, utxo, utxo_address) - VALUES (:address, :asset, :quantity, :block_index, :tx_index, :utxo, :utxo_address) + INSERT INTO balances (address, asset, quantity, block_index, tx_index, utxo_tx_hash, utxo_vout, utxo_address) + VALUES (:address, :asset, :quantity, :block_index, :tx_index, :utxo_tx_hash, :utxo_vout, :utxo_address) """ balance_cursor.execute(query, bindings) @@ -361,21 +688,27 @@ def get_messages(db, block_index=None, block_index_in=None, message_index_in=Non where = [] bindings = [] if block_index is not None: - where.append("block_index = ?") + where.append("m.block_index = ?") bindings.append(block_index) if block_index_in is not None: - where.append(f"block_index IN ({','.join(['?' for e in range(0, len(block_index_in))])})") + where.append(f"m.block_index IN ({','.join(['?' for e in range(0, len(block_index_in))])})") bindings += block_index_in if message_index_in is not None: where.append( - f"message_index IN ({','.join(['?' for e in range(0, len(message_index_in))])})" + f"m.message_index IN ({','.join(['?' for e in range(0, len(message_index_in))])})" ) bindings += message_index_in - # no sql injection here + # no sql injection here -- expose tx_hash via JOIN (messages.tx_hash + # was dropped in favour of an FK on transactions). + select = ( + "SELECT m.*, " + "(SELECT t.tx_hash FROM transactions t WHERE t.tx_index = m.tx_index) AS tx_hash " + "FROM messages m" + ) if len(where) == 0: - query = """SELECT * FROM messages ORDER BY message_index ASC LIMIT ?""" + query = f"""{select} ORDER BY m.message_index ASC LIMIT ?""" else: - query = f"""SELECT * FROM messages WHERE ({" AND ".join(where)}) ORDER BY message_index ASC LIMIT ?""" # nosec B608 # noqa: S608 # nosec B608 + query = f"""{select} WHERE ({" AND ".join(where)}) ORDER BY m.message_index ASC LIMIT ?""" # nosec B608 # noqa: S608 # nosec B608 bindings.append(limit) cursor.execute(query, tuple(bindings)) return cursor.fetchall() diff --git a/counterparty-core/counterpartycore/lib/ledger/issuances.py b/counterparty-core/counterpartycore/lib/ledger/issuances.py index d01fb6d282..e1aa1f3a37 100644 --- a/counterparty-core/counterpartycore/lib/ledger/issuances.py +++ b/counterparty-core/counterpartycore/lib/ledger/issuances.py @@ -11,7 +11,7 @@ from counterpartycore.lib.ledger.events import insert_update from counterpartycore.lib.ledger.supplies import asset_supply from counterpartycore.lib.parser import protocol -from counterpartycore.lib.utils import assetnames +from counterpartycore.lib.utils import assetnames, database, hashcodec logger = logging.getLogger(config.LOGGER_NAME) @@ -165,7 +165,7 @@ def is_divisible(db, asset): WHERE (status = ? AND asset = ?) ORDER BY tx_index DESC """ - bindings = ("valid", asset) + bindings = ("valid", database.asset_index_from_name(db, asset)) cursor.execute(query, bindings) issuances = cursor.fetchall() if not issuances: @@ -255,7 +255,7 @@ def get_asset_issuer(db, asset): WHERE (status = ? AND asset = ?) ORDER BY tx_index DESC """ - bindings = ("valid", asset) + bindings = ("valid", database.asset_index_from_name(db, asset)) cursor.execute(query, bindings) issuances = cursor.fetchall() if not issuances: @@ -273,7 +273,7 @@ def get_asset_description(db, asset): WHERE (status = ? AND asset = ?) ORDER BY tx_index DESC """ - bindings = ("valid", asset) + bindings = ("valid", database.asset_index_from_name(db, asset)) cursor.execute(query, bindings) issuances = cursor.fetchall() if not issuances: @@ -288,7 +288,7 @@ def get_issuances_count(db, address): FROM issuances WHERE issuer = ? """ - bindings = (address,) + bindings = (database.address_index_from_name(db, address),) cursor.execute(query, bindings) return cursor.fetchall()[0]["cnt"] @@ -300,7 +300,7 @@ def get_asset_issued(db, address): FROM issuances WHERE issuer = ? """ - bindings = (address,) + bindings = (database.address_index_from_name(db, address),) cursor.execute(query, bindings) return cursor.fetchall() @@ -375,7 +375,7 @@ def get_issuances( bindings.append(status) if asset is not None: where.append("asset = ?") - bindings.append(asset) + bindings.append(database.asset_index_from_name(db, asset)) if locked is not None: where.append("locked = ?") bindings.append(locked) @@ -425,7 +425,11 @@ def get_asset(db, asset): WHERE ({name_field} = ? AND status = ?) ORDER BY tx_index DESC """ # nosec B608 # noqa: S608 # nosec B608 - bindings = (asset, "valid") + # ``asset_longname`` stays TEXT; only the ``asset`` column is the index FK. + bind_asset = ( + asset if name_field == "asset_longname" else database.asset_index_from_name(db, asset) + ) + bindings = (bind_asset, "valid") cursor.execute(query, bindings) issuances = cursor.fetchall() if not issuances: @@ -488,7 +492,7 @@ def get_fairminter_by_asset(db, asset): WHERE asset = ? ORDER BY rowid DESC LIMIT 1 """ - bindings = (asset,) + bindings = (database.asset_index_from_name(db, asset),) cursor.execute(query, bindings) return cursor.fetchone() @@ -520,9 +524,11 @@ def get_fairmint_quantities(db, fairminter_tx_hash): SUM(paid_quantity) AS paid_quantity, SUM(commission) AS commission FROM fairmints - WHERE fairminter_tx_hash = ? AND status = ? + WHERE fairminter_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) AND status = ? """ - bindings = (fairminter_tx_hash, "valid") + bindings = (hashcodec.hash_to_db(fairminter_tx_hash), "valid") cursor.execute(query, bindings) sums = cursor.fetchone() return (sums["quantity"] or 0) + (sums["commission"] or 0), (sums["paid_quantity"] or 0) @@ -534,9 +540,15 @@ def get_fairmint_by_address(db, fairminter_tx_hash, source): SELECT SUM(earn_quantity) AS quantity FROM fairmints - WHERE fairminter_tx_hash = ? AND status = ? AND source = ? + WHERE fairminter_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) AND status = ? AND source = ? """ - bindings = (fairminter_tx_hash, "valid", source) + bindings = ( + hashcodec.hash_to_db(fairminter_tx_hash), + "valid", + database.address_index_from_name(db, source), + ) cursor.execute(query, bindings) sums = cursor.fetchone() return sums["quantity"] or 0 @@ -565,9 +577,11 @@ def get_valid_fairmints(db, fairminter_tx_hash): cursor = db.cursor() query = """ SELECT * FROM fairmints - WHERE fairminter_tx_hash = ? AND status = ? + WHERE fairminter_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) AND status = ? """ - bindings = (fairminter_tx_hash, "valid") + bindings = (hashcodec.hash_to_db(fairminter_tx_hash), "valid") cursor.execute(query, bindings) return cursor.fetchall() diff --git a/counterparty-core/counterpartycore/lib/ledger/markets.py b/counterparty-core/counterpartycore/lib/ledger/markets.py index d80e35a697..665861c784 100644 --- a/counterparty-core/counterpartycore/lib/ledger/markets.py +++ b/counterparty-core/counterpartycore/lib/ledger/markets.py @@ -7,6 +7,8 @@ from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.ledger.events import credit, insert_record, insert_update from counterpartycore.lib.parser import protocol +from counterpartycore.lib.utils import database, hashcodec, helpers +from counterpartycore.lib.utils.helpers import MATCH_ID_SQL logger = logging.getLogger(config.LOGGER_NAME) @@ -213,59 +215,72 @@ def compute_pool_fill(reserve_in, reserve_out, max_give, fee_bps, block_index=No def get_pending_order_matches(db, tx0_hash, tx1_hash): cursor = db.cursor() - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) as rowid FROM order_matches + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) as rowid FROM order_matches WHERE ( tx0_hash in (:tx0_hash, :tx1_hash) OR tx1_hash in (:tx0_hash, :tx1_hash) ) - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = :status ORDER BY rowid - """ - bindings = {"status": "pending", "tx0_hash": tx0_hash, "tx1_hash": tx1_hash} + """ # noqa: S608 # nosec B608 + bindings = { + "status": "pending", + "tx0_hash": hashcodec.hash_to_db(tx0_hash), + "tx1_hash": hashcodec.hash_to_db(tx1_hash), + } cursor.execute(query, bindings) return cursor.fetchall() def get_pending_btc_order_matches(db, address): cursor = db.cursor() - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) AS rowid + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) AS rowid FROM order_matches WHERE (tx0_address = ? AND forward_asset = ?) OR (tx1_address = ? AND backward_asset = ?) ) WHERE status = ? ORDER BY rowid - """ - bindings = (address, config.BTC, address, config.BTC, "pending") + """ # noqa: S608 # nosec B608 + btc_idx = database.asset_index_from_name(db, config.BTC) + address_id = database.address_index_from_name(db, address) + bindings = (address_id, btc_idx, address_id, btc_idx, "pending") cursor.execute(query, bindings) return cursor.fetchall() def get_order_match(db, match_id): cursor = db.cursor() - query = """ - SELECT *, rowid + # ``match_id`` is the composite ``tx0hash_tx1hash`` text; split it and match + # on the underlying hash pair (the TEXT ``id`` column no longer exists). + # A malformed/None id matches nothing, mirroring the old ``WHERE id = ?``. + parts = match_id.split(helpers.ID_SEPARATOR) if isinstance(match_id, str) else [] + if len(parts) != 2: + return [] + tx0_hash, tx1_hash = parts + query = f""" + SELECT *, {MATCH_ID_SQL} AS id, rowid FROM order_matches - WHERE id = ? - ORDER BY rowid DESC LIMIT 1""" - bindings = (match_id,) + WHERE tx0_hash = ? AND tx1_hash = ? + ORDER BY rowid DESC LIMIT 1""" # noqa: S608 # nosec B608 + bindings = (hashcodec.hash_to_db(tx0_hash), hashcodec.hash_to_db(tx1_hash)) cursor.execute(query, bindings) return cursor.fetchall() def get_order_matches_to_expire(db, block_index): cursor = db.cursor() - query = """SELECT * FROM ( - SELECT *, MAX(rowid) AS rowid + query = f"""SELECT * FROM ( + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) AS rowid FROM order_matches WHERE match_expire_index = ? - 1 - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = ? ORDER BY rowid - """ + """ # noqa: S608 # nosec B608 bindings = (block_index, "pending") cursor.execute(query, bindings) return cursor.fetchall() @@ -282,7 +297,7 @@ def get_order(db, order_hash: str): WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1 """ - bindings = (order_hash,) + bindings = (hashcodec.hash_to_db(order_hash),) cursor.execute(query, bindings) return cursor.fetchall() @@ -293,7 +308,7 @@ def get_order_first_block_index(cursor, tx_hash): WHERE tx_hash = ? ORDER BY rowid ASC LIMIT 1 """ - bindings = (tx_hash,) + bindings = (hashcodec.hash_to_db(tx_hash),) cursor.execute(query, bindings) return cursor.fetchone()["block_index"] @@ -325,7 +340,11 @@ def get_open_btc_orders(db, address): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (address, config.BTC, "open") + bindings = ( + database.address_index_from_name(db, address), + database.asset_index_from_name(db, config.BTC), + "open", + ) cursor.execute(query, bindings) return cursor.fetchall() @@ -341,7 +360,7 @@ def get_open_orders_by_source(db, address): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (address, "open") + bindings = (database.address_index_from_name(db, address), "open") cursor.execute(query, bindings) return cursor.fetchall() @@ -357,7 +376,12 @@ def get_matching_orders_no_cache(db, tx_hash, give_asset, get_asset): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (tx_hash, get_asset, give_asset, "open") + bindings = ( + hashcodec.hash_to_db(tx_hash), + database.asset_index_from_name(db, get_asset), + database.asset_index_from_name(db, give_asset), + "open", + ) cursor.execute(query, bindings) return cursor.fetchall() @@ -384,12 +408,15 @@ def update_order(db, tx_hash, update_data): def mark_order_as_filled(db, tx0_hash, tx1_hash, source=None): - select_bindings = {"tx0_hash": tx0_hash, "tx1_hash": tx1_hash} + select_bindings = { + "tx0_hash": hashcodec.hash_to_db(tx0_hash), + "tx1_hash": hashcodec.hash_to_db(tx1_hash), + } where_source = "" if source is not None: where_source = " AND source = :source" - select_bindings["source"] = source + select_bindings["source"] = database.address_index_from_name(db, source) # no sql injection here select_query = f""" @@ -447,7 +474,7 @@ def get_dispenser_info(db, tx_hash=None, tx_index=None): bindings = [] if tx_hash is not None: where.append("tx_hash = ?") - bindings.append(tx_hash) + bindings.append(hashcodec.hash_to_db(tx_hash)) if tx_index is not None: where.append("tx_index = ?") bindings.append(tx_index) @@ -476,11 +503,13 @@ def get_dispensers_info(db, tx_hash_list): WHERE tx_hash IN ({",".join(["?" for e in range(0, len(tx_hash_list))])}) GROUP BY tx_hash """ # nosec B608 # noqa: S608 # nosec B608 - cursor.execute(query, tx_hash_list) + cursor.execute(query, [hashcodec.hash_to_db(h) for h in tx_hash_list]) dispensers = cursor.fetchall() result = {} for dispenser in dispensers: del dispenser["rowid"] + # rowtracer converts BLOB -> hex; key the result on the hex form so + # callers passing hex keys can index it back. tx_hash = dispenser["tx_hash"] del dispenser["tx_hash"] del dispenser["asset"] @@ -489,13 +518,18 @@ def get_dispensers_info(db, tx_hash_list): def get_refilling_count(db, dispenser_tx_hash): + # ``dispenser_refills.dispenser_tx_hash`` was replaced by an integer + # ``dispenser_tx_index`` FK; translate the hex hash via the + # ``transactions`` table. cursor = db.cursor() query = """ SELECT count(*) cnt FROM dispenser_refills - WHERE dispenser_tx_hash = ? + WHERE dispenser_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) """ - bindings = (dispenser_tx_hash,) + bindings = (hashcodec.hash_to_db(dispenser_tx_hash),) cursor.execute(query, bindings) return cursor.fetchall()[0]["cnt"] @@ -533,7 +567,11 @@ def get_dispensers_count(db, source, status, origin): ) WHERE status = ? ORDER BY tx_index """ - bindings = (source, origin, status) + bindings = ( + database.address_index_from_name(db, source), + database.address_index_from_name(db, origin), + status, + ) cursor.execute(query, bindings) return cursor.fetchall()[0]["cnt"] @@ -555,16 +593,16 @@ def get_dispensers( first_where = [] if address is not None: first_where.append("source = ?") - bindings.append(address) + bindings.append(database.address_index_from_name(db, address)) if source_in is not None: first_where.append(f"source IN ({','.join(['?' for e in range(0, len(source_in))])})") - bindings += source_in + bindings += [database.address_index_from_name(db, s) for s in source_in] if asset is not None: first_where.append("asset = ?") - bindings.append(asset) + bindings.append(database.asset_index_from_name(db, asset)) if origin is not None: first_where.append("origin = ?") - bindings.append(origin) + bindings.append(database.address_index_from_name(db, origin)) # where for mutable fields second_where = [] if status is not None: @@ -580,7 +618,16 @@ def get_dispensers( second_where_str = " AND ".join(second_where) if second_where_str != "": second_where_str = f"WHERE ({second_where_str})" - order_clause = f"ORDER BY {order_by}" if order_by is not None else "ORDER BY tx_index" + if order_by == "asset": + # ``asset`` is stored as the compact asset_index; ordering by it would + # change the (consensus-relevant) dispenser processing order in + # ``dispense.parse``. Order by the resolved asset *name* to reproduce + # the exact pre-normalization ordering. + order_clause = "ORDER BY (SELECT asset_name FROM assets WHERE asset_index = asset)" + elif order_by is not None: + order_clause = f"ORDER BY {order_by}" + else: + order_clause = "ORDER BY tx_index" group_clause = f"GROUP BY {group_by}" if group_by is not None else "GROUP BY asset, source" # no sql injection here query = f""" @@ -626,7 +673,10 @@ def get_pool(db, asset_a, asset_b): WHERE asset_a = ? AND asset_b = ? ORDER BY rowid DESC LIMIT 1 """ - bindings = (asset_a, asset_b) + bindings = ( + database.asset_index_from_name(db, asset_a), + database.asset_index_from_name(db, asset_b), + ) cursor.execute(query, bindings) pools = cursor.fetchall() cursor.close() @@ -672,7 +722,13 @@ def get_pool_deposits(db, asset_a, asset_b): WHERE asset_a = ? AND asset_b = ? AND status = 'valid' ORDER BY block_index, tx_index """ - cursor.execute(query, (asset_a, asset_b)) + cursor.execute( + query, + ( + database.asset_index_from_name(db, asset_a), + database.asset_index_from_name(db, asset_b), + ), + ) return cursor.fetchall() @@ -683,7 +739,13 @@ def get_pool_withdrawals(db, asset_a, asset_b): WHERE asset_a = ? AND asset_b = ? AND status = 'valid' ORDER BY block_index, tx_index """ - cursor.execute(query, (asset_a, asset_b)) + cursor.execute( + query, + ( + database.asset_index_from_name(db, asset_a), + database.asset_index_from_name(db, asset_b), + ), + ) return cursor.fetchall() @@ -698,18 +760,30 @@ def get_open_orders_for_pair(db, give_asset, get_asset): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - cursor.execute(query, (give_asset, get_asset, "open")) + cursor.execute( + query, + ( + database.asset_index_from_name(db, give_asset), + database.asset_index_from_name(db, get_asset), + "open", + ), + ) return cursor.fetchall() def get_pool_matches_by_order(db, order_tx_hash): + # ``pool_matches.order_tx_hash`` was replaced by an integer + # ``order_tx_index`` FK; translate the hex hash via the + # ``transactions`` table. cursor = db.cursor() query = """ SELECT * FROM pool_matches - WHERE order_tx_hash = ? + WHERE order_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) ORDER BY block_index, tx_index """ - cursor.execute(query, (order_tx_hash,)) + cursor.execute(query, (hashcodec.hash_to_db(order_tx_hash),)) return cursor.fetchall() @@ -724,7 +798,10 @@ def update_pool(db, asset_a, asset_b, new_reserve_a, new_reserve_b): cursor = db.cursor() cursor.execute( "SELECT rowid FROM pools WHERE asset_a = ? AND asset_b = ? ORDER BY rowid DESC LIMIT 1", - (asset_a, asset_b), + ( + database.asset_index_from_name(db, asset_a), + database.asset_index_from_name(db, asset_b), + ), ) row = cursor.fetchone() cursor.close() diff --git a/counterparty-core/counterpartycore/lib/ledger/migration_data/__init__.py b/counterparty-core/counterpartycore/lib/ledger/migration_data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_schema.py b/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_schema.py new file mode 100644 index 0000000000..45892c6198 --- /dev/null +++ b/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_schema.py @@ -0,0 +1,876 @@ +"""Schema rewrites used by the compact-hash storage migration. + +This module owns the bulky declarative data (indexes, triggers, views, +custom INSERT/SELECT clauses) that the ``0010.compact_hash_storage.py`` +migration applies. The companion ``compact_hash_tables`` module owns the +CREATE TABLE statements; together they replace what used to be a single +oversized migration file. +""" + +from counterpartycore.lib.ledger.migration_data.compact_hash_tables import ( + ADDRESS_NAME_COLUMNS, + ASSET_NAME_COLUMNS, + TABLE_REWRITES, + UTXO_SPLIT_COLUMNS, +) + +__all__ = [ + "ADDRESS_NAME_COLUMNS", + "ASSET_NAME_COLUMNS", + "CUSTOM_INSERT_SELECT", + "INDEXES_AFTER_REWRITE", + "NO_UPDATE_TRIGGERS", + "TABLE_REWRITES", + "TRIGGERS_AFTER_REWRITE", + "UTXO_SPLIT_COLUMNS", + "VIEWS_AFTER_REWRITE", +] + + +# Triggers that enforce the "no UPDATE" contract on every history table. +# Listed here so both the migration (drop at start, recreate at end) and the +# trigger DDL builder below share a single source of truth. +NO_UPDATE_TRIGGERS = [ + "block_update_balances", + "block_update_credits", + "block_update_debits", + "block_update_messages", + "block_update_order_match_expirations", + "block_update_order_matches", + "block_update_order_expirations", + "block_update_orders", + "block_update_bet_match_expirations", + "block_update_bet_matches", + "block_update_bet_match_resolutions", + "block_update_bet_expirations", + "block_update_bets", + "block_update_broadcasts", + "block_update_btcpays", + "block_update_burns", + "block_update_cancels", + "block_update_dividends", + "block_update_rps_match_expirations", + "block_update_rps_expirations", + "block_update_rpsresolves", + "block_update_rps_matches", + "block_update_rps", + "block_update_destructions", + "block_update_assets", + "block_update_address_list", + "block_update_addresses", + "block_update_sweeps", + "block_update_dispensers", + "block_update_dispenser_refills", + "block_update_fairmints", + "block_update_transaction_count", + "block_update_fairminters", + "block_update_dispenses", + "block_update_sends", + "block_update_issuances", +] + + +# Indexes that need to be recreated on the new (BLOB) tables. These mirror the +# index set from ``0001.initial_migration.sql`` plus the messages_tx_index_idx +# replacement for the runtime ``messages_tx_hash_idx``. +INDEXES_AFTER_REWRITE = [ + # assets (asset_index is the INTEGER PRIMARY KEY, auto-indexed) + "CREATE INDEX IF NOT EXISTS assets_asset_name_idx ON assets (asset_name)", + "CREATE INDEX IF NOT EXISTS assets_asset_id_idx ON assets (asset_id)", + "CREATE UNIQUE INDEX IF NOT EXISTS assets_asset_longname_idx ON assets (asset_longname)", + # address_list (address_id is the INTEGER PRIMARY KEY, auto-indexed). The + # ``address`` UNIQUE constraint already creates an index; this mirrors the + # explicit assets_asset_name_idx for the string->id resolver lookups. + "CREATE INDEX IF NOT EXISTS address_list_address_idx ON address_list (address)", + # debits + "CREATE INDEX IF NOT EXISTS debits_address_idx ON debits (address)", + "CREATE INDEX IF NOT EXISTS debits_asset_idx ON debits (asset)", + "CREATE INDEX IF NOT EXISTS debits_block_index_idx ON debits (block_index)", + "CREATE INDEX IF NOT EXISTS debits_event_idx ON debits (event)", + "CREATE INDEX IF NOT EXISTS debits_action_idx ON debits (action)", + "CREATE INDEX IF NOT EXISTS debits_quantity_idx ON debits (quantity)", + "CREATE INDEX IF NOT EXISTS debits_utxo_idx ON debits (utxo_tx_hash, utxo_vout)", + "CREATE INDEX IF NOT EXISTS debits_utxo_address_idx ON debits (utxo_address)", + # credits + "CREATE INDEX IF NOT EXISTS credits_address_idx ON credits (address)", + "CREATE INDEX IF NOT EXISTS credits_asset_idx ON credits (asset)", + "CREATE INDEX IF NOT EXISTS credits_block_index_idx ON credits (block_index)", + "CREATE INDEX IF NOT EXISTS credits_event_idx ON credits (event)", + "CREATE INDEX IF NOT EXISTS credits_calling_function_idx ON credits (calling_function)", + "CREATE INDEX IF NOT EXISTS credits_quantity_idx ON credits (quantity)", + "CREATE INDEX IF NOT EXISTS credits_utxo_idx ON credits (utxo_tx_hash, utxo_vout)", + "CREATE INDEX IF NOT EXISTS credits_utxo_address_idx ON credits (utxo_address)", + # balances + "CREATE INDEX IF NOT EXISTS balances_address_asset_idx ON balances (address, asset)", + "CREATE INDEX IF NOT EXISTS balances_address_idx ON balances (address)", + "CREATE INDEX IF NOT EXISTS balances_asset_idx ON balances (asset)", + "CREATE INDEX IF NOT EXISTS balances_block_index_idx ON balances (block_index)", + "CREATE INDEX IF NOT EXISTS balances_quantity_idx ON balances (quantity)", + "CREATE INDEX IF NOT EXISTS balances_utxo_idx ON balances (utxo_tx_hash, utxo_vout)", + "CREATE INDEX IF NOT EXISTS balances_utxo_address_idx ON balances (utxo_address)", + "CREATE INDEX IF NOT EXISTS balances_utxo_asset_idx ON balances (utxo_tx_hash, utxo_vout, asset)", + "CREATE INDEX IF NOT EXISTS balances_address_utxo_asset_idx ON balances (address, utxo_tx_hash, utxo_vout, asset)", + # blocks + "CREATE INDEX IF NOT EXISTS blocks_block_index_idx ON blocks (block_index)", + "CREATE INDEX IF NOT EXISTS blocks_block_index_block_hash_idx ON blocks (block_index, block_hash)", + "CREATE INDEX IF NOT EXISTS blocks_ledger_hash_idx ON blocks (ledger_hash)", + # transactions + "CREATE INDEX IF NOT EXISTS transactions_block_index_idx ON transactions (block_index)", + "CREATE INDEX IF NOT EXISTS transactions_tx_index_idx ON transactions (tx_index)", + "CREATE INDEX IF NOT EXISTS transactions_tx_hash_idx ON transactions (tx_hash)", + "CREATE INDEX IF NOT EXISTS transactions_block_index_tx_index_idx ON transactions (block_index, tx_index)", + "CREATE INDEX IF NOT EXISTS transactions_tx_index_tx_hash_block_index_idx ON transactions (tx_index, tx_hash, block_index)", + "CREATE INDEX IF NOT EXISTS transactions_source_idx ON transactions (source)", + "CREATE INDEX IF NOT EXISTS transactions_transaction_type_idx ON transactions (transaction_type)", + # mempool_transactions + "CREATE INDEX IF NOT EXISTS mempool_transactions_block_index_idx ON mempool_transactions (block_index)", + "CREATE INDEX IF NOT EXISTS mempool_transactions_tx_index_idx ON mempool_transactions (tx_index)", + "CREATE INDEX IF NOT EXISTS mempool_transactions_tx_hash_idx ON mempool_transactions (tx_hash)", + "CREATE INDEX IF NOT EXISTS mempool_transactions_block_index_tx_index_idx ON mempool_transactions (block_index, tx_index)", + "CREATE INDEX IF NOT EXISTS mempool_transactions_tx_index_tx_hash_block_index_idx ON mempool_transactions (tx_index, tx_hash, block_index)", + "CREATE INDEX IF NOT EXISTS mempool_transactions_source_idx ON mempool_transactions (source)", + # messages: rebuild the same index set the runtime helper + # ``parser.blocks.create_events_indexes`` would create. The migration + # drops and recreates the table, which destroys the original indexes; + # nodes running ``--api-only`` (load test, API-only deployments) never + # invoke the parser path that lazily rebuilds them, so every read on + # ``messages`` would fall back to a full table scan -- on a 30M-row + # ledger that turns ``/v2/transactions//events`` into a + # 6-20s request. Recreating the indexes here keeps both code paths + # (parser catch-up and api-only) covered. + "CREATE INDEX IF NOT EXISTS messages_block_index_idx ON messages (block_index)", + "CREATE INDEX IF NOT EXISTS messages_block_index_message_index_idx ON messages (block_index, message_index)", + "CREATE INDEX IF NOT EXISTS messages_block_index_event_idx ON messages (block_index, event)", + "CREATE INDEX IF NOT EXISTS messages_event_idx ON messages (event)", + "CREATE INDEX IF NOT EXISTS messages_tx_index_idx ON messages (tx_index)", + "CREATE INDEX IF NOT EXISTS messages_event_hash_idx ON messages (event_hash)", + # orders + "CREATE INDEX IF NOT EXISTS orders_block_index_idx ON orders (block_index)", + "CREATE INDEX IF NOT EXISTS orders_tx_index_tx_hash_idx ON orders (tx_index, tx_hash)", + "CREATE INDEX IF NOT EXISTS orders_give_asset_idx ON orders (give_asset)", + "CREATE INDEX IF NOT EXISTS orders_tx_hash_idx ON orders (tx_hash)", + "CREATE INDEX IF NOT EXISTS orders_expire_index_idx ON orders (expire_index)", + "CREATE INDEX IF NOT EXISTS orders_get_asset_give_asset_idx ON orders (get_asset, give_asset)", + "CREATE INDEX IF NOT EXISTS orders_status_idx ON orders (status)", + "CREATE INDEX IF NOT EXISTS orders_source_give_asset_idx ON orders (source, give_asset)", + "CREATE INDEX IF NOT EXISTS orders_get_quantity_idx ON orders (get_quantity)", + "CREATE INDEX IF NOT EXISTS orders_give_quantity_idx ON orders (give_quantity)", + # order_matches + "CREATE INDEX IF NOT EXISTS order_matches_block_index_idx ON order_matches (block_index)", + "CREATE INDEX IF NOT EXISTS order_matches_forward_asset_idx ON order_matches (forward_asset)", + "CREATE INDEX IF NOT EXISTS order_matches_backward_asset_idx ON order_matches (backward_asset)", + "CREATE INDEX IF NOT EXISTS order_matches_tx0_index_tx1_index_idx ON order_matches (tx0_index, tx1_index)", + "CREATE INDEX IF NOT EXISTS order_matches_tx0_address_forward_asset_idx ON order_matches (tx0_address, forward_asset)", + "CREATE INDEX IF NOT EXISTS order_matches_tx1_address_backward_asset_idx ON order_matches (tx1_address, backward_asset)", + "CREATE INDEX IF NOT EXISTS order_matches_match_expire_index_idx ON order_matches (match_expire_index)", + "CREATE INDEX IF NOT EXISTS order_matches_status_idx ON order_matches (status)", + "CREATE INDEX IF NOT EXISTS order_matches_tx0_hash_idx ON order_matches (tx0_hash)", + "CREATE INDEX IF NOT EXISTS order_matches_tx1_hash_idx ON order_matches (tx1_hash)", + # order_expirations + "CREATE INDEX IF NOT EXISTS order_expirations_block_index_idx ON order_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS order_expirations_source_idx ON order_expirations (source)", + # order_match_expirations (rewritten: order_match_id -> tx index pair) + "CREATE INDEX IF NOT EXISTS order_match_expirations_block_index_idx ON order_match_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS order_match_expirations_tx0_address_idx ON order_match_expirations (tx0_address)", + "CREATE INDEX IF NOT EXISTS order_match_expirations_tx1_address_idx ON order_match_expirations (tx1_address)", + # btcpays + "CREATE INDEX IF NOT EXISTS btcpays_block_index_idx ON btcpays (block_index)", + "CREATE INDEX IF NOT EXISTS btcpays_source_idx ON btcpays (source)", + "CREATE INDEX IF NOT EXISTS btcpays_destination_idx ON btcpays (destination)", + "CREATE INDEX IF NOT EXISTS btcpays_order_match_tx_index_idx ON btcpays (order_match_tx0_index, order_match_tx1_index)", + # issuances + "CREATE INDEX IF NOT EXISTS issuances_block_index_idx ON issuances (block_index)", + "CREATE INDEX IF NOT EXISTS issuances_asset_status_idx ON issuances (asset, status)", + "CREATE INDEX IF NOT EXISTS issuances_status_idx ON issuances (status)", + "CREATE INDEX IF NOT EXISTS issuances_source_idx ON issuances (source)", + "CREATE INDEX IF NOT EXISTS issuances_asset_longname_idx ON issuances (asset_longname)", + "CREATE INDEX IF NOT EXISTS issuances_status_asset_tx_index_idx ON issuances (status, asset, tx_index DESC)", + "CREATE INDEX IF NOT EXISTS issuances_issuer_idx ON issuances (issuer)", + "CREATE INDEX IF NOT EXISTS issuances_status_asset_longname_tx_index_idx ON issuances (status, asset_longname, tx_index DESC)", + # broadcasts + "CREATE INDEX IF NOT EXISTS broadcasts_block_index_idx ON broadcasts (block_index)", + "CREATE INDEX IF NOT EXISTS broadcasts_status_source_idx ON broadcasts (status, source)", + "CREATE INDEX IF NOT EXISTS broadcasts_status_source_tx_index_idx ON broadcasts (status, source, tx_index)", + "CREATE INDEX IF NOT EXISTS broadcasts_timestamp_idx ON broadcasts (timestamp)", + # bets + "CREATE INDEX IF NOT EXISTS bets_block_index_idx ON bets (block_index)", + "CREATE INDEX IF NOT EXISTS bets_tx_index_tx_hash_idx ON bets (tx_index, tx_hash)", + "CREATE INDEX IF NOT EXISTS bets_status_idx ON bets (status)", + "CREATE INDEX IF NOT EXISTS bets_tx_hash_idx ON bets (tx_hash)", + "CREATE INDEX IF NOT EXISTS bets_feed_address_idx ON bets (feed_address)", + "CREATE INDEX IF NOT EXISTS bets_expire_index_idx ON bets (expire_index)", + "CREATE INDEX IF NOT EXISTS bets_feed_address_bet_type_idx ON bets (feed_address, bet_type)", + # bet_matches + "CREATE INDEX IF NOT EXISTS bet_matches_block_index_idx ON bet_matches (block_index)", + "CREATE INDEX IF NOT EXISTS bet_matches_tx0_index_tx1_index_idx ON bet_matches (tx0_index, tx1_index)", + "CREATE INDEX IF NOT EXISTS bet_matches_status_idx ON bet_matches (status)", + "CREATE INDEX IF NOT EXISTS bet_matches_deadline_idx ON bet_matches (deadline)", + "CREATE INDEX IF NOT EXISTS bet_matches_tx0_address_idx ON bet_matches (tx0_address)", + "CREATE INDEX IF NOT EXISTS bet_matches_tx1_address_idx ON bet_matches (tx1_address)", + # bet_expirations + "CREATE INDEX IF NOT EXISTS bet_expirations_block_index_idx ON bet_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS bet_expirations_source_idx ON bet_expirations (source)", + # bet_match_expirations (rewritten: bet_match_id -> tx index pair) + "CREATE INDEX IF NOT EXISTS bet_match_expirations_block_index_idx ON bet_match_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS bet_match_expirations_tx0_address_idx ON bet_match_expirations (tx0_address)", + "CREATE INDEX IF NOT EXISTS bet_match_expirations_tx1_address_idx ON bet_match_expirations (tx1_address)", + # dividends + "CREATE INDEX IF NOT EXISTS dividends_block_index_idx ON dividends (block_index)", + "CREATE INDEX IF NOT EXISTS dividends_source_idx ON dividends (source)", + "CREATE INDEX IF NOT EXISTS dividends_asset_idx ON dividends (asset)", + # burns + "CREATE INDEX IF NOT EXISTS burns_status_idx ON burns (status)", + "CREATE INDEX IF NOT EXISTS burns_source_idx ON burns (source)", + # cancels + "CREATE INDEX IF NOT EXISTS cancels_block_index_idx ON cancels (block_index)", + "CREATE INDEX IF NOT EXISTS cancels_source_idx ON cancels (source)", + "CREATE INDEX IF NOT EXISTS cancels_offer_tx_index_idx ON cancels (offer_tx_index)", + # rps + "CREATE INDEX IF NOT EXISTS rps_source_idx ON rps (source)", + "CREATE INDEX IF NOT EXISTS rps_wager_possible_moves_idx ON rps (wager, possible_moves)", + "CREATE INDEX IF NOT EXISTS rps_status_idx ON rps (status)", + "CREATE INDEX IF NOT EXISTS rps_tx_index_idx ON rps (tx_index)", + "CREATE INDEX IF NOT EXISTS rps_tx_hash_idx ON rps (tx_hash)", + "CREATE INDEX IF NOT EXISTS rps_expire_index_idx ON rps (expire_index)", + "CREATE INDEX IF NOT EXISTS rps_tx_index_tx_hash_idx ON rps (tx_index, tx_hash)", + # rps_matches + "CREATE INDEX IF NOT EXISTS rps_matches_tx0_address_idx ON rps_matches (tx0_address)", + "CREATE INDEX IF NOT EXISTS rps_matches_tx1_address_idx ON rps_matches (tx1_address)", + "CREATE INDEX IF NOT EXISTS rps_matches_status_idx ON rps_matches (status)", + "CREATE INDEX IF NOT EXISTS rps_matches_tx0_index_tx1_index_idx ON rps_matches (tx0_index, tx1_index)", + "CREATE INDEX IF NOT EXISTS rps_matches_match_expire_index_idx ON rps_matches (match_expire_index)", + # rps_expirations + "CREATE INDEX IF NOT EXISTS rps_expirations_block_index_idx ON rps_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS rps_expirations_source_idx ON rps_expirations (source)", + # rps_match_expirations (rewritten: rps_match_id -> tx index pair) + "CREATE INDEX IF NOT EXISTS rps_match_expirations_block_index_idx ON rps_match_expirations (block_index)", + "CREATE INDEX IF NOT EXISTS rps_match_expirations_tx0_address_idx ON rps_match_expirations (tx0_address)", + "CREATE INDEX IF NOT EXISTS rps_match_expirations_tx1_address_idx ON rps_match_expirations (tx1_address)", + # rpsresolves + "CREATE INDEX IF NOT EXISTS rpsresolves_block_index_idx ON rpsresolves (block_index)", + "CREATE INDEX IF NOT EXISTS rpsresolves_source_idx ON rpsresolves (source)", + "CREATE INDEX IF NOT EXISTS rpsresolves_rps_match_tx_index_idx ON rpsresolves (rps_match_tx0_index, rps_match_tx1_index)", + # sweeps + "CREATE INDEX IF NOT EXISTS sweeps_block_index_idx ON sweeps (block_index)", + "CREATE INDEX IF NOT EXISTS sweeps_source_idx ON sweeps (source)", + "CREATE INDEX IF NOT EXISTS sweeps_destination_idx ON sweeps (destination)", + "CREATE INDEX IF NOT EXISTS sweeps_memo_idx ON sweeps (memo)", + # dispensers + "CREATE INDEX IF NOT EXISTS dispensers_block_index_idx ON dispensers (block_index)", + "CREATE INDEX IF NOT EXISTS dispensers_source_idx ON dispensers (source)", + "CREATE INDEX IF NOT EXISTS dispensers_asset_idx ON dispensers (asset)", + "CREATE INDEX IF NOT EXISTS dispensers_tx_index_idx ON dispensers (tx_index)", + "CREATE INDEX IF NOT EXISTS dispensers_tx_hash_idx ON dispensers (tx_hash)", + "CREATE INDEX IF NOT EXISTS dispensers_status_idx ON dispensers (status)", + "CREATE INDEX IF NOT EXISTS dispensers_give_remaining_idx ON dispensers (give_remaining)", + "CREATE INDEX IF NOT EXISTS dispensers_status_block_index_idx ON dispensers (status, block_index)", + "CREATE INDEX IF NOT EXISTS dispensers_source_origin_idx ON dispensers (source, origin)", + "CREATE INDEX IF NOT EXISTS dispensers_source_asset_origin_status_idx ON dispensers (source, asset, origin, status)", + "CREATE INDEX IF NOT EXISTS dispensers_last_status_tx_hash_idx ON dispensers (last_status_tx_hash)", + "CREATE INDEX IF NOT EXISTS dispensers_close_block_index_status_idx ON dispensers (close_block_index, status)", + "CREATE INDEX IF NOT EXISTS dispensers_give_quantity_idx ON dispensers (give_quantity)", + # dispenses + "CREATE INDEX IF NOT EXISTS dispenses_tx_hash_idx ON dispenses (tx_hash)", + "CREATE INDEX IF NOT EXISTS dispenses_block_index_idx ON dispenses (block_index)", + "CREATE INDEX IF NOT EXISTS dispenses_dispenser_tx_index_idx ON dispenses (dispenser_tx_index)", + "CREATE INDEX IF NOT EXISTS dispenses_asset_idx ON dispenses (asset)", + "CREATE INDEX IF NOT EXISTS dispenses_source_idx ON dispenses (source)", + "CREATE INDEX IF NOT EXISTS dispenses_destination_idx ON dispenses (destination)", + "CREATE INDEX IF NOT EXISTS dispenses_dispense_quantity_idx ON dispenses (dispense_quantity)", + # dispenser_refills + "CREATE INDEX IF NOT EXISTS dispenser_refills_tx_hash_idx ON dispenser_refills (tx_hash)", + "CREATE INDEX IF NOT EXISTS dispenser_refills_block_index_idx ON dispenser_refills (block_index)", + # fairminters + "CREATE INDEX IF NOT EXISTS fairminters_tx_hash_idx ON fairminters (tx_hash)", + "CREATE INDEX IF NOT EXISTS fairminters_block_index_idx ON fairminters (block_index)", + "CREATE INDEX IF NOT EXISTS fairminters_asset_idx ON fairminters (asset)", + "CREATE INDEX IF NOT EXISTS fairminters_asset_longname_idx ON fairminters (asset_longname)", + "CREATE INDEX IF NOT EXISTS fairminters_asset_parent_idx ON fairminters (asset_parent)", + "CREATE INDEX IF NOT EXISTS fairminters_source_idx ON fairminters (source)", + "CREATE INDEX IF NOT EXISTS fairminters_status_idx ON fairminters (status)", + # fairmints + "CREATE INDEX IF NOT EXISTS fairmints_tx_hash_idx ON fairmints (tx_hash)", + "CREATE INDEX IF NOT EXISTS fairmints_block_index_idx ON fairmints (block_index)", + "CREATE INDEX IF NOT EXISTS fairmints_fairminter_tx_index_idx ON fairmints (fairminter_tx_index)", + "CREATE INDEX IF NOT EXISTS fairmints_asset_idx ON fairmints (asset)", + "CREATE INDEX IF NOT EXISTS fairmints_source_idx ON fairmints (source)", + "CREATE INDEX IF NOT EXISTS fairmints_status_idx ON fairmints (status)", + # sends + "CREATE INDEX IF NOT EXISTS sends_block_index_idx ON sends (block_index)", + "CREATE INDEX IF NOT EXISTS sends_source_idx ON sends (source)", + "CREATE INDEX IF NOT EXISTS sends_destination_idx ON sends (destination)", + "CREATE INDEX IF NOT EXISTS sends_asset_idx ON sends (asset)", + "CREATE INDEX IF NOT EXISTS sends_memo_idx ON sends (memo)", + "CREATE INDEX IF NOT EXISTS sends_block_index_send_type_idx ON sends (block_index, send_type)", + "CREATE INDEX IF NOT EXISTS sends_asset_send_type_idx ON sends (asset, send_type)", + "CREATE INDEX IF NOT EXISTS sends_status_idx ON sends (status)", + "CREATE INDEX IF NOT EXISTS sends_send_type_idx ON sends (send_type)", + "CREATE INDEX IF NOT EXISTS sends_send_type ON sends (send_type)", + "CREATE INDEX IF NOT EXISTS sends_source_address ON sends (source_address)", + "CREATE INDEX IF NOT EXISTS sends_destination_address ON sends (destination_address)", + # destructions + "CREATE INDEX IF NOT EXISTS destructions_status_idx ON destructions (status)", + "CREATE INDEX IF NOT EXISTS destructions_source_idx ON destructions (source)", + "CREATE INDEX IF NOT EXISTS destructions_asset_idx ON destructions (asset)", + # pools + "CREATE INDEX IF NOT EXISTS pools_asset_a_asset_b_idx ON pools (asset_a, asset_b)", + "CREATE INDEX IF NOT EXISTS pools_lp_asset_idx ON pools (lp_asset)", + "CREATE INDEX IF NOT EXISTS pools_block_index_idx ON pools (block_index)", + # pool_deposits + "CREATE INDEX IF NOT EXISTS pool_deposits_tx_hash_idx ON pool_deposits (tx_hash)", + "CREATE INDEX IF NOT EXISTS pool_deposits_source_status_idx ON pool_deposits (source, status)", + "CREATE INDEX IF NOT EXISTS pool_deposits_block_index_idx ON pool_deposits (block_index)", + "CREATE INDEX IF NOT EXISTS pool_deposits_asset_a_asset_b_status_idx ON pool_deposits (asset_a, asset_b, status)", + # pool_withdrawals + "CREATE INDEX IF NOT EXISTS pool_withdrawals_tx_hash_idx ON pool_withdrawals (tx_hash)", + "CREATE INDEX IF NOT EXISTS pool_withdrawals_source_status_idx ON pool_withdrawals (source, status)", + "CREATE INDEX IF NOT EXISTS pool_withdrawals_block_index_idx ON pool_withdrawals (block_index)", + "CREATE INDEX IF NOT EXISTS pool_withdrawals_asset_a_asset_b_status_idx ON pool_withdrawals (asset_a, asset_b, status)", + # pool_matches + "CREATE INDEX IF NOT EXISTS pool_matches_tx_hash_idx ON pool_matches (tx_hash)", + "CREATE INDEX IF NOT EXISTS pool_matches_source_idx ON pool_matches (source)", + "CREATE INDEX IF NOT EXISTS pool_matches_block_index_idx ON pool_matches (block_index)", + "CREATE INDEX IF NOT EXISTS pool_matches_asset_a_asset_b_idx ON pool_matches (asset_a, asset_b)", + "CREATE INDEX IF NOT EXISTS pool_matches_order_tx_index_idx ON pool_matches (order_tx_index)", +] + + +# Triggers we recreate at the end (every BEFORE UPDATE trigger from +# 0001+0006). ``messages`` and others now reference the new tables; SQLite +# doesn't care that the table was recreated as long as the trigger names are +# unique. +TRIGGERS_AFTER_REWRITE = [ + f"CREATE TRIGGER IF NOT EXISTS {name} BEFORE UPDATE ON {name.replace('block_update_', '')} " + 'BEGIN SELECT RAISE(FAIL, "UPDATES NOT ALLOWED"); END' + for name in NO_UPDATE_TRIGGERS +] + + +VIEWS_AFTER_REWRITE = [ + # all_transactions: same shape as 0002 but rebuilt against the new schema. + # ``block_hash`` is no longer a column on ``transactions``; rebuild it via + # JOIN against ``blocks``. + """CREATE VIEW IF NOT EXISTS all_transactions AS + SELECT + tx_index, + tx_hash, + block_index, + block_hash, + block_time, + source, + destination, + btc_amount, + fee, + data, + supported, + utxos_info, + transaction_type, + FALSE as confirmed + FROM mempool_transactions + UNION ALL + SELECT + t.tx_index, + t.tx_hash, + t.block_index, + b.block_hash AS block_hash, + t.block_time, + (SELECT address FROM address_list WHERE address_id = t.source) AS source, + (SELECT address FROM address_list WHERE address_id = t.destination) AS destination, + t.btc_amount, + t.fee, + t.data, + t.supported, + t.utxos_info, + t.transaction_type, + TRUE as confirmed + FROM transactions t + LEFT JOIN blocks b ON b.block_index = t.block_index""", + """CREATE VIEW IF NOT EXISTS transactions_with_status AS + SELECT + t.tx_index as rowid, + t.tx_index, + t.tx_hash, + t.block_index, + b.block_hash AS block_hash, + t.block_time, + (SELECT address FROM address_list WHERE address_id = t.source) AS source, + (SELECT address FROM address_list WHERE address_id = t.destination) AS destination, + t.btc_amount, + t.fee, + t.data, + t.supported, + t.utxos_info, + t.transaction_type, + ts.valid + FROM transactions t + LEFT JOIN blocks b ON b.block_index = t.block_index + LEFT JOIN transactions_status ts ON t.tx_index = ts.tx_index""", + """CREATE VIEW IF NOT EXISTS all_transactions_with_status AS + SELECT + t.tx_index as rowid, + t.tx_index, + t.tx_hash, + t.block_index, + t.block_hash, + t.block_time, + t.source, + t.destination, + t.btc_amount, + t.fee, + t.data, + t.supported, + t.utxos_info, + t.transaction_type, + t.confirmed, + ts.valid + FROM all_transactions t + LEFT JOIN transactions_status ts ON t.tx_index = ts.tx_index""", + # all_expirations: BLOB hashes; expose hex for clients via hex_lower UDF. + """CREATE VIEW IF NOT EXISTS all_expirations AS + SELECT 'order' AS type, hex_lower(order_hash) AS object_id, block_index, + CONCAT(CAST(block_index AS VARCHAR), '_order_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM order_expirations + UNION ALL + SELECT 'order_match' AS type, + (SELECT hex_lower(t0.tx_hash) FROM transactions t0 WHERE t0.tx_index = e.order_match_tx0_index) + || '_' || + (SELECT hex_lower(t1.tx_hash) FROM transactions t1 WHERE t1.tx_index = e.order_match_tx1_index) AS object_id, + block_index, + CONCAT(CAST(block_index AS VARCHAR), '_order_match_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM order_match_expirations e + UNION ALL + SELECT 'bet' AS type, hex_lower(bet_hash) AS object_id, block_index, + CONCAT(CAST(block_index AS VARCHAR), '_bet_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM bet_expirations + UNION ALL + SELECT 'bet_match' AS type, + (SELECT hex_lower(t0.tx_hash) FROM transactions t0 WHERE t0.tx_index = e.bet_match_tx0_index) + || '_' || + (SELECT hex_lower(t1.tx_hash) FROM transactions t1 WHERE t1.tx_index = e.bet_match_tx1_index) AS object_id, + block_index, + CONCAT(CAST(block_index AS VARCHAR), '_bet_match_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM bet_match_expirations e + UNION ALL + SELECT 'rps' AS type, hex_lower(rps_hash) AS object_id, block_index, + CONCAT(CAST(block_index AS VARCHAR), '_rps_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM rps_expirations + UNION ALL + SELECT 'rps_match' AS type, + (SELECT hex_lower(t0.tx_hash) FROM transactions t0 WHERE t0.tx_index = e.rps_match_tx0_index) + || '_' || + (SELECT hex_lower(t1.tx_hash) FROM transactions t1 WHERE t1.tx_index = e.rps_match_tx1_index) AS object_id, + block_index, + CONCAT(CAST(block_index AS VARCHAR), '_rps_match_', CAST(rowid AS VARCHAR)) AS cursor_id + FROM rps_match_expirations e""", + """CREATE VIEW IF NOT EXISTS all_holders AS + SELECT (SELECT asset_name FROM assets WHERE asset_index = balances.asset) AS asset, + (SELECT address FROM address_list WHERE address_id = balances.address) AS address, + quantity, NULL AS escrow, MAX(rowid) AS rowid, + CONCAT('balances_', CAST(rowid AS VARCHAR)) AS cursor_id, 'balances' AS holding_type, NULL AS status + FROM balances + GROUP BY asset, address + UNION ALL + SELECT * FROM ( + SELECT (SELECT asset_name FROM assets WHERE asset_index = give_asset) AS asset, (SELECT address FROM address_list WHERE address_id = source) AS address, give_remaining AS quantity, hex_lower(tx_hash) AS escrow, + MAX(rowid) AS rowid, CONCAT('open_order_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'open_order' AS holding_type, status + FROM orders + GROUP BY tx_hash + ) WHERE status = 'open' + UNION ALL + SELECT * FROM ( + SELECT (SELECT asset_name FROM assets WHERE asset_index = forward_asset) AS asset, (SELECT address FROM address_list WHERE address_id = tx0_address) AS address, forward_quantity AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('order_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_order_match' AS holding_type, status + FROM order_matches + GROUP BY tx0_index, tx1_index + ) WHERE status = 'pending' + UNION ALL + SELECT * FROM ( + SELECT (SELECT asset_name FROM assets WHERE asset_index = backward_asset) AS asset, (SELECT address FROM address_list WHERE address_id = tx1_address) AS address, backward_quantity AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('order_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_order_match' AS holding_type, status + FROM order_matches + GROUP BY tx0_index, tx1_index + ) WHERE status = 'pending' + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = source) AS address, wager_remaining AS quantity, + hex_lower(tx_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('open_bet_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'open_bet' AS holding_type, status + FROM bets + GROUP BY tx_hash + ) WHERE status = 'open' + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = tx0_address) AS address, forward_quantity AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('bet_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_bet_match' AS holding_type, status + FROM bet_matches + GROUP BY tx0_index, tx1_index + ) WHERE status = 'pending' + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = tx1_address) AS address, backward_quantity AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('bet_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_bet_match' AS holding_type, status + FROM bet_matches + GROUP BY tx0_index, tx1_index + ) WHERE status = 'pending' + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = source) AS address, wager AS quantity, + hex_lower(tx_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('open_rps_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'open_rps' AS holding_type, status + FROM rps + GROUP BY tx_hash + ) WHERE status = 'open' + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = tx0_address) AS address, wager AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('rps_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_rps_match' AS holding_type, status + FROM rps_matches + GROUP BY tx0_index, tx1_index + ) WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') + UNION ALL + SELECT * FROM ( + SELECT 'XCP' AS asset, (SELECT address FROM address_list WHERE address_id = tx1_address) AS address, wager AS quantity, + hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('rps_match_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'pending_rps_match' AS holding_type, status + FROM rps_matches + GROUP BY tx0_index, tx1_index + ) WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') + UNION ALL + SELECT * FROM ( + SELECT (SELECT asset_name FROM assets WHERE asset_index = dispensers.asset) AS asset, (SELECT address FROM address_list WHERE address_id = source) AS address, give_remaining AS quantity, + hex_lower(tx_hash) AS escrow, MAX(rowid) AS rowid, CONCAT('open_dispenser_', CAST(rowid AS VARCHAR)) AS cursor_id, + 'open_dispenser' AS holding_type, status + FROM dispensers + GROUP BY source, asset + ) WHERE status = 0""", +] + + +# --------------------------------------------------------------------------- +# Custom INSERT SELECT logic for tables whose row shape changes between the +# old and new schema (column drops / ``*_tx_hash`` -> ``*_tx_index`` FKs). +# --------------------------------------------------------------------------- + +CUSTOM_INSERT_SELECT = { + # assets: copy the legacy columns verbatim and let the new + # ``asset_index INTEGER PRIMARY KEY`` auto-assign in stable insertion + # order. ``ORDER BY rowid`` makes the assignment deterministic (it is + # consensus- and API-irrelevant -- only internal FK consistency matters). + # This entry MUST run before every other rewrite that resolves an asset + # name to its ``asset_index`` (``assets`` is first in TABLE_REWRITES). + "assets": ( + """ + SELECT + asset_id, + asset_name, + block_index, + asset_longname + FROM assets_old + ORDER BY rowid + """ + ), + # balances/credits/debits: resolve ``address``/``utxo_address`` to the + # compact ``address_id`` (via ``address_list``), ``asset`` to ``asset_index`` + # (via ``assets``), and split the legacy ``utxo`` TEXT (``tx_hash:vout``) + # into ``utxo_tx_hash`` (``__hex_to_blob`` of the 64-char hex hash) and + # ``utxo_vout`` (``CAST(substr(utxo, 66) AS INTEGER)``). The tx_hash is + # stored RAW (BLOB) -- not a tx_index FK -- because an attach destination may + # be any bitcoin UTXO absent from ``transactions``. ``substr``/``__hex_to_blob`` + # of a NULL utxo yields NULL (address balances). ``assets`` and + # ``address_list`` are fully populated before these run. + "balances": ( + """ + SELECT + (SELECT al.address_id FROM address_list al WHERE al.address = b.address) AS address, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = b.asset) AS asset, + b.quantity, + b.block_index, + b.tx_index, + __hex_to_blob(substr(b.utxo, 1, 64)) AS utxo_tx_hash, + CAST(substr(b.utxo, 66) AS INTEGER) AS utxo_vout, + (SELECT al.address_id FROM address_list al WHERE al.address = b.utxo_address) AS utxo_address + FROM balances_old b + """ + ), + "credits": ( + """ + SELECT + c.block_index, + (SELECT al.address_id FROM address_list al WHERE al.address = c.address) AS address, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = c.asset) AS asset, + c.quantity, + c.calling_function, + c.event, + c.tx_index, + __hex_to_blob(substr(c.utxo, 1, 64)) AS utxo_tx_hash, + CAST(substr(c.utxo, 66) AS INTEGER) AS utxo_vout, + (SELECT al.address_id FROM address_list al WHERE al.address = c.utxo_address) AS utxo_address + FROM credits_old c + """ + ), + "debits": ( + """ + SELECT + d.block_index, + (SELECT al.address_id FROM address_list al WHERE al.address = d.address) AS address, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = d.asset) AS asset, + d.quantity, + d.action, + d.event, + d.tx_index, + __hex_to_blob(substr(d.utxo, 1, 64)) AS utxo_tx_hash, + CAST(substr(d.utxo, 66) AS INTEGER) AS utxo_vout, + (SELECT al.address_id FROM address_list al WHERE al.address = d.utxo_address) AS utxo_address + FROM debits_old d + """ + ), + # messages: drop tx_hash, add tx_index via JOIN; convert event_hash hex + # to BLOB. + "messages": ( + # SELECT clause (must produce rows in the same column order as the + # new CREATE TABLE) + """ + SELECT + m.message_index, + m.block_index, + m.command, + m.category, + m.bindings, + m.timestamp, + m.event, + t.tx_index AS tx_index, + __hex_to_blob(m.event_hash) AS event_hash + FROM messages_old m + LEFT JOIN transactions_old t ON t.tx_hash = m.tx_hash + """ + ), + # transactions: drop block_hash + "transactions": ( + """ + SELECT + tx_index, + __hex_to_blob(tx_hash) AS tx_hash, + block_index, + block_time, + (SELECT address_id FROM address_list WHERE address = transactions_old.source) AS source, + (SELECT address_id FROM address_list WHERE address = transactions_old.destination) AS destination, + btc_amount, + fee, + data, + supported, + utxos_info, + transaction_type + FROM transactions_old + """ + ), + # cancels: replace offer_hash with offer_tx_index via JOIN + "cancels": ( + """ + SELECT + c.tx_index, + __hex_to_blob(c.tx_hash) AS tx_hash, + c.block_index, + (SELECT address_id FROM address_list WHERE address = c.source) AS source, + t.tx_index AS offer_tx_index, + c.status + FROM cancels_old c + LEFT JOIN transactions_old t ON t.tx_hash = c.offer_hash + """ + ), + # dispenses: replace dispenser_tx_hash with dispenser_tx_index + "dispenses": ( + """ + SELECT + d.tx_index, + d.dispense_index, + __hex_to_blob(d.tx_hash) AS tx_hash, + d.block_index, + (SELECT address_id FROM address_list WHERE address = d.source) AS source, + (SELECT address_id FROM address_list WHERE address = d.destination) AS destination, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = d.asset) AS asset, + d.dispense_quantity, + t.tx_index AS dispenser_tx_index, + d.btc_amount + FROM dispenses_old d + LEFT JOIN transactions_old t ON t.tx_hash = d.dispenser_tx_hash + """ + ), + # dispenser_refills: replace dispenser_tx_hash with dispenser_tx_index + "dispenser_refills": ( + """ + SELECT + r.tx_index, + __hex_to_blob(r.tx_hash) AS tx_hash, + r.block_index, + (SELECT address_id FROM address_list WHERE address = r.source) AS source, + (SELECT address_id FROM address_list WHERE address = r.destination) AS destination, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = r.asset) AS asset, + r.dispense_quantity, + t.tx_index AS dispenser_tx_index + FROM dispenser_refills_old r + LEFT JOIN transactions_old t ON t.tx_hash = r.dispenser_tx_hash + """ + ), + # fairmints: replace fairminter_tx_hash with fairminter_tx_index + "fairmints": ( + """ + SELECT + __hex_to_blob(f.tx_hash) AS tx_hash, + f.tx_index, + f.block_index, + (SELECT address_id FROM address_list WHERE address = f.source) AS source, + t.tx_index AS fairminter_tx_index, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = f.asset) AS asset, + f.earn_quantity, + f.paid_quantity, + f.commission, + f.status + FROM fairmints_old f + LEFT JOIN transactions_old t ON t.tx_hash = f.fairminter_tx_hash + """ + ), + # pool_matches: replace order_tx_hash with order_tx_index + "pool_matches": ( + """ + SELECT + p.tx_index, + __hex_to_blob(p.tx_hash) AS tx_hash, + p.block_index, + (SELECT address_id FROM address_list WHERE address = p.source) AS source, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = p.asset_a) AS asset_a, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = p.asset_b) AS asset_b, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = p.forward_asset) AS forward_asset, + p.forward_quantity, + (SELECT a.asset_index FROM assets a WHERE a.asset_name = p.backward_asset) AS backward_asset, + p.backward_quantity, + p.fee_quantity, + p.fee_bps, + t.tx_index AS order_tx_index, + p.status + FROM pool_matches_old p + LEFT JOIN transactions_old t ON t.tx_hash = p.order_tx_hash + """ + ), + # transaction_outputs: drop tx_hash entirely (resolved via tx_index FK) + "transaction_outputs": ( + """ + SELECT + tx_index, + block_index, + out_index, + (SELECT address_id FROM address_list WHERE address = transaction_outputs_old.destination) AS destination, + btc_amount + FROM transaction_outputs_old + """ + ), + # -------------------------------------------------------------------- + # Composite match-id normalization. The legacy TEXT id is + # ``tx0hash_tx1hash`` (64 hex + '_' + 64 hex); split it on the fixed + # offsets and resolve each half to its tx_index via ``transactions_old`` + # (still hex at this point in the migration). LEFT JOINs so an + # unresolvable / NULL id (e.g. an invalid btcpay) yields NULL indexes. + # -------------------------------------------------------------------- + # btcpays: order_match_id -> (order_match_tx0_index, order_match_tx1_index) + "btcpays": ( + """ + SELECT + b.tx_index, + __hex_to_blob(b.tx_hash) AS tx_hash, + b.block_index, + (SELECT address_id FROM address_list WHERE address = b.source) AS source, + (SELECT address_id FROM address_list WHERE address = b.destination) AS destination, + b.btc_amount, + t0.tx_index AS order_match_tx0_index, + t1.tx_index AS order_match_tx1_index, + b.status + FROM btcpays_old b + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(b.order_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(b.order_match_id, 66) + """ + ), + # rpsresolves: rps_match_id -> (rps_match_tx0_index, rps_match_tx1_index) + "rpsresolves": ( + """ + SELECT + r.tx_index, + __hex_to_blob(r.tx_hash) AS tx_hash, + r.block_index, + (SELECT address_id FROM address_list WHERE address = r.source) AS source, + r.move, + r.random, + t0.tx_index AS rps_match_tx0_index, + t1.tx_index AS rps_match_tx1_index, + r.status + FROM rpsresolves_old r + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(r.rps_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(r.rps_match_id, 66) + """ + ), + # order_match_expirations: order_match_id -> (tx0_index, tx1_index) + "order_match_expirations": ( + """ + SELECT + t0.tx_index AS order_match_tx0_index, + t1.tx_index AS order_match_tx1_index, + (SELECT address_id FROM address_list WHERE address = e.tx0_address) AS tx0_address, + (SELECT address_id FROM address_list WHERE address = e.tx1_address) AS tx1_address, + e.block_index + FROM order_match_expirations_old e + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(e.order_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(e.order_match_id, 66) + """ + ), + # bet_match_expirations: bet_match_id -> (tx0_index, tx1_index) + "bet_match_expirations": ( + """ + SELECT + t0.tx_index AS bet_match_tx0_index, + t1.tx_index AS bet_match_tx1_index, + (SELECT address_id FROM address_list WHERE address = e.tx0_address) AS tx0_address, + (SELECT address_id FROM address_list WHERE address = e.tx1_address) AS tx1_address, + e.block_index + FROM bet_match_expirations_old e + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(e.bet_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(e.bet_match_id, 66) + """ + ), + # rps_match_expirations: rps_match_id -> (tx0_index, tx1_index) + "rps_match_expirations": ( + """ + SELECT + t0.tx_index AS rps_match_tx0_index, + t1.tx_index AS rps_match_tx1_index, + (SELECT address_id FROM address_list WHERE address = e.tx0_address) AS tx0_address, + (SELECT address_id FROM address_list WHERE address = e.tx1_address) AS tx1_address, + e.block_index + FROM rps_match_expirations_old e + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(e.rps_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(e.rps_match_id, 66) + """ + ), + # bet_match_resolutions: bet_match_id -> (tx0_index, tx1_index) + "bet_match_resolutions": ( + """ + SELECT + t0.tx_index AS bet_match_tx0_index, + t1.tx_index AS bet_match_tx1_index, + r.bet_match_type_id, + r.block_index, + (SELECT address_id FROM address_list WHERE address = r.winner) AS winner, + r.settled, + r.bull_credit, + r.bear_credit, + r.escrow_less_fee, + r.fee + FROM bet_match_resolutions_old r + LEFT JOIN transactions_old t0 ON t0.tx_hash = substr(r.bet_match_id, 1, 64) + LEFT JOIN transactions_old t1 ON t1.tx_hash = substr(r.bet_match_id, 66) + """ + ), +} diff --git a/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_tables.py b/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_tables.py new file mode 100644 index 0000000000..ab1e99db8d --- /dev/null +++ b/counterparty-core/counterpartycore/lib/ledger/migration_data/compact_hash_tables.py @@ -0,0 +1,1401 @@ +"""TABLE_REWRITES used by the compact-hash storage migration. + +Holds the CREATE TABLE statements (with new BLOB column types) and the +column lists used by the migration. Split out from ``compact_hash_schema`` +to keep individual modules under pylint's per-module line cap. +""" + +# --------------------------------------------------------------------------- +# Table rewrites. Each entry contains: +# - new CREATE TABLE statement (column types reflect BLOB(32) for hashes) +# - the INSERT ... SELECT clause that converts hex -> BLOB via __hex_to_blob +# +# Most rewrites only touch column *types* and indexes (hex -> binary). The +# few tables that also drop a legacy hash column or replace it with a +# ``*_tx_index`` foreign key use a CUSTOM_INSERT_SELECT clause below. +# --------------------------------------------------------------------------- + +# (table_name, columns_to_recreate, full_create_sql_with_new_types, +# hex_columns, original_create_for_rollback) +# +# ``hex_columns`` is the subset of columns that need ``__hex_to_blob`` in the +# INSERT SELECT; all other columns are copied verbatim. + +TABLE_REWRITES = [ + # assets: the legacy ``asset_id`` TEXT remains (it is the protocol id, + # exposed verbatim by the API). A compact sequential ``asset_index`` + # INTEGER PRIMARY KEY is added: it is auto-assigned in stable insertion + # order (see CUSTOM_INSERT_SELECT, ``ORDER BY rowid``) and is the FK target + # every other table's asset column now points at. Must be FIRST in this + # list so the new ``assets`` table is fully populated before any other + # rewrite resolves an asset name to its ``asset_index``. + ( + "assets", + ("asset_id", "asset_name", "block_index", "asset_longname"), + """CREATE TABLE assets( + asset_index INTEGER PRIMARY KEY, + asset_id TEXT UNIQUE, + asset_name TEXT UNIQUE, + block_index INTEGER, + asset_longname TEXT)""", + (), + ), + # address_list: a brand-new identity table giving every distinct address a + # compact sequential ``address_id INTEGER PRIMARY KEY`` -- the FK target for + # every address column across the schema (see ADDRESS_NAME_COLUMNS). It has + # no legacy ``_old`` counterpart, so the migration creates it in phase 1 and + # populates it explicitly (``_populate_address_list``) from the DISTINCT set + # of all address values BEFORE the per-table copy resolves names to ids. + # Kept distinct from the existing ``addresses`` options-history table + # (identity vs. history, like ``assets`` vs. ``issuances``). + ( + "address_list", + ("address",), + """CREATE TABLE address_list( + address_id INTEGER PRIMARY KEY, + address TEXT UNIQUE)""", + (), + ), + # balances/credits/debits: high-volume tables whose ``asset`` name TEXT is + # replaced by the compact ``asset_index`` INTEGER. The ``address`` and + # ``utxo_address`` TEXT columns are normalized to the ``address_id`` FK + # (see ADDRESS_NAME_COLUMNS) and the ``utxo`` TEXT (``tx_hash:vout``) is + # split into a compact ``(utxo_tx_hash, utxo_vout)`` pair (see + # UTXO_SPLIT_COLUMNS). They have no hash columns; they use a + # CUSTOM_INSERT_SELECT for the utxo split. + ( + "balances", + ( + "address", + "asset", + "quantity", + "block_index", + "tx_index", + "utxo_tx_hash", + "utxo_vout", + "utxo_address", + ), + """CREATE TABLE balances( + address INTEGER, + asset INTEGER, + quantity INTEGER, + block_index INTEGER, + tx_index INTEGER, + utxo_tx_hash BLOB, + utxo_vout INTEGER, + utxo_address INTEGER)""", + (), + ), + ( + "credits", + ( + "block_index", + "address", + "asset", + "quantity", + "calling_function", + "event", + "tx_index", + "utxo_tx_hash", + "utxo_vout", + "utxo_address", + ), + """CREATE TABLE credits( + block_index INTEGER, + address INTEGER, + asset INTEGER, + quantity INTEGER, + calling_function TEXT, + event TEXT, + tx_index INTEGER, + utxo_tx_hash BLOB, + utxo_vout INTEGER, + utxo_address INTEGER)""", + (), + ), + ( + "debits", + ( + "block_index", + "address", + "asset", + "quantity", + "action", + "event", + "tx_index", + "utxo_tx_hash", + "utxo_vout", + "utxo_address", + ), + """CREATE TABLE debits( + block_index INTEGER, + address INTEGER, + asset INTEGER, + quantity INTEGER, + action TEXT, + event TEXT, + tx_index INTEGER, + utxo_tx_hash BLOB, + utxo_vout INTEGER, + utxo_address INTEGER)""", + (), + ), + # blocks: 5 hash columns + ( + "blocks", + ( + "block_index", + "block_hash", + "block_time", + "ledger_hash", + "txlist_hash", + "messages_hash", + "previous_block_hash", + "difficulty", + "transaction_count", + ), + """CREATE TABLE blocks( + block_index INTEGER UNIQUE, + block_hash BLOB UNIQUE, + block_time INTEGER, + ledger_hash BLOB, + txlist_hash BLOB, + messages_hash BLOB, + previous_block_hash BLOB UNIQUE, + difficulty INTEGER, + transaction_count INTEGER, + PRIMARY KEY (block_index, block_hash))""", + ("block_hash", "ledger_hash", "txlist_hash", "messages_hash", "previous_block_hash"), + ), + # transactions: tx_hash BLOB; block_hash dropped. Doing the column drop + # in the same pass avoids a second table-rewrite of the largest table + # in the schema. + ( + "transactions", + ( + "tx_index", + "tx_hash", + "block_index", + "block_time", + "source", + "destination", + "btc_amount", + "fee", + "data", + "supported", + "utxos_info", + "transaction_type", + ), + """CREATE TABLE transactions( + tx_index INTEGER UNIQUE, + tx_hash BLOB UNIQUE, + block_index INTEGER, + block_time INTEGER, + source INTEGER, + destination INTEGER, + btc_amount INTEGER, + fee INTEGER, + data BLOB, + supported BOOL DEFAULT 1, + utxos_info TEXT, + transaction_type TEXT, + FOREIGN KEY (block_index) REFERENCES blocks(block_index), + PRIMARY KEY (tx_index))""", + ("tx_hash",), + ), + # mempool_transactions: tx_hash BLOB; block_hash stays TEXT because it + # stores the literal sentinel "mempool" (not a real 32-byte hash). + # Converting it with __hex_to_blob would fail (not valid hex). + ( + "mempool_transactions", + ( + "tx_index", + "tx_hash", + "block_index", + "block_hash", + "block_time", + "source", + "destination", + "btc_amount", + "fee", + "data", + "supported", + "utxos_info", + "transaction_type", + ), + """CREATE TABLE mempool_transactions( + tx_index INTEGER UNIQUE, + tx_hash BLOB UNIQUE, + block_index INTEGER, + block_hash TEXT, + block_time INTEGER, + source TEXT, + destination TEXT, + btc_amount INTEGER, + fee INTEGER, + data BLOB, + supported BOOL DEFAULT 1, + utxos_info TEXT, transaction_type TEXT)""", + ("tx_hash",), + ), + # mempool: tx_hash BLOB. + ( + "mempool", + ("tx_hash", "command", "category", "bindings", "timestamp", "event", "addresses"), + """CREATE TABLE mempool( + tx_hash BLOB, + command TEXT, + category TEXT, + bindings TEXT, + timestamp INTEGER, + event TEXT, addresses TEXT)""", + ("tx_hash",), + ), + # messages: tx_hash dropped (replaced by tx_index FK), event_hash BLOB. + # Insert from the old row picking tx_index via JOIN on transactions.tx_hash. + # The messages table requires the BLOB conversion for event_hash in any + # case, so doing the column drop at the same time avoids two separate + # full-table rewrites on heavy installs. + ( + "messages", + ( + "message_index", + "block_index", + "command", + "category", + "bindings", + "timestamp", + "event", + "tx_index", + "event_hash", + ), + """CREATE TABLE messages( + message_index INTEGER PRIMARY KEY, + block_index INTEGER, + command TEXT, + category TEXT, + bindings TEXT, + timestamp INTEGER, + event TEXT, + tx_index INTEGER, + event_hash BLOB)""", + ("event_hash",), + # custom insert: ``tx_index`` is resolved from the old hex + # ``tx_hash`` via a join below. + ), + # orders + ( + "orders", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "give_asset", + "give_quantity", + "give_remaining", + "get_asset", + "get_quantity", + "get_remaining", + "expiration", + "expire_index", + "fee_required", + "fee_required_remaining", + "fee_provided", + "fee_provided_remaining", + "status", + ), + """CREATE TABLE orders( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + give_asset INTEGER, + give_quantity INTEGER, + give_remaining INTEGER, + get_asset INTEGER, + get_quantity INTEGER, + get_remaining INTEGER, + expiration INTEGER, + expire_index INTEGER, + fee_required INTEGER, + fee_required_remaining INTEGER, + fee_provided INTEGER, + fee_provided_remaining INTEGER, + status TEXT)""", + ("tx_hash",), + ), + # order_matches: tx0_hash, tx1_hash BLOB; the composite TEXT ``id`` is + # dropped -- the match is keyed by the existing ``(tx0_index, tx1_index)`` + # pair. The text id is reconstructed on read via + # ``hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash)``. + ( + "order_matches", + ( + "tx0_index", + "tx0_hash", + "tx0_address", + "tx1_index", + "tx1_hash", + "tx1_address", + "forward_asset", + "forward_quantity", + "backward_asset", + "backward_quantity", + "tx0_block_index", + "tx1_block_index", + "block_index", + "tx0_expiration", + "tx1_expiration", + "match_expire_index", + "fee_paid", + "status", + ), + """CREATE TABLE order_matches( + tx0_index INTEGER, + tx0_hash BLOB, + tx0_address INTEGER, + tx1_index INTEGER, + tx1_hash BLOB, + tx1_address INTEGER, + forward_asset INTEGER, + forward_quantity INTEGER, + backward_asset INTEGER, + backward_quantity INTEGER, + tx0_block_index INTEGER, + tx1_block_index INTEGER, + block_index INTEGER, + tx0_expiration INTEGER, + tx1_expiration INTEGER, + match_expire_index INTEGER, + fee_paid INTEGER, + status TEXT)""", + ("tx0_hash", "tx1_hash"), + ), + ( + "order_expirations", + ("order_hash", "source", "block_index"), + """CREATE TABLE order_expirations( + order_hash BLOB PRIMARY KEY, + source INTEGER, + block_index INTEGER, + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + ("order_hash",), + ), + ( + "btcpays", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "destination", + "btc_amount", + "order_match_tx0_index", + "order_match_tx1_index", + "status", + ), + """CREATE TABLE btcpays( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + destination INTEGER, + btc_amount INTEGER, + order_match_tx0_index INTEGER, + order_match_tx1_index INTEGER, + status TEXT, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "issuances", + ( + "tx_index", + "tx_hash", + "msg_index", + "block_index", + "asset", + "quantity", + "divisible", + "source", + "issuer", + "transfer", + "callable", + "call_date", + "call_price", + "description", + "fee_paid", + "status", + "asset_longname", + "description_locked", + "fair_minting", + "asset_events", + "locked", + "reset", + "mime_type", + ), + """CREATE TABLE issuances( + tx_index INTEGER, + tx_hash BLOB, + msg_index INTEGER DEFAULT 0, + block_index INTEGER, + asset INTEGER, + quantity INTEGER, + divisible BOOL, + source INTEGER, + issuer INTEGER, + transfer BOOL, + callable BOOL, + call_date INTEGER, + call_price REAL, + description TEXT, + fee_paid INTEGER, + status TEXT, + asset_longname TEXT, + description_locked BOOL, + fair_minting BOOL DEFAULT 0, + asset_events TEXT, + locked BOOL DEFAULT FALSE, + reset BOOL DEFAULT FALSE, + mime_type TEXT DEFAULT "text/plain", + PRIMARY KEY (tx_index, msg_index), + UNIQUE (tx_hash, msg_index) + )""", + ("tx_hash",), + ), + ( + "broadcasts", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "timestamp", + "value", + "fee_fraction_int", + "text", + "locked", + "status", + "mime_type", + ), + """CREATE TABLE broadcasts( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + timestamp INTEGER, + value REAL, + fee_fraction_int INTEGER, + text TEXT, + locked BOOL, + status TEXT, + mime_type TEXT DEFAULT "text/plain", + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "bets", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "feed_address", + "bet_type", + "deadline", + "wager_quantity", + "wager_remaining", + "counterwager_quantity", + "counterwager_remaining", + "target_value", + "leverage", + "expiration", + "expire_index", + "fee_fraction_int", + "status", + ), + """CREATE TABLE bets( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + feed_address INTEGER, + bet_type INTEGER, + deadline INTEGER, + wager_quantity INTEGER, + wager_remaining INTEGER, + counterwager_quantity INTEGER, + counterwager_remaining INTEGER, + target_value REAL, + leverage INTEGER, + expiration INTEGER, + expire_index INTEGER, + fee_fraction_int INTEGER, + status TEXT)""", + ("tx_hash",), + ), + ( + "bet_matches", + ( + "tx0_index", + "tx0_hash", + "tx0_address", + "tx1_index", + "tx1_hash", + "tx1_address", + "tx0_bet_type", + "tx1_bet_type", + "feed_address", + "initial_value", + "deadline", + "target_value", + "leverage", + "forward_quantity", + "backward_quantity", + "tx0_block_index", + "tx1_block_index", + "block_index", + "tx0_expiration", + "tx1_expiration", + "match_expire_index", + "fee_fraction_int", + "status", + ), + """CREATE TABLE bet_matches( + tx0_index INTEGER, + tx0_hash BLOB, + tx0_address INTEGER, + tx1_index INTEGER, + tx1_hash BLOB, + tx1_address INTEGER, + tx0_bet_type INTEGER, + tx1_bet_type INTEGER, + feed_address INTEGER, + initial_value INTEGER, + deadline INTEGER, + target_value REAL, + leverage INTEGER, + forward_quantity INTEGER, + backward_quantity INTEGER, + tx0_block_index INTEGER, + tx1_block_index INTEGER, + block_index INTEGER, + tx0_expiration INTEGER, + tx1_expiration INTEGER, + match_expire_index INTEGER, + fee_fraction_int INTEGER, + status TEXT)""", + ("tx0_hash", "tx1_hash"), + ), + ( + "bet_expirations", + ("bet_index", "bet_hash", "source", "block_index"), + """CREATE TABLE bet_expirations( + bet_index INTEGER PRIMARY KEY, + bet_hash BLOB UNIQUE, + source INTEGER, + block_index INTEGER, + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + ("bet_hash",), + ), + ( + "dividends", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset", + "dividend_asset", + "quantity_per_unit", + "fee_paid", + "status", + ), + """CREATE TABLE dividends( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + asset INTEGER, + dividend_asset INTEGER, + quantity_per_unit INTEGER, + fee_paid INTEGER, + status TEXT, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "burns", + ("tx_index", "tx_hash", "block_index", "source", "burned", "earned", "status"), + """CREATE TABLE burns( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + burned INTEGER, + earned INTEGER, + status TEXT, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + # cancels: ``offer_hash`` becomes ``offer_tx_index``; resolved from the + # old hex offer_hash via a JOIN below. + ( + "cancels", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "offer_tx_index", + "status", + ), + """CREATE TABLE cancels( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + offer_tx_index INTEGER, + status TEXT, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "rps", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "possible_moves", + "wager", + "move_random_hash", + "expiration", + "expire_index", + "status", + ), + """CREATE TABLE rps( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + possible_moves INTEGER, + wager INTEGER, + move_random_hash BLOB, + expiration INTEGER, + expire_index INTEGER, + status TEXT)""", + ("tx_hash", "move_random_hash"), + ), + ( + "rps_matches", + ( + "tx0_index", + "tx0_hash", + "tx0_address", + "tx1_index", + "tx1_hash", + "tx1_address", + "tx0_move_random_hash", + "tx1_move_random_hash", + "wager", + "possible_moves", + "tx0_block_index", + "tx1_block_index", + "block_index", + "tx0_expiration", + "tx1_expiration", + "match_expire_index", + "status", + ), + """CREATE TABLE rps_matches( + tx0_index INTEGER, + tx0_hash BLOB, + tx0_address INTEGER, + tx1_index INTEGER, + tx1_hash BLOB, + tx1_address INTEGER, + tx0_move_random_hash BLOB, + tx1_move_random_hash BLOB, + wager INTEGER, + possible_moves INTEGER, + tx0_block_index INTEGER, + tx1_block_index INTEGER, + block_index INTEGER, + tx0_expiration INTEGER, + tx1_expiration INTEGER, + match_expire_index INTEGER, + status TEXT)""", + ("tx0_hash", "tx1_hash", "tx0_move_random_hash", "tx1_move_random_hash"), + ), + ( + "rps_expirations", + ("rps_index", "rps_hash", "source", "block_index"), + """CREATE TABLE rps_expirations( + rps_index INTEGER PRIMARY KEY, + rps_hash BLOB UNIQUE, + source INTEGER, + block_index INTEGER, + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + ("rps_hash",), + ), + ( + "rpsresolves", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "move", + "random", + "rps_match_tx0_index", + "rps_match_tx1_index", + "status", + ), + """CREATE TABLE rpsresolves( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + move INTEGER, + random TEXT, + rps_match_tx0_index INTEGER, + rps_match_tx1_index INTEGER, + status TEXT, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "sweeps", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "destination", + "flags", + "status", + "memo", + "fee_paid", + ), + """CREATE TABLE sweeps( + tx_index INTEGER PRIMARY KEY, + tx_hash BLOB UNIQUE, + block_index INTEGER, + source INTEGER, + destination INTEGER, + flags INTEGER, + status TEXT, + memo BLOB, + fee_paid INTEGER, + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "dispensers", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset", + "give_quantity", + "escrow_quantity", + "satoshirate", + "status", + "give_remaining", + "oracle_address", + "last_status_tx_hash", + "origin", + "dispense_count", + "last_status_tx_source", + "close_block_index", + ), + """CREATE TABLE dispensers( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset INTEGER, + give_quantity INTEGER, + escrow_quantity INTEGER, + satoshirate INTEGER, + status INTEGER, + give_remaining INTEGER, + oracle_address INTEGER, + last_status_tx_hash BLOB, + origin INTEGER, + dispense_count INTEGER DEFAULT 0, + last_status_tx_source INTEGER, + close_block_index INTEGER)""", + ("tx_hash", "last_status_tx_hash"), + ), + ( + "dispenses", + ( + "tx_index", + "dispense_index", + "tx_hash", + "block_index", + "source", + "destination", + "asset", + "dispense_quantity", + "dispenser_tx_index", + "btc_amount", + ), + """CREATE TABLE dispenses ( + tx_index INTEGER, + dispense_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + destination INTEGER, + asset INTEGER, + dispense_quantity INTEGER, + dispenser_tx_index INTEGER, + btc_amount INTEGER, + PRIMARY KEY (tx_index, dispense_index, source, destination), + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "dispenser_refills", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "destination", + "asset", + "dispense_quantity", + "dispenser_tx_index", + ), + """CREATE TABLE dispenser_refills( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + destination INTEGER, + asset INTEGER, + dispense_quantity INTEGER, + dispenser_tx_index INTEGER, + PRIMARY KEY (tx_index, source, destination), + FOREIGN KEY (tx_index) + REFERENCES transactions(tx_index))""", + ("tx_hash",), + ), + ( + "fairminters", + ( + "tx_hash", + "tx_index", + "block_index", + "source", + "asset", + "asset_parent", + "asset_longname", + "description", + "price", + "quantity_by_price", + "hard_cap", + "burn_payment", + "max_mint_per_tx", + "premint_quantity", + "start_block", + "end_block", + "minted_asset_commission_int", + "soft_cap", + "soft_cap_deadline_block", + "lock_description", + "lock_quantity", + "divisible", + "pre_minted", + "status", + "max_mint_per_address", + "mime_type", + ), + """CREATE TABLE fairminters ( + tx_hash BLOB, + tx_index INTEGER, + block_index INTEGER, + source INTEGER, + asset INTEGER, + asset_parent INTEGER, + asset_longname TEXT, + description TEXT, + price INTEGER, + quantity_by_price INTEGER, + hard_cap INTEGER, + burn_payment BOOL, + max_mint_per_tx INTEGER, + premint_quantity INTEGER, + start_block INTEGER, + end_block INTEGER, + minted_asset_commission_int INTEGER, + soft_cap INTEGER, + soft_cap_deadline_block INTEGER, + lock_description BOOL, + lock_quantity BOOL, + divisible BOOL, + pre_minted BOOL DEFAULT 0, + status TEXT, + max_mint_per_address INTEGER, + mime_type TEXT DEFAULT "text/plain" + )""", + ("tx_hash",), + ), + ( + "fairmints", + ( + "tx_hash", + "tx_index", + "block_index", + "source", + "fairminter_tx_index", + "asset", + "earn_quantity", + "paid_quantity", + "commission", + "status", + ), + """CREATE TABLE fairmints ( + tx_hash BLOB PRIMARY KEY, + tx_index INTEGER, + block_index INTEGER, + source INTEGER, + fairminter_tx_index INTEGER, + asset INTEGER, + earn_quantity INTEGER, + paid_quantity INTEGER, + commission INTEGER, + status TEXT + )""", + ("tx_hash",), + ), + ( + "sends", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "destination", + "asset", + "quantity", + "status", + "msg_index", + "memo", + "fee_paid", + "send_type", + "source_address", + "destination_address", + ), + """CREATE TABLE "sends"( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + destination INTEGER, + asset INTEGER, + quantity INTEGER, + status TEXT, + msg_index INTEGER DEFAULT 0, + memo BLOB, + fee_paid INTEGER DEFAULT 0, + send_type TEXT, + source_address INTEGER, + destination_address INTEGER, + PRIMARY KEY (tx_index, msg_index), + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index), + UNIQUE (tx_hash, msg_index) ON CONFLICT FAIL)""", + ("tx_hash",), + ), + ( + "destructions", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset", + "quantity", + "tag", + "status", + ), + """CREATE TABLE destructions( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset INTEGER, + quantity INTEGER, + tag TEXT, + status TEXT + )""", + ("tx_hash",), + ), + ( + "transaction_outputs", + ("tx_index", "block_index", "out_index", "destination", "btc_amount"), + """CREATE TABLE transaction_outputs( + tx_index INTEGER, + block_index INTEGER, + out_index INTEGER, + destination INTEGER, + btc_amount INTEGER, + PRIMARY KEY (tx_index, out_index), + FOREIGN KEY (tx_index) REFERENCES transactions(tx_index))""", + (), + ), + # addresses: the broadcast/options history table (multiple rows per + # address). Its ``address`` TEXT column is normalized to the ``address_id`` + # FK on ``address_list`` like every other address column. The id table + # itself is ``address_list`` (created above), not this history table. + ( + "addresses", + ("address", "options", "block_index"), + """CREATE TABLE addresses( + address INTEGER, + options INTEGER, + block_index INTEGER)""", + (), + ), + ( + "pools", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset_a", + "asset_b", + "reserve_a", + "reserve_b", + "lp_asset", + ), + """CREATE TABLE pools( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset_a INTEGER, + asset_b INTEGER, + reserve_a INTEGER, + reserve_b INTEGER, + lp_asset TEXT +)""", + ("tx_hash",), + ), + ( + "pool_deposits", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset_a", + "asset_b", + "quantity_a", + "quantity_b", + "quantity_minted", + "status", + ), + """CREATE TABLE pool_deposits( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset_a INTEGER, + asset_b INTEGER, + quantity_a INTEGER, + quantity_b INTEGER, + quantity_minted INTEGER, + status TEXT +)""", + ("tx_hash",), + ), + ( + "pool_withdrawals", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset_a", + "asset_b", + "quantity_destroyed", + "quantity_a", + "quantity_b", + "status", + ), + """CREATE TABLE pool_withdrawals( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset_a INTEGER, + asset_b INTEGER, + quantity_destroyed INTEGER, + quantity_a INTEGER, + quantity_b INTEGER, + status TEXT +)""", + ("tx_hash",), + ), + ( + "pool_matches", + ( + "tx_index", + "tx_hash", + "block_index", + "source", + "asset_a", + "asset_b", + "forward_asset", + "forward_quantity", + "backward_asset", + "backward_quantity", + "fee_quantity", + "fee_bps", + "order_tx_index", + "status", + ), + """CREATE TABLE pool_matches( + tx_index INTEGER, + tx_hash BLOB, + block_index INTEGER, + source INTEGER, + asset_a INTEGER, + asset_b INTEGER, + forward_asset INTEGER, + forward_quantity INTEGER, + backward_asset INTEGER, + backward_quantity INTEGER, + fee_quantity INTEGER, + fee_bps INTEGER, + order_tx_index INTEGER, + status TEXT +)""", + ("tx_hash",), + ), + # ------------------------------------------------------------------ + # Composite match-id normalization: the four tables below referenced a + # match through a single TEXT ``*_match_id`` (``tx0hash_tx1hash``). They + # are rewritten to a ``(*_tx0_index, *_tx1_index)`` integer pair resolved + # via JOIN on ``transactions`` (see CUSTOM_INSERT_SELECT). They have no + # hash columns of their own, which is why they were skipped by the + # original hex->BLOB pass. + # ------------------------------------------------------------------ + ( + "order_match_expirations", + ( + "order_match_tx0_index", + "order_match_tx1_index", + "tx0_address", + "tx1_address", + "block_index", + ), + """CREATE TABLE order_match_expirations( + order_match_tx0_index INTEGER, + order_match_tx1_index INTEGER, + tx0_address INTEGER, + tx1_address INTEGER, + block_index INTEGER, + PRIMARY KEY (order_match_tx0_index, order_match_tx1_index), + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + (), + ), + ( + "bet_match_expirations", + ( + "bet_match_tx0_index", + "bet_match_tx1_index", + "tx0_address", + "tx1_address", + "block_index", + ), + """CREATE TABLE bet_match_expirations( + bet_match_tx0_index INTEGER, + bet_match_tx1_index INTEGER, + tx0_address INTEGER, + tx1_address INTEGER, + block_index INTEGER, + PRIMARY KEY (bet_match_tx0_index, bet_match_tx1_index), + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + (), + ), + ( + "rps_match_expirations", + ( + "rps_match_tx0_index", + "rps_match_tx1_index", + "tx0_address", + "tx1_address", + "block_index", + ), + """CREATE TABLE rps_match_expirations( + rps_match_tx0_index INTEGER, + rps_match_tx1_index INTEGER, + tx0_address INTEGER, + tx1_address INTEGER, + block_index INTEGER, + PRIMARY KEY (rps_match_tx0_index, rps_match_tx1_index), + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + (), + ), + ( + "bet_match_resolutions", + ( + "bet_match_tx0_index", + "bet_match_tx1_index", + "bet_match_type_id", + "block_index", + "winner", + "settled", + "bull_credit", + "bear_credit", + "escrow_less_fee", + "fee", + ), + """CREATE TABLE bet_match_resolutions( + bet_match_tx0_index INTEGER, + bet_match_tx1_index INTEGER, + bet_match_type_id INTEGER, + block_index INTEGER, + winner INTEGER, + settled BOOL, + bull_credit INTEGER, + bear_credit INTEGER, + escrow_less_fee INTEGER, + fee INTEGER, + PRIMARY KEY (bet_match_tx0_index, bet_match_tx1_index), + FOREIGN KEY (block_index) REFERENCES blocks(block_index))""", + (), + ), +] + + +# --------------------------------------------------------------------------- +# Asset normalization: columns that store an asset *name* (TEXT) and are +# rewritten to the compact integer ``asset_index`` foreign key on ``assets``. +# +# Single source of truth shared by: +# * the migration (``0010``): the auto INSERT/SELECT path resolves each of +# these columns to its ``asset_index`` via a subquery on the new ``assets`` +# table (only for columns also present in the table's column list, so the +# not-yet-added ``fairminters.lp_asset`` is naturally skipped at migration +# time and handled at runtime once ``0011`` adds it). +# * the write path (``ledger.events._prepare_record_for_insert``): converts +# the in-memory asset name to its ``asset_index`` just before INSERT. +# +# ``assets``/``assets_info`` are intentionally absent: ``asset_id``/``asset_name`` +# there are the source-of-truth values, not foreign keys. +# --------------------------------------------------------------------------- +ASSET_NAME_COLUMNS = { + "balances": ("asset",), + "credits": ("asset",), + "debits": ("asset",), + "sends": ("asset",), + "orders": ("give_asset", "get_asset"), + "order_matches": ("forward_asset", "backward_asset"), + "issuances": ("asset",), + "dividends": ("asset", "dividend_asset"), + "dispensers": ("asset",), + "dispenses": ("asset",), + "dispenser_refills": ("asset",), + # NB: ``lp_asset`` (on ``fairminters``/``pools``) is intentionally NOT + # normalized: an LP token is referenced (earmarked on the fairminter) + # before it is created when the pool opens, so it cannot resolve to an + # ``asset_index`` at write time. LP names are numeric (``A...``) anyway, so + # the saving would be marginal. It stays a TEXT asset name. + "fairminters": ("asset", "asset_parent"), + "fairmints": ("asset",), + "destructions": ("asset",), + "pools": ("asset_a", "asset_b"), + "pool_deposits": ("asset_a", "asset_b"), + "pool_withdrawals": ("asset_a", "asset_b"), + "pool_matches": ("asset_a", "asset_b", "forward_asset", "backward_asset"), +} + + +# --------------------------------------------------------------------------- +# Address normalization: columns that store a bitcoin/counterparty address +# (TEXT) and are rewritten to the compact integer ``address_id`` foreign key on +# the ``address_list`` identity table. +# +# Single source of truth shared by: +# * the migration (``0010``): the auto INSERT/SELECT path resolves each of +# these columns to its ``address_id`` via a subquery on ``address_list`` +# (only for columns present in the table's column list); custom +# INSERT/SELECT clauses do the same explicitly. +# * the write path (``ledger.events._prepare_record_for_insert`` and the +# raw-SQL ``add_to_balance``/``remove_from_balance``): converts the +# in-memory address string to its ``address_id`` just before INSERT, +# creating the ``address_list`` row first if needed (``ensure_address``). +# * the read path (``utils.database.rowtracer``): decodes ``address_id`` back +# to the address string so consensus/API/tests keep seeing strings. +# +# NB: ``mempool.addresses`` is a comma-separated LIST of addresses, not a single +# address, so it is intentionally absent (stays TEXT). ``mempool_transactions`` +# is transient (rolled back) and also stays TEXT. +# --------------------------------------------------------------------------- +ADDRESS_NAME_COLUMNS = { + "balances": ("address", "utxo_address"), + "credits": ("address", "utxo_address"), + "debits": ("address", "utxo_address"), + "transactions": ("source", "destination"), + "sends": ("source", "destination", "source_address", "destination_address"), + "btcpays": ("source", "destination"), + "sweeps": ("source", "destination"), + "dispenses": ("source", "destination"), + "dispenser_refills": ("source", "destination"), + "issuances": ("source", "issuer"), + "bets": ("source", "feed_address"), + "bet_matches": ("tx0_address", "tx1_address", "feed_address"), + "order_matches": ("tx0_address", "tx1_address"), + "order_match_expirations": ("tx0_address", "tx1_address"), + "rps_matches": ("tx0_address", "tx1_address"), + "rps_match_expirations": ("tx0_address", "tx1_address"), + "bet_match_expirations": ("tx0_address", "tx1_address"), + "bet_match_resolutions": ("winner",), + "dispensers": ("source", "oracle_address", "origin", "last_status_tx_source"), + "transaction_outputs": ("destination",), + "addresses": ("address",), + "orders": ("source",), + "destructions": ("source",), + "broadcasts": ("source",), + "dividends": ("source",), + "burns": ("source",), + "cancels": ("source",), + "rps": ("source",), + "rps_expirations": ("source",), + "rpsresolves": ("source",), + "bet_expirations": ("source",), + "order_expirations": ("source",), + "fairminters": ("source",), + "fairmints": ("source",), + "pools": ("source",), + "pool_deposits": ("source",), + "pool_withdrawals": ("source",), + "pool_matches": ("source",), +} + + +# --------------------------------------------------------------------------- +# UTXO compaction: the ``utxo`` TEXT column (``tx_hash:vout``) on +# balances/credits/debits is replaced by a compact ``(utxo_tx_hash, +# utxo_vout)`` integer pair. Every utxo's ``tx_hash`` is a Counterparty-indexed +# transaction (the parser adds any tx spending an asset-bearing UTXO to +# ``transactions``), so the hash always resolves to a ``tx_index``. The +# original ``utxo`` string is reconstructed transparently on read by the +# rowtracer, so consensus/API/tests are unchanged. +# +# Mapping: table -> (legacy_utxo_column, tx_index_column, vout_column) +# --------------------------------------------------------------------------- +UTXO_SPLIT_COLUMNS = { + "balances": ("utxo", "utxo_tx_hash", "utxo_vout"), + "credits": ("utxo", "utxo_tx_hash", "utxo_vout"), + "debits": ("utxo", "utxo_tx_hash", "utxo_vout"), +} diff --git a/counterparty-core/counterpartycore/lib/ledger/migrations/0010.compact_hash_storage.py b/counterparty-core/counterpartycore/lib/ledger/migrations/0010.compact_hash_storage.py new file mode 100644 index 0000000000..81cc960c2e --- /dev/null +++ b/counterparty-core/counterpartycore/lib/ledger/migrations/0010.compact_hash_storage.py @@ -0,0 +1,340 @@ +"""Compact hash storage migration. + +This migration compacts the on-disk size of every hash-typed column on the +ledger schema. It applies two independent storage optimizations in a single +table-rewrite pass: + + 1. Hex -> binary: every ``*_hash`` column (and derivatives like + ``*_random_hash``/``offer_hash``) is converted from ``TEXT(64 hex)`` to + ``BLOB(32)``. Indexes on those columns are rebuilt against the new + binary representation. Approximate savings: 32 bytes per hash on the + value, plus ~50% on every hash-related index. + + 2. Hash -> tx_index foreign keys: a handful of tables that already store + a ``tx_index`` no longer need to carry the duplicate ``tx_hash`` text + column. The legacy column is dropped and, where it referenced another + table's transaction, replaced by an integer ``*_tx_index`` foreign key + resolved via a JOIN on ``transactions.tx_hash``. Affected tables: + ``messages`` (drop ``tx_hash``, add ``tx_index``), ``transactions`` + (drop ``block_hash``), ``transaction_outputs`` (drop ``tx_hash``), + ``cancels`` (``offer_hash`` -> ``offer_tx_index``), ``dispenses``, + ``dispenser_refills`` (``dispenser_tx_hash`` -> ``dispenser_tx_index``), + ``fairmints`` (``fairminter_tx_hash`` -> ``fairminter_tx_index``), + ``pool_matches`` (``order_tx_hash`` -> ``order_tx_index``). + +The PK ``transactions(tx_index, tx_hash, block_index)`` is reduced to +``(tx_index)`` to keep the composite-key story simple after ``block_hash`` +is dropped. + +Because the schema is enforced by ``BEFORE UPDATE ... RAISE(FAIL, ...)`` +triggers on many tables, we use the create-new + INSERT SELECT + DROP + +RENAME pattern; the triggers themselves are dropped at the top of the +migration and recreated at the end against the new tables. + +The data transformation relies on a tiny ``__hex_to_blob`` SQLite UDF that +the migration registers on the apsw/yoyo connection at the start of ``apply``. + +This migration is idempotent in the sense that if it has already run, the +column types are BLOB and re-application is short-circuited via a version +sentinel stored in the ``config`` table. +""" + +import logging +import sqlite3 + +import apsw +from counterpartycore.lib import config +from counterpartycore.lib.ledger.migration_data.compact_hash_schema import ( + ADDRESS_NAME_COLUMNS, + ASSET_NAME_COLUMNS, + CUSTOM_INSERT_SELECT, + INDEXES_AFTER_REWRITE, + NO_UPDATE_TRIGGERS, + TABLE_REWRITES, + TRIGGERS_AFTER_REWRITE, + VIEWS_AFTER_REWRITE, +) +from counterpartycore.lib.utils import hashcodec +from yoyo import step + +logger = logging.getLogger(config.LOGGER_NAME) + +# DB driver errors raised by ``cursor.execute`` when the targeted table is +# missing. yoyo may pass either an apsw connection (apsw.SQLError) or a +# stdlib sqlite3 connection (sqlite3.OperationalError) depending on its +# backend. Group them so the idempotency probe doesn't depend on which +# driver yoyo selected at runtime. +_DB_PROBE_ERRORS = (apsw.SQLError, sqlite3.OperationalError, sqlite3.DatabaseError) + + +SENTINEL_NAME = "COMPACT_HASH_STORAGE_APPLIED" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _register_udfs(db): + hashcodec.register_db_functions(db) + + +def _table_has_column(cursor, table, column): + rows = cursor.execute(f"PRAGMA table_info({table})").fetchall() + if not rows: + return False + if isinstance(rows[0], dict): + names = {r["name"] for r in rows} + else: + names = {r[1] for r in rows} + return column in names + + +def _populate_address_list(cursor, renamed_tables): + """Populate the brand-new ``address_list`` id table from the DISTINCT set of + every address value across all renamed ``*_old`` tables. + + Run AFTER phase 1 (the ``*_old`` tables exist) and BEFORE phase 2 (so the + per-table copy can resolve addresses to ids). ``address_id`` auto-assigns in + ``ORDER BY address`` order, which makes the assignment deterministic (it is + an internal FK only -- consensus and API see the decoded string). Only the + ``ADDRESS_NAME_COLUMNS`` sources are unioned, each guarded by + ``_table_has_column`` so a column absent at migration time is skipped; + ``mempool``/``mempool_transactions`` are excluded (transient / list).""" + selects = [] + for table, columns in ADDRESS_NAME_COLUMNS.items(): + if table not in renamed_tables: + continue + old_table = f"{table}_old" + for col in columns: + if _table_has_column(cursor, old_table, col): + selects.append( + f"SELECT {col} AS addr FROM {old_table} WHERE {col} IS NOT NULL" # nosec B608 # noqa: S608 + ) + if not selects: + return + union_sql = " UNION ALL ".join(selects) + cursor.execute( + "INSERT INTO address_list (address) " # nosec B608 # noqa: S608 + f"SELECT DISTINCT addr FROM ({union_sql}) ORDER BY addr" + ) + + +def _column_affinity(cursor, table, column): + rows = cursor.execute(f"PRAGMA table_info({table})").fetchall() + for r in rows: + if isinstance(r, dict): + if r["name"] == column: + return (r["type"] or "").upper() + else: + if r[1] == column: + return (r[2] or "").upper() + return None + + +def _index_definitions(cursor, table): + """Return a list of (name, sql) for every index on ``table`` that isn't an + auto index for the table's primary key.""" + rows = cursor.execute( + "SELECT name, sql FROM sqlite_master " + "WHERE type='index' AND tbl_name = ? AND sql IS NOT NULL", + (table,), + ).fetchall() + out = [] + for r in rows: + name = r["name"] if isinstance(r, dict) else r[0] + sql = r["sql"] if isinstance(r, dict) else r[1] + out.append((name, sql)) + return out + + +def _drop_views(cursor): + """Drop legacy views; they reference tables we are about to recreate. + We recreate them at the end of the migration with the new column types.""" + for view in ( + "all_holders", + "all_expirations", + "all_transactions", + "all_transactions_with_status", + "transactions_with_status", + ): + cursor.execute(f"DROP VIEW IF EXISTS {view}") # nosec B608 + + +def _drop_triggers(cursor): + for trig in NO_UPDATE_TRIGGERS: + cursor.execute(f"DROP TRIGGER IF EXISTS {trig}") # nosec B608 + + +# --------------------------------------------------------------------------- +# Main migration entry points +# --------------------------------------------------------------------------- + + +def apply(conn): + """Apply the compact-hash storage migration to the ledger DB. + + ``conn`` is the yoyo-provided connection (a stock sqlite3 connection wrapped + in apsw on some versions). We coerce to the same row-factory contract as + the rest of the codebase by extracting the underlying connection. + """ + db = conn + # yoyo sometimes passes the apsw Connection directly; sometimes a sqlite3 + # connection. Both expose ``cursor()``. + cursor = db.cursor() + + if hasattr(cursor, "fetchone"): + # sqlite3 stdlib path: rows come back as tuples by default. + pass + + # Idempotency: bail if already applied (the rerun-safe shape avoids + # double work on dev DBs). + try: + row = cursor.execute("SELECT value FROM config WHERE name = ?", (SENTINEL_NAME,)).fetchone() + except _DB_PROBE_ERRORS: + # ``config`` may not exist yet on a fresh DB; treat that as + # "not applied" and let the migration create the table downstream. + row = None + if row: + logger.info("Compact-hash storage migration already applied, skipping.") + return + + # Register the apsw UDF for hex -> BLOB; yoyo on apsw exposes + # ``createscalarfunction`` on the connection. + try: + db.createscalarfunction("__hex_to_blob", _hex_to_blob_udf, 1) + except AttributeError: + # stdlib sqlite3 path + db.create_function("__hex_to_blob", 1, _hex_to_blob_udf) + + # Make sure we can recreate tables freely. ``legacy_alter_table = ON`` + # prevents SQLite from auto-rewriting FK references in *other* tables + # when we RENAME a parent table -- without it, ``ALTER TABLE blocks + # RENAME TO blocks_old`` will silently retarget every dependent FK + # (credits, debits, ...) to ``blocks_old`` and then crash when the + # legacy table is dropped at the end of the migration. + cursor.execute("PRAGMA foreign_keys = OFF") + cursor.execute("PRAGMA defer_foreign_keys = ON") + cursor.execute("PRAGMA legacy_alter_table = ON") + + _drop_views(cursor) + _drop_triggers(cursor) + + # Phase 1: rename all existing tables to ``_old`` so cross-table + # JOINs (resolution of hex tx_hash -> tx_index for the FK-conversion + # tables) can run against the legacy data after individual rewrites + # complete. + renamed_tables = [] + for entry in TABLE_REWRITES: + table = entry[0] + new_create_sql = entry[2] + existing = cursor.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name = ?", + (table,), + ).fetchone() + if not existing: + cursor.execute(new_create_sql) + continue + cursor.execute(f"ALTER TABLE {table} RENAME TO {table}_old") # nosec B608 + cursor.execute(new_create_sql) + renamed_tables.append(table) + + # Phase 1b: populate the brand-new ``address_list`` id table from the + # DISTINCT set of every address value across the ``*_old`` tables, so the + # per-table copy below can resolve each address to its compact + # ``address_id``. Must run after all renames and before any copy. + _populate_address_list(cursor, renamed_tables) + + # Phase 2: copy data from each ``_old`` into the new tables. JOINs against + # ``transactions_old`` work because all old tables are still present. + for entry in TABLE_REWRITES: + if len(entry) == 4: + table, columns, _new_create_sql, hex_columns = entry + else: + table, columns, _new_create_sql, hex_columns, *_ = entry + + if table not in renamed_tables: + continue + + if table in CUSTOM_INSERT_SELECT: + select_sql = CUSTOM_INSERT_SELECT[table] + cursor.execute( + f"INSERT INTO {table} ({', '.join(columns)}) {select_sql}" # nosec B608 # noqa: S608 + ) + else: + # Asset-name columns are resolved to the compact ``asset_index`` via + # a correlated subquery on the freshly-populated ``assets`` table + # (``assets`` is first in TABLE_REWRITES, so it is fully rewritten + # before any other table runs). Only columns present in this + # table's column list are touched, so an asset column that does not + # yet exist at migration time (e.g. ``fairminters.lp_asset``, added + # by 0011) is naturally skipped. + asset_cols = ASSET_NAME_COLUMNS.get(table, ()) + addr_cols = ADDRESS_NAME_COLUMNS.get(table, ()) + select_cols = [] + for col in columns: + if col in hex_columns: + select_cols.append(f"__hex_to_blob({col}) AS {col}") + elif col in asset_cols: + select_cols.append( + f"(SELECT a.asset_index FROM assets a " # nosec B608 # noqa: S608 + f"WHERE a.asset_name = {table}_old.{col}) AS {col}" + ) + elif col in addr_cols: + select_cols.append( + f"(SELECT al.address_id FROM address_list al " # nosec B608 # noqa: S608 + f"WHERE al.address = {table}_old.{col}) AS {col}" + ) + else: + select_cols.append(col) + cursor.execute( + f"INSERT INTO {table} ({', '.join(columns)}) " # nosec B608 # noqa: S608 + f"SELECT {', '.join(select_cols)} FROM {table}_old" + ) + + # Phase 3: drop all the renamed legacy tables. + for table in renamed_tables: + cursor.execute(f"DROP TABLE {table}_old") # nosec B608 + + # 5. Recreate triggers and indexes. + for trig_sql in TRIGGERS_AFTER_REWRITE: + cursor.execute(trig_sql) + for idx_sql in INDEXES_AFTER_REWRITE: + cursor.execute(idx_sql) + + # 6. Recreate views referencing the new tables. + for view_sql in VIEWS_AFTER_REWRITE: + cursor.execute(view_sql) + + # 7. Sentinel so we don't re-run. + cursor.execute( + "INSERT OR REPLACE INTO config (name, value) VALUES (?, ?)", + (SENTINEL_NAME, "1"), + ) + + cursor.execute("PRAGMA legacy_alter_table = OFF") + cursor.execute("PRAGMA foreign_keys = ON") + logger.info("Compact-hash storage migration applied.") + + +def rollback(conn): + # Rollback is not supported for this migration: the data transformation + # is one-directional. Operators should restore from bootstrap. + raise NotImplementedError( + "Compact-hash storage migration cannot be rolled back; restore from bootstrap." + ) + + +def _hex_to_blob_udf(value): + """SQLite UDF: convert a hex string to BLOB, or NULL to NULL.""" + if value is None: + return None + if isinstance(value, bytes): + return value + if value == "": + return None + return bytes.fromhex(value) + + +if not __name__.startswith("apsw_"): + steps = [step(apply, rollback)] diff --git a/counterparty-core/counterpartycore/lib/ledger/migrations/0010.fairminter_pool.sql b/counterparty-core/counterpartycore/lib/ledger/migrations/0011.fairminter_pool.sql similarity index 100% rename from counterparty-core/counterpartycore/lib/ledger/migrations/0010.fairminter_pool.sql rename to counterparty-core/counterpartycore/lib/ledger/migrations/0011.fairminter_pool.sql diff --git a/counterparty-core/counterpartycore/lib/ledger/other.py b/counterparty-core/counterpartycore/lib/ledger/other.py index 49b7c70015..00ae19e3b2 100644 --- a/counterparty-core/counterpartycore/lib/ledger/other.py +++ b/counterparty-core/counterpartycore/lib/ledger/other.py @@ -1,5 +1,7 @@ from counterpartycore.lib import config, exceptions from counterpartycore.lib.ledger.events import insert_update +from counterpartycore.lib.utils import database, hashcodec +from counterpartycore.lib.utils.helpers import MATCH_ID_SQL ##################### # BROADCASTS # @@ -13,7 +15,11 @@ def get_oracle_last_price(db, oracle_address, block_index): WHERE source = :source AND status = :status AND block_index < :block_index ORDER by tx_index DESC LIMIT 1 """ - bindings = {"source": oracle_address, "status": "valid", "block_index": block_index} + bindings = { + "source": database.address_index_from_name(db, oracle_address), + "status": "valid", + "block_index": block_index, + } cursor.execute(query, bindings) broadcasts = cursor.fetchall() cursor.close() @@ -51,7 +57,7 @@ def get_broadcasts_by_source(db, address: str, status: str = "valid", order_by: WHERE (status = ? AND source = ?) ORDER BY tx_index {order_by} """ # nosec B608 # noqa: S608 # nosec B608 - bindings = (status, address) + bindings = (status, database.address_index_from_name(db, address)) cursor.execute(query, bindings) return cursor.fetchall() @@ -75,7 +81,7 @@ def get_burns(db, address: str = None, status: str = "valid"): bindings.append(status) if address is not None: where.append("source = ?") - bindings.append(address) + bindings.append(database.address_index_from_name(db, address)) # no sql injection here query = f"""SELECT * FROM burns WHERE ({" AND ".join(where)})""" # nosec B608 # noqa: S608 # nosec B608 cursor.execute(query, tuple(bindings)) @@ -93,7 +99,7 @@ def get_addresses(db, address=None): bindings = [] if address is not None: where.append("address = ?") - bindings.append(address) + bindings.append(database.address_index_from_name(db, address)) # no sql injection here query = f"""SELECT *, MAX(rowid) AS rowid FROM addresses WHERE ({" AND ".join(where)}) GROUP BY address""" # nosec B608 # noqa: S608 # nosec B608 cursor.execute(query, tuple(bindings)) @@ -106,7 +112,7 @@ def get_send_msg_index(db, tx_hash): """ SELECT MAX(msg_index) as msg_index FROM sends WHERE tx_hash = ? """, - (tx_hash,), + (hashcodec.hash_to_db(tx_hash),), ).fetchone() if last_msg_index and last_msg_index["msg_index"] is not None: msg_index = last_msg_index["msg_index"] + 1 @@ -121,7 +127,7 @@ def get_issuance_msg_index(db, tx_hash): """ SELECT MAX(msg_index) as msg_index FROM issuances WHERE tx_hash = ? """, - (tx_hash,), + (hashcodec.hash_to_db(tx_hash),), ).fetchone() if last_msg_index and last_msg_index["msg_index"] is not None: msg_index = last_msg_index["msg_index"] + 1 @@ -139,34 +145,34 @@ def get_issuance_msg_index(db, tx_hash): def get_pending_bet_matches(db, feed_address, order_by=None): cursor = db.cursor() - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) as rowid + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) as rowid FROM bet_matches WHERE feed_address = ? - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = ? - """ + """ # noqa: S608 # nosec B608 if order_by is not None: query += f" ORDER BY {order_by}" else: query += " ORDER BY rowid" - bindings = (feed_address, "pending") + bindings = (database.address_index_from_name(db, feed_address), "pending") cursor.execute(query, bindings) return cursor.fetchall() def get_bet_matches_to_expire(db, block_time): cursor = db.cursor() - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) as rowid + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) as rowid FROM bet_matches WHERE deadline < ? AND deadline > ? - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = ? ORDER BY rowid - """ + """ # noqa: S608 # nosec B608 bindings = ( block_time - config.TWO_WEEKS, block_time @@ -188,7 +194,7 @@ def get_bet(db, bet_hash: str): WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1 """ - bindings = (bet_hash,) + bindings = (hashcodec.hash_to_db(bet_hash),) cursor.execute(query, bindings) return cursor.fetchall() @@ -220,7 +226,7 @@ def get_matching_bets(db, feed_address, bet_type): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (feed_address, bet_type, "open") + bindings = (database.address_index_from_name(db, feed_address), bet_type, "open") cursor.execute(query, bindings) return cursor.fetchall() @@ -241,7 +247,7 @@ def get_bet_by_feed(db, address: str, status: str = "open"): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (address, status) + bindings = (database.address_index_from_name(db, address), status) cursor.execute(query, bindings) return cursor.fetchall() @@ -257,7 +263,7 @@ def get_open_bets_by_source(db, address): ) WHERE status = ? ORDER BY tx_index, tx_hash """ - bindings = (address, "open") + bindings = (database.address_index_from_name(db, address), "open") cursor.execute(query, bindings) return cursor.fetchall() diff --git a/counterparty-core/counterpartycore/lib/ledger/supplies.py b/counterparty-core/counterpartycore/lib/ledger/supplies.py index fd192146d9..e22e914b5e 100644 --- a/counterparty-core/counterpartycore/lib/ledger/supplies.py +++ b/counterparty-core/counterpartycore/lib/ledger/supplies.py @@ -1,6 +1,8 @@ from counterpartycore.lib import config from counterpartycore.lib.ledger.caches import AssetCache from counterpartycore.lib.parser import protocol +from counterpartycore.lib.utils import database +from counterpartycore.lib.utils.helpers import MATCH_ID_SQL # Ugly way to get holders but we want to preserve the order with the old query @@ -36,6 +38,9 @@ def holders(db, asset, exclude_empty_holders=False): """Return holders of the asset.""" all_holders = [] cursor = db.cursor() + # Asset columns are stored as the compact asset_index; resolve the name once + # for the WHERE filters below (``asset`` stays the name for the XCP check). + asset_idx = database.asset_index_from_name(db, asset) # Balances @@ -44,7 +49,7 @@ def holders(db, asset, exclude_empty_holders=False): FROM balances WHERE asset = ? AND address IS NOT NULL """ - bindings = (asset,) + bindings = (asset_idx,) cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -53,14 +58,20 @@ def holders(db, asset, exclude_empty_holders=False): exclude_empty_holders=exclude_empty_holders, ) + # ``utxo`` is stored as the compact ``(utxo_tx_hash, utxo_vout)`` pair; the + # rowtracer reconstructs the ``utxo`` string. ``holders()`` order is + # consensus-relevant (dividends credit holders in this order), so reproduce + # the original ``ORDER BY utxo`` by ordering on the reconstructed + # ``tx_hash:vout`` string (``hex_lower`` yields the lowercase hex the utxo + # string used). query = """ SELECT *, rowid FROM balances - WHERE asset = ? AND utxo IS NOT NULL - ORDER BY utxo + WHERE asset = ? AND utxo_tx_hash IS NOT NULL + ORDER BY hex_lower(utxo_tx_hash) || ':' || utxo_vout """ - bindings = (asset,) + bindings = (asset_idx,) cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -79,7 +90,7 @@ def holders(db, asset, exclude_empty_holders=False): ) WHERE status = ? ORDER BY tx_index """ - bindings = (asset, "open") + bindings = (asset_idx, "open") cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -89,15 +100,15 @@ def holders(db, asset, exclude_empty_holders=False): ) # Funds escrowed in pending order matches. (Protocol change.) - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) FROM order_matches WHERE forward_asset = ? - GROUP BY id + GROUP BY {MATCH_ID_SQL} ) WHERE status = ? - """ - bindings = (asset, "pending") + """ # noqa: S608 # nosec B608 + bindings = (asset_idx, "pending") cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -106,15 +117,15 @@ def holders(db, asset, exclude_empty_holders=False): # exclude_empty_holders=exclude_empty_holders, ) - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) AS rowid + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) AS rowid FROM order_matches WHERE backward_asset = ? ) WHERE status = ? ORDER BY rowid - """ - bindings = (asset, "pending") + """ # noqa: S608 # nosec B608 + bindings = (asset_idx, "pending") cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -142,13 +153,13 @@ def holders(db, asset, exclude_empty_holders=False): # exclude_empty_holders=exclude_empty_holders, ) - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) FROM bet_matches - GROUP BY id + GROUP BY {MATCH_ID_SQL} ) WHERE status = ? - """ + """ # noqa: S608 # nosec B608 bindings = ("pending",) cursor.execute(query, bindings) all_holders += _get_holders( @@ -176,13 +187,13 @@ def holders(db, asset, exclude_empty_holders=False): # exclude_empty_holders=exclude_empty_holders, ) - query = """ + query = f""" SELECT * FROM ( - SELECT *, MAX(rowid) + SELECT *, {MATCH_ID_SQL} AS id, MAX(rowid) FROM rps_matches - GROUP BY id + GROUP BY {MATCH_ID_SQL} ) WHERE status IN (?, ?, ?) - """ + """ # noqa: S608 # nosec B608 bindings = ("pending", "pending and resolved", "resolved and pending") cursor.execute(query, bindings) all_holders += _get_holders( @@ -204,7 +215,7 @@ def holders(db, asset, exclude_empty_holders=False): ) WHERE status = ? ORDER BY tx_index """ - bindings = (asset, 0) + bindings = (asset_idx, 0) cursor.execute(query, bindings) all_holders += _get_holders( cursor, @@ -241,7 +252,7 @@ def xcp_destroyed(db): FROM destructions WHERE (status = ? AND asset = ?) """ - bindings = ("valid", config.XCP) + bindings = ("valid", database.asset_index_from_name(db, config.XCP)) cursor.execute(query, bindings) destroyed_total = list(cursor)[0]["total"] or 0 @@ -315,7 +326,7 @@ def destructions(db): WHERE (status = ? AND asset != ?) GROUP BY asset """ - bindings = ("valid", config.XCP) + bindings = ("valid", database.asset_index_from_name(db, config.XCP)) cursor.execute(query, bindings) for destruction in cursor: @@ -335,7 +346,7 @@ def asset_issued_total_no_cache(db, asset): FROM issuances WHERE (status = ? AND asset = ?) """ - bindings = ("valid", asset) + bindings = ("valid", database.asset_index_from_name(db, asset)) cursor.execute(query, bindings) issued_total = list(cursor)[0]["total"] or 0 cursor.close() @@ -350,7 +361,7 @@ def asset_destroyed_total_no_cache(db, asset): FROM destructions WHERE (status = ? AND asset = ?) """ - bindings = ("valid", asset) + bindings = ("valid", database.asset_index_from_name(db, asset)) cursor.execute(query, bindings) destroyed_total = list(cursor)[0]["total"] or 0 cursor.close() @@ -379,11 +390,14 @@ def supplies(db): def held(db): queries = [ + # ``address``/``asset`` are now small integers; concatenating them + # without a separator would collide (e.g. 5||37 == 53||7), so use ':'. + # ``utxo`` is the compact ``(utxo_tx_hash, utxo_vout)`` pair. """ SELECT asset, SUM(quantity) AS total FROM ( - SELECT address, asset, quantity, (address || asset) AS aa, MAX(rowid) + SELECT address, asset, quantity, (address || ':' || asset) AS aa, MAX(rowid) FROM balances - WHERE address IS NOT NULL AND utxo IS NULL + WHERE address IS NOT NULL AND utxo_tx_hash IS NULL GROUP BY aa ) GROUP BY asset """, @@ -391,14 +405,14 @@ def held(db): SELECT asset, SUM(quantity) AS total FROM ( SELECT NULL, asset, quantity FROM balances - WHERE address IS NULL AND utxo IS NULL + WHERE address IS NULL AND utxo_tx_hash IS NULL ) GROUP BY asset """, """ SELECT asset, SUM(quantity) AS total FROM ( - SELECT utxo, asset, quantity, (utxo || asset) AS aa, MAX(rowid) + SELECT asset, quantity, (hex_lower(utxo_tx_hash) || ':' || utxo_vout || ':' || asset) AS aa, MAX(rowid) FROM balances - WHERE address IS NULL AND utxo IS NOT NULL + WHERE address IS NULL AND utxo_tx_hash IS NOT NULL GROUP BY aa ) GROUP BY asset """, @@ -413,7 +427,8 @@ def held(db): SELECT give_asset AS asset, SUM(give_remaining) AS total FROM ( SELECT give_asset, give_remaining, status, MAX(rowid) FROM orders - WHERE give_asset = 'XCP' AND get_asset = 'BTC' + WHERE give_asset = (SELECT asset_index FROM assets WHERE asset_name = 'XCP') + AND get_asset = (SELECT asset_index FROM assets WHERE asset_name = 'BTC') GROUP BY tx_hash ) WHERE status = 'filled' GROUP BY asset """, @@ -421,49 +436,49 @@ def held(db): SELECT forward_asset AS asset, SUM(forward_quantity) AS total FROM ( SELECT forward_asset, forward_quantity, status, MAX(rowid) FROM order_matches - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = 'pending' GROUP BY asset """, """ SELECT backward_asset AS asset, SUM(backward_quantity) AS total FROM ( SELECT backward_asset, backward_quantity, status, MAX(rowid) FROM order_matches - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = 'pending' GROUP BY asset """, """ - SELECT 'XCP' AS asset, SUM(wager_remaining) AS total FROM ( + SELECT (SELECT asset_index FROM assets WHERE asset_name = 'XCP') AS asset, SUM(wager_remaining) AS total FROM ( SELECT wager_remaining, status, MAX(rowid) FROM bets GROUP BY tx_hash ) WHERE status = 'open' """, """ - SELECT 'XCP' AS asset, SUM(forward_quantity) AS total FROM ( + SELECT (SELECT asset_index FROM assets WHERE asset_name = 'XCP') AS asset, SUM(forward_quantity) AS total FROM ( SELECT forward_quantity, status, MAX(rowid) FROM bet_matches - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = 'pending' """, """ - SELECT 'XCP' AS asset, SUM(backward_quantity) AS total FROM ( + SELECT (SELECT asset_index FROM assets WHERE asset_name = 'XCP') AS asset, SUM(backward_quantity) AS total FROM ( SELECT backward_quantity, status, MAX(rowid) FROM bet_matches - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status = 'pending' """, """ - SELECT 'XCP' AS asset, SUM(wager) AS total FROM ( + SELECT (SELECT asset_index FROM assets WHERE asset_name = 'XCP') AS asset, SUM(wager) AS total FROM ( SELECT wager, status, MAX(rowid) FROM rps GROUP BY tx_hash ) WHERE status = 'open' """, """ - SELECT 'XCP' AS asset, SUM(wager * 2) AS total FROM ( + SELECT (SELECT asset_index FROM assets WHERE asset_name = 'XCP') AS asset, SUM(wager * 2) AS total FROM ( SELECT wager, status, MAX(rowid) FROM rps_matches - GROUP BY id + GROUP BY tx0_index, tx1_index ) WHERE status IN ('pending', 'pending and resolved', 'resolved and pending') """, """ diff --git a/counterparty-core/counterpartycore/lib/messages/fairminter.py b/counterparty-core/counterpartycore/lib/messages/fairminter.py index 9506ec4f88..f0330c484e 100644 --- a/counterparty-core/counterpartycore/lib/messages/fairminter.py +++ b/counterparty-core/counterpartycore/lib/messages/fairminter.py @@ -809,6 +809,18 @@ def parse(db, tx, message): "pool_quantity": pool_quantity, "lp_asset": lp_asset or None, } + if not existing_asset: + # Pre-create the asset row (DB only, no event) so the fairminters record + # below can resolve its compact asset_index. The ASSET_CREATION event is + # still emitted in its original position via the idempotent insert + # below, preserving the consensus event order. + ledger.events.ensure_asset( + db, + ledger.issuances.generate_asset_id(asset_name), + asset_name, + tx["block_index"], + asset_longname if asset_longname != "" else None, + ) ledger.events.insert_record(db, "fairminters", bindings, "NEW_FAIRMINTER") logger.info("Fair minter opened for %s by %s.", asset_name, tx["source"]) diff --git a/counterparty-core/counterpartycore/lib/parser/blocks.py b/counterparty-core/counterpartycore/lib/parser/blocks.py index d609fbfc6b..63a7890a86 100644 --- a/counterparty-core/counterpartycore/lib/parser/blocks.py +++ b/counterparty-core/counterpartycore/lib/parser/blocks.py @@ -51,7 +51,7 @@ from counterpartycore.lib.monitors.profiler import Profiler from counterpartycore.lib.parser import check, deserialize, messagetype, protocol from counterpartycore.lib.parser.gettxinfo import get_tx_info -from counterpartycore.lib.utils import database, helpers +from counterpartycore.lib.utils import database, hashcodec, helpers D = decimal.Decimal logger = logging.getLogger(config.LOGGER_NAME) @@ -118,7 +118,7 @@ def update_transaction(db, tx, supported): """UPDATE transactions \ SET supported=$supported \ WHERE tx_hash=$tx_hash""", - {"supported": False, "tx_hash": tx["tx_hash"]}, + {"supported": False, "tx_hash": hashcodec.hash_to_db(tx["tx_hash"])}, ) if tx["block_index"] != config.MEMPOOL_BLOCK_INDEX: logger.info("Unsupported transaction: hash %s; data %s", tx["tx_hash"], tx["data"]) @@ -269,13 +269,28 @@ def parse_tx(db, tx): def replay_transactions_events(db, transactions): cursor = db.cursor() + # Cache block_hash lookups per block_index since transactions no longer + # carry block_hash; journal payload still includes it for consensus + # stability. + block_hash_cache = {} + + def _block_hash_for(block_index): + if block_index not in block_hash_cache: + row = cursor.execute( + "SELECT block_hash FROM blocks WHERE block_index = ?", + (block_index,), + ).fetchone() + block_hash_cache[block_index] = row["block_hash"] if row else None + return block_hash_cache[block_index] + for tx in transactions: CurrentState().set_current_tx_hash(tx["tx_hash"]) + block_hash = _block_hash_for(tx["block_index"]) transaction_bindings = { "tx_index": tx["tx_index"], "tx_hash": tx["tx_hash"], "block_index": tx["block_index"], - "block_hash": tx["block_hash"], + "block_hash": block_hash, "block_time": tx["block_time"], "source": tx["source"], "destination": tx["destination"], @@ -436,9 +451,12 @@ def parse_block( WHERE block_index=:block_index """ update_block_bindings = { - "txlist_hash": new_txlist_hash, - "ledger_hash": new_ledger_hash, - "messages_hash": new_messages_hash, + # The hash columns are BLOB(32) at rest; bind the BLOB form so + # SQLite actually stores the optimized representation instead of + # falling back to TEXT affinity for the hex string. + "txlist_hash": hashcodec.hash_to_db(new_txlist_hash), + "ledger_hash": hashcodec.hash_to_db(new_ledger_hash), + "messages_hash": hashcodec.hash_to_db(new_messages_hash), "transaction_count": len(transactions), "block_index": block_index, } @@ -509,7 +527,6 @@ def list_tx(db, block_hash, block_index, block_time, tx_hash, tx_index, decoded_ "tx_index": tx_index, "tx_hash": tx_hash, "block_index": block_index, - "block_hash": block_hash, "block_time": block_time, "source": source, "destination": destination, @@ -521,23 +538,34 @@ def list_tx(db, block_hash, block_index, block_time, tx_hash, tx_index, decoded_ data, destination, utxos_info, block_index ), } - ledger.events.insert_record(db, "transactions", transaction_bindings, "NEW_TRANSACTION") + # ``transactions.block_hash`` was dropped from storage; we still + # expose it in the consensus journal so ``messages_hash`` is + # byte-identical to the pre-migration release. + ledger.events.insert_record( + db, + "transactions", + transaction_bindings, + "NEW_TRANSACTION", + event_info={"block_hash": block_hash}, + ) if dispensers_outs: for next_out in dispensers_outs: transaction_outputs_bindings = { "tx_index": tx_index, - "tx_hash": tx_hash, "block_index": block_index, "out_index": next_out["out_index"], "destination": next_out["destination"], "btc_amount": next_out["btc_amount"], } + # Journal payload keeps the legacy hex ``tx_hash`` field so the + # consensus-critical ``messages_hash`` JSON stays byte-identical. ledger.events.insert_record( db, "transaction_outputs", transaction_outputs_bindings, "NEW_TRANSACTION_OUTPUT", + event_info={"tx_hash": tx_hash}, ) cursor.close() @@ -565,6 +593,13 @@ def clean_messages_tables(db, block_index=0): for table in TABLES: clean_table_from(cursor, table, block_index) cursor.execute("""PRAGMA foreign_keys=ON""") + # ``assets`` is in TABLES, so rows with block_index >= the rollback + # point were just deleted and their freed ``asset_index`` values can be + # reused by a different asset on reparse. Drop the stale name<->index + # cache on this connection. The address_id cache is dropped for the + # same class of hazard (a rolled-back address_id is reused on reparse). + database.reset_asset_caches(db) + database.reset_address_caches(db) def clean_transactions_tables(cursor, block_index=0): @@ -597,6 +632,12 @@ def rebuild_database(db, include_transactions=True): with open(file, "r", encoding="utf-8") as sql_file: db.execute(sql_file.read()) + # The ``assets``/``address_list`` tables were just dropped/recreated, so any + # cached name<->asset_index or address<->address_id mapping on this + # connection is now stale. + database.reset_asset_caches(db) + database.reset_address_caches(db) + def rollback(db, block_index=0, force=False): if not force and block_index > CurrentState().current_block_index(): @@ -980,14 +1021,22 @@ def start_rsfetcher(): def create_events_indexes(db): - if database.get_config_value(db, "EVENTS_INDEXES_CREATED") == "True": - return + # ``CREATE INDEX IF NOT EXISTS`` is already idempotent, so we don't gate + # on a config flag any more. The previous flag-gated path silently + # skipped index creation when migration 0010 (compact-hash storage) + # rebuilt ``messages`` against a DB that had the ``EVENTS_INDEXES_CREATED`` + # marker from a pre-migration parse: the marker stayed but the indexes + # were dropped along with the old table, leaving the runtime to do a + # full-table scan on every ``messages`` read. Running the DDL on every + # call costs a single ``sqlite_master`` probe per index when the index + # already exists, which is cheap. sqls = [ "CREATE INDEX IF NOT EXISTS messages_block_index_idx ON messages (block_index)", "CREATE INDEX IF NOT EXISTS messages_block_index_message_index_idx ON messages (block_index, message_index)", "CREATE INDEX IF NOT EXISTS messages_block_index_event_idx ON messages (block_index, event)", "CREATE INDEX IF NOT EXISTS messages_event_idx ON messages (event)", - "CREATE INDEX IF NOT EXISTS messages_tx_hash_idx ON messages (tx_hash)", + # ``messages.tx_hash`` was replaced by a ``tx_index`` FK. + "CREATE INDEX IF NOT EXISTS messages_tx_index_idx ON messages (tx_index)", "CREATE INDEX IF NOT EXISTS messages_event_hash_idx ON messages (event_hash)", ] cursor = db.cursor() diff --git a/counterparty-core/counterpartycore/lib/parser/follow.py b/counterparty-core/counterpartycore/lib/parser/follow.py index 9324d4bdd9..742d308281 100644 --- a/counterparty-core/counterpartycore/lib/parser/follow.py +++ b/counterparty-core/counterpartycore/lib/parser/follow.py @@ -19,7 +19,7 @@ from counterpartycore.lib.monitors import sentry from counterpartycore.lib.monitors.telemetry.oneshot import TelemetryOneShot from counterpartycore.lib.parser import blocks, check, deserialize, mempool -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.utils import hashcodec, helpers logger = logging.getLogger(config.LOGGER_NAME) @@ -487,7 +487,8 @@ def get_raw_mempool(db): if NotSupportedTransactionsCache().is_not_supported(txid): continue existing_tx_in_mempool = cursor.execute( - "SELECT * FROM mempool WHERE tx_hash = ? LIMIT 1", (txid,) + "SELECT * FROM mempool WHERE tx_hash = ? LIMIT 1", + (hashcodec.hash_to_db(txid),), ).fetchone() if existing_tx_in_mempool: continue diff --git a/counterparty-core/counterpartycore/lib/parser/mempool.py b/counterparty-core/counterpartycore/lib/parser/mempool.py index 897ae03ca5..7e17a3b276 100644 --- a/counterparty-core/counterpartycore/lib/parser/mempool.py +++ b/counterparty-core/counterpartycore/lib/parser/mempool.py @@ -6,6 +6,7 @@ from counterpartycore.lib.api.apiwatcher import EVENTS_ADDRESS_FIELDS from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.parser import blocks, deserialize +from counterpartycore.lib.utils import database, hashcodec logger = logging.getLogger(config.LOGGER_NAME) @@ -21,13 +22,19 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): not_supported_txs = [] try: with db: - # insert fake block + # insert fake block (block_hash stored as BLOB after the size + # optimization migration; convert from the hex MEMPOOL_BLOCK_HASH + # constant inline since this path bypasses ``insert_record``). cursor.execute( """INSERT INTO blocks( block_index, block_hash, block_time) VALUES(?,?,?)""", - (config.MEMPOOL_BLOCK_INDEX, config.MEMPOOL_BLOCK_HASH, now), + ( + config.MEMPOOL_BLOCK_INDEX, + hashcodec.hash_to_db(config.MEMPOOL_BLOCK_HASH), + now, + ), ) # get the last tx_index cursor.execute( @@ -66,7 +73,8 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): logger.trace(f"Transaction {decoded_tx['tx_hash']} already in the database") continue existing_tx_in_mempool = cursor.execute( - "SELECT * FROM mempool WHERE tx_hash = ? LIMIT 1", (decoded_tx["tx_hash"],) + "SELECT * FROM mempool WHERE tx_hash = ? LIMIT 1", + (hashcodec.hash_to_db(decoded_tx["tx_hash"]),), ).fetchone() if existing_tx_in_mempool: logger.trace(f"Transaction {decoded_tx['tx_hash']} already in the mempool") @@ -86,17 +94,29 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): # parse fake block blocks.parse_block(db, config.MEMPOOL_BLOCK_INDEX, now) - # get messages generated by the transaction + # get messages generated by the transaction. ``messages`` stores + # ``tx_index`` rather than ``tx_hash``; expose the legacy hex + # ``tx_hash`` for consumers via a subquery JOIN on + # ``transactions``. cursor.execute( - """SELECT * FROM messages WHERE message_index > ?""", + """SELECT m.*, t.tx_hash AS tx_hash + FROM messages m + LEFT JOIN transactions t ON t.tx_index = m.tx_index + WHERE m.message_index > ?""", (message_index_before,), ) # save the events in memory transaction_events = cursor.fetchall() - # get the mempool transactions + # get the mempool transactions. ``transactions.block_hash`` was + # dropped in the compact-hash migration, so we synthesize it for + # the legacy ``mempool_transactions`` schema by joining + # ``blocks`` (always the MEMPOOL_BLOCK_HASH for mempool rows). cursor.execute( - """SELECT * FROM transactions WHERE block_index = ?""", + """SELECT t.*, b.block_hash AS block_hash + FROM transactions t + LEFT JOIN blocks b ON b.block_index = t.block_index + WHERE t.block_index = ?""", (config.MEMPOOL_BLOCK_INDEX,), ) # save the mempool transactions in memory @@ -124,20 +144,28 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): addresses = list(set(addresses)) event["addresses"] = " ".join(addresses) + event_for_insert = dict(event) + event_for_insert["tx_hash"] = hashcodec.hash_to_db(event.get("tx_hash")) cursor.execute( """INSERT INTO mempool VALUES( :tx_hash, :command, :category, :bindings, :timestamp, :event, :addresses )""", - event, + event_for_insert, ) for tx in mempool_transactions: + tx_for_insert = dict(tx) + tx_for_insert["tx_hash"] = hashcodec.hash_to_db(tx.get("tx_hash")) + # block_hash is always the "mempool" sentinel TEXT value; do not + # call hash_to_db which would encode it as a 7-byte BLOB and then + # have the rowtracer decode it back as "6d656d706f6f6c". + tx_for_insert["block_hash"] = config.MEMPOOL_BLOCK_HASH cursor.execute( """INSERT INTO mempool_transactions VALUES( :tx_index, :tx_hash, :block_index, :block_hash, :block_time, :source, :destination, :btc_amount, :fee, :data, :supported, :utxos_info, :transaction_type )""", - tx, + tx_for_insert, ) except exceptions.ParseTransactionError as e: # A mempool tx that would halt the chain on confirmation must NOT @@ -150,6 +178,21 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): # singleton stuck in mempool mode (which would silently disable UTXO # cache eviction in subsequent block parsing). CurrentState().set_parsing_mempool(False) + # The mempool parse above always rolls back its DB mutations (the + # `with db:` block exits via MempoolError, or a real error). That + # rollback discards any ``assets`` rows it created, but NOT the + # per-connection asset_index<->name caches populated while resolving + # them. Since ``db`` is the SAME connection used for block parsing, + # those stale mappings would otherwise make the next block's + # ``asset_index_from_name`` resolve a freshly-issued asset to a reused + # index -- e.g. mis-detecting a first issuance as a reissuance and + # skipping its XCP fee. Drop them so block parsing re-resolves against + # the committed table. + database.reset_asset_caches(db) + # Same hazard for the address_id cache: the rolled-back mempool parse may + # have created/reused address_list rows; drop them so block parsing + # re-resolves against the committed table. + database.reset_address_caches(db) logger.trace("Mempool transaction parsed successfully.") return not_supported_txs @@ -157,8 +200,9 @@ def parse_mempool_transactions(db, raw_tx_list, timestamps=None): def clean_transaction_from_mempool(db, tx_hash): cursor = db.cursor() - cursor.execute("DELETE FROM mempool WHERE tx_hash = ?", (tx_hash,)) - cursor.execute("DELETE FROM mempool_transactions WHERE tx_hash = ?", (tx_hash,)) + tx_hash_blob = hashcodec.hash_to_db(tx_hash) + cursor.execute("DELETE FROM mempool WHERE tx_hash = ?", (tx_hash_blob,)) + cursor.execute("DELETE FROM mempool_transactions WHERE tx_hash = ?", (tx_hash_blob,)) def clean_mempool(db): @@ -168,6 +212,7 @@ def clean_mempool(db): # tx (or one whose handler raised before emitting events) has a row in # mempool_transactions but none in mempool, so the events-only sweep # never cleaned it -- ghost rows accumulated indefinitely. + # rowtracer converts BLOB tx_hash back to hex. cursor.execute( "SELECT DISTINCT tx_hash FROM mempool " "UNION SELECT DISTINCT tx_hash FROM mempool_transactions" diff --git a/counterparty-core/counterpartycore/lib/utils/address.py b/counterparty-core/counterpartycore/lib/utils/address.py index d04da5cae3..5e9d98e872 100644 --- a/counterparty-core/counterpartycore/lib/utils/address.py +++ b/counterparty-core/counterpartycore/lib/utils/address.py @@ -128,7 +128,12 @@ def unpack_legacy(short_address_bytes): # we have a segwit address here witver = short_address_bytes[0] - 0x80 witprog = short_address_bytes[1:] - return str(bitcoin.bech32.CBech32Data.from_bytes(witver, witprog)) + try: + return str(bitcoin.bech32.CBech32Data.from_bytes(witver, witprog)) + except (TypeError, ValueError) as e: + # bech32 encoding fails for an invalid witness program length + # (CBech32Data.__str__ returns None); treat as unpackable + raise exceptions.UnpackError from e check = bitcoin.core.Hash(short_address_bytes)[0:4] return bitcoin.base58.encode(short_address_bytes + check) diff --git a/counterparty-core/counterpartycore/lib/utils/assetnames.py b/counterparty-core/counterpartycore/lib/utils/assetnames.py index e801e2178b..e5533e3845 100644 --- a/counterparty-core/counterpartycore/lib/utils/assetnames.py +++ b/counterparty-core/counterpartycore/lib/utils/assetnames.py @@ -236,8 +236,10 @@ def gen_random_asset_name(seed, add=0): def asset_exists(db, name): cursor = db.cursor() + # ``issuances.asset`` stores the compact asset_index; resolve the name. cursor.execute( - "SELECT * FROM issuances WHERE asset = ?", + "SELECT 1 FROM issuances " + "WHERE asset = (SELECT asset_index FROM assets WHERE asset_name = ?) LIMIT 1", (name,), ) if cursor.fetchall(): diff --git a/counterparty-core/counterpartycore/lib/utils/database.py b/counterparty-core/counterpartycore/lib/utils/database.py index 62d96f9498..a3b5bab4c4 100644 --- a/counterparty-core/counterpartycore/lib/utils/database.py +++ b/counterparty-core/counterpartycore/lib/utils/database.py @@ -3,6 +3,7 @@ import threading import time import weakref +from collections import OrderedDict from contextlib import contextmanager import apsw @@ -10,7 +11,7 @@ import apsw.ext import psutil from counterpartycore.lib import config, exceptions -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.utils import hashcodec, helpers from termcolor import cprint from yoyo import get_backend, read_migrations from yoyo.exceptions import LockTimeout @@ -21,12 +22,393 @@ apsw.ext.log_sqlite(logger=logger) -def rowtracer(cursor, sql): - """Converts fetched SQL data into dict-style""" - return { - name: (bool(value) if str(field_type) == "BOOL" else value) - for (name, field_type), value in zip(cursor.getdescription(), sql, strict=True) +# Local reference for the rowtracer hot path: avoids the per-call attribute +# lookup ``hashcodec.HASH_COLUMN_NAMES``. The rowtracer runs once per row per +# column so trimming a few attribute lookups matters in the load test. +_HASH_COLUMN_NAMES = hashcodec.HASH_COLUMN_NAMES + + +# Columns that store the compact integer ``asset_index`` foreign key (see the +# asset-normalization rewrite in ``0010``). On read the rowtracer transparently +# decodes the index back to the asset *name* so the rest of the codebase +# (consensus handlers, API, tests) keeps seeing names exactly as before the +# normalization. This frozenset MUST stay in sync with the union of +# ``migration_data.compact_hash_tables.ASSET_NAME_COLUMNS`` values; it is +# duplicated here (rather than imported) because ``database`` is a low-level +# module and importing ``lib.ledger.*`` at load time would create a cycle. A +# unit test asserts the two stay identical. +ASSET_INDEX_COLUMN_NAMES = frozenset( + { + "asset", + "give_asset", + "get_asset", + "forward_asset", + "backward_asset", + "dividend_asset", + "asset_parent", + "asset_a", + "asset_b", + } +) + +# Columns that store the compact integer ``address_id`` foreign key (see the +# address-normalization rewrite in ``0010``). On read the rowtracer transparently +# decodes the id back to the address *string* so the rest of the codebase +# (consensus handlers, API, tests) keeps seeing addresses exactly as before the +# normalization. This frozenset MUST stay in sync with the union of +# ``migration_data.compact_hash_tables.ADDRESS_NAME_COLUMNS`` values; it is +# duplicated here (rather than imported) because ``database`` is a low-level +# module and importing ``lib.ledger.*`` at load time would create a cycle. A +# unit test asserts the two stay identical. +# +# CAUTION: this is matched by column NAME globally in the rowtracer -- any int +# value in a column with one of these names is decoded as an address. No table +# may have a same-named column holding a non-address integer. ``mempool``'s +# ``addresses`` (a comma-separated list) and ``mempool_transactions``'s +# ``source``/``destination`` (transient, kept TEXT) are not in this set. +ADDRESS_INDEX_COLUMN_NAMES = frozenset( + { + "address", + "utxo_address", + "source", + "destination", + "source_address", + "destination_address", + "issuer", + "feed_address", + "tx0_address", + "tx1_address", + "winner", + "oracle_address", + "origin", + "last_status_tx_source", } +) + +# Per-connection cache size cap for the high-cardinality address/tx_hash +# resolvers. Assets are a few thousand (unbounded dict is fine), but addresses +# and transactions number in the millions, so an unbounded dict would grow the +# parser's RSS without bound. An LRU cap keeps the working set hot while +# bounding memory. +ADDRESS_CACHE_MAXSIZE = 100_000 + +# Per-connection asset_index<->name caches. Asset rows are append-only (never +# renamed or deleted), and ``asset_index`` is monotonic, so: +# * index->name hits and misses are both permanently valid (a stored index +# always references an asset that already exists), so misses are cached. +# * name->index misses may later become hits (the asset gets registered), so +# only hits are cached there. +_CACHE_MISS = object() +_ASSET_NAME_BY_INDEX = weakref.WeakKeyDictionary() +_ASSET_INDEX_BY_NAME = weakref.WeakKeyDictionary() +# Per-connection name of the ``assets`` table. On a Ledger DB connection it is +# ``assets``; on a read-only State DB connection (which ATTACHes the Ledger DB +# as ``ledger_db``) it is ``ledger_db.assets``. ``None`` => not resolvable. +_ASSETS_TABLE_NAME = weakref.WeakKeyDictionary() + + +def _resolve_assets_table(db): + cached = _ASSETS_TABLE_NAME.get(db, _CACHE_MISS) + if cached is not _CACHE_MISS: + return cached + name = None + for candidate in ("assets", "ledger_db.assets"): + try: + db.cursor().execute(f"SELECT 1 FROM {candidate} LIMIT 0") # nosec B608 # noqa: S608 + except apsw.SQLError: + continue + name = candidate + break + _ASSETS_TABLE_NAME[db] = name + return name + + +def asset_name_from_index(db, index): + """Resolve a stored ``asset_index`` to its asset name. Returns the raw + index unchanged if it cannot be resolved (e.g. the ``assets`` table is not + reachable from this connection).""" + cache = _ASSET_NAME_BY_INDEX.get(db) + if cache is None: + cache = {} + _ASSET_NAME_BY_INDEX[db] = cache + name = cache.get(index, _CACHE_MISS) + if name is _CACHE_MISS: + table = _resolve_assets_table(db) + if table is None: + return index + row = ( + db.cursor() + .execute( + f"SELECT asset_name FROM {table} WHERE asset_index = ?", # nosec B608 # noqa: S608 + (index,), + ) + .fetchone() + ) + name = row["asset_name"] if row else None + cache[index] = name + return name if name is not None else index + + +def asset_index_from_name(db, asset_name): + """Resolve an asset name to its compact ``asset_index``. Returns ``None`` + when the asset is not registered (e.g. an invalid record referencing a + never-issued asset), which stores as NULL.""" + if asset_name is None: + return None + cache = _ASSET_INDEX_BY_NAME.get(db) + if cache is None: + cache = {} + _ASSET_INDEX_BY_NAME[db] = cache + index = cache.get(asset_name, _CACHE_MISS) + if index is _CACHE_MISS: + table = _resolve_assets_table(db) + if table is None: + return None + row = ( + db.cursor() + .execute( + f"SELECT asset_index FROM {table} WHERE asset_name = ?", # nosec B608 # noqa: S608 + (asset_name,), + ) + .fetchone() + ) + index = row["asset_index"] if row else None + if index is not None: + # Only cache hits: a miss can become a hit once the asset is issued. + cache[asset_name] = index + return index + + +def reset_asset_caches(db): + """Drop the per-connection ``asset_index``<->name caches for ``db``. + + The caches assume asset rows are append-only and ``asset_index`` is + immutable, which holds during a committed forward parse. It is VIOLATED + whenever a transaction that created ``assets`` rows is ROLLED BACK on the + same connection: the freed ``asset_index`` is reused by a different asset + on the next parse, so a cached name->index (or index->name) mapping then + resolves to the wrong asset. The mempool parser creates this exact + situation -- it parses a fake block (creating/caching asset rows) and then + rolls back the DB to discard the mempool state -- and so do reorg/reparse. + Call this right after such a rollback so subsequent parsing re-resolves + against the actual committed ``assets`` table.""" + _ASSET_NAME_BY_INDEX.pop(db, None) + _ASSET_INDEX_BY_NAME.pop(db, None) + + +# Hot-path local reference (avoids the per-cell attribute lookup in rowtracer). +_ADDRESS_INDEX_COLUMN_NAMES = ADDRESS_INDEX_COLUMN_NAMES + +# Per-connection address_id<->string caches. Unlike assets these are BOUNDED +# (LRU) because addresses number in the millions. Each maps db -> OrderedDict. +# * index->string: a stored id always references an existing address, so both +# hits and misses (stored as None) are permanently valid during a committed +# forward parse and may be cached; LRU-evicted past the cap. +# * string->index: a miss can become a hit once the address is first seen +# (``ensure_address``), so only hits are cached; LRU-evicted past the cap. +_ADDRESS_STRING_BY_INDEX = weakref.WeakKeyDictionary() +_ADDRESS_INDEX_BY_STRING = weakref.WeakKeyDictionary() +# Per-connection name of the ``address_list`` table (``address_list`` on a +# Ledger DB connection, ``ledger_db.address_list`` on a read-only State DB +# connection, or ``None`` if not reachable). +_ADDRESS_LIST_TABLE_NAME = weakref.WeakKeyDictionary() + + +def _lru_get(cache_dict, db, key): + """Return (found, value) from the per-connection ``OrderedDict`` for ``db``, + moving the key to the most-recently-used end on a hit.""" + cache = cache_dict.get(db) + if cache is None: + return False, None + value = cache.get(key, _CACHE_MISS) + if value is _CACHE_MISS: + return False, None + cache.move_to_end(key) + return True, value + + +def _lru_put(cache_dict, db, key, value, maxsize): + """Insert ``key -> value`` into the per-connection ``OrderedDict`` for + ``db``, evicting the least-recently-used entry past ``maxsize``.""" + cache = cache_dict.get(db) + if cache is None: + cache = OrderedDict() + cache_dict[db] = cache + cache[key] = value + cache.move_to_end(key) + while len(cache) > maxsize: + cache.popitem(last=False) + + +def _resolve_address_list_table(db): + cached = _ADDRESS_LIST_TABLE_NAME.get(db, _CACHE_MISS) + if cached is not _CACHE_MISS: + return cached + name = None + for candidate in ("address_list", "ledger_db.address_list"): + try: + db.cursor().execute(f"SELECT 1 FROM {candidate} LIMIT 0") # nosec B608 # noqa: S608 + except apsw.SQLError: + continue + name = candidate + break + _ADDRESS_LIST_TABLE_NAME[db] = name + return name + + +def address_string_from_index(db, index): + """Resolve a stored ``address_id`` to its address string. Returns the raw + index unchanged if it cannot be resolved (e.g. ``address_list`` is not + reachable from this connection).""" + found, value = _lru_get(_ADDRESS_STRING_BY_INDEX, db, index) + if found: + return value if value is not None else index + table = _resolve_address_list_table(db) + if table is None: + return index + row = ( + db.cursor() + .execute( + f"SELECT address FROM {table} WHERE address_id = ?", # nosec B608 # noqa: S608 + (index,), + ) + .fetchone() + ) + value = row["address"] if row else None + _lru_put(_ADDRESS_STRING_BY_INDEX, db, index, value, ADDRESS_CACHE_MAXSIZE) + return value if value is not None else index + + +def address_index_from_name(db, address): + """Resolve an address string to its compact ``address_id``. Returns ``None`` + when the address is not registered in ``address_list`` (callers that write + addresses pre-register them via ``events.ensure_address``).""" + if address is None: + return None + found, value = _lru_get(_ADDRESS_INDEX_BY_STRING, db, address) + if found: + return value + table = _resolve_address_list_table(db) + if table is None: + return None + row = ( + db.cursor() + .execute( + f"SELECT address_id FROM {table} WHERE address = ?", # nosec B608 # noqa: S608 + (address,), + ) + .fetchone() + ) + index = row["address_id"] if row else None + if index is not None: + # Only cache hits: a miss can become a hit once the address is seen. + _lru_put(_ADDRESS_INDEX_BY_STRING, db, address, index, ADDRESS_CACHE_MAXSIZE) + return index + + +def reset_address_caches(db): + """Drop the per-connection ``address_id``<->string caches for ``db``. + + Like the asset caches, these assume ``address_id`` is immutable -- which is + violated when a transaction that created ``address_list`` rows is ROLLED + BACK on the same connection (mempool parse, reorg/reparse): the freed id is + reused by a different address on the next parse. Call this right after such + a rollback. See ``reset_asset_caches``.""" + _ADDRESS_STRING_BY_INDEX.pop(db, None) + _ADDRESS_INDEX_BY_STRING.pop(db, None) + + +def split_utxo(utxo): + """Split a ``tx_hash:vout`` UTXO string into the stored + ``(utxo_tx_hash, utxo_vout)`` pair: the 64-char hex tx_hash is converted to + its compact ``BLOB(32)`` form and the vout to an int. Returns + ``(None, None)`` for a ``None`` utxo (an address balance). + + The tx_hash is stored RAW (as a BLOB) rather than resolved to a ``tx_index`` + FK because an attach destination may be ANY valid bitcoin UTXO whose tx is + not a Counterparty transaction (and so is absent from ``transactions``); + a tx_index FK would lose such balances. The single choke point shared by the + write path (``events``) and the read/WHERE path (``balances``/``caches``).""" + if utxo is None: + return None, None + tx_hash_hex, _, vout = utxo.partition(":") + return hashcodec.hash_to_db(tx_hash_hex), int(vout) + + +def utxo_from_split(utxo_tx_hash, utxo_vout): + """Reconstruct the ``tx_hash:vout`` UTXO string from the stored + ``(utxo_tx_hash, utxo_vout)`` pair. Returns ``None`` when there is no utxo + (an address balance).""" + if utxo_tx_hash is None: + return None + if utxo_tx_hash.__class__ is bytes: + utxo_tx_hash = utxo_tx_hash.hex() + return f"{utxo_tx_hash}:{utxo_vout}" + + +def _convert_value(name, field_type, value): + # Fast path: most columns are non-NULL primitives (int, str, ...) and + # not BOOL/BLOB hashes. Putting the cheapest checks first avoids the + # ``isinstance(..., bytes)`` and ``str(field_type) == "BOOL"`` + # allocations that previously ran for every cell. + if value is None: + # Preserve the pre-optimization rowtracer contract: ``BOOL`` columns + # always materialize as a real Python bool, even when the underlying + # SQLite value is NULL (``bool(None) == False``). Several handlers + # and serialized events rely on this. + if field_type == "BOOL": + return False + return None + # Columns storing 256-bit hashes are BLOB(32) at rest after the size + # optimization migration, but the rest of the codebase (consensus, + # API, tests) expects 64-char lowercase hex strings. Convert lazily + # in the rowtracer so downstream code is unchanged. ``bytes.hex()`` is + # ~1.6x faster than ``binascii.hexlify(value).decode("ascii")``. + if value.__class__ is bytes and name in _HASH_COLUMN_NAMES: + return value.hex() + if field_type == "BOOL": + return bool(value) + return value + + +def rowtracer(cursor, sql): + """Converts fetched SQL data into dict-style. Auto-converts BLOB hash + columns back to lowercase hex strings, the compact integer ``asset_index`` + foreign keys back to asset names, the compact ``address_id`` foreign keys + back to address strings, and the split ``(utxo_tx_hash, utxo_vout)`` pair + back to the ``utxo`` string (``tx_hash:vout``). This preserves the legacy + contract that ``row['tx_hash']`` is hex, ``row['asset']`` is a name, + ``row['source']`` is an address and ``row['utxo']`` is ``tx_hash:vout``. + """ + db = None + out = {} + for (name, field_type), value in zip(cursor.getdescription(), sql, strict=True): + # Asset-index columns hold a small integer at rest; decode to the asset + # name. A name already materialized as TEXT (e.g. ``assets.asset_name``, + # ``assets_info.asset``, or a view that pre-resolves the name) is left + # untouched, as is a NULL (invalid record with no asset). + if value.__class__ is int and name in ASSET_INDEX_COLUMN_NAMES: + if db is None: + db = cursor.getconnection() + out[name] = asset_name_from_index(db, value) + # Address-id columns hold a small integer at rest; decode to the address + # string. A string already materialized as TEXT (a view that + # pre-resolves the address, or a State DB table that keeps TEXT + # addresses) is left untouched, as is a NULL. + elif value.__class__ is int and name in _ADDRESS_INDEX_COLUMN_NAMES: + if db is None: + db = cursor.getconnection() + out[name] = address_string_from_index(db, value) + else: + out[name] = _convert_value(name, field_type, value) + # Reconstruct the ``utxo`` string from the split ``(utxo_tx_hash, + # utxo_vout)`` pair (balances/credits/debits on the Ledger DB). Only fires + # when both columns are present; the synthesized ``utxo`` replaces the two + # raw columns so the row shape is identical to the pre-split schema. A NULL + # ``utxo_tx_hash`` (an address-balance row) yields ``utxo = None``. + if "utxo_tx_hash" in out and "utxo_vout" in out: + out["utxo"] = utxo_from_split(out.pop("utxo_tx_hash"), out.pop("utxo_vout")) + return out def get_file_openers(filename): @@ -56,6 +438,19 @@ def check_wal_file(db_file): raise exceptions.WALFileFoundError("Found WAL file. Database may be corrupted.") +def _should_attach_ledger_db(read_only, db_file): + """Return True when a read-only State DB connection should ATTACH the + Ledger DB so that hash-FK projections can JOIN against ``transactions``. + """ + if not read_only: + return False + if not hasattr(config, "STATE_DATABASE") or db_file != config.STATE_DATABASE: + return False + if not hasattr(config, "DATABASE") or not config.DATABASE: + return False + return os.path.exists(config.DATABASE) + + def get_db_connection(db_file, read_only=True, check_wal=False): """Connects to the SQLite database, returning a db `Connection` object""" @@ -80,16 +475,44 @@ def get_db_connection(db_file, read_only=True, check_wal=False): db = apsw.Connection(db_file, flags=apsw.SQLITE_OPEN_READONLY) else: db = apsw.Connection(db_file) + + # Register UDFs before opening any cursor. SQLite 3.41+ ships a built-in + # ``unhex``; overriding a built-in fails with SQLITE_BUSY when there are + # active prepared statements on the connection, so we must register here + # before any cursor/PRAGMA work creates such statements. + hashcodec.register_db_functions(db) + cursor = db.cursor() # Make case sensitive the `LIKE` operator. # For insensitive queries use 'UPPER(fieldname) LIKE value.upper()'' cursor.execute("PRAGMA case_sensitive_like = ON") - cursor.execute("PRAGMA auto_vacuum = 1") - cursor.execute("PRAGMA synchronous = normal") - cursor.execute("PRAGMA journal_size_limit = 6144000") cursor.execute("PRAGMA foreign_keys = ON") cursor.execute("PRAGMA defer_foreign_keys = ON") + if not read_only: + cursor.execute("PRAGMA auto_vacuum = 1") + cursor.execute("PRAGMA synchronous = normal") + cursor.execute("PRAGMA journal_size_limit = 6144000") + + # State DB read-only connections (used by API request handlers) need to + # see ``ledger_db.transactions`` so that hash-FK projections that + # re-hydrate ``order_tx_hash`` / ``dispenser_tx_hash`` from their + # ``*_tx_index`` foreign keys can JOIN against it. We do this only for + # read-only connections to avoid taking a write lock on ledger_db + # (which would conflict with the ledger writer / test fixtures). + if _should_attach_ledger_db(read_only, db_file): + try: + attached_row = cursor.execute( + "SELECT COUNT(*) FROM pragma_database_list WHERE name = ?", + ("ledger_db",), + ).fetchone() + already_attached = (attached_row[0] if attached_row else 0) > 0 + if not already_attached: + cursor.execute("ATTACH DATABASE ? AS ledger_db", (config.DATABASE,)) + except apsw.SQLError: + # Ledger DB may not exist yet during early bootstrap; the caller + # will retry once it's available. + pass db.setrowtrace(rowtracer) @@ -392,19 +815,28 @@ def close(db): db.close() # always close connection with write access last +_VACUUM_AFTER_MIGRATIONS = {"0010.compact_hash_storage"} + + def apply_outstanding_migration(db_file, migration_dir): logger.info("Applying migrations to %s...", db_file) - # Apply migrations backend = get_backend(f"sqlite:///{db_file}") migrations = read_migrations(migration_dir) + to_apply = backend.to_apply(migrations) + needs_vacuum = any(any(name in m.id for name in _VACUUM_AFTER_MIGRATIONS) for m in to_apply) try: - # with backend.lock(): - backend.apply_migrations(backend.to_apply(migrations)) + backend.apply_migrations(to_apply) except LockTimeout: logger.debug("API Watcher - Migration lock timeout. Breaking lock and retrying...") backend.break_lock() backend.apply_migrations(backend.to_apply(migrations)) backend.connection.close() + if needs_vacuum: + logger.info("Running VACUUM after compact-hash migration to reclaim disk space...") + conn = apsw.Connection(db_file) + conn.cursor().execute("VACUUM") + conn.close() + logger.info("VACUUM completed.") def rollback_all_migrations(db_file, migration_dir): diff --git a/counterparty-core/counterpartycore/lib/utils/hashcodec.py b/counterparty-core/counterpartycore/lib/utils/hashcodec.py new file mode 100644 index 0000000000..377e74b3ea --- /dev/null +++ b/counterparty-core/counterpartycore/lib/utils/hashcodec.py @@ -0,0 +1,165 @@ +"""Hash codec for converting between the at-rest BLOB(32) representation and +the in-memory/JSON hex string representation used throughout the codebase and +exposed to consensus, API consumers, and existing tests. + +Database schema after the compact-hash storage migration stores all +``*_hash``/``tx_hash`` columns (except a few documented exceptions) as +``BLOB`` (32 bytes for 256-bit hashes). The consensus paths in +``parser/blocks.py``/``ledger/events.py`` and the API surface still operate on +the canonical 64-char lowercase hex string, so we expose hex via a row tracer +and accept hex on the way in. + +A handful of tables also drop the redundant ``*_tx_hash`` column entirely +in favour of a ``*_tx_index`` integer FK; helpers here are used by the +message handlers and ``insert_record`` to resolve ``hex tx_hash -> tx_index`` +transparently. +""" + +import binascii + +# Names of columns that store a 256-bit hash as BLOB(32) in the optimized +# schema. The row tracer inspects column names against this set to decide +# whether a ``bytes`` value should be returned to Python as a hex string. +# Includes both the canonical name (``tx_hash``) and table-qualified variants +# used in match/expiration tables. +HASH_COLUMN_NAMES = frozenset( + { + # blocks + "block_hash", + "previous_block_hash", + "ledger_hash", + "txlist_hash", + "messages_hash", + # transactions / generic + "tx_hash", + "event_hash", + # match-related + "tx0_hash", + "tx1_hash", + # rps random commit + "move_random_hash", + "tx0_move_random_hash", + "tx1_move_random_hash", + # last-status (dispenser) + "last_status_tx_hash", + # expirations + "order_hash", + "bet_hash", + "rps_hash", + # FK-style hash aliases: in the migrated schema the underlying + # columns are ``*_tx_index`` integers, but the legacy hash fields + # are still re-exposed via JOINs/VIEWs and accepted on the input + # side. Keeping them here means the row tracer / WHERE-clause hex + # conversion treats them consistently. + "dispenser_tx_hash", + "fairminter_tx_hash", + "order_tx_hash", + "offer_hash", + } +) + + +def hash_to_db(value, strict=False): + """Convert a hex string or already-bytes value to the BLOB form used by + the optimized schema. ``None`` passes through. + + Accepts: + - ``None`` -> ``None`` + - ``bytes`` -> bytes as-is + - ``str`` (hex) -> ``bytes.fromhex(value)`` + + A non-hex string is encoded as its UTF-8 bytes when ``strict=False``. + This permissive fallback exists for synthetic test fixtures that pass + non-hash labels through APIs that expect a ``tx_hash`` (e.g. ``"tx1"``). + Production code always passes 64-char lowercase hex; consensus paths + should call with ``strict=True`` to assert that contract. + + When ``strict=True``: + - non-hex strings raise ``ValueError`` + - non-64-char hex strings raise ``ValueError`` + - ``bytes`` not of length 32 raise ``ValueError`` + """ + if value is None: + return None + if isinstance(value, bytes): + if strict and len(value) != 32: + raise ValueError(f"hash_to_db(strict): expected 32 bytes, got {len(value)}") + return value + if isinstance(value, str): + if value == "": + if strict: + raise ValueError("hash_to_db(strict): empty string is not a valid hash") + return None + if strict: + if len(value) != 64: + raise ValueError(f"hash_to_db(strict): expected 64-char hex, got len={len(value)}") + # bytes.fromhex will raise ValueError on non-hex content. + return bytes.fromhex(value) + try: + return bytes.fromhex(value) + except ValueError: + # Permissive UTF-8 fallback for test fixtures only. + return value.encode("utf-8") + raise TypeError(f"hash_to_db: unsupported type {type(value).__name__}") + + +def hash_from_db(value): + """Convert a BLOB value back to its 64-char lowercase hex string. Used at + the API / consensus / JSON boundary.""" + if value is None: + return None + if isinstance(value, str): + return value + if isinstance(value, bytes): + return binascii.hexlify(value).decode("ascii") + raise TypeError(f"hash_from_db: unsupported type {type(value).__name__}") + + +def normalize_record_hashes(record, hash_columns): + """In-place normalize the hash-typed values of ``record`` (mapping) to + BLOB form for ``hash_columns`` present in the dict. Returns ``record`` + for chaining.""" + for col in hash_columns: + if col in record: + record[col] = hash_to_db(record[col]) + return record + + +def register_db_functions(db): + """Register scalar UDFs on the given connection so SQL can convert + between BLOB and hex inline (used by VIEW definitions and migrations). + + Works on both ``apsw.Connection`` (``createscalarfunction``) and the + stdlib ``sqlite3.Connection`` (``create_function``). The stdlib path is + needed by yoyo-driven migrations of the API state DB, which open a + plain ``sqlite3`` connection that hasn't been through + ``database.get_db_connection``. Without it, any DDL that triggers view + re-validation (e.g. ``ALTER TABLE ... RENAME``) on a table referenced + by a view that uses ``hex_lower`` will fail with + ``no such function: hex_lower``. + + - ``hex_lower(blob)`` returns the lowercase hex string of a BLOB, or + NULL for NULL. Mirrors Python ``binascii.hexlify(value).decode()``. + - ``unhex(text)`` returns ``BLOB`` for a hex string, or NULL. + """ + + def _hex_lower(blob): + if blob is None: + return None + if isinstance(blob, str): + return blob.lower() + return binascii.hexlify(blob).decode("ascii") + + def _unhex(text): + if text is None: + return None + if isinstance(text, bytes): + return text + return bytes.fromhex(text) + + if hasattr(db, "createscalarfunction"): + db.createscalarfunction("hex_lower", _hex_lower, 1) + db.createscalarfunction("unhex", _unhex, 1) + else: + db.create_function("hex_lower", 1, _hex_lower) + db.create_function("unhex", 1, _unhex) diff --git a/counterparty-core/counterpartycore/lib/utils/helpers.py b/counterparty-core/counterpartycore/lib/utils/helpers.py index 522bec038a..54de2f5d74 100644 --- a/counterparty-core/counterpartycore/lib/utils/helpers.py +++ b/counterparty-core/counterpartycore/lib/utils/helpers.py @@ -43,6 +43,13 @@ def make_id(hash_1, hash_2): return hash_1 + ID_SEPARATOR + hash_2 +# SQL form of ``make_id``: reconstructs the composite TEXT match ``id`` +# (``tx0hash_tx1hash``) from the compact ``tx0_hash``/``tx1_hash`` BLOB columns +# kept on the match tables. ``hex_lower`` is the UDF registered on the ledger +# and state connections (see ``hashcodec.register_db_functions``). +MATCH_ID_SQL = f"hex_lower(tx0_hash) || '{ID_SEPARATOR}' || hex_lower(tx1_hash)" + + # ORACLES def satoshirate_to_fiat(satoshirate): return round(satoshirate / 100.0, 2) diff --git a/counterparty-core/counterpartycore/test/functionals/multisig_scenarios_test.py b/counterparty-core/counterpartycore/test/functionals/multisig_scenarios_test.py index cc6b78e57f..170f2d1c14 100644 --- a/counterparty-core/counterpartycore/test/functionals/multisig_scenarios_test.py +++ b/counterparty-core/counterpartycore/test/functionals/multisig_scenarios_test.py @@ -1,3 +1,4 @@ +from counterpartycore.lib.utils import helpers from counterpartycore.test.mocks.counterpartydbs import ProtocolChangesDisabled, run_scenario @@ -84,9 +85,11 @@ def check_standard_scenario( ], ) - order_match_id = empty_ledger_db.execute( - "SELECT id FROM order_matches ORDER BY rowid DESC" - ).fetchone()["id"] + order_match = empty_ledger_db.execute( + f"SELECT {helpers.MATCH_ID_SQL} AS id, tx0_index, tx1_index " # noqa: S608 + "FROM order_matches ORDER BY rowid DESC" + ).fetchone() + order_match_id = order_match["id"] run_scenario( empty_ledger_db, @@ -330,7 +333,9 @@ def check_standard_scenario( assert ( empty_ledger_db.execute( - "SELECT COUNT(*) AS count FROM btcpays WHERE order_match_id = ?", (order_match_id,) + "SELECT COUNT(*) AS count FROM btcpays " + "WHERE order_match_tx0_index = ? AND order_match_tx1_index = ?", + (order_match["tx0_index"], order_match["tx1_index"]), ).fetchone()["count"] == 1 ) diff --git a/counterparty-core/counterpartycore/test/integrations/cache_manager.py b/counterparty-core/counterpartycore/test/integrations/cache_manager.py index 2421646ff8..3577313b1b 100644 --- a/counterparty-core/counterpartycore/test/integrations/cache_manager.py +++ b/counterparty-core/counterpartycore/test/integrations/cache_manager.py @@ -11,6 +11,7 @@ from datetime import datetime, timezone import apsw +from counterpartycore.lib.utils import hashcodec # Number of block hashes to store in cache HASH_COUNT = 100 @@ -47,10 +48,49 @@ def get_hashes_path(network): def cache_exists(network): - """Check if a valid cache exists for the given network.""" + """Check if a valid cache exists for the given network. + + Validates both that the files are present and that the hashes JSON is + syntactically valid and has the expected structure. A corrupted hashes + file (e.g. partial write from a previous failed run) is treated as a + missing cache so the test falls back to a clean bootstrap and rewrites + the cache rather than aborting with ``JSONDecodeError``. + """ db_path = get_cached_db_path(network) hashes_path = get_hashes_path(network) - return os.path.exists(db_path) and os.path.exists(hashes_path) + if not (os.path.exists(db_path) and os.path.exists(hashes_path)): + return False + + try: + with open(hashes_path, "r") as f: + data = json.load(f) + except (json.JSONDecodeError, OSError) as e: + print(f"Cache hashes file is unreadable ({e}); treating cache as missing.") + _discard_corrupted_cache(network) + return False + + if not isinstance(data, dict) or not isinstance(data.get("hashes"), list) or not data["hashes"]: + print("Cache hashes file is malformed; treating cache as missing.") + _discard_corrupted_cache(network) + return False + + return True + + +def _discard_corrupted_cache(network): + """Remove a corrupted cache directory so the next run rebuilds it. + + Used when ``cache_exists`` detects an unreadable or malformed hashes + file. We can't trust the cached DB either in that case, since the two + are produced together and may be out of sync. + """ + network_cache_dir = get_network_cache_dir(network) + if os.path.exists(network_cache_dir): + try: + shutil.rmtree(network_cache_dir) + print(f"Removed corrupted cache directory: {network_cache_dir}") + except OSError as e: + print(f"Failed to remove corrupted cache directory {network_cache_dir}: {e}") def get_block_hashes_from_db(db_path, count=HASH_COUNT): @@ -58,6 +98,9 @@ def get_block_hashes_from_db(db_path, count=HASH_COUNT): Extract the last N block hashes from the database. Returns a list of dicts with block_index, ledger_hash, and txlist_hash. + Hashes are returned as 64-char lowercase hex strings, regardless of + whether the underlying schema stores them as BLOB (post-migration 0010) + or TEXT (pre-migration). """ db = apsw.Connection(db_path) try: @@ -77,8 +120,8 @@ def get_block_hashes_from_db(db_path, count=HASH_COUNT): return [ { "block_index": row[0], - "ledger_hash": row[1], - "txlist_hash": row[2], + "ledger_hash": hashcodec.hash_from_db(row[1]), + "txlist_hash": hashcodec.hash_from_db(row[2]), } for row in reversed(rows) ] @@ -122,8 +165,20 @@ def save_hashes(network, db_path): } hashes_path = get_hashes_path(network) - with open(hashes_path, "w") as f: - json.dump(data, f, indent=2) + # Write atomically: dump to a temp file in the same directory, then rename. + # This prevents leaving a partially-written / corrupted JSON file on disk + # if json.dump raises mid-write (e.g. a serialization error). Otherwise a + # subsequent run would find a syntactically broken cache file and abort + # with a JSONDecodeError instead of falling back to a clean rebuild. + tmp_path = hashes_path + ".tmp" + try: + with open(tmp_path, "w") as f: + json.dump(data, f, indent=2) + os.replace(tmp_path, hashes_path) + except Exception: + if os.path.exists(tmp_path): + os.remove(tmp_path) + raise print(f"Saved {len(hashes)} block hashes to {hashes_path}") return data @@ -337,8 +392,10 @@ def verify_hashes(db_path, expected_hashes): if row is None: raise AssertionError(f"Block {block_index} not found in database") - actual_ledger_hash = row[0] - actual_txlist_hash = row[1] + # Normalize to hex string so the comparison works regardless of + # whether the schema stores hashes as BLOB or TEXT. + actual_ledger_hash = hashcodec.hash_from_db(row[0]) + actual_txlist_hash = hashcodec.hash_from_db(row[1]) if actual_ledger_hash != expected["ledger_hash"]: raise AssertionError( diff --git a/counterparty-core/counterpartycore/test/integrations/regtest/apidoc/apicache.json b/counterparty-core/counterpartycore/test/integrations/regtest/apidoc/apicache.json deleted file mode 100644 index 5854b3d5e2..0000000000 --- a/counterparty-core/counterpartycore/test/integrations/regtest/apidoc/apicache.json +++ /dev/null @@ -1,14491 +0,0 @@ -{ - "/v2/events/NEW_BLOCK": { - "result": [ - { - "event_index": 1378, - "event": "NEW_BLOCK", - "params": { - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_index": 325, - "block_time": 1781529693, - "difficulty": 545259519, - "previous_block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80" - }, - "tx_hash": null, - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1372, - "result_count": 225 - }, - "/v2/events/NEW_TRANSACTION": { - "result": [ - { - "event_index": 1379, - "event": "NEW_TRANSACTION", - "params": { - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_index": 325, - "block_time": 1781529693, - "btc_amount": 1000, - "data": "0d00", - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "fee": 0, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "transaction_type": "dispense", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxos_info": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1 3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0 3 1", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1365, - "result_count": 142 - }, - "/v2/events/NEW_TRANSACTION_OUTPUT": { - "result": [ - { - "event_index": 1380, - "event": "NEW_TRANSACTION_OUTPUT", - "params": { - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "out_index": 0, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1014, - "result_count": 6 - }, - "/v2/events/BLOCK_PARSED": { - "result": [ - { - "event_index": 1391, - "event": "BLOCK_PARSED", - "params": { - "block_index": 325, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "transaction_count": 1, - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "block_time": 1781529693 - }, - "tx_hash": null, - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1377, - "result_count": 225 - }, - "/v2/events/TRANSACTION_PARSED": { - "result": [ - { - "event_index": 1390, - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141 - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1370, - "result_count": 142 - }, - "/v2/events/DEBIT": { - "result": [ - { - "event_index": 1384, - "event": "DEBIT", - "params": { - "action": "utxo move", - "address": null, - "asset": "XCP", - "block_index": 325, - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "utxo_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1381, - "result_count": 137 - }, - "/v2/events/CREDIT": { - "result": [ - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1385, - "result_count": 165 - }, - "/v2/events/ENHANCED_SEND": { - "result": [ - { - "event_index": 689, - "event": "ENHANCED_SEND", - "params": { - "asset": "MPMASSET", - "block_index": 203, - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "memo": null, - "msg_index": 0, - "quantity": 1000, - "send_type": "send", - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "b33aa61e8d73a25651efa36c750a9683288f7d0541e39eaf6c95dd7070e79c77", - "tx_index": 80, - "block_time": 1781529208, - "asset_info": { - "asset_longname": null, - "description": "My super asset B", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "0.00001000" - }, - "tx_hash": "b33aa61e8d73a25651efa36c750a9683288f7d0541e39eaf6c95dd7070e79c77", - "block_index": 203, - "block_time": 1781529208 - } - ], - "next_cursor": 559, - "result_count": 3 - }, - "/v2/events/MPMA_SEND": { - "result": [ - { - "event_index": 746, - "event": "MPMA_SEND", - "params": { - "asset": "XCP", - "block_index": 207, - "destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "memo": "memo1", - "msg_index": 2, - "quantity": 10, - "send_type": "send", - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "tx_hash": "2102a09d76312481bf0185d1b504f7632fb72dd446dfbefcc128535c46ef1b66", - "tx_index": 84, - "block_time": 1781529225, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000010" - }, - "tx_hash": "2102a09d76312481bf0185d1b504f7632fb72dd446dfbefcc128535c46ef1b66", - "block_index": 207, - "block_time": 1781529225 - } - ], - "next_cursor": 745, - "result_count": 15 - }, - "/v2/events/SEND": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/events/ASSET_TRANSFER": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/events/SWEEP": { - "result": [ - { - "event_index": 604, - "event": "SWEEP", - "params": { - "block_index": 192, - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "fee_paid": 800000, - "flags": 1, - "memo": "sweep my assets", - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "status": "valid", - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "tx_index": 68, - "block_time": 1781529163, - "fee_paid_normalized": "0.00800000" - }, - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "block_index": 192, - "block_time": 1781529163 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/ASSET_DIVIDEND": { - "result": [ - { - "event_index": 338, - "event": "ASSET_DIVIDEND", - "params": { - "asset": "MYASSETA", - "block_index": 146, - "dividend_asset": "XCP", - "fee_paid": 20000, - "quantity_per_unit": 100000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "tx_index": 42, - "block_time": 1781528999, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dividend_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_per_unit_normalized": "1.00000000", - "fee_paid_normalized": "0.00020000" - }, - "tx_hash": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "block_index": 146, - "block_time": 1781528999 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/RESET_ISSUANCE": { - "result": [ - { - "event_index": 1034, - "event": "RESET_ISSUANCE", - "params": { - "asset": "RESET", - "asset_events": "reset", - "asset_longname": null, - "block_index": 242, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "divisible": true, - "fee_paid": 0, - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "locked": false, - "mime_type": "text/plain", - "quantity": 1200000000, - "reset": true, - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "status": "valid", - "transfer": false, - "tx_hash": "3ebd11688f4de7bba3a0d007f30b09fcb5e0132d637d94f8aa9f11f97cda733e", - "tx_index": 120, - "block_time": 1781529385, - "quantity_normalized": "12.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "3ebd11688f4de7bba3a0d007f30b09fcb5e0132d637d94f8aa9f11f97cda733e", - "block_index": 242, - "block_time": 1781529385 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/ASSET_CREATION": { - "result": [ - { - "event_index": 1367, - "event": "ASSET_CREATION", - "params": { - "asset_id": "117132633401", - "asset_longname": null, - "asset_name": "OPENFAIR", - "block_index": 323, - "block_time": 1781529682 - }, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_time": 1781529682 - } - ], - "next_cursor": 1340, - "result_count": 39 - }, - "/v2/events/ASSET_ISSUANCE": { - "result": [ - { - "event_index": 1375, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMARK", - "asset_events": "close_fairminter", - "asset_longname": null, - "block_index": 324, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": false, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": true, - "mime_type": "text/plain", - "msg_index": 1, - "quantity": 0, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529686, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": null, - "block_index": 324, - "block_time": 1781529686 - } - ], - "next_cursor": 1368, - "result_count": 76 - }, - "/v2/events/ASSET_DESTRUCTION": { - "result": [ - { - "event_index": 1376, - "event": "ASSET_DESTRUCTION", - "params": { - "asset": "FAIRMARK", - "block_index": 324, - "quantity": 400000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tag": "soft cap not reached", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529686, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - }, - "tx_hash": null, - "block_index": 324, - "block_time": 1781529686 - } - ], - "next_cursor": 1285, - "result_count": 8 - }, - "/v2/events/OPEN_ORDER": { - "result": [ - { - "event_index": 1358, - "event": "OPEN_ORDER", - "params": { - "block_index": 322, - "expiration": 21, - "expire_index": 342, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "fee_required": 0, - "fee_required_remaining": 0, - "get_asset": "UTXOASSET", - "get_quantity": 1000, - "get_remaining": 1000, - "give_asset": "BTC", - "give_quantity": 1000, - "give_remaining": 1000, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": "open", - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx_index": 139, - "block_time": 1781529679, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000" - }, - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "block_index": 322, - "block_time": 1781529679 - } - ], - "next_cursor": 1353, - "result_count": 12 - }, - "/v2/events/ORDER_MATCH": { - "result": [ - { - "event_index": 1361, - "event": "ORDER_MATCH", - "params": { - "backward_asset": "BTC", - "backward_quantity": 1000, - "block_index": 322, - "fee_paid": 0, - "forward_asset": "UTXOASSET", - "forward_quantity": 1000, - "id": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416_392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "match_expire_index": 341, - "status": "pending", - "tx0_address": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "tx0_block_index": 321, - "tx0_expiration": 21, - "tx0_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "tx0_index": 138, - "tx1_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx1_block_index": 322, - "tx1_expiration": 21, - "tx1_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx1_index": 139, - "block_time": 1781529679, - "forward_asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "block_index": 322, - "block_time": 1781529679 - } - ], - "next_cursor": 712, - "result_count": 5 - }, - "/v2/events/ORDER_UPDATE": { - "result": [ - { - "event_index": 1360, - "event": "ORDER_UPDATE", - "params": { - "fee_provided_remaining": 10000, - "fee_required_remaining": 0, - "get_remaining": 0, - "give_remaining": 0, - "status": "open", - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000" - }, - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "block_index": 322, - "block_time": 1781529679 - } - ], - "next_cursor": 1359, - "result_count": 22 - }, - "/v2/events/ORDER_FILLED": { - "result": [ - { - "event_index": 538, - "event": "ORDER_FILLED", - "params": { - "status": "filled", - "tx_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d" - }, - "tx_hash": "60ee00dbff9ff858cc1885dca75ccb6ffc124842a978e616a9102c43ac0600ca", - "block_index": 184, - "block_time": 1781529130 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/ORDER_MATCH_UPDATE": { - "result": [ - { - "event_index": 882, - "event": "ORDER_MATCH_UPDATE", - "params": { - "id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "order_match_id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "status": "expired" - }, - "tx_hash": null, - "block_index": 225, - "block_time": 1781529297 - } - ], - "next_cursor": 706, - "result_count": 4 - }, - "/v2/events/BTC_PAY": { - "result": [ - { - "event_index": 539, - "event": "BTC_PAY", - "params": { - "block_index": 184, - "btc_amount": 2000, - "destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "order_match_id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "tx_hash": "60ee00dbff9ff858cc1885dca75ccb6ffc124842a978e616a9102c43ac0600ca", - "tx_index": 60, - "block_time": 1781529130, - "btc_amount_normalized": "0.00002000" - }, - "tx_hash": "60ee00dbff9ff858cc1885dca75ccb6ffc124842a978e616a9102c43ac0600ca", - "block_index": 184, - "block_time": 1781529130 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/CANCEL_ORDER": { - "result": [ - { - "event_index": 1148, - "event": "CANCEL_ORDER", - "params": { - "block_index": 294, - "offer_hash": "f27758db106fb62e5fd1413aeead73b591804e0fbc22ce7bcf0567fa18a1ba83", - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "tx_hash": "2fec2e0acf421c3df1181718cb062fdf0affff7ea3c2cf467a1e8f6aea1b0a41", - "tx_index": 122, - "block_time": 1781529481 - }, - "tx_hash": "2fec2e0acf421c3df1181718cb062fdf0affff7ea3c2cf467a1e8f6aea1b0a41", - "block_index": 294, - "block_time": 1781529481 - } - ], - "next_cursor": 584, - "result_count": 2 - }, - "/v2/events/ORDER_EXPIRATION": { - "result": [ - { - "event_index": 1351, - "event": "ORDER_EXPIRATION", - "params": { - "block_index": 321, - "order_hash": "d99c71cc65fc097524b7ff82feb17a727183a0f9159733738205e174d63fcfb9", - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "block_time": 1781529675 - }, - "tx_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "block_index": 321, - "block_time": 1781529675 - } - ], - "next_cursor": 785, - "result_count": 6 - }, - "/v2/events/ORDER_MATCH_EXPIRATION": { - "result": [ - { - "event_index": 884, - "event": "ORDER_MATCH_EXPIRATION", - "params": { - "block_index": 225, - "order_match_id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "block_time": 1781529297 - }, - "tx_hash": null, - "block_index": 225, - "block_time": 1781529297 - } - ], - "next_cursor": 709, - "result_count": 3 - }, - "/v2/events/OPEN_DISPENSER": { - "result": [ - { - "event_index": 1009, - "event": "OPEN_DISPENSER", - "params": { - "asset": "XCP", - "block_index": 238, - "dispense_count": 0, - "escrow_quantity": 5000, - "give_quantity": 1, - "give_remaining": 5000, - "oracle_address": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "satoshirate": 1, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "status": 0, - "tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "tx_index": 117, - "block_time": 1781529369, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00005000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001" - }, - "tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "block_index": 238, - "block_time": 1781529369 - } - ], - "next_cursor": 620, - "result_count": 6 - }, - "/v2/events/DISPENSER_UPDATE": { - "result": [ - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1016, - "result_count": 9 - }, - "/v2/events/REFILL_DISPENSER": { - "result": [ - { - "event_index": 253, - "event": "REFILL_DISPENSER", - "params": { - "asset": "XCP", - "block_index": 135, - "destination": "mz7U1yRFEQVu84SfHcadv7ha8d9fQQZ8Xv", - "dispense_quantity": 10, - "dispenser_tx_hash": "20b02bde2bba1f3d9abbbaf22568328792325430005ce26af0bd9ac2691e1eba", - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx_hash": "1d153f9f9ef047cb2f0c2b1837db1024325ca55da39af5b0bcd91511fb9f19f0", - "tx_index": 31, - "block_time": 1781528953, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000010" - }, - "tx_hash": "1d153f9f9ef047cb2f0c2b1837db1024325ca55da39af5b0bcd91511fb9f19f0", - "block_index": 135, - "block_time": 1781528953 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events/DISPENSE": { - "result": [ - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1017, - "result_count": 6 - }, - "/v2/events/BROADCAST": { - "result": [ - { - "event_index": 210, - "event": "BROADCAST", - "params": { - "block_index": 129, - "fee_fraction_int": 0, - "locked": false, - "mime_type": "text/plain", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": "valid", - "text": "price-USD", - "timestamp": 4003903983, - "tx_hash": "e135d21a676dea1fdb2638bce05139bbee4708b17a214eac42565a86c6646b5e", - "tx_index": 25, - "value": 66600.0, - "block_time": 1781528928, - "fee_fraction_int_normalized": "0.00000000" - }, - "tx_hash": "e135d21a676dea1fdb2638bce05139bbee4708b17a214eac42565a86c6646b5e", - "block_index": 129, - "block_time": 1781528928 - } - ], - "next_cursor": 205, - "result_count": 2 - }, - "/v2/events/NEW_FAIRMINTER": { - "result": [ - { - "event_index": 1366, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "OPENFAIR", - "asset_longname": null, - "asset_parent": null, - "block_index": 323, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 0, - "lock_description": false, - "lock_quantity": false, - "lp_asset": null, - "max_mint_per_address": 0, - "max_mint_per_tx": 10, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 0, - "pre_minted": false, - "premint_quantity": 0, - "price": 0, - "quantity_by_price": 1, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "start_block": 0, - "status": "open", - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "tx_index": 140, - "block_time": 1781529682, - "price_normalized": "0.0000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000010", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_time": 1781529682 - } - ], - "next_cursor": 1339, - "result_count": 23 - }, - "/v2/events/FAIRMINTER_UPDATE": { - "result": [ - { - "event_index": 1374, - "event": "FAIRMINTER_UPDATE", - "params": { - "status": "closed", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3" - }, - "tx_hash": null, - "block_index": 324, - "block_time": 1781529686 - } - ], - "next_cursor": 1326, - "result_count": 15 - }, - "/v2/events/NEW_FAIRMINT": { - "result": [ - { - "event_index": 1313, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRMULTI", - "block_index": 315, - "commission": 0, - "earn_quantity": 400000000, - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "paid_quantity": 400000000, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - }, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "block_index": 315, - "block_time": 1781529653 - } - ], - "next_cursor": 1304, - "result_count": 22 - }, - "/v2/events/ATTACH_TO_UTXO": { - "result": [ - { - "event_index": 998, - "event": "ATTACH_TO_UTXO", - "params": { - "asset": "DETACHA", - "block_index": 237, - "destination": "472465ea5fc1a82672c8b08727a0b5c3763f4290fd402ac6b623b6270514fda7:0", - "destination_address": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "fee_paid": 0, - "msg_index": 0, - "quantity": 100000000, - "send_type": "attach", - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "status": "valid", - "tx_hash": "472465ea5fc1a82672c8b08727a0b5c3763f4290fd402ac6b623b6270514fda7", - "tx_index": 115, - "block_time": 1781529363, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": false, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "1.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "472465ea5fc1a82672c8b08727a0b5c3763f4290fd402ac6b623b6270514fda7", - "block_index": 237, - "block_time": 1781529363 - } - ], - "next_cursor": 977, - "result_count": 9 - }, - "/v2/events/DETACH_FROM_UTXO": { - "result": [ - { - "event_index": 990, - "event": "DETACH_FROM_UTXO", - "params": { - "asset": "DETACHB", - "block_index": 236, - "destination": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "fee_paid": 0, - "msg_index": 1, - "quantity": 100000000, - "send_type": "detach", - "source": "a605af4d25677914936044eb007ddc7ca948ed5ab5f6ab543618ee28d524508f:0", - "source_address": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "status": "valid", - "tx_hash": "dfda224b90f5e244fcd38c5b67592eabc54e41519b75de92f0f0fc41d6b3c555", - "tx_index": 114, - "block_time": 1781529359, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": false, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "1.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "dfda224b90f5e244fcd38c5b67592eabc54e41519b75de92f0f0fc41d6b3c555", - "block_index": 236, - "block_time": 1781529359 - } - ], - "next_cursor": 987, - "result_count": 5 - }, - "/v2/events/UTXO_MOVE": { - "result": [ - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1383, - "result_count": 14 - }, - "/v2/events/BURN": { - "result": [ - { - "event_index": 61, - "event": "BURN", - "params": { - "block_index": 112, - "burned": 50000000, - "earned": 74999998167, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "status": "valid", - "tx_hash": "02e17626a3b84df0f7913ae83149f612a94ff6d0819a00667e275466027367dc", - "tx_index": 9, - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - }, - "tx_hash": "02e17626a3b84df0f7913ae83149f612a94ff6d0819a00667e275466027367dc", - "block_index": 112, - "block_time": 1781528859 - } - ], - "next_cursor": 58, - "result_count": 10 - }, - "/v2/blocks": { - "result": [ - { - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "previous_block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80", - "difficulty": 545259519, - "transaction_count": 1 - }, - { - "block_index": 324, - "block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80", - "block_time": 1781529686, - "ledger_hash": "b10800c3bafb4e98c0382f8f67f706a9f3f877b0599ccf6a1a0b82cd901a87c5", - "txlist_hash": "1a48fbdd5a96d5c405ca69a9157448646554384e794ec652b977ef03bf238457", - "messages_hash": "117bf70d6a3594ca0c2a49c5bac2feb1b706a47dd6a0e7bf81c9d7e0af82b9e0", - "previous_block_hash": "0e66de8a5d7dde36e5db9e4b2c54d8071b22485a5ecdab32d3e1d777980a682a", - "difficulty": 545259519, - "transaction_count": 0 - }, - { - "block_index": 323, - "block_hash": "0e66de8a5d7dde36e5db9e4b2c54d8071b22485a5ecdab32d3e1d777980a682a", - "block_time": 1781529682, - "ledger_hash": "63a0f158553a2c6263ac403075697250ad3728ff00422e2bba875b7681d85c81", - "txlist_hash": "5b19bab808594978079101e2df9e17ca2099c6e8fda0c1224dd0a837a73f5aff", - "messages_hash": "bec19b29c9d8f6962399d29f0e7a472792f584e817232373828c16b138ca4bc1", - "previous_block_hash": "3970886600b7abfe152203c3ec6f035c6bffdd779b7191ad1656ca62692f7803", - "difficulty": 545259519, - "transaction_count": 1 - }, - { - "block_index": 322, - "block_hash": "3970886600b7abfe152203c3ec6f035c6bffdd779b7191ad1656ca62692f7803", - "block_time": 1781529679, - "ledger_hash": "984f20593313275b82c1d85523899120c205b4924149d10ebb84ae4f07cd4f2f", - "txlist_hash": "5076c9d68dd37d563eef9bce9ee36106ab61eb97b6c9fd1f6a9faf01fb9b7a4e", - "messages_hash": "96ca4d7ada31896f5c470890d584a9fd2ff1e960c1e38e651229a38a46b49542", - "previous_block_hash": "4b6559c0fd0a6daf4d4f76e11b8ceb81f71f19d3bba5755f907cee2ef22e1a72", - "difficulty": 545259519, - "transaction_count": 1 - }, - { - "block_index": 321, - "block_hash": "4b6559c0fd0a6daf4d4f76e11b8ceb81f71f19d3bba5755f907cee2ef22e1a72", - "block_time": 1781529675, - "ledger_hash": "44526feb6fae1ed1a2a4c73e1f99b81ed30139fde90dcb0e63b16336d0aeb4e6", - "txlist_hash": "6cf3f6b41bcd0486bef5c5aefcef6b19f498995e17dc07b5d5e9d3a38dc6e3cf", - "messages_hash": "f1208de87c939d392ba843fec7ce823f16294d559a11c46e9640f27dc8bb28b0", - "previous_block_hash": "4b15c2be04cc59d9a4815ed52ec988191b2de4f2aea5d66bcf974cb87a87d3db", - "difficulty": 545259519, - "transaction_count": 1 - } - ], - "next_cursor": 320, - "result_count": 225 - }, - "/v2/blocks/last": { - "result": { - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "previous_block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80", - "difficulty": 545259519, - "transaction_count": 1 - } - }, - "/v2/blocks/": { - "result": { - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "previous_block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80", - "difficulty": 545259519, - "transaction_count": 1 - } - }, - "/v2/blocks/": { - "result": { - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "previous_block_hash": "6fbcbc1fcdd9de386fbf218abeb3619d0ab01f02ee050792240568b8287b5e80", - "difficulty": 545259519, - "transaction_count": 1 - } - }, - "/v2/blocks//transactions": { - "result": [ - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "btc_amount": 1000, - "fee": 0, - "data": "0d00", - "supported": true, - "utxos_info": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1 3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0 3 1", - "transaction_type": "dispense", - "valid": true, - "events": [ - { - "event_index": 1383, - "event": "UTXO_MOVE", - "params": { - "asset": "MYASSETA", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 0, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "unpacked_data": { - "message_type": "dispense", - "message_type_id": 13, - "message_data": { - "data": "00" - } - }, - "btc_amount_normalized": "0.00001000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//transactions/counts": { - "result": [ - { - "transaction_type": "utxomove", - "count": 1 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//events": { - "result": [ - { - "event_index": 1391, - "event": "BLOCK_PARSED", - "params": { - "block_index": 325, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "transaction_count": 1, - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "block_time": 1781529693 - }, - "tx_hash": null - }, - { - "event_index": 1390, - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141 - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - }, - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - } - ], - "next_cursor": 1386, - "result_count": 14 - }, - "/v2/blocks//events/counts": { - "result": [ - { - "event": "UTXO_MOVE", - "event_count": 2 - }, - { - "event": "TRANSACTION_PARSED", - "event_count": 1 - }, - { - "event": "NEW_TRANSACTION_OUTPUT", - "event_count": 1 - }, - { - "event": "NEW_TRANSACTION", - "event_count": 1 - }, - { - "event": "NEW_BLOCK", - "event_count": 1 - } - ], - "next_cursor": "DISPENSER_UPDATE", - "result_count": 10 - }, - "/v2/blocks//events/": { - "result": [ - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - }, - { - "event_index": 1385, - "event": "CREDIT", - "params": { - "address": null, - "asset": "XCP", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - }, - { - "event_index": 1382, - "event": "CREDIT", - "params": { - "address": null, - "asset": "MYASSETA", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/blocks//credits": { - "result": [ - { - "block_index": 325, - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "quantity": 66, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "credit_index": 165, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - { - "block_index": 325, - "address": null, - "asset": "XCP", - "quantity": 2000000000, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "credit_index": 164, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - { - "block_index": 325, - "address": null, - "asset": "MYASSETA", - "quantity": 2000000000, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "credit_index": 163, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/blocks//debits": { - "result": [ - { - "block_index": 325, - "address": null, - "asset": "XCP", - "quantity": 2000000000, - "action": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "utxo_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "debit_index": 137, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - { - "block_index": 325, - "address": null, - "asset": "MYASSETA", - "quantity": 2000000000, - "action": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "utxo_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "debit_index": 136, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/blocks//expirations": { - "result": [ - { - "type": "order", - "object_id": "d99c71cc65fc097524b7ff82feb17a727183a0f9159733738205e174d63fcfb9", - "block_index": 321, - "block_time": 1781529675 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//cancels": { - "result": [ - { - "tx_index": 122, - "tx_hash": "2fec2e0acf421c3df1181718cb062fdf0affff7ea3c2cf467a1e8f6aea1b0a41", - "block_index": 294, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "offer_hash": "f27758db106fb62e5fd1413aeead73b591804e0fbc22ce7bcf0567fa18a1ba83", - "status": "valid", - "block_time": 1781529481 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//destructions": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "quantity": 400000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529686, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//issuances": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "msg_index": 1, - "block_index": 324, - "asset": "FAIRMARK", - "quantity": 0, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "", - "fee_paid": 0, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "close_fairminter", - "locked": true, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529686, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//sends": { - "result": [ - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "asset": "MYASSETA", - "quantity": 2000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/blocks//dispenses": { - "result": [ - { - "tx_index": 141, - "dispense_index": 0, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "btc_amount": 1000, - "dispenser": { - "tx_index": 33, - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016" - }, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//sweeps": { - "result": [ - { - "tx_index": 68, - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "block_index": 192, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "flags": 1, - "status": "valid", - "memo": "sweep my assets", - "fee_paid": 800000, - "block_time": 1781529163, - "fee_paid_normalized": "0.00800000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//fairminters": { - "result": [ - { - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "earned_quantity": null, - "paid_quantity": null, - "commission": null, - "block_time": 1781529686, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//fairmints": { - "result": [ - { - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_index": 315, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "asset": "FAIRMULTI", - "earn_quantity": 400000000, - "paid_quantity": 400000000, - "commission": 0, - "status": "valid", - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/blocks//pool_deposits": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/blocks//pool_withdrawals": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/blocks//pool_matches": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/transactions": { - "result": [ - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "btc_amount": 1000, - "fee": 0, - "data": "0d00", - "supported": true, - "utxos_info": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1 3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0 3 1", - "transaction_type": "dispense", - "valid": true, - "events": [ - { - "event_index": 1383, - "event": "UTXO_MOVE", - "params": { - "asset": "MYASSETA", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 0, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "unpacked_data": { - "message_type": "dispense", - "message_type_id": 13, - "message_data": { - "data": "00" - } - }, - "btc_amount_normalized": "0.00001000" - }, - { - "tx_index": 140, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_hash": "0e66de8a5d7dde36e5db9e4b2c54d8071b22485a5ecdab32d3e1d777980a682a", - "block_time": 1781529682, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a931b0000001b45a625390000010a0000000000000000f4f4f4f56040", - "supported": true, - "utxos_info": " ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1366, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "OPENFAIR", - "asset_longname": null, - "asset_parent": null, - "block_index": 323, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 0, - "lock_description": false, - "lock_quantity": false, - "lp_asset": null, - "max_mint_per_address": 0, - "max_mint_per_tx": 10, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 0, - "pre_minted": false, - "premint_quantity": 0, - "price": 0, - "quantity_by_price": 1, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "start_block": 0, - "status": "open", - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "tx_index": 140, - "block_time": 1781529682, - "price_normalized": "0.0000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000010", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_time": 1781529682 - }, - { - "event_index": 1367, - "event": "ASSET_CREATION", - "params": { - "asset_id": "117132633401", - "asset_longname": null, - "asset_name": "OPENFAIR", - "block_index": 323, - "block_time": 1781529682 - }, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_time": 1781529682 - }, - { - "event_index": 1368, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "OPENFAIR", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 323, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "locked": false, - "mime_type": "text/plain", - "quantity": 0, - "reset": false, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": "valid", - "transfer": false, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "tx_index": 140, - "block_time": 1781529682, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "block_index": 323, - "block_time": 1781529682 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "OPENFAIR", - "asset_parent": "", - "price": 0, - "quantity_by_price": 1, - "max_mint_per_tx": 10, - "max_mint_per_address": 0, - "hard_cap": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 0, - "lp_asset": null, - "price_normalized": "0.0000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000010", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - } - ], - "next_cursor": 139, - "result_count": 142 - }, - "/v2/transactions/counts": { - "result": [ - { - "transaction_type": "fairminter", - "count": 23 - }, - { - "transaction_type": "fairmint", - "count": 22 - }, - { - "transaction_type": "issuance", - "count": 21 - }, - { - "transaction_type": "order", - "count": 12 - }, - { - "transaction_type": "burn", - "count": 10 - }, - { - "transaction_type": "attach", - "count": 9 - }, - { - "transaction_type": "dispenser", - "count": 9 - }, - { - "transaction_type": "utxomove", - "count": 7 - }, - { - "transaction_type": "dispense", - "count": 6 - }, - { - "transaction_type": "mpma", - "count": 5 - }, - { - "transaction_type": "detach", - "count": 4 - }, - { - "transaction_type": "unknown", - "count": 3 - }, - { - "transaction_type": "enhanced_send", - "count": 3 - }, - { - "transaction_type": "cancel", - "count": 2 - }, - { - "transaction_type": "broadcast", - "count": 2 - }, - { - "transaction_type": "destroy", - "count": 1 - }, - { - "transaction_type": "sweep", - "count": 1 - }, - { - "transaction_type": "btcpay", - "count": 1 - }, - { - "transaction_type": "dividend", - "count": 1 - } - ], - "next_cursor": null, - "result_count": 19 - }, - "/v2/transactions/info": { - "result": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "decoded_tx": { - "version": 2, - "segwit": true, - "coinbase": false, - "lock_time": 0, - "tx_id": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "vtxinwit": [ - [ - "304402205ad0e65933844656dfc7e7abfb4df38451f0d131d6e170de402dcd00ef3de471022023ecd92f7d2a4b30884e42a341a4a4a31fcb7f7faaf086da4c5a820c018f386a01", - "02a4cbb1d9c86a1cbb9937cf76c9d636e2d35f65c745fb7d80052dd1caa10de870" - ] - ], - "parsed_vouts": [ - [], - 0, - -7449770000, - "5a951b000000095fce9d3400010100001a3b9aca000000001a23c3460019014400f4f4f5f51a17d784001b01530821671b10026040", - [ - [ - null, - null - ], - [ - "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - 7449770000 - ] - ], - false - ], - "vin": [ - { - "hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "n": 1, - "sequence": 4294967295, - "script_sig": "", - "info": { - "script_pub_key": "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949", - "value": 7449780000, - "is_segwit": true - } - } - ], - "vout": [ - { - "value": 0, - "script_pub_key": "6a3d831d6540cf0b64ebc690a2008a77e9b882459f064c355e2c23226eb2d5e9252cc04c874ac60db0f99273caa9f0c8d6bdc9d0d4f7ac7b3f7bd9f55be584" - }, - { - "value": 7449770000, - "script_pub_key": "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - } - ] - }, - "data": "5a951b000000095fce9d3400010100001a3b9aca000000001a23c3460019014400f4f4f5f51a17d784001b01530821671b10026040", - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMARK", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - } - }, - "/v2/transactions//info": { - "result": { - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "decoded_tx": { - "version": 2, - "segwit": true, - "coinbase": false, - "lock_time": 0, - "tx_id": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "vtxinwit": [ - [ - "304402200fa7d44352504b65ee01a71cc09cc00017f9316e0f7b92a93df40e4a0343f4b7022004696cca41c82d9de354cc6e86b4f578d54582292a30d2d0c7af8ab2524f62bb01", - "031f805e33ff0e7332c52e2a6f63430f3edbb0d9597b3ea4afe9a414e19866f20d" - ] - ], - "parsed_vouts": [ - [], - 0, - -4949940000, - "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - [ - [ - null, - null - ], - [ - "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - 4949940000 - ] - ], - false - ], - "vin": [ - { - "hash": "b98771bf17a55465f5677ef0a9c522d1a1e5ebfaa85e039d14e41423d57230c0", - "n": 1, - "sequence": 4294967295, - "script_sig": "", - "info": { - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810", - "value": 4949950000, - "is_segwit": true - } - } - ], - "vout": [ - { - "value": 0, - "script_pub_key": "6a264b9dcd39ccd97c61152621d175363877c8bc1301ea5293efb4fe3f03ebd0005ea58e3325f6dd" - }, - { - "value": 4949940000, - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810" - } - ] - }, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - "unpacked_data": { - "message_type": "enhanced_send", - "message_type_id": 2, - "message_data": { - "asset": "XCP", - "quantity": 10000, - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "memo": null, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - } - }, - "btc_amount_normalized": "0.00000000" - } - }, - "/v2/bitcoin/transactions//info": { - "result": { - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "decoded_tx": { - "version": 2, - "segwit": true, - "coinbase": false, - "lock_time": 0, - "tx_id": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "vtxinwit": [ - [ - "304402200fa7d44352504b65ee01a71cc09cc00017f9316e0f7b92a93df40e4a0343f4b7022004696cca41c82d9de354cc6e86b4f578d54582292a30d2d0c7af8ab2524f62bb01", - "031f805e33ff0e7332c52e2a6f63430f3edbb0d9597b3ea4afe9a414e19866f20d" - ] - ], - "parsed_vouts": [ - [], - 0, - -4949940000, - "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - [ - [ - null, - null - ], - [ - "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - 4949940000 - ] - ], - false - ], - "vin": [ - { - "hash": "b98771bf17a55465f5677ef0a9c522d1a1e5ebfaa85e039d14e41423d57230c0", - "n": 1, - "sequence": 4294967295, - "script_sig": "", - "info": { - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810", - "value": 4949950000, - "is_segwit": true - } - } - ], - "vout": [ - { - "value": 0, - "script_pub_key": "6a264b9dcd39ccd97c61152621d175363877c8bc1301ea5293efb4fe3f03ebd0005ea58e3325f6dd" - }, - { - "value": 4949940000, - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810" - } - ] - }, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - "unpacked_data": { - "message_type": "enhanced_send", - "message_type_id": 2, - "message_data": { - "asset": "XCP", - "quantity": 10000, - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "memo": null - } - } - } - }, - "/v2/transactions/unpack": { - "result": { - "message_type": "enhanced_send", - "message_type_id": 2, - "message_data": { - "error": "memo too long" - } - } - }, - "/v2/transactions/": { - "result": { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "btc_amount": 1000, - "fee": 0, - "data": "0d00", - "supported": true, - "utxos_info": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1 3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0 3 1", - "transaction_type": "dispense", - "confirmed": true, - "valid": true, - "events": [ - { - "event_index": 1383, - "event": "UTXO_MOVE", - "params": { - "asset": "MYASSETA", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 0, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "unpacked_data": { - "message_type": "dispense", - "message_type_id": 13, - "message_data": { - "data": "00" - } - }, - "btc_amount_normalized": "0.00001000" - } - }, - "/v2/transactions/": { - "result": { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_hash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "block_time": 1781529693, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "btc_amount": 1000, - "fee": 0, - "data": "0d00", - "supported": true, - "utxos_info": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1 3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0 3 1", - "transaction_type": "dispense", - "confirmed": true, - "valid": true, - "events": [ - { - "event_index": 1383, - "event": "UTXO_MOVE", - "params": { - "asset": "MYASSETA", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 0, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "unpacked_data": { - "message_type": "dispense", - "message_type_id": 13, - "message_data": { - "data": "00" - } - }, - "btc_amount_normalized": "0.00001000" - } - }, - "/v2/transactions//events": { - "result": [ - { - "event_index": 1390, - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141 - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1385, - "result_count": 12 - }, - "/v2/transactions//events": { - "result": [ - { - "event_index": 1390, - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141 - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1386, - "event": "UTXO_MOVE", - "params": { - "asset": "XCP", - "block_index": 325, - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "msg_index": 1, - "quantity": 2000000000, - "send_type": "move", - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "status": "valid", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1385, - "result_count": 12 - }, - "/v2/transactions//sends": { - "result": [ - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "asset": "MYASSETA", - "quantity": 2000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/transactions//dispenses": { - "result": [ - { - "tx_index": 141, - "dispense_index": 0, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "btc_amount": 1000, - "dispenser": { - "tx_index": 33, - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016" - }, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/transactions//events/": { - "result": [ - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1385, - "event": "CREDIT", - "params": { - "address": null, - "asset": "XCP", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1382, - "event": "CREDIT", - "params": { - "address": null, - "asset": "MYASSETA", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/transactions//events/": { - "result": [ - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1385, - "event": "CREDIT", - "params": { - "address": null, - "asset": "XCP", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1382, - "event": "CREDIT", - "params": { - "address": null, - "asset": "MYASSETA", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/addresses/balances": { - "result": [ - { - "asset": "XCP", - "asset_longname": null, - "total": 156467479334, - "addresses": [ - { - "address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "utxo": null, - "utxo_address": null, - "quantity": 73090013139, - "quantity_normalized": "730.90013139" - }, - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "utxo": null, - "utxo_address": null, - "quantity": 83377466195, - "quantity_normalized": "833.77466195" - } - ], - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "total_normalized": "1564.67479334" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/transactions": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_hash": "4b15c2be04cc59d9a4815ed52ec988191b2de4f2aea5d66bcf974cb87a87d3db", - "block_time": 1781529671, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a951b000000095fce9d3400010100001a3b9aca000000001a23c3460019014400f4f4f5f51a17d784001b01530821671b10026040", - "supported": true, - "utxos_info": " 55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1339, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "FAIRMARK", - "asset_longname": null, - "asset_parent": null, - "block_index": 320, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 1000000000, - "lock_description": false, - "lock_quantity": true, - "lp_asset": "A95428956661682178", - "max_mint_per_address": 0, - "max_mint_per_tx": 0, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 400000000, - "pre_minted": false, - "premint_quantity": 0, - "price": 1, - "quantity_by_price": 1, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "start_block": 0, - "status": "open", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529671, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - }, - { - "event_index": 1340, - "event": "ASSET_CREATION", - "params": { - "asset_id": "40262081844", - "asset_longname": null, - "asset_name": "FAIRMARK", - "block_index": 320, - "block_time": 1781529671 - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - }, - { - "event_index": 1341, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMARK", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 320, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "quantity": 400000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529671, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMARK", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 136, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "block_index": 315, - "block_hash": "764d0d9a014ebb1fde979758e09765d5b68fa0c865ca91386bf1d0cf52fac1e8", - "block_time": 1781529653, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5b821b000000f3bb0145821a17d78400", - "supported": true, - "utxos_info": " 897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998:1 2 0", - "transaction_type": "fairmint", - "valid": true, - "events": [ - { - "event_index": 1313, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRMULTI", - "block_index": 315, - "commission": 0, - "earn_quantity": 400000000, - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "paid_quantity": 400000000, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - }, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "block_index": 315, - "block_time": 1781529653 - }, - { - "event_index": 1314, - "event": "FAIRMINTER_UPDATE", - "params": { - "soft_cap_deadline_block": 315, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7" - }, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "block_index": 315, - "block_time": 1781529653 - }, - { - "event_index": 1315, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMULTI", - "asset_events": "fairmint", - "asset_longname": null, - "block_index": 315, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": false, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": true, - "mime_type": "text/plain", - "msg_index": 0, - "quantity": 400000000, - "reset": false, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "status": "valid", - "transfer": false, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_time": 1781529653, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "block_index": 315, - "block_time": 1781529653 - } - ], - "unpacked_data": { - "message_type": "fairmint", - "message_type_id": 91, - "message_data": { - "asset": "FAIRMULTI", - "quantity": 400000000, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 135, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_hash": "14b4795fe328c4fa9fd7cd36f314af5ca9cbfd947a72986281bcf675082a8029", - "block_time": 1781529649, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5b821b000000f3bb0145821a0bebc200", - "supported": true, - "utxos_info": " 1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c:1 2 0", - "transaction_type": "fairmint", - "valid": true, - "events": [ - { - "event_index": 1304, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRMULTI", - "block_index": 314, - "commission": 0, - "earn_quantity": 200000000, - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "paid_quantity": 200000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "block_time": 1781529649, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_time": 1781529649 - }, - { - "event_index": 1305, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMULTI", - "asset_events": "fairmint", - "asset_longname": null, - "block_index": 314, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": true, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "msg_index": 0, - "quantity": 200000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "block_time": 1781529649, - "quantity_normalized": "2.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_time": 1781529649 - } - ], - "unpacked_data": { - "message_type": "fairmint", - "message_type_id": 91, - "message_data": { - "asset": "FAIRMULTI", - "quantity": 200000000, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "2.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 134, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_hash": "09f0e9c70a79826ea1805c388d67c38bde78f107897b5672e090271ffc9f5b64", - "block_time": 1781529646, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a951b000000f3bb01458200010100001a3b9aca000000001a23c3460019013d00f4f4f5f51a17d784001b01530821671b10016040", - "supported": true, - "utxos_info": " 454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1291, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "FAIRMULTI", - "asset_longname": null, - "asset_parent": null, - "block_index": 313, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 1000000000, - "lock_description": false, - "lock_quantity": true, - "lp_asset": "A95428956661682177", - "max_mint_per_address": 0, - "max_mint_per_tx": 0, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 400000000, - "pre_minted": false, - "premint_quantity": 0, - "price": 1, - "quantity_by_price": 1, - "soft_cap": 600000000, - "soft_cap_deadline_block": 317, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "start_block": 0, - "status": "open", - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_time": 1781529646, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - }, - { - "event_index": 1292, - "event": "ASSET_CREATION", - "params": { - "asset_id": "1046814475650", - "asset_longname": null, - "asset_name": "FAIRMULTI", - "block_index": 313, - "block_time": 1781529646 - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - }, - { - "event_index": 1293, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMULTI", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 313, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "quantity": 400000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_time": 1781529646, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMULTI", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 317, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682177", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 133, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_hash": "1c128a2f026a7c23ac30f01d993fb92fb28724793b9ebc78dd8316ac00df5fd4", - "block_time": 1781529629, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5b821b000000095fccbbb31a0bebc200", - "supported": true, - "utxos_info": " d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a:1 2 0", - "transaction_type": "fairmint", - "valid": true, - "events": [ - { - "event_index": 1271, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRFAIL", - "block_index": 308, - "commission": 0, - "earn_quantity": 200000000, - "fairminter_tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "paid_quantity": 200000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "block_time": 1781529629, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_time": 1781529629 - }, - { - "event_index": 1272, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRFAIL", - "asset_events": "fairmint", - "asset_longname": null, - "block_index": 308, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": true, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "msg_index": 0, - "quantity": 200000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "block_time": 1781529629, - "quantity_normalized": "2.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_time": 1781529629 - } - ], - "unpacked_data": { - "message_type": "fairmint", - "message_type_id": 91, - "message_data": { - "asset": "FAIRFAIL", - "quantity": 200000000, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "2.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - } - ], - "next_cursor": 132, - "result_count": 69 - }, - "/v2/addresses/events": { - "result": [ - { - "event_index": 1376, - "event": "ASSET_DESTRUCTION", - "params": { - "asset": "FAIRMARK", - "block_index": 324, - "quantity": 400000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tag": "soft cap not reached", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529686, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - }, - "tx_hash": null, - "block_index": 324, - "block_time": 1781529686 - }, - { - "event_index": 1375, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMARK", - "asset_events": "close_fairminter", - "asset_longname": null, - "block_index": 324, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": false, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": true, - "mime_type": "text/plain", - "msg_index": 1, - "quantity": 0, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529686, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": null, - "block_index": 324, - "block_time": 1781529686 - }, - { - "event_index": 1351, - "event": "ORDER_EXPIRATION", - "params": { - "block_index": 321, - "order_hash": "d99c71cc65fc097524b7ff82feb17a727183a0f9159733738205e174d63fcfb9", - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "block_time": 1781529675 - }, - "tx_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "block_index": 321, - "block_time": 1781529675 - }, - { - "event_index": 1350, - "event": "CREDIT", - "params": { - "address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "block_index": 321, - "calling_function": "cancel order", - "event": "d99c71cc65fc097524b7ff82feb17a727183a0f9159733738205e174d63fcfb9", - "quantity": 1000000, - "tx_index": 0, - "utxo": null, - "utxo_address": null, - "block_time": 1781529675, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.01000000" - }, - "tx_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "block_index": 321, - "block_time": 1781529675 - } - ], - "next_cursor": 1343, - "result_count": 384 - }, - "/v2/addresses/mempool": { - "result": [ - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "ENHANCED_SEND", - "params": { - "asset": "XCP", - "block_index": 9999999, - "destination": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "memo": null, - "msg_index": 0, - "quantity": 10000, - "send_type": "send", - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "status": "valid", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "CREDIT", - "params": { - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "asset": "XCP", - "block_index": 325, - "calling_function": "send", - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "DEBIT", - "params": { - "action": "send", - "address": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "block_index": 325, - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "NEW_TRANSACTION", - "params": { - "block_hash": "mempool", - "block_index": 9999999, - "block_time": 1781529697.2448351, - "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - "destination": "", - "fee": 10000, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "transaction_type": "enhanced_send", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "utxos_info": " 2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f:1 2 0", - "btc_amount_normalized": "0.00000000" - }, - "timestamp": 1781529697.2448351 - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/addresses/
": { - "result": { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "options": 0, - "block_index": null - } - }, - "/v2/addresses/
/options": { - "result": { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "options": 0, - "block_index": null - } - }, - "/v2/addresses/
/balances": { - "result": [ - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "A95428956980101314", - "asset_longname": null, - "quantity": 100000000000, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": "A95428959745315388.SUBNUMERIC", - "description": "A subnumeric asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "1000.00000000" - }, - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MPMASSET", - "asset_longname": null, - "quantity": 99999998960, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "My super asset B", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "999.99998960" - }, - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MYASSETA", - "asset_longname": null, - "quantity": 97999999980, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "979.99999980" - }, - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "asset_longname": null, - "quantity": 83377466195, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "833.77466195" - }, - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "TESTLOCKDESC", - "asset_longname": null, - "quantity": 9999990000, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "99.99990000" - } - ], - "next_cursor": null, - "result_count": 9 - }, - "/v2/addresses/
/balances/": { - "result": [ - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "asset_longname": null, - "quantity": 83377466195, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "833.77466195" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/credits": { - "result": [ - { - "block_index": 315, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMULTI", - "quantity": 200000000, - "calling_function": "unescrowed fairmint", - "event": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "utxo": null, - "utxo_address": null, - "credit_index": 158, - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "2.00000000" - }, - { - "block_index": 311, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 200000000, - "calling_function": "fairmint refund", - "event": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "utxo": null, - "utxo_address": null, - "credit_index": 152, - "block_time": 1781529633, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "2.00000000" - }, - { - "block_index": 303, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRPOOL", - "quantity": 300000000, - "calling_function": "unescrowed fairmint", - "event": "7f7f23b610ee7f18eff58112921f046dadcb6eca2661b35716174ae252a3b3a6", - "tx_index": 131, - "utxo": null, - "utxo_address": null, - "credit_index": 147, - "block_time": 1781529610, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "3.00000000" - }, - { - "block_index": 303, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRPOOL", - "quantity": 300000000, - "calling_function": "unescrowed fairmint", - "event": "48813dcbb51cc4e3e58a87f89e88732d72c0659181006a093ff8af379e5e326e", - "tx_index": 130, - "utxo": null, - "utxo_address": null, - "credit_index": 146, - "block_time": 1781529610, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "3.00000000" - }, - { - "block_index": 299, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 27499999, - "calling_function": "pool withdraw", - "event": "d28ab5afd7ad64416ca273eed1adfa7a8a98eeb8d149f10d9284b4fd9b6832f3", - "tx_index": 127, - "utxo": null, - "utxo_address": null, - "credit_index": 140, - "block_time": 1781529594, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.27499999" - } - ], - "next_cursor": 139, - "result_count": 33 - }, - "/v2/addresses/
/debits": { - "result": [ - { - "block_index": 320, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 50000000, - "action": "fairminter fee", - "event": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "utxo": null, - "utxo_address": null, - "debit_index": 132, - "block_time": 1781529671, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.50000000" - }, - { - "block_index": 314, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 200000000, - "action": "escrowed fairmint", - "event": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "utxo": null, - "utxo_address": null, - "debit_index": 128, - "block_time": 1781529649, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "2.00000000" - }, - { - "block_index": 313, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 50000000, - "action": "fairminter fee", - "event": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "utxo": null, - "utxo_address": null, - "debit_index": 127, - "block_time": 1781529646, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.50000000" - }, - { - "block_index": 308, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 200000000, - "action": "escrowed fairmint", - "event": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "utxo": null, - "utxo_address": null, - "debit_index": 124, - "block_time": 1781529629, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "2.00000000" - }, - { - "block_index": 307, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 50000000, - "action": "fairminter fee", - "event": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "tx_index": 132, - "utxo": null, - "utxo_address": null, - "debit_index": 123, - "block_time": 1781529625, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.50000000" - } - ], - "next_cursor": 120, - "result_count": 44 - }, - "/v2/addresses/
/bets": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/addresses/
/broadcasts": { - "result": [ - { - "tx_index": 24, - "tx_hash": "2ff61da29d5eb78e0d8b5efa5db836cd2920ceb666124b1fc25712f7a9fe58b4", - "block_index": 128, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "timestamp": 4003903983, - "value": 999.0, - "fee_fraction_int": 0, - "text": "Hello, world!", - "locked": false, - "status": "valid", - "mime_type": "text/plain", - "block_time": 1781528924, - "fee_fraction_int_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/burns": { - "result": [ - { - "tx_index": 8, - "tx_hash": "827ee95c910620b770e6ae733476e967021f89d869a2c839480b120ae97127a5", - "block_index": 112, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/sends": { - "result": [ - { - "tx_index": 36, - "tx_hash": "c234ce6cd9fe022072ba02c5c66eae7516ac45daf4c0f2ce7868fe705e7b2f7d", - "block_index": 140, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "c234ce6cd9fe022072ba02c5c66eae7516ac45daf4c0f2ce7868fe705e7b2f7d:0", - "asset": "MYASSETA", - "quantity": 1000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "attach", - "source_address": null, - "destination_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "block_time": 1781528974, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "10.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 39, - "tx_hash": "d6585cb20aa3c097a002c7ebd7c0f8a582b4943c5f88e79350048f2073b0701f", - "block_index": 143, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "d6585cb20aa3c097a002c7ebd7c0f8a582b4943c5f88e79350048f2073b0701f:0", - "asset": "MYASSETA", - "quantity": 1000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "attach", - "source_address": null, - "destination_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "block_time": 1781528987, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "10.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 37, - "tx_hash": "9ddb8d7755dc7140a86ee41b0f30c7d1e4ca6b69954fe3686365736ba952d572", - "block_index": 141, - "source": "c234ce6cd9fe022072ba02c5c66eae7516ac45daf4c0f2ce7868fe705e7b2f7d:0", - "destination": "9ddb8d7755dc7140a86ee41b0f30c7d1e4ca6b69954fe3686365736ba952d572:0", - "asset": "MYASSETA", - "quantity": 1000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination_address": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "block_time": 1781528979, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "10.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 41, - "tx_hash": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1", - "block_index": 145, - "source": "d6585cb20aa3c097a002c7ebd7c0f8a582b4943c5f88e79350048f2073b0701f:0", - "destination": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1:0", - "asset": "MYASSETA", - "quantity": 1000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781528995, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "10.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 80, - "tx_hash": "b33aa61e8d73a25651efa36c750a9683288f7d0541e39eaf6c95dd7070e79c77", - "block_index": 203, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "MPMASSET", - "quantity": 1000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "send", - "source_address": null, - "destination_address": null, - "block_time": 1781529208, - "asset_info": { - "asset_longname": null, - "description": "My super asset B", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 16 - }, - "/v2/addresses/
/receives": { - "result": [ - { - "tx_index": 38, - "tx_hash": "fcfa67fda58f64ea415a02fdba9100677f4c26708e731c2cbee2e8fbb86985e1", - "block_index": 142, - "source": "9ddb8d7755dc7140a86ee41b0f30c7d1e4ca6b69954fe3686365736ba952d572:0", - "destination": "bcrt1qduxrsdnc45nff2dhz9thw066emfyz9fxevqz6f", - "asset": "MYASSETA", - "quantity": 1000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "detach", - "source_address": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "destination_address": null, - "block_time": 1781528982, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "10.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/sends/": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/addresses/
/receives/": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/addresses/
/destructions": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "quantity": 400000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529686, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - }, - { - "tx_index": 132, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 311, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRFAIL", - "quantity": 600000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529633, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "6.00000000" - }, - { - "tx_index": 127, - "tx_hash": "d28ab5afd7ad64416ca273eed1adfa7a8a98eeb8d149f10d9284b4fd9b6832f3", - "block_index": 299, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "A95428956689590706", - "quantity": 25000000, - "tag": "pool_withdraw", - "status": "valid", - "block_time": 1781529594, - "asset_info": { - "asset_longname": null, - "description": "LP token for POOLTEST/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "quantity_normalized": "0.25000000" - }, - { - "tx_index": 14, - "tx_hash": "5e166bb291e92cea919ec32f5f9f51795604ee989c600c131ac60353d43833e1", - "block_index": 121, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMINTB", - "quantity": 300000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781528896, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "3.00000000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/addresses/
/dispensers": { - "result": [ - { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 71, - "tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "TESTLOCKDESC", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/addresses/
/dispensers/source": { - "result": [ - { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 71, - "tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "TESTLOCKDESC", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/addresses/
/dispensers/origin": { - "result": [ - { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 30, - "tx_hash": "20b02bde2bba1f3d9abbbaf22568328792325430005ce26af0bd9ac2691e1eba", - "block_index": 141, - "source": "mz7U1yRFEQVu84SfHcadv7ha8d9fQQZ8Xv", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": "ef9fd937898eb025c96221793283861e4accdf98df66ba985e343b9d1322e831", - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 0, - "last_status_tx_source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "close_block_index": 141, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528979, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00000010", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 71, - "tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "TESTLOCKDESC", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/addresses/
/dispensers/": { - "result": { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - }, - "/v2/addresses/
/dispenses/sends": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 72, - "dispense_index": 0, - "tx_hash": "1d46f783bfbbd31cae75b29627d5249785ed51374b478f3f11ac4a229673d585", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "TESTLOCKDESC", - "dispense_quantity": 4000, - "dispenser_tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "btc_amount": 4000, - "dispenser": { - "tx_index": 71, - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/addresses/
/dispenses/receives": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 72, - "dispense_index": 0, - "tx_hash": "1d46f783bfbbd31cae75b29627d5249785ed51374b478f3f11ac4a229673d585", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "TESTLOCKDESC", - "dispense_quantity": 4000, - "dispenser_tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "btc_amount": 4000, - "dispenser": { - "tx_index": 71, - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 118, - "dispense_index": 0, - "tx_hash": "925d54707e318ccf711099bb0870ade1015d2da14e4c6934b9288cc18731abad", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 3000, - "dispenser_tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "btc_amount": 3000, - "dispenser": { - "tx_index": 117, - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00003000", - "btc_amount_normalized": "0.00003000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/addresses/
/dispenses/sends/": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/addresses/
/dispenses/receives/": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 118, - "dispense_index": 0, - "tx_hash": "925d54707e318ccf711099bb0870ade1015d2da14e4c6934b9288cc18731abad", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 3000, - "dispenser_tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "btc_amount": 3000, - "dispenser": { - "tx_index": 117, - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00003000", - "btc_amount_normalized": "0.00003000" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/addresses/
/sweeps": { - "result": [ - { - "tx_index": 68, - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "block_index": 192, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "flags": 1, - "status": "valid", - "memo": "sweep my assets", - "fee_paid": 800000, - "block_time": 1781529163, - "fee_paid_normalized": "0.00800000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/issuances": { - "result": [ - { - "tx_index": 35, - "tx_hash": "4a3f2b308a9dba4aa33ea336b22ef6cb2249d1a8f73ea86599b95e43339dd884", - "msg_index": 0, - "block_index": 139, - "asset": "MYASSETA", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset A", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781528970, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 55, - "tx_hash": "4e3c863d740868abae4d884783e163e8b1ce5425229ca0925af48e2a84b91255", - "msg_index": 0, - "block_index": 159, - "asset": "A95428956980101314", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "A subnumeric asset", - "fee_paid": 0, - "status": "valid", - "asset_longname": "A95428959745315388.SUBNUMERIC", - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529051, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 79, - "tx_hash": "d9795d85914715b04a569592ddf5ce19de889e17e599831703c3ef5b9c8f7b2c", - "msg_index": 0, - "block_index": 202, - "asset": "MPMASSET", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset B", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529205, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 52, - "tx_hash": "fbf3dee36c25ef19a48d642c2986e682d4deedf583210c00b4d0eca4e69613ec", - "msg_index": 0, - "block_index": 156, - "asset": "TESTLOCKDESC", - "quantity": 10000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "Test Locking Description", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529040, - "quantity_normalized": "100.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 13, - "tx_hash": "d1ffcbb5b8174f1c6afbb926f2899eceb6c993e2c5f76ce327967c18830d5a59", - "msg_index": 0, - "block_index": 116, - "asset": "FAIRMINTA", - "quantity": 9000000000, - "divisible": true, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "", - "fee_paid": 0, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "fairmint", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781528875, - "quantity_normalized": "90.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 42 - }, - "/v2/addresses/
/assets": { - "result": [ - { - "asset": "FAIRMARK", - "asset_id": "40262081844", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 320, - "last_issuance_block_index": 324, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRMULTI", - "asset_id": "1046814475650", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 313, - "last_issuance_block_index": 315, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, - "supply_normalized": "10.00000000" - }, - { - "asset": "FAIRFAIL", - "asset_id": "40261958579", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 307, - "last_issuance_block_index": 311, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRPOOL", - "asset_id": "40262143959", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 301, - "last_issuance_block_index": 303, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, - "supply_normalized": "10.00000000" - }, - { - "asset": "POOLTEST", - "asset_id": "124973676639", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "supply": 1000000000, - "description": "Pool test asset", - "description_locked": false, - "first_issuance_block_index": 295, - "last_issuance_block_index": 295, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, - "supply_normalized": "10.00000000" - } - ], - "next_cursor": 15, - "result_count": 14 - }, - "/v2/addresses/
/assets/issued": { - "result": [ - { - "asset": "FAIRMARK", - "asset_id": "40262081844", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 320, - "last_issuance_block_index": 324, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRMULTI", - "asset_id": "1046814475650", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 313, - "last_issuance_block_index": 315, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, - "supply_normalized": "10.00000000" - }, - { - "asset": "FAIRFAIL", - "asset_id": "40261958579", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 307, - "last_issuance_block_index": 311, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRPOOL", - "asset_id": "40262143959", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 301, - "last_issuance_block_index": 303, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, - "supply_normalized": "10.00000000" - }, - { - "asset": "POOLTEST", - "asset_id": "124973676639", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "supply": 1000000000, - "description": "Pool test asset", - "description_locked": false, - "first_issuance_block_index": 295, - "last_issuance_block_index": 295, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, - "supply_normalized": "10.00000000" - } - ], - "next_cursor": 15, - "result_count": 14 - }, - "/v2/addresses/
/assets/owned": { - "result": [ - { - "asset": "FAIRMARK", - "asset_id": "40262081844", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 320, - "last_issuance_block_index": 324, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRMULTI", - "asset_id": "1046814475650", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 313, - "last_issuance_block_index": 315, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, - "supply_normalized": "10.00000000" - }, - { - "asset": "FAIRFAIL", - "asset_id": "40261958579", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 307, - "last_issuance_block_index": 311, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRPOOL", - "asset_id": "40262143959", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 301, - "last_issuance_block_index": 303, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, - "supply_normalized": "10.00000000" - }, - { - "asset": "POOLTEST", - "asset_id": "124973676639", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "supply": 1000000000, - "description": "Pool test asset", - "description_locked": false, - "first_issuance_block_index": 295, - "last_issuance_block_index": 295, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, - "supply_normalized": "10.00000000" - } - ], - "next_cursor": 15, - "result_count": 14 - }, - "/v2/addresses/
/transactions": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_hash": "4b15c2be04cc59d9a4815ed52ec988191b2de4f2aea5d66bcf974cb87a87d3db", - "block_time": 1781529671, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a951b000000095fce9d3400010100001a3b9aca000000001a23c3460019014400f4f4f5f51a17d784001b01530821671b10026040", - "supported": true, - "utxos_info": " 55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1339, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "FAIRMARK", - "asset_longname": null, - "asset_parent": null, - "block_index": 320, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 1000000000, - "lock_description": false, - "lock_quantity": true, - "lp_asset": "A95428956661682178", - "max_mint_per_address": 0, - "max_mint_per_tx": 0, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 400000000, - "pre_minted": false, - "premint_quantity": 0, - "price": 1, - "quantity_by_price": 1, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "start_block": 0, - "status": "open", - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529671, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - }, - { - "event_index": 1340, - "event": "ASSET_CREATION", - "params": { - "asset_id": "40262081844", - "asset_longname": null, - "asset_name": "FAIRMARK", - "block_index": 320, - "block_time": 1781529671 - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - }, - { - "event_index": 1341, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMARK", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 320, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "quantity": 400000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_time": 1781529671, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMARK", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 135, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_hash": "14b4795fe328c4fa9fd7cd36f314af5ca9cbfd947a72986281bcf675082a8029", - "block_time": 1781529649, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5b821b000000f3bb0145821a0bebc200", - "supported": true, - "utxos_info": " 1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c:1 2 0", - "transaction_type": "fairmint", - "valid": true, - "events": [ - { - "event_index": 1304, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRMULTI", - "block_index": 314, - "commission": 0, - "earn_quantity": 200000000, - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "paid_quantity": 200000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "block_time": 1781529649, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_time": 1781529649 - }, - { - "event_index": 1305, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMULTI", - "asset_events": "fairmint", - "asset_longname": null, - "block_index": 314, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": true, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "msg_index": 0, - "quantity": 200000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "block_time": 1781529649, - "quantity_normalized": "2.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "block_index": 314, - "block_time": 1781529649 - } - ], - "unpacked_data": { - "message_type": "fairmint", - "message_type_id": 91, - "message_data": { - "asset": "FAIRMULTI", - "quantity": 200000000, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "2.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 134, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_hash": "09f0e9c70a79826ea1805c388d67c38bde78f107897b5672e090271ffc9f5b64", - "block_time": 1781529646, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a951b000000f3bb01458200010100001a3b9aca000000001a23c3460019013d00f4f4f5f51a17d784001b01530821671b10016040", - "supported": true, - "utxos_info": " 454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1291, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "FAIRMULTI", - "asset_longname": null, - "asset_parent": null, - "block_index": 313, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 1000000000, - "lock_description": false, - "lock_quantity": true, - "lp_asset": "A95428956661682177", - "max_mint_per_address": 0, - "max_mint_per_tx": 0, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 400000000, - "pre_minted": false, - "premint_quantity": 0, - "price": 1, - "quantity_by_price": 1, - "soft_cap": 600000000, - "soft_cap_deadline_block": 317, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "start_block": 0, - "status": "open", - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_time": 1781529646, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - }, - { - "event_index": 1292, - "event": "ASSET_CREATION", - "params": { - "asset_id": "1046814475650", - "asset_longname": null, - "asset_name": "FAIRMULTI", - "block_index": 313, - "block_time": 1781529646 - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - }, - { - "event_index": 1293, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRMULTI", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 313, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "quantity": 400000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_time": 1781529646, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 313, - "block_time": 1781529646 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMULTI", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 317, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682177", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 133, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_hash": "1c128a2f026a7c23ac30f01d993fb92fb28724793b9ebc78dd8316ac00df5fd4", - "block_time": 1781529629, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5b821b000000095fccbbb31a0bebc200", - "supported": true, - "utxos_info": " d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a:1 2 0", - "transaction_type": "fairmint", - "valid": true, - "events": [ - { - "event_index": 1271, - "event": "NEW_FAIRMINT", - "params": { - "asset": "FAIRFAIL", - "block_index": 308, - "commission": 0, - "earn_quantity": 200000000, - "fairminter_tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "paid_quantity": 200000000, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "block_time": 1781529629, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_time": 1781529629 - }, - { - "event_index": 1272, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRFAIL", - "asset_events": "fairmint", - "asset_longname": null, - "block_index": 308, - "call_date": 0, - "call_price": 0.0, - "callable": false, - "description": "", - "description_locked": false, - "divisible": true, - "fair_minting": true, - "fee_paid": 0, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "msg_index": 0, - "quantity": 200000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "block_time": 1781529629, - "quantity_normalized": "2.00000000", - "fee_paid_normalized": "0.00000000" - }, - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "block_index": 308, - "block_time": 1781529629 - } - ], - "unpacked_data": { - "message_type": "fairmint", - "message_type_id": 91, - "message_data": { - "asset": "FAIRFAIL", - "quantity": 200000000, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "2.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - }, - { - "tx_index": 132, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 307, - "block_hash": "748cb8cd102bc49cbd435adcb0cd7bcdbb1a8320a531b43e4003bce6f9bb52f4", - "block_time": 1781529625, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": null, - "btc_amount": 0, - "fee": 10000, - "data": "5a951b000000095fccbbb300010100001a3b9aca000000001a23c3460019013700f4f4f5f51a17d784001b01530821e5def3096040", - "supported": true, - "utxos_info": " fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8:1 2 0", - "transaction_type": "fairminter", - "valid": true, - "events": [ - { - "event_index": 1258, - "event": "NEW_FAIRMINTER", - "params": { - "asset": "FAIRFAIL", - "asset_longname": null, - "asset_parent": null, - "block_index": 307, - "burn_payment": false, - "description": "", - "divisible": true, - "end_block": 0, - "hard_cap": 1000000000, - "lock_description": false, - "lock_quantity": true, - "lp_asset": "A95428958788449033", - "max_mint_per_address": 0, - "max_mint_per_tx": 0, - "mime_type": "text/plain", - "minted_asset_commission_int": 0, - "pool_quantity": 400000000, - "pre_minted": false, - "premint_quantity": 0, - "price": 1, - "quantity_by_price": 1, - "soft_cap": 600000000, - "soft_cap_deadline_block": 311, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "start_block": 0, - "status": "open", - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "tx_index": 132, - "block_time": 1781529625, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 307, - "block_time": 1781529625 - }, - { - "event_index": 1259, - "event": "ASSET_CREATION", - "params": { - "asset_id": "40261958579", - "asset_longname": null, - "asset_name": "FAIRFAIL", - "block_index": 307, - "block_time": 1781529625 - }, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 307, - "block_time": 1781529625 - }, - { - "event_index": 1260, - "event": "ASSET_ISSUANCE", - "params": { - "asset": "FAIRFAIL", - "asset_events": "open_fairminter", - "asset_longname": null, - "block_index": 307, - "call_date": 0, - "call_price": 0, - "callable": false, - "description": "", - "divisible": true, - "fair_minting": true, - "fee_paid": 50000000, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "locked": false, - "mime_type": "text/plain", - "quantity": 400000000, - "reset": false, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "status": "valid", - "transfer": false, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "tx_index": 132, - "block_time": 1781529625, - "quantity_normalized": "4.00000000", - "fee_paid_normalized": "0.50000000" - }, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 307, - "block_time": 1781529625 - } - ], - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRFAIL", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 311, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428958788449033", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" - } - ], - "next_cursor": 131, - "result_count": 45 - }, - "/v2/addresses/
/transactions/counts": { - "result": [ - { - "transaction_type": "fairminter", - "count": 11 - }, - { - "transaction_type": "issuance", - "count": 7 - }, - { - "transaction_type": "dispenser", - "count": 6 - }, - { - "transaction_type": "order", - "count": 4 - }, - { - "transaction_type": "fairmint", - "count": 4 - }, - { - "transaction_type": "unknown", - "count": 3 - }, - { - "transaction_type": "mpma", - "count": 3 - }, - { - "transaction_type": "attach", - "count": 2 - }, - { - "transaction_type": "enhanced_send", - "count": 1 - }, - { - "transaction_type": "dividend", - "count": 1 - }, - { - "transaction_type": "cancel", - "count": 1 - }, - { - "transaction_type": "burn", - "count": 1 - }, - { - "transaction_type": "broadcast", - "count": 1 - } - ], - "next_cursor": null, - "result_count": 13 - }, - "/v2/addresses/
/dividends": { - "result": [ - { - "tx_index": 42, - "tx_hash": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "block_index": 146, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MYASSETA", - "dividend_asset": "XCP", - "quantity_per_unit": 100000000, - "fee_paid": 20000, - "status": "valid", - "block_time": 1781528999, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dividend_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_per_unit_normalized": "1.00000000", - "fee_paid_normalized": "0.00020000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/orders": { - "result": [ - { - "tx_index": 56, - "tx_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "block_index": 181, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 180, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529066, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 58, - "tx_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "block_index": 203, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 10000, - "give_remaining": 5000, - "get_asset": "BTC", - "get_quantity": 10000, - "get_remaining": 5000, - "expiration": 21, - "expire_index": 202, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529208, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00010000", - "get_quantity_normalized": "0.00010000", - "get_remaining_normalized": "0.00005000", - "give_remaining_normalized": "0.00005000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 65, - "tx_hash": "11ca1f3f7f68d2b4c7e7d3a99b08c6f1bbf5f98a4a44cd0fb89adc66808303a5", - "block_index": 190, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 209, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "cancelled", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529154, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 67, - "tx_hash": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d", - "block_index": 212, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 0, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 0, - "expiration": 21, - "expire_index": 211, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529245, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00000000", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/addresses/
/fairminters": { - "result": [ - { - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "earned_quantity": null, - "paid_quantity": null, - "commission": null, - "block_time": 1781529686, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_index": 315, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMULTI", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 315, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682177", - "earned_quantity": 600000000, - "paid_quantity": 600000000, - "commission": 0, - "block_time": 1781529653, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "6.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "6.00000000" - }, - { - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "tx_index": 132, - "block_index": 311, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRFAIL", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 311, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428958788449033", - "earned_quantity": 200000000, - "paid_quantity": 200000000, - "commission": 0, - "block_time": 1781529633, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - { - "tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "tx_index": 129, - "block_index": 303, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRPOOL", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 303, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428960030839430", - "earned_quantity": 600000000, - "paid_quantity": 600000000, - "commission": 0, - "block_time": 1781529610, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "6.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "6.00000000" - }, - { - "tx_hash": "6c7902773d058aac2ad88ac6fe03304c4ec9e08a6ced5834d9082ed9b2f7b264", - "tx_index": 47, - "block_index": 153, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "HARDCSOFT", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 2000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 1000000000, - "soft_cap_deadline_block": 1520, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 2000000000, - "paid_quantity": 2000000000, - "commission": 0, - "block_time": 1781529027, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "20.00000000", - "soft_cap_normalized": "10.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "20.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "20.00000000" - }, - { - "tx_hash": "9ccd66d37f1537e33a13e279a55cf6907ef963e814210f9c8f3c351b2dd5a441", - "tx_index": 44, - "block_index": 150, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FREEFAIRMINT", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 0, - "quantity_by_price": 1, - "hard_cap": 180, - "burn_payment": false, - "max_mint_per_tx": 100, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 180, - "paid_quantity": 0, - "commission": 0, - "block_time": 1781529015, - "price_normalized": "0.0000000000000000", - "hard_cap_normalized": "0.00000180", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000100", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "0.00000180", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "e6ec58eb6666fe84b6077897498d11654f9a5bc2cd7b173d064a163317cdc0fe", - "tx_index": 43, - "block_index": 147, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "A95428958968845068", - "asset_parent": "MYASSETA", - "asset_longname": "MYASSETA.SUBMYASSETA", - "description": "", - "price": 1, - "quantity_by_price": 5, - "hard_cap": 0, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "open", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": null, - "paid_quantity": null, - "commission": null, - "block_time": 1781529003, - "price_normalized": "0.2000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000005", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "d1962ea1044e71baec36835d6c4f0766dd5a963c59a21390b7f784adda3c354e", - "tx_index": 22, - "block_index": 126, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMINTD", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 17, - "quantity_by_price": 20, - "hard_cap": 0, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "open", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 40, - "paid_quantity": 34, - "commission": 0, - "block_time": 1781528916, - "price_normalized": "0.8500000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000020", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "0.00000040", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000034" - }, - { - "tx_hash": "0626d07a8834a727ae2e581594ba7b730b3468f99e1f4354004dc6646ec818d2", - "tx_index": 18, - "block_index": 122, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMINTC", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 5, - "hard_cap": 0, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "open", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 25, - "paid_quantity": 5, - "commission": 0, - "block_time": 1781528900, - "price_normalized": "0.2000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000005", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "0.00000025", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000005" - }, - { - "tx_hash": "5e166bb291e92cea919ec32f5f9f51795604ee989c600c131ac60353d43833e1", - "tx_index": 14, - "block_index": 121, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMINTB", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 10000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 1000000000, - "soft_cap_deadline_block": 121, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 300000000, - "paid_quantity": 300000000, - "commission": 0, - "block_time": 1781528896, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "100.00000000", - "soft_cap_normalized": "10.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "3.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "3.00000000" - }, - { - "tx_hash": "dd5c6ec0b0678a550e9c03485e2bd02433fb569243d48f07d36e66ab6be59ccb", - "tx_index": 10, - "block_index": 116, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMINTA", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 10000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 1000000000, - "soft_cap_deadline_block": 115, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 10000000000, - "paid_quantity": 10000000000, - "commission": 0, - "block_time": 1781528875, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "100.00000000", - "soft_cap_normalized": "10.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "100.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "100.00000000" - } - ], - "next_cursor": null, - "result_count": 11 - }, - "/v2/addresses/
/fairmints": { - "result": [ - { - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_index": 315, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "asset": "FAIRMULTI", - "earn_quantity": 400000000, - "paid_quantity": 400000000, - "commission": 0, - "status": "valid", - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - }, - { - "tx_hash": "d29c805f665ed010657e5c06c50ea5b99bf50d2f2eb40bd61acdb3ff2eea57ef", - "tx_index": 48, - "block_index": 152, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "6c7902773d058aac2ad88ac6fe03304c4ec9e08a6ced5834d9082ed9b2f7b264", - "asset": "HARDCSOFT", - "earn_quantity": 1000000000, - "paid_quantity": 1000000000, - "commission": 0, - "status": "valid", - "block_time": 1781529024, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "10.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "10.00000000" - }, - { - "tx_hash": "cf0fbc8428db492ab875cdf8432d11036bcf033aa87c6950229c4568a73b8957", - "tx_index": 46, - "block_index": 150, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "9ccd66d37f1537e33a13e279a55cf6907ef963e814210f9c8f3c351b2dd5a441", - "asset": "FREEFAIRMINT", - "earn_quantity": 80, - "paid_quantity": 0, - "commission": 0, - "status": "valid", - "block_time": 1781529015, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000080", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "f56018852235b1ce6886be20f211fe5143fbfd7b8d44ffb06256323e2640677f", - "tx_index": 45, - "block_index": 149, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "9ccd66d37f1537e33a13e279a55cf6907ef963e814210f9c8f3c351b2dd5a441", - "asset": "FREEFAIRMINT", - "earn_quantity": 100, - "paid_quantity": 0, - "commission": 0, - "status": "valid", - "block_time": 1781529011, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000100", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "7d55861764ebc37d382c53d484e797b0f9da4cb7fe5059d3b22826ef500d6876", - "tx_index": 23, - "block_index": 127, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "d1962ea1044e71baec36835d6c4f0766dd5a963c59a21390b7f784adda3c354e", - "asset": "FAIRMINTD", - "earn_quantity": 40, - "paid_quantity": 34, - "commission": 0, - "status": "valid", - "block_time": 1781528921, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000040", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000034" - }, - { - "tx_hash": "c9d64724487c0ab82d1091e530e1d79111f767741662f5ec72720da726a9d682", - "tx_index": 21, - "block_index": 125, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "0626d07a8834a727ae2e581594ba7b730b3468f99e1f4354004dc6646ec818d2", - "asset": "FAIRMINTC", - "earn_quantity": 15, - "paid_quantity": 3, - "commission": 0, - "status": "valid", - "block_time": 1781528912, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000015", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000003" - }, - { - "tx_hash": "6ec9f333cddb3730ec9514abd8f074d8fb5ddb09b21d7a3da6fd5620ae7f387a", - "tx_index": 20, - "block_index": 124, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "0626d07a8834a727ae2e581594ba7b730b3468f99e1f4354004dc6646ec818d2", - "asset": "FAIRMINTC", - "earn_quantity": 5, - "paid_quantity": 1, - "commission": 0, - "status": "valid", - "block_time": 1781528908, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000005", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000001" - }, - { - "tx_hash": "717fe7f6fa454c1cfba2403855894c2c22ae553b2c2bb351b095d7963e2db1e0", - "tx_index": 19, - "block_index": 123, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "0626d07a8834a727ae2e581594ba7b730b3468f99e1f4354004dc6646ec818d2", - "asset": "FAIRMINTC", - "earn_quantity": 5, - "paid_quantity": 1, - "commission": 0, - "status": "valid", - "block_time": 1781528903, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "0.00000005", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "0.00000001" - }, - { - "tx_hash": "076cdbcd484a125eb6980fee080ca47d0a688713ce6e931998a52dd46c425f9c", - "tx_index": 15, - "block_index": 118, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "5e166bb291e92cea919ec32f5f9f51795604ee989c600c131ac60353d43833e1", - "asset": "FAIRMINTB", - "earn_quantity": 100000000, - "paid_quantity": 100000000, - "commission": 0, - "status": "valid", - "block_time": 1781528884, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "1.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "1.00000000" - }, - { - "tx_hash": "3c70704b2b68710bebf884e10b5a2dac835b35dbbfd21796035dcbfca12dbcd5", - "tx_index": 11, - "block_index": 114, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "dd5c6ec0b0678a550e9c03485e2bd02433fb569243d48f07d36e66ab6be59ccb", - "asset": "FAIRMINTA", - "earn_quantity": 500000000, - "paid_quantity": 500000000, - "commission": 0, - "status": "valid", - "block_time": 1781528867, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "5.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "5.00000000" - } - ], - "next_cursor": null, - "result_count": 10 - }, - "/v2/addresses/
/fairmints/": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/utxos//balances": { - "result": [ - { - "asset": "UTXOASSET", - "asset_longname": null, - "quantity": 1000000000, - "utxo": "95add0833c6a3882ebac77dae9256c72db98fee5bbd6b308219c2560141c180b:0", - "utxo_address": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "quantity_normalized": "10.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/utxos/withbalances": { - "result": { - "$UTXO_1": false, - "$UTXO_2": false - } - }, - "/v2/addresses/
/compose/bet": { - "result": { - "rawtransaction": "0200000001c3a0a51c7bc66ec486c125e35bfba1a40e4a6784ecddbf77743e2f59af5ca3550100000000ffffffff034a01000000000000160014a2b86f1e0c89746ed4f1002565d4a50c8047627a0000000000000000316a2faea69fd940a14260b28d9c49efefb8011347ae3e826c3d2ba960acf8976910837f53b3ab48242f619e6a0bd441b692c6760abc01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 7449770000, - "btc_out": 330, - "btc_change": 7449769670, - "btc_fee": 0, - "data": "434e545250525459280002b2d05e0000000000000003e800000000000003e8408f400000000000000013b000000064", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 7449770000 - ], - "signed_tx_estimated_size": { - "vsize": 199, - "adjusted_vsize": 199, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAKsCAAAAAcOgpRx7xm7EhsEl41v7oaQOSmeE7N2/d3Q+L1mvXKNVAQAAAAD/////A0oBAAAAAAAAFgAUorhvHgyJdG7U8QAlZdSlDIBHYnoAAAAAAAAAADFqL66mn9lAoUJgso2cSe/vuAETR64+gmw9K6lgrPiXaRCDf1Ozq0gkL2GeagvUQbaSxnYKvAEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAAAA==", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "feed_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "bet_type": 2, - "deadline": 3000000000, - "wager_quantity": 1000, - "counterwager_quantity": 1000, - "target_value": 1000, - "leverage": 5040, - "expiration": 100, - "skip_validation": true - }, - "name": "bet" - } - }, - "/v2/addresses/
/compose/broadcast": { - "result": { - "rawtransaction": "0200000001f5ec03e013190cb2461a63393a3f993c19e07f9b1593005aa7c99befdd16d87f0000000000ffffffff020000000000000000306a2e231bcf9264de865b73c4ceecf97d0108f73118b06c595c83c19112f8454490d4450d67ad78ac4346bdc8529ea3b1a078072a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000100000, - "btc_out": 0, - "btc_change": 5000100000, - "btc_fee": 0, - "data": "434e5452505254591e851aeea6b9f1fb40590000000000001a004c4b40604f2248656c6c6f2c20776f726c642122", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000100000 - ], - "signed_tx_estimated_size": { - "vsize": 167, - "adjusted_vsize": 167, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIsCAAAAAfXsA+ATGQyyRhpjOTo/mTwZ4H+bFZMAWqfJm+/dFth/AAAAAAD/////AgAAAAAAAAAAMGouIxvPkmTehltzxM7s+X0BCPcxGLBsWVyDwZES+EVEkNRFDWeteKxDRr3IUp6jsaB4ByoBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "timestamp": 4003903985, - "value": 100.0, - "fee_fraction": 0.05, - "text": "\"Hello, world!\"", - "mime_type": "", - "skip_validation": true - }, - "name": "broadcast" - } - }, - "/v2/addresses/
/compose/btcpay": { - "result": { - "rawtransaction": "0200000001de55b0ee070c210dfc239f58fc87336a17a462c16b69fdc75420d3c022aa2b370000000000ffffffff03e803000000000000160014bbc22b85e74585563fa5027d0022d27e011d249600000000000000004b6a4927c1c214623fe6b07e4dba9f46039704e20a1eb46c8320bc9bc07367cfd7158ce3301cc0562b99316245b5f19b39d3415bdb17a6cd5073580ea25f9cc8ecccdca5ff86b3f9c77b62372815062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 1000, - "btc_change": 5000009000, - "btc_fee": 0, - "data": "434e5452505254590b905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 225, - "adjusted_vsize": 225, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAMUCAAAAAd5VsO4HDCEN/COfWPyHM2oXpGLBa2n9x1Qg08Aiqis3AAAAAAD/////A+gDAAAAAAAAFgAUu8IrhedFhVY/pQJ9ACLSfgEdJJYAAAAAAAAAAEtqSSfBwhRiP+awfk26n0YDlwTiCh60bIMgvJvAc2fP1xWM4zAcwFYrmTFiRbXxmznTQVvbF6bNUHNYDqJfnMjszNyl/4az+cd7YjcoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAAA", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "order_match_id": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416_392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "skip_validation": true - }, - "name": "btcpay" - } - }, - "/v2/addresses/
/compose/burn": { - "result": { - "rawtransaction": "0200000001023d2106cb8d4a17e894ebad96b6e064a6858547ce38d4c9fbecff821ac3d6770000000000ffffffff02e8030000000000001976a914a11b66a67b3ff69671c8f82254099faf374b800e88ac2815062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 1000, - "btc_change": 5000009000, - "btc_fee": 0, - "data": null, - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 144, - "adjusted_vsize": 144, - "sigops_count": 5 - }, - "psbt": "cHNidP8BAHQCAAAAAQI9IQbLjUoX6JTrrZa24GSmhYVHzjjUyfvs/4Iaw9Z3AAAAAAD/////AugDAAAAAAAAGXapFKEbZqZ7P/aWccj4IlQJn683S4AOiKwoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "quantity": 1000, - "overburn": false, - "skip_validation": true - }, - "name": "burn" - } - }, - "/v2/addresses/
/compose/cancel": { - "result": { - "rawtransaction": "020000000175ad3f1cf5fd60f886aa3f81305e5352236d97feb6ea6e561170c27ba6e544320100000000ffffffff0200000000000000002b6a29913d994943a361a0832fe5d9cb03a97230553cdcd558c0c4cb2867b6193898b5c8687ad3d2e9cd1f2878b50927010000001600144aa9d623cc85384e21cbe8bea82f55499ad70b8f00000000", - "btc_in": 4949915000, - "btc_out": 0, - "btc_change": 4949915000, - "btc_fee": 0, - "data": "434e54525052545946392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "lock_scripts": [ - "00144aa9d623cc85384e21cbe8bea82f55499ad70b8f" - ], - "inputs_values": [ - 4949915000 - ], - "signed_tx_estimated_size": { - "vsize": 162, - "adjusted_vsize": 162, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIYCAAAAAXWtPxz1/WD4hqo/gTBeU1IjbZf+tupuVhFwwnum5UQyAQAAAAD/////AgAAAAAAAAAAK2opkT2ZSUOjYaCDL+XZywOpcjBVPNzVWMDEyyhnthk4mLXIaHrT0unNHyh4tQknAQAAABYAFEqp1iPMhThOIcvovqgvVUma1wuPAAAAAAAAAAA=", - "params": { - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "offer_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "skip_validation": true - }, - "name": "cancel" - } - }, - "/v2/addresses/
/compose/destroy": { - "result": { - "rawtransaction": "0200000001c17a63a1c49ff5fa1a7b429eb6017d9596d99826f83130a135a72081a290af280000000000ffffffff020000000000000000226a2047b383ca402504b67d788b49c0dbd89d4723847e21d715e117f6c291149601981019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254596e000000000000000100000000000003e822627567732122", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 153, - "adjusted_vsize": 153, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAH0CAAAAAcF6Y6HEn/X6GntCnrYBfZWW2Zgm+DEwoTWnIIGikK8oAAAAAAD/////AgAAAAAAAAAAImogR7ODykAlBLZ9eItJwNvYnUcjhH4h1xXhF/bCkRSWAZgQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 1000, - "tag": "\"bugs!\"", - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00001000" - }, - "name": "destroy" - } - }, - "/v2/addresses/
/compose/dispenser": { - "result": { - "rawtransaction": "02000000013da9648d6e5c18380125cd7ba9988724ee29a0227e66524b038b8bd210ace33f0200000000ffffffff0200000000000000002c6a2aeb424018449e9c59d04f2d5f188244ae0c5dd4a80bd455359f7fb378c5fb8cec9191c018b67e48018d438714092701000000160014e786d2670784c30638a7382d9953c9aeb4f2040400000000", - "btc_in": 4949873799, - "btc_out": 0, - "btc_change": 4949873799, - "btc_fee": 0, - "data": "434e5452505254590c000000000000000100000000000003e800000000000003e8000000000000006400", - "lock_scripts": [ - "0014e786d2670784c30638a7382d9953c9aeb4f20404" - ], - "inputs_values": [ - 4949873799 - ], - "signed_tx_estimated_size": { - "vsize": 163, - "adjusted_vsize": 163, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIcCAAAAAT2pZI1uXBg4ASXNe6mYhyTuKaAifmZSSwOLi9IQrOM/AgAAAAD/////AgAAAAAAAAAALGoq60JAGESenFnQTy1fGIJErgxd1KgL1FU1n3+zeMX7jOyRkcAYtn5IAY1DhxQJJwEAAAAWABTnhtJnB4TDBjinOC2ZU8mutPIEBAAAAAAAAAAA", - "params": { - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "give_quantity": 1000, - "escrow_quantity": 1000, - "mainchainrate": 100, - "status": 0, - "open_address": null, - "oracle_address": null, - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00001000", - "escrow_quantity_normalized": "0.00001000" - }, - "name": "dispenser" - } - }, - "/v2/addresses/
/compose/dividend": { - "result": { - "rawtransaction": "02000000018f1873e93c3da6da2194aa70e4cfc646ea8dc1b3fe846bd2ba2520208531ab9b0000000000ffffffff020000000000000000236a21f0cd8f84a11dc32e8634cf5de7ce76c117bb89f4862c2906fa9342a8393c58d6a91019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e545250525459320000000000000001000000182b37176e0000000000000001", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 154, - "adjusted_vsize": 154, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAH4CAAAAAY8Yc+k8PabaIZSqcOTPxkbqjcGz/oRr0rolICCFMaubAAAAAAD/////AgAAAAAAAAAAI2oh8M2PhKEdwy6GNM9d5852wRe7ifSGLCkG+pNCqDk8WNapEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "quantity_per_unit": 1, - "asset": "MYASSETA", - "dividend_asset": "XCP", - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dividend_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_per_unit_normalized": "0.00000001" - }, - "name": "dividend", - "xcp_fee": 60000 - } - }, - "/v2/addresses/
/compose/dividend/estimatexcpfees": { - "result": 60000 - }, - "/v2/addresses/
/compose/issuance": { - "result": { - "rawtransaction": "02000000014f676fd3f87bfacf317a15109b43061410f3ab3a32f26609368f3e2d1dd1f4850000000000ffffffff034a01000000000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000000000001d6a1bc4a6e4c6d7086bd6769b53f8fa427afa639ed66ea3a4a962e538ccc617062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 330, - "btc_change": 5000009670, - "btc_fee": 0, - "data": "434e54525052545916871b00000001a956fbdf1903e8f5f4f460f6", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 179, - "adjusted_vsize": 179, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAJcCAAAAAU9nb9P4e/rPMXoVEJtDBhQQ86s6MvJmCTaPPi0d0fSFAAAAAAD/////A0oBAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAB1qG8Sm5MbXCGvWdptT+PpCevpjntZuo6SpYuU4zMYXBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCPTEST", - "quantity": 1000, - "transfer_destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "lock": false, - "reset": false, - "description": null, - "mime_type": "", - "skip_validation": true, - "quantity_normalized": "0.00001000" - }, - "name": "issuance" - } - }, - "/v2/addresses/
/compose/mpma": { - "result": { - "rawtransaction": "0200000001982995df8de0f28c2d141348c4339db71cd506fbeac71d4637963d5369f47f890100000000ffffffff03e803000000000000695121035eeb58e9d93560311795d8a7b3098954828568ef7de247cd6223e1863dadfe232103b6a49666e7305ab74346109445bd9cded461e8be896d6505754afbce83c8732421020b34a63c6ba97a84f4f96ed707c94e3464fffb5c4fe177361caa651e5195fbcc53aee8030000000000006951210241eb58e9d93560311786d8a533a17faf5f89fc2290ffec0a4826d08f816e023321029fed17c45f5f44bbca327e40b4bdb9bb00c4e43ece0f1f45754ac7203c4ccabe21020b34a63c6ba97a84f4f96ed707c94e3464fffb5c4fe177361caa651e5195fbcc53aed0e2062701000000160014a2b86f1e0c89746ed4f1002565d4a50c8047627a00000000", - "btc_in": 4949732000, - "btc_out": 2000, - "btc_change": 4949730000, - "btc_fee": 0, - "data": "434e54525052545903000280a8f6fbdd2894cded1dabc72a013109bcc3fc294980a2b86f1e0c89746ed4f1002565d4a50c8047627a4000003ceebf84b91000000000000000240000000000000004000000000000000100", - "lock_scripts": [ - "0014a2b86f1e0c89746ed4f1002565d4a50c8047627a" - ], - "inputs_values": [ - 4949732000 - ], - "signed_tx_estimated_size": { - "vsize": 338, - "adjusted_vsize": 805, - "sigops_count": 161 - }, - "psbt": "cHNidP8BAP02AQIAAAABmCmV343g8owtFBNIxDOdtxzVBvvqxx1GN5Y9U2n0f4kBAAAAAP////8D6AMAAAAAAABpUSEDXutY6dk1YDEXldinswmJVIKFaO994kfNYiPhhj2t/iMhA7aklmbnMFq3Q0YQlEW9nN7UYei+iW1lBXVK+86DyHMkIQILNKY8a6l6hPT5btcHyU40ZP/7XE/hdzYcqmUeUZX7zFOu6AMAAAAAAABpUSECQetY6dk1YDEXhtilM6F/r1+J/CKQ/+wKSCbQj4FuAjMhAp/tF8RfX0S7yjJ+QLS9ubsAxOQ+zg8fRXVKxyA8TMq+IQILNKY8a6l6hPT5btcHyU40ZP/7XE/hdzYcqmUeUZX7zFOu0OIGJwEAAAAWABSiuG8eDIl0btTxACVl1KUMgEdiegAAAAAAAAAAAA==", - "params": { - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset_dest_quant_list": [ - [ - "XCP", - "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - 1 - ], - [ - "FAIRMINTC", - "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - 2 - ] - ], - "memo": null, - "memo_is_hex": false, - "skip_validation": true - }, - "name": "mpma" - } - }, - "/v2/addresses/
/compose/order": { - "result": { - "rawtransaction": "0200000001649c6ce6e340d99f450207012f80956eeb14c64d0959129b89fc563fc73c2d710000000000ffffffff020000000000000000356a33ac1de6ddb884493e865129ca255fcf8611160aa8571a04a9298e1acee686998153ef1085fcecd9b44fe38ef9373f652e0dda311019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254590a000000000000000100000000000003e800000000014572d500000000000003e800640000000000000064", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 172, - "adjusted_vsize": 172, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAJACAAAAAWScbObjQNmfRQIHAS+AlW7rFMZNCVkSm4n8Vj/HPC1xAAAAAAD/////AgAAAAAAAAAANWozrB3m3biEST6GUSnKJV/PhhEWCqhXGgSpKY4azuaGmYFT7xCF/OzZtE/jjvk3P2UuDdoxEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "get_asset": "BURNER", - "get_quantity": 1000, - "expiration": 100, - "fee_required": 100, - "skip_validation": true, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "fee_required_normalized": "0.00000100" - }, - "name": "order" - } - }, - "/v2/addresses/
/compose/send": { - "result": { - "rawtransaction": "0200000001b885af4d8c254ef3492df3d0bbdd5cad7dffdf3d0a4ca6cd1200e77a42e72b300000000000ffffffff020000000000000000286a26a4b5574a6f12b5bbbf09162d10ef4fed59df0173ceab24471267c8651c0c76e9f86f82f668d61019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254590284011903e8560300a2b86f1e0c89746ed4f1002565d4a50c8047627a40", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 159, - "adjusted_vsize": 159, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIMCAAAAAbiFr02MJU7zSS3z0LvdXK19/989CkymzRIA53pC5yswAAAAAAD/////AgAAAAAAAAAAKGompLVXSm8Stbu/CRYtEO9P7VnfAXPOqyRHEmfIZRwMdun4b4L2aNYQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "quantity": 1000, - "memo": null, - "memo_is_hex": false, - "use_enhanced_send": true, - "no_dispense": false, - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00001000" - }, - "name": "send" - } - }, - "/v2/addresses/
/compose/sweep": { - "result": { - "rawtransaction": "0200000001cd2052af2f72453fa357fab7b314701ff25686a3d9cd4f2266bd27a82b1bec8b0000000000ffffffff020000000000000000276a2579c558c9e3834d149df9680c36f6efab22b02f57193f5f85ef9aebdd18039d3a5fc41abdf81019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254590483560300a2b86f1e0c89746ed4f1002565d4a50c8047627a0742ffff", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 158, - "adjusted_vsize": 158, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIICAAAAAc0gUq8vckU/o1f6t7MUcB/yVoaj2c1PIma9J6grG+yLAAAAAAD/////AgAAAAAAAAAAJ2olecVYyeODTRSd+WgMNvbvqyKwL1cZP1+F75rr3RgDnTpfxBq9+BAZBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "flags": 7, - "memo": "FFFF", - "skip_validation": true - }, - "name": "sweep", - "xcp_fee": 8600000 - } - }, - "/v2/addresses/
/compose/sweep/estimatexcpfees": { - "result": 8600000 - }, - "/v2/addresses/
/compose/dispense": { - "result": { - "rawtransaction": "0200000001beb5c4a9fcfdd1752a4e6ad953f2f960ee6afce46a2004f12a083d099971a66c0000000000ffffffff03e803000000000000160014c33484f00e7e7a47f015bcf95eb5b822eaa8281000000000000000000c6a0aa24de20a589d3feb8dd42815062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 1000, - "btc_change": 5000009000, - "btc_fee": 0, - "data": "434e5452505254590d00", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 162, - "adjusted_vsize": 162, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAIYCAAAAAb61xKn8/dF1Kk5q2VPy+WDuavzkaiAE8SoIPQmZcaZsAAAAAAD/////A+gDAAAAAAAAFgAUwzSE8A5+ekfwFbz5XrW4IuqoKBAAAAAAAAAAAAxqCqJN4gpYnT/rjdQoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAAA", - "params": { - "quantity": 1000, - "skip_validation": true, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispenser": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "quantity_normalized": "0.00001000" - }, - "name": "dispense" - } - }, - "/v2/addresses/
/compose/fairminter": { - "result": { - "rawtransaction": "0200000001f327e466ff33c0c6b5ab931ac3432075463b04bd76ecb6dd75ad0988e8dfd6f50000000000ffffffff020000000000000000236a219ee3bfb1618a4aba02b98c19e09bc602c757df5dde3f0d08aa7395e816a6ce62ba1019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254595a931aedf845d3000a01000000000000000000f4f4f4f56040", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 154, - "adjusted_vsize": 154, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAH4CAAAAAfMn5Gb/M8DGtauTGsNDIHVGOwS9duy23XWtCYjo39b1AAAAAAD/////AgAAAAAAAAAAI2ohnuO/sWGKSroCuYwZ4JvGAsdX313ePw0IqnOV6BamzmK6EBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MYASSET", - "asset_parent": "", - "price": 10, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "minted_asset_commission": 0.0, - "burn_payment": false, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "description": "", - "mime_type": "", - "pool_quantity": 0, - "lp_asset": "A95428956661682177", - "skip_validation": true, - "price_normalized": "10.0000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - "name": "fairminter" - } - }, - "/v2/addresses/
/compose/fairmint": { - "result": { - "rawtransaction": "02000000013370ce99444bdee463bb77e37c2c3436dd35f3e52813b1ac9b499e53c44190940000000000ffffffff020000000000000000166a142497c093dc6b83cb278ce5d4623943ba13a8cdc51019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254595b821b0000001b45a6253900", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 141, - "adjusted_vsize": 141, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAHECAAAAATNwzplES97kY7t343wsNDbdNfPlKBOxrJtJnlPEQZCUAAAAAAD/////AgAAAAAAAAAAFmoUJJfAk9xrg8snjOXUYjlDuhOozcUQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "OPENFAIR", - "quantity": 0, - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "divisible": true, - "locked": false, - "owner": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9" - }, - "quantity_normalized": "0.00000000" - }, - "name": "fairmint" - } - }, - "/v2/addresses/
/compose/pooldeposit": { - "result": { - "rawtransaction": "0200000001be02fd5b30a27b75f2e1ebb330015f81e43db3e843766596212f934eb7c71c5a0000000000ffffffff0200000000000000003b6a398a3cd45a87b1800b0809f7b2845dcd26c2cf544de875a979598714592740b6d214971cf8435ef1c79a85ccdfa1bf6b1a73f6e0929be81ae5f21019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254597800000000000000010000001d1902f85f00000000000f424000000000000f424000000000000000000000000000000000", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 178, - "adjusted_vsize": 178, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAJYCAAAAAb4C/Vswont18uHrszABX4HkPbPoQ3ZlliEvk063xxxaAAAAAAD/////AgAAAAAAAAAAO2o5ijzUWoexgAsICfeyhF3NJsLPVE3odal5WYcUWSdAttIUlxz4Q17xx5qFzN+hv2sac/bgkpvoGuXyEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "XCP", - "asset_b": "POOLTEST", - "quantity_a": 1000000, - "quantity_b": 1000000, - "min_lp_quantity": 0, - "lp_asset": null, - "skip_validation": true, - "asset_a_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "asset_b_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_a_normalized": "0.01000000", - "quantity_b_normalized": "0.01000000" - }, - "name": "pooldeposit", - "xcp_fee": 0 - } - }, - "/v2/addresses/
/compose/pooldeposit/estimatexcpfees": { - "result": 0 - }, - "/v2/addresses/
/compose/poolwithdraw": { - "result": { - "rawtransaction": "0200000001e2450722d9a9ccca869405e2b3cee4fc2ee4921d967b9faee7b51de9579b3bd60000000000ffffffff020000000000000000336a3199048f90c86f120437c917a9e936aed56001c07377ac4f37c41caa35d134836b792218709c56387b3a7ad646065a220b9c1019062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 0, - "btc_change": 5000010000, - "btc_fee": 0, - "data": "434e5452505254597900000000000000010000001d1902f85f00000000000f424000000000000000000000000000000000", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 170, - "adjusted_vsize": 170, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAI4CAAAAAeJFByLZqczKhpQF4rPO5Pwu5JIdlnufrue1HelXmzvWAAAAAAD/////AgAAAAAAAAAAM2oxmQSPkMhvEgQ3yRep6Tau1WABwHN3rE83xByqNdE0g2t5IhhwnFY4ezp61kYGWiILnBAZBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "XCP", - "asset_b": "POOLTEST", - "quantity": 1000000, - "min_quantity_a": 0, - "min_quantity_b": 0, - "skip_validation": true, - "asset_a_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "asset_b_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - } - }, - "name": "poolwithdraw", - "xcp_fee": 0 - } - }, - "/v2/addresses/
/compose/poolwithdraw/estimatexcpfees": { - "result": 0 - }, - "/v2/pools///quote": { - "result": { - "pool_exists": false, - "estimated_output": 0, - "book_orders": 0, - "message": "No pool or orders exist for this pair." - } - }, - "/v2/pools///quote/deposit": { - "result": { - "first_deposit": true, - "asset_a": "BURNER", - "asset_b": "XCP", - "quantity_a_required": null, - "quantity_b_required": null, - "quantity_minted_estimate": null, - "message": "First deposit: provide both quantities to set the initial price.", - "asset_a_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - } - } - }, - "/v2/pools///quote/withdraw": { - "result": { - "pool_exists": false, - "message": "Pool does not exist or is empty." - } - }, - "/v2/addresses/
/compose/attach": { - "result": { - "rawtransaction": "0200000001ab549a9ffea3fbb5646081b96cacc667a9bef28c6bb05070291398196ea549d60000000000ffffffff032202000000000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc29490000000000000000146a12d7b4e386a56a82e6e691bd027a27f741eaa1ee16062a01000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", - "btc_in": 5000010000, - "btc_out": 546, - "btc_change": 5000009454, - "btc_fee": 0, - "data": "434e545250525459655843507c313030307c", - "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" - ], - "inputs_values": [ - 5000010000 - ], - "signed_tx_estimated_size": { - "vsize": 170, - "adjusted_vsize": 170, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAI4CAAAAAatUmp/+o/u1ZGCBuWysxmepvvKMa7BQcCkTmBlupUnWAAAAAAD/////AyICAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAABRqEte044alaoLm5pG9Anon90Hqoe4WBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAAA=", - "params": { - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 1000, - "utxo_value": null, - "destination_vout": null, - "skip_validation": true, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00001000" - }, - "name": "attach", - "xcp_fee": 0 - } - }, - "/v2/addresses/
/compose/attach/estimatexcpfees": { - "result": 0 - }, - "/v2/utxos//compose/detach": { - "result": { - "rawtransaction": "02000000010b181c1460259c2108b3d6bbe5fe98db726c25e9da77aceb82386a3c83d0ad950000000000ffffffff020000000000000000376a3568645c5df42ac23219cad89d788a9d84d9706f88af5b4724ad1bd4d3ba479a8eaabb77d48ab9c877604836c21b9fc4b377ca6e23261027000000000000160014bbc22b85e74585563fa5027d0022d27e011d249600000000", - "btc_in": 10000, - "btc_out": 0, - "btc_change": 10000, - "btc_fee": 0, - "data": "434e5452505254596662637274317134726d30686866676a6e783736386474637534717a766766686e706c633232667432676a6177", - "lock_scripts": [ - "0014bbc22b85e74585563fa5027d0022d27e011d2496" - ], - "inputs_values": [ - 10000 - ], - "signed_tx_estimated_size": { - "vsize": 174, - "adjusted_vsize": 174, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAJICAAAAAQsYHBRgJZwhCLPWu+X+mNtybCXp2nes64I4ajyD0K2VAAAAAAD/////AgAAAAAAAAAAN2o1aGRcXfQqwjIZytideIqdhNlwb4ivW0ckrRvU07pHmo6qu3fUirnId2BINsIbn8Szd8puIyYQJwAAAAAAABYAFLvCK4XnRYVWP6UCfQAi0n4BHSSWAAAAAAAAAAA=", - "params": { - "source": "95add0833c6a3882ebac77dae9256c72db98fee5bbd6b308219c2560141c180b:0", - "destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "skip_validation": true - }, - "name": "detach" - } - }, - "/v2/utxos//compose/movetoutxo": { - "result": { - "rawtransaction": "02000000010b181c1460259c2108b3d6bbe5fe98db726c25e9da77aceb82386a3c83d0ad950000000000ffffffff022202000000000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc2949ee24000000000000160014bbc22b85e74585563fa5027d0022d27e011d249600000000", - "btc_in": 10000, - "btc_out": 546, - "btc_change": 9454, - "btc_fee": 0, - "data": null, - "lock_scripts": [ - "0014bbc22b85e74585563fa5027d0022d27e011d2496" - ], - "inputs_values": [ - 10000 - ], - "signed_tx_estimated_size": { - "vsize": 141, - "adjusted_vsize": 141, - "sigops_count": 1 - }, - "psbt": "cHNidP8BAHECAAAAAQsYHBRgJZwhCLPWu+X+mNtybCXp2nes64I4ajyD0K2VAAAAAAD/////AiICAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUnuJAAAAAAAABYAFLvCK4XnRYVWP6UCfQAi0n4BHSSWAAAAAAAAAAA=", - "params": { - "source": "95add0833c6a3882ebac77dae9256c72db98fee5bbd6b308219c2560141c180b:0", - "destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "utxo_value": null, - "skip_validation": true - }, - "name": "move" - } - }, - "/v2/compose/detach": { - "error": "No UTXOs found for 95add0833c6a3882ebac77dae9256c72db98fee5bbd6b308219c2560141c180b:0, provide UTXOs with the `inputs_set` parameter" - }, - "/v2/compose/attach/estimatexcpfees": { - "result": 0 - }, - "/v2/assets": { - "result": [ - { - "asset": "OPENFAIR", - "asset_id": "117132633401", - "asset_longname": null, - "issuer": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "owner": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "divisible": true, - "locked": false, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 323, - "last_issuance_block_index": 323, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529682, - "last_issuance_block_time": 1781529682, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRMARK", - "asset_id": "40262081844", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 320, - "last_issuance_block_index": 324, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRMULTI", - "asset_id": "1046814475650", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 313, - "last_issuance_block_index": 315, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, - "supply_normalized": "10.00000000" - }, - { - "asset": "FAIRFAIL", - "asset_id": "40261958579", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 0, - "description": "", - "description_locked": false, - "first_issuance_block_index": 307, - "last_issuance_block_index": 311, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, - "supply_normalized": "0.00000000" - }, - { - "asset": "FAIRPOOL", - "asset_id": "40262143959", - "asset_longname": null, - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "supply": 1000000000, - "description": "", - "description_locked": false, - "first_issuance_block_index": 301, - "last_issuance_block_index": 303, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, - "supply_normalized": "10.00000000" - } - ], - "next_cursor": 32, - "result_count": 29 - }, - "/v2/assets/": { - "result": { - "asset": "BURNER", - "asset_id": "21328597", - "asset_longname": null, - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "supply": 100000000, - "description": "let's burn it", - "description_locked": true, - "first_issuance_block_index": 222, - "last_issuance_block_index": 223, - "mime_type": "text/plain", - "first_issuance_block_time": 1781529285, - "last_issuance_block_time": 1781529289, - "supply_normalized": "1.00000000" - } - }, - "/v2/assets//balances": { - "result": [ - { - "address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "utxo": null, - "utxo_address": null, - "asset": "BURNER", - "asset_longname": null, - "quantity": 80000000, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.80000000" - }, - { - "address": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "utxo": null, - "utxo_address": null, - "asset": "BURNER", - "asset_longname": null, - "quantity": 20000000, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.20000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/assets//balances/
": { - "result": [ - { - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "asset_longname": null, - "quantity": 83377466195, - "utxo": null, - "utxo_address": null, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "833.77466195" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/assets//orders": { - "result": [ - { - "tx_index": 56, - "tx_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "block_index": 181, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 180, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529066, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 58, - "tx_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "block_index": 203, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 10000, - "give_remaining": 5000, - "get_asset": "BTC", - "get_quantity": 10000, - "get_remaining": 5000, - "expiration": 21, - "expire_index": 202, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529208, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00010000", - "get_quantity_normalized": "0.00010000", - "get_remaining_normalized": "0.00005000", - "give_remaining_normalized": "0.00005000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 65, - "tx_hash": "11ca1f3f7f68d2b4c7e7d3a99b08c6f1bbf5f98a4a44cd0fb89adc66808303a5", - "block_index": 190, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 209, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "cancelled", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529154, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 67, - "tx_hash": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d", - "block_index": 212, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 0, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 0, - "expiration": 21, - "expire_index": 211, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529245, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00000000", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 125, - "tx_hash": "36cf73cec2e2e9277439b628b1182e78a7050f2134ebf5224e409ba0478bbf0d", - "block_index": 297, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "give_asset": "XCP", - "give_quantity": 10000000, - "give_remaining": 0, - "get_asset": "POOLTEST", - "get_quantity": 1, - "get_remaining": -9049566, - "expiration": 21, - "expire_index": 317, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "filled", - "get_asset_divisible": true, - "give_asset_divisible": true, - "give_price": 1e-07, - "get_price": 10000000.0, - "block_time": 1781529585, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "give_quantity_normalized": "0.10000000", - "get_quantity_normalized": "0.00000001", - "get_remaining_normalized": "-0.09049566", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "0.0000001000000000", - "get_price_normalized": "10000000.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 10 - }, - "/v2/assets//matches": { - "result": [ - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 3000, - "backward_asset": "BTC", - "backward_quantity": 3000, - "tx0_block_index": 183, - "tx1_block_index": 185, - "block_index": 205, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 204, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529216, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00003000", - "backward_quantity_normalized": "0.00003000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 59, - "tx1_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 2000, - "backward_asset": "BTC", - "backward_quantity": 2000, - "tx0_block_index": 182, - "tx1_block_index": 183, - "block_index": 184, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 202, - "fee_paid": 0, - "status": "completed", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529130, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00002000", - "backward_quantity_normalized": "0.00002000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e_f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx0_index": 56, - "tx0_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 57, - "tx1_hash": "f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 160, - "tx1_block_index": 161, - "block_index": 181, - "tx0_expiration": 21, - "tx1_expiration": 20, - "match_expire_index": 180, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529066, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 67, - "tx0_hash": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 191, - "tx1_block_index": 205, - "block_index": 225, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 224, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529297, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/assets//credits": { - "result": [ - { - "block_index": 223, - "address": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "asset": "BURNER", - "quantity": 20000000, - "calling_function": "fairmint commission", - "event": "c53c93034fdfdcc9365ea4b5d7d94e9f0093e7e7fcd5ad76bb5abeea630798ee", - "tx_index": 100, - "utxo": null, - "utxo_address": null, - "credit_index": 114, - "block_time": 1781529289, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.20000000" - }, - { - "block_index": 223, - "address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "asset": "BURNER", - "quantity": 80000000, - "calling_function": "fairmint", - "event": "c53c93034fdfdcc9365ea4b5d7d94e9f0093e7e7fcd5ad76bb5abeea630798ee", - "tx_index": 100, - "utxo": null, - "utxo_address": null, - "credit_index": 113, - "block_time": 1781529289, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.80000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/assets//debits": { - "result": [ - { - "block_index": 325, - "address": null, - "asset": "XCP", - "quantity": 2000000000, - "action": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "utxo": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "utxo_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "debit_index": 137, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - { - "block_index": 323, - "address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "asset": "XCP", - "quantity": 50000000, - "action": "fairminter fee", - "event": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "tx_index": 140, - "utxo": null, - "utxo_address": null, - "debit_index": 134, - "block_time": 1781529682, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.50000000" - }, - { - "block_index": 320, - "address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "quantity": 50000000, - "action": "fairminter fee", - "event": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "utxo": null, - "utxo_address": null, - "debit_index": 132, - "block_time": 1781529671, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.50000000" - }, - { - "block_index": 315, - "address": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "asset": "XCP", - "quantity": 600000000, - "action": "unescrowed fairmint payment", - "event": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 0, - "utxo": null, - "utxo_address": null, - "debit_index": 131, - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "6.00000000" - }, - { - "block_index": 315, - "address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "quantity": 400000000, - "action": "escrowed fairmint", - "event": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "utxo": null, - "utxo_address": null, - "debit_index": 129, - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "4.00000000" - } - ], - "next_cursor": 128, - "result_count": 82 - }, - "/v2/assets//destructions": { - "result": [ - { - "tx_index": 100, - "tx_hash": "c53c93034fdfdcc9365ea4b5d7d94e9f0093e7e7fcd5ad76bb5abeea630798ee", - "block_index": 223, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "asset": "XCP", - "quantity": 100000000, - "tag": "burn fairmint payment", - "status": "valid", - "block_time": 1781529289, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "1.00000000" - }, - { - "tx_index": 69, - "tx_hash": "b98771bf17a55465f5677ef0a9c522d1a1e5ebfaa85e039d14e41423d57230c0", - "block_index": 193, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "quantity": 1, - "tag": "64657374726f79", - "status": "valid", - "block_time": 1781529167, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000001" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/assets//dividends": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/assets//issuances": { - "result": [ - { - "tx_index": 100, - "tx_hash": "c53c93034fdfdcc9365ea4b5d7d94e9f0093e7e7fcd5ad76bb5abeea630798ee", - "msg_index": 0, - "block_index": 223, - "asset": "BURNER", - "quantity": 100000000, - "divisible": true, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "let's burn it", - "fee_paid": 0, - "status": "valid", - "asset_longname": null, - "description_locked": true, - "fair_minting": false, - "asset_events": "fairmint", - "locked": true, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529289, - "quantity_normalized": "1.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 99, - "tx_hash": "b346840ec04263a939e9f0d64e79176505766dab374cffb830ff8c221447affd", - "msg_index": 0, - "block_index": 222, - "asset": "BURNER", - "quantity": 0, - "divisible": true, - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "let's burn it", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": true, - "asset_events": "open_fairminter", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529285, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.50000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/assets//sends": { - "result": [ - { - "tx_index": 62, - "tx_hash": "b42ad377f39af99412529cc6b2e0db3f443d4274ede62781429cf85e7289da84", - "block_index": 186, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "quantity": 10000000000000, - "status": "invalid: insufficient funds", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "send", - "source_address": null, - "destination_address": null, - "block_time": 1781529139, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "100000.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 50, - "tx_hash": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90", - "block_index": 154, - "source": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1:0", - "destination": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "block_time": 1781529031, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 51, - "tx_hash": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669", - "block_index": 155, - "source": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "destination": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "block_time": 1781529036, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 141, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "destination": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "destination_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 63, - "tx_hash": "836b784247fdb5b1abb318e9f5a4daea55b9381f04ef8adaab31d01a0bf2e5af", - "block_index": 187, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "quantity": 10000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "send", - "source_address": null, - "destination_address": null, - "block_time": 1781529142, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 10 - }, - "/v2/assets//dispensers": { - "result": [ - { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 29, - "tx_hash": "bcdcbaf45bf43649098b49ae2e8e81fa9e01866a380ea368cb3e82d36df46c1a", - "block_index": 133, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 10000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "dispense_count": 0, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528944, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00010000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 30, - "tx_hash": "20b02bde2bba1f3d9abbbaf22568328792325430005ce26af0bd9ac2691e1eba", - "block_index": 141, - "source": "mz7U1yRFEQVu84SfHcadv7ha8d9fQQZ8Xv", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": "ef9fd937898eb025c96221793283861e4accdf98df66ba985e343b9d1322e831", - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 0, - "last_status_tx_source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "close_block_index": 141, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528979, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00000010", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 33, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 117, - "tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 5 - }, - "/v2/assets//dispensers/
": { - "result": { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - }, - "/v2/assets//holders": { - "result": [ - { - "asset": "BURNER", - "address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "quantity": 80000000, - "escrow": null, - "cursor_id": "balances_59", - "holding_type": "balances", - "status": null, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.80000000" - }, - { - "asset": "BURNER", - "address": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "quantity": 20000000, - "escrow": null, - "cursor_id": "balances_60", - "holding_type": "balances", - "status": null, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.20000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/assets//dispenses": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 118, - "dispense_index": 0, - "tx_hash": "925d54707e318ccf711099bb0870ade1015d2da14e4c6934b9288cc18731abad", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 3000, - "dispenser_tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "btc_amount": 3000, - "dispenser": { - "tx_index": 117, - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00003000", - "btc_amount_normalized": "0.00003000" - }, - { - "tx_index": 34, - "dispense_index": 0, - "tx_hash": "efcfcc570ccef5540822cf4d48dd8235a5a387ee5b32b958dde92f19064e584e", - "block_index": 138, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "asset": "XCP", - "dispense_quantity": 666, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "btc_amount": 10000, - "dispenser": { - "tx_index": 33, - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016" - }, - "block_time": 1781528965, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000666", - "btc_amount_normalized": "0.00010000" - }, - { - "tx_index": 141, - "dispense_index": 0, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "btc_amount": 1000, - "dispenser": { - "tx_index": 33, - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016" - }, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - } - ], - "next_cursor": null, - "result_count": 5 - }, - "/v2/assets//subassets": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/assets//fairminters": { - "result": [ - { - "tx_hash": "b346840ec04263a939e9f0d64e79176505766dab374cffb830ff8c221447affd", - "tx_index": 99, - "block_index": 223, - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "asset": "BURNER", - "asset_parent": null, - "asset_longname": null, - "description": "let's burn it", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 100000000, - "burn_payment": true, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 20000000, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": true, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": 80000000, - "paid_quantity": 100000000, - "commission": 20000000, - "block_time": 1781529289, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "1.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "0.80000000", - "commission_normalized": "0.20000000", - "paid_quantity_normalized": "1.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/assets//fairmints": { - "result": [ - { - "tx_hash": "c53c93034fdfdcc9365ea4b5d7d94e9f0093e7e7fcd5ad76bb5abeea630798ee", - "tx_index": 100, - "block_index": 223, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "fairminter_tx_hash": "b346840ec04263a939e9f0d64e79176505766dab374cffb830ff8c221447affd", - "asset": "BURNER", - "earn_quantity": 80000000, - "paid_quantity": 100000000, - "commission": 20000000, - "status": "valid", - "block_time": 1781529289, - "asset_info": { - "asset_longname": null, - "description": "let's burn it", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": true, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "earn_quantity_normalized": "0.80000000", - "commission_normalized": "0.20000000", - "paid_quantity_normalized": "1.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/assets//fairmints/
": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/orders": { - "result": [ - { - "tx_index": 56, - "tx_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "block_index": 181, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 180, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529066, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 58, - "tx_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "block_index": 203, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 10000, - "give_remaining": 5000, - "get_asset": "BTC", - "get_quantity": 10000, - "get_remaining": 5000, - "expiration": 21, - "expire_index": 202, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529208, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00010000", - "get_quantity_normalized": "0.00010000", - "get_remaining_normalized": "0.00005000", - "give_remaining_normalized": "0.00005000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 59, - "tx_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "block_index": 184, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "give_asset": "BTC", - "give_quantity": 2000, - "give_remaining": 0, - "get_asset": "XCP", - "get_quantity": 2000, - "get_remaining": 0, - "expiration": 21, - "expire_index": 203, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "filled", - "get_asset_divisible": true, - "give_asset_divisible": false, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529130, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00002000", - "get_quantity_normalized": "0.00002000", - "get_remaining_normalized": "0.00000000", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 61, - "tx_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "block_index": 206, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "give_asset": "BTC", - "give_quantity": 3000, - "give_remaining": 2000, - "get_asset": "XCP", - "get_quantity": 3000, - "get_remaining": 2000, - "expiration": 21, - "expire_index": 205, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": true, - "give_asset_divisible": false, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529221, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00003000", - "get_quantity_normalized": "0.00003000", - "get_remaining_normalized": "0.00002000", - "give_remaining_normalized": "0.00002000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - }, - { - "tx_index": 65, - "tx_hash": "11ca1f3f7f68d2b4c7e7d3a99b08c6f1bbf5f98a4a44cd0fb89adc66808303a5", - "block_index": 190, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 209, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "cancelled", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529154, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 12 - }, - "/v2/orders/": { - "result": { - "tx_index": 139, - "tx_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "block_index": 322, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_asset": "BTC", - "give_quantity": 1000, - "give_remaining": 0, - "get_asset": "UTXOASSET", - "get_quantity": 1000, - "get_remaining": 0, - "expiration": 21, - "expire_index": 342, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "open", - "get_asset_divisible": true, - "give_asset_divisible": false, - "give_price": 1.0, - "get_price": 1.0, - "block_time": 1781529679, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00000000", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000" - } - }, - "/v2/orders//matches": { - "result": [ - { - "id": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416_392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx0_index": 138, - "tx0_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "tx0_address": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "tx1_index": 139, - "tx1_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx1_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "forward_asset": "UTXOASSET", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 321, - "tx1_block_index": 322, - "block_index": 322, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 341, - "fee_paid": 0, - "status": "pending", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529679, - "forward_asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/orders//btcpays": { - "result": [ - { - "tx_index": 60, - "tx_hash": "60ee00dbff9ff858cc1885dca75ccb6ffc124842a978e616a9102c43ac0600ca", - "block_index": 184, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "destination": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "btc_amount": 2000, - "order_match_id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "status": "valid", - "block_time": 1781529130, - "btc_amount_normalized": "0.00002000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/orders//": { - "result": [ - { - "tx_index": 59, - "tx_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "block_index": 184, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "give_asset": "BTC", - "give_quantity": 2000, - "give_remaining": 0, - "get_asset": "XCP", - "get_quantity": 2000, - "get_remaining": 0, - "expiration": 21, - "expire_index": 203, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "filled", - "get_asset_divisible": true, - "give_asset_divisible": false, - "give_price": 1.0, - "get_price": 1.0, - "market_pair": "BTC/XCP", - "market_dir": "SELL", - "market_price": "1.00000000", - "block_time": 1781529130, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00002000", - "get_quantity_normalized": "0.00002000", - "get_remaining_normalized": "0.00000000", - "give_remaining_normalized": "0.00000000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000", - "market_price_normalized": "1.00000000" - }, - { - "tx_index": 61, - "tx_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "block_index": 206, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "give_asset": "BTC", - "give_quantity": 3000, - "give_remaining": 2000, - "get_asset": "XCP", - "get_quantity": 3000, - "get_remaining": 2000, - "expiration": 21, - "expire_index": 205, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": true, - "give_asset_divisible": false, - "give_price": 1.0, - "get_price": 1.0, - "market_pair": "BTC/XCP", - "market_dir": "SELL", - "market_price": "1.00000000", - "block_time": 1781529221, - "give_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "get_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00003000", - "get_quantity_normalized": "0.00003000", - "get_remaining_normalized": "0.00002000", - "give_remaining_normalized": "0.00002000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000", - "market_price_normalized": "1.00000000" - }, - { - "tx_index": 56, - "tx_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "block_index": 181, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 180, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529066, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000", - "market_price_normalized": "1.00000000" - }, - { - "tx_index": 58, - "tx_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "block_index": 203, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 10000, - "give_remaining": 5000, - "get_asset": "BTC", - "get_quantity": 10000, - "get_remaining": 5000, - "expiration": 21, - "expire_index": 202, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "expired", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529208, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00010000", - "get_quantity_normalized": "0.00010000", - "get_remaining_normalized": "0.00005000", - "give_remaining_normalized": "0.00005000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000", - "market_price_normalized": "1.00000000" - }, - { - "tx_index": 65, - "tx_hash": "11ca1f3f7f68d2b4c7e7d3a99b08c6f1bbf5f98a4a44cd0fb89adc66808303a5", - "block_index": 190, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_asset": "XCP", - "give_quantity": 1000, - "give_remaining": 1000, - "get_asset": "BTC", - "get_quantity": 1000, - "get_remaining": 1000, - "expiration": 21, - "expire_index": 209, - "fee_required": 0, - "fee_required_remaining": 0, - "fee_provided": 10000, - "fee_provided_remaining": 10000, - "status": "cancelled", - "get_asset_divisible": false, - "give_asset_divisible": true, - "give_price": 1.0, - "get_price": 1.0, - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529154, - "give_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "get_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "give_quantity_normalized": "0.00001000", - "get_quantity_normalized": "0.00001000", - "get_remaining_normalized": "0.00001000", - "give_remaining_normalized": "0.00001000", - "fee_provided_normalized": "0.00010000", - "fee_required_normalized": "0.00000000", - "fee_required_remaining_normalized": "0.00000000", - "fee_provided_remaining_normalized": "0.00010000", - "give_price_normalized": "1.0000000000000000", - "get_price_normalized": "1.0000000000000000", - "market_price_normalized": "1.00000000" - } - ], - "next_cursor": null, - "result_count": 8 - }, - "/v2/orders///matches": { - "result": [ - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 3000, - "backward_asset": "BTC", - "backward_quantity": 3000, - "tx0_block_index": 183, - "tx1_block_index": 185, - "block_index": 205, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 204, - "fee_paid": 0, - "status": "expired", - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529216, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00003000", - "backward_quantity_normalized": "0.00003000", - "fee_paid_normalized": "0.00000000", - "market_price_normalized": "1.00000000" - }, - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 59, - "tx1_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 2000, - "backward_asset": "BTC", - "backward_quantity": 2000, - "tx0_block_index": 182, - "tx1_block_index": 183, - "block_index": 184, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 202, - "fee_paid": 0, - "status": "completed", - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529130, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00002000", - "backward_quantity_normalized": "0.00002000", - "fee_paid_normalized": "0.00000000", - "market_price_normalized": "1.00000000" - }, - { - "id": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e_f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx0_index": 56, - "tx0_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 57, - "tx1_hash": "f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 160, - "tx1_block_index": 161, - "block_index": 181, - "tx0_expiration": 21, - "tx1_expiration": 20, - "match_expire_index": 180, - "fee_paid": 0, - "status": "expired", - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529066, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "market_price_normalized": "1.00000000" - }, - { - "id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 67, - "tx0_hash": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 191, - "tx1_block_index": 205, - "block_index": 225, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 224, - "fee_paid": 0, - "status": "expired", - "market_pair": "BTC/XCP", - "market_dir": "BUY", - "market_price": "1.00000000", - "block_time": 1781529297, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "market_price_normalized": "1.00000000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/order_matches": { - "result": [ - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 3000, - "backward_asset": "BTC", - "backward_quantity": 3000, - "tx0_block_index": 183, - "tx1_block_index": 185, - "block_index": 205, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 204, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529216, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00003000", - "backward_quantity_normalized": "0.00003000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535_d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx0_index": 58, - "tx0_hash": "217742202c45f6d3a526f8761de6428f554e6afa7be6f737b2c7acadccee4535", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 59, - "tx1_hash": "d9c788c546dbc1ac003383d61b30634d95b928d97d93abc2ccc5899f6acd2c0d", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 2000, - "backward_asset": "BTC", - "backward_quantity": 2000, - "tx0_block_index": 182, - "tx1_block_index": 183, - "block_index": 184, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 202, - "fee_paid": 0, - "status": "completed", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529130, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00002000", - "backward_quantity_normalized": "0.00002000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e_f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx0_index": 56, - "tx0_hash": "28b2d10c1e40a0fb60869a742aba30dc93988473931bc1c70f08403473c13a9e", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 57, - "tx1_hash": "f49df212e5cf598acd0dc3e92b95cbb43d0aec1e662ce1f87341d0ac0820e938", - "tx1_address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 160, - "tx1_block_index": 161, - "block_index": 181, - "tx0_expiration": 21, - "tx1_expiration": 20, - "match_expire_index": 180, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529066, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d_f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx0_index": 67, - "tx0_hash": "2465cd21df6be524f39561fef0d2f612308b8618298c18ab18824e48a665827d", - "tx0_address": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "tx1_index": 61, - "tx1_hash": "f2cc0a8b93a87c83b390b3971c9aaaebaf3914fb6376639c5dcd00ee2a44932e", - "tx1_address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "forward_asset": "XCP", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 191, - "tx1_block_index": 205, - "block_index": 225, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 224, - "fee_paid": 0, - "status": "expired", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529297, - "forward_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - }, - { - "id": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416_392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx0_index": 138, - "tx0_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "tx0_address": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "tx1_index": 139, - "tx1_hash": "392c4fd83545cbf14af2935753e5964b87b420af6c520fa06ef3afd3f323a801", - "tx1_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "forward_asset": "UTXOASSET", - "forward_quantity": 1000, - "backward_asset": "BTC", - "backward_quantity": 1000, - "tx0_block_index": 321, - "tx1_block_index": 322, - "block_index": 322, - "tx0_expiration": 21, - "tx1_expiration": 21, - "match_expire_index": 341, - "fee_paid": 0, - "status": "pending", - "backward_price": 1.0, - "forward_price": 1.0, - "block_time": 1781529679, - "forward_asset_info": { - "asset_longname": null, - "description": "My super asset", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "divisible": true, - "locked": false, - "owner": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk" - }, - "backward_asset_info": { - "divisible": true, - "asset_longname": null, - "description": "The Bitcoin cryptocurrency", - "locked": false, - "issuer": null - }, - "forward_quantity_normalized": "0.00001000", - "backward_quantity_normalized": "0.00001000", - "fee_paid_normalized": "0.00000000", - "forward_price_normalized": "1.0000000000000000", - "backward_price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 5 - }, - "/v2/orders//pool_matches": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/pool_matches": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/pools": { - "result": [ - { - "tx_index": 129, - "tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "block_index": 303, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "FAIRPOOL", - "asset_b": "XCP", - "reserve_a": 400000000, - "reserve_b": 600000000, - "lp_asset": "A95428960030839430", - "block_time": 1781529610, - "asset_a_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "lp_asset_info": { - "asset_longname": null, - "description": "LP token for FAIRPOOL/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "reserve_a_normalized": "4.00000000", - "reserve_b_normalized": "6.00000000" - }, - { - "tx_index": 134, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 315, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "FAIRMULTI", - "asset_b": "XCP", - "reserve_a": 400000000, - "reserve_b": 600000000, - "lp_asset": "A95428956661682177", - "block_time": 1781529653, - "asset_a_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "lp_asset_info": { - "asset_longname": null, - "description": "LP token for FAIRMULTI/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "reserve_a_normalized": "4.00000000", - "reserve_b_normalized": "6.00000000" - }, - { - "tx_index": 124, - "tx_hash": "c97119277727396d8df2628840c993904c6294deff47a3fbaae7a0a0848c1438", - "block_index": 299, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "POOLTEST", - "asset_b": "XCP", - "reserve_a": 109553931, - "reserve_b": 132500000, - "lp_asset": "A95428956689590706", - "block_time": 1781529594, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "lp_asset_info": { - "asset_longname": null, - "description": "LP token for POOLTEST/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "reserve_a_normalized": "1.09553931", - "reserve_b_normalized": "1.32500000" - } - ], - "next_cursor": null, - "result_count": 3 - }, - "/v2/pools//": { - "result": { - "tx_index": 124, - "tx_hash": "c97119277727396d8df2628840c993904c6294deff47a3fbaae7a0a0848c1438", - "block_index": 299, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "POOLTEST", - "asset_b": "XCP", - "reserve_a": 109553931, - "reserve_b": 132500000, - "lp_asset": "A95428956689590706", - "block_time": 1781529594, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "lp_asset_info": { - "asset_longname": null, - "description": "LP token for POOLTEST/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "reserve_a_normalized": "1.09553931", - "reserve_b_normalized": "1.32500000" - } - }, - "/v2/pools///deposits": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/pools///withdrawals": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/pools///matches": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/pools///price_history": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/addresses/
/pool_deposits": { - "result": [ - { - "tx_index": 134, - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "block_index": 315, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "FAIRMULTI", - "asset_b": "XCP", - "quantity_a": 400000000, - "quantity_b": 600000000, - "quantity_minted": 489897948, - "status": "valid", - "block_time": 1781529653, - "asset_a_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_a_normalized": "4.00000000", - "quantity_b_normalized": "6.00000000", - "quantity_minted_normalized": "4.89897948" - }, - { - "tx_index": 129, - "tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "block_index": 303, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "FAIRPOOL", - "asset_b": "XCP", - "quantity_a": 400000000, - "quantity_b": 600000000, - "quantity_minted": 489897948, - "status": "valid", - "block_time": 1781529610, - "asset_a_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_a_normalized": "4.00000000", - "quantity_b_normalized": "6.00000000", - "quantity_minted_normalized": "4.89897948" - }, - { - "tx_index": 126, - "tx_hash": "86ef76ecad9ccfab504c640ef79a2e0478e3e1c4b2c554f7b82217db0126da22", - "block_index": 298, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "POOLTEST", - "asset_b": "XCP", - "quantity_a": 41341106, - "quantity_b": 50000000, - "quantity_minted": 45454545, - "status": "valid", - "block_time": 1781529589, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_a_normalized": "0.41341106", - "quantity_b_normalized": "0.50000000", - "quantity_minted_normalized": "0.45454545" - }, - { - "tx_index": 124, - "tx_hash": "c97119277727396d8df2628840c993904c6294deff47a3fbaae7a0a0848c1438", - "block_index": 296, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "POOLTEST", - "asset_b": "XCP", - "quantity_a": 100000000, - "quantity_b": 100000000, - "quantity_minted": 100000000, - "status": "valid", - "block_time": 1781529582, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_a_normalized": "1.00000000", - "quantity_b_normalized": "1.00000000", - "quantity_minted_normalized": "1.00000000" - } - ], - "next_cursor": null, - "result_count": 4 - }, - "/v2/addresses/
/pool_withdrawals": { - "result": [ - { - "tx_index": 127, - "tx_hash": "d28ab5afd7ad64416ca273eed1adfa7a8a98eeb8d149f10d9284b4fd9b6832f3", - "block_index": 299, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset_a": "POOLTEST", - "asset_b": "XCP", - "quantity_destroyed": 25000000, - "quantity_a": 22737608, - "quantity_b": 27499999, - "status": "valid", - "block_time": 1781529594, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_a_normalized": "0.22737608", - "quantity_b_normalized": "0.27499999", - "quantity_destroyed_normalized": "0.25000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/addresses/
/pools": { - "result": [ - { - "asset_a": "POOLTEST", - "asset_b": "XCP", - "lp_asset": "A95428956689590706", - "reserve_a": 109553931, - "reserve_b": 132500000, - "quantity": 120454545, - "asset_a_info": { - "asset_longname": null, - "description": "Pool test asset", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "asset_b_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "lp_asset_info": { - "asset_longname": null, - "description": "LP token for POOLTEST/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "reserve_a_normalized": "1.09553931", - "reserve_b_normalized": "1.32500000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/bets": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/bets/": { - "error": "Not found" - }, - "/v2/bets//matches": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/bets//resolutions": { - "result": [], - "next_cursor": null, - "result_count": 0 - }, - "/v2/burns": { - "result": [ - { - "tx_index": 9, - "tx_hash": "02e17626a3b84df0f7913ae83149f612a94ff6d0819a00667e275466027367dc", - "block_index": 112, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - }, - { - "tx_index": 8, - "tx_hash": "827ee95c910620b770e6ae733476e967021f89d869a2c839480b120ae97127a5", - "block_index": 112, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - }, - { - "tx_index": 7, - "tx_hash": "dd5aca34f60f91bf0be59fca09e428734574184af1d56f8aa9e328d5360051a1", - "block_index": 112, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - }, - { - "tx_index": 6, - "tx_hash": "5faed55210561524fd85e32e12f8ed02ca1e4a8685548df955ea432100d8aa99", - "block_index": 112, - "source": "bcrt1qduxrsdnc45nff2dhz9thw066emfyz9fxevqz6f", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - }, - { - "tx_index": 5, - "tx_hash": "6bd28cad2c2696c6a46296f6f5fe16dcb652decf868bf5f6c6a5b0c8d34eef89", - "block_index": 112, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "burned": 50000000, - "earned": 74999998167, - "status": "valid", - "block_time": 1781528859, - "burned_normalized": "0.50000000", - "earned_normalized": "749.99998167" - } - ], - "next_cursor": 4, - "result_count": 10 - }, - "/v2/dispensers": { - "result": [ - { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 29, - "tx_hash": "bcdcbaf45bf43649098b49ae2e8e81fa9e01866a380ea368cb3e82d36df46c1a", - "block_index": 133, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 10000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "dispense_count": 0, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528944, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00010000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 30, - "tx_hash": "20b02bde2bba1f3d9abbbaf22568328792325430005ce26af0bd9ac2691e1eba", - "block_index": 141, - "source": "mz7U1yRFEQVu84SfHcadv7ha8d9fQQZ8Xv", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": "ef9fd937898eb025c96221793283861e4accdf98df66ba985e343b9d1322e831", - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 0, - "last_status_tx_source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "close_block_index": 141, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528979, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00000010", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 71, - "tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "TESTLOCKDESC", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - }, - { - "tx_index": 117, - "tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - ], - "next_cursor": null, - "result_count": 6 - }, - "/v2/dispensers/": { - "result": { - "tx_index": 26, - "tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "XCP", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "price": 100000000.0, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001", - "price_normalized": "1.0000000000000000" - } - }, - "/v2/dispensers//dispenses": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/dividends": { - "result": [ - { - "tx_index": 42, - "tx_hash": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "block_index": 146, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MYASSETA", - "dividend_asset": "XCP", - "quantity_per_unit": 100000000, - "fee_paid": 20000, - "status": "valid", - "block_time": 1781528999, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dividend_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_per_unit_normalized": "1.00000000", - "fee_paid_normalized": "0.00020000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/dividends/": { - "result": { - "tx_index": 42, - "tx_hash": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "block_index": 146, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "MYASSETA", - "dividend_asset": "XCP", - "quantity_per_unit": 100000000, - "fee_paid": 20000, - "status": "valid", - "block_time": 1781528999, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dividend_asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_per_unit_normalized": "1.00000000", - "fee_paid_normalized": "0.00020000" - } - }, - "/v2/dividends//credits": { - "result": [ - { - "block_index": 146, - "address": null, - "asset": "XCP", - "quantity": 2000000000, - "calling_function": "dividend", - "event": "f70ac1eba18450ed44db5e9717c97db7316cacf8e9202b465945bfc39b4ef61b", - "tx_index": 42, - "utxo": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "credit_index": 51, - "block_time": 1781528999, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/events": { - "result": [ - { - "event_index": 1391, - "event": "BLOCK_PARSED", - "params": { - "block_index": 325, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "transaction_count": 1, - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "block_time": 1781529693 - }, - "tx_hash": null, - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1390, - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141 - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1389, - "event": "DISPENSE", - "params": { - "asset": "XCP", - "block_index": 325, - "btc_amount": 1000, - "destination": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "dispense_index": 0, - "dispense_quantity": 66, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "tx_index": 141, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000066", - "btc_amount_normalized": "0.00001000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1388, - "event": "DISPENSER_UPDATE", - "params": { - "asset": "XCP", - "dispense_count": 2, - "give_remaining": 9268, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "status": 0, - "tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "give_remaining_normalized": "0.00009268" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - } - ], - "next_cursor": 1386, - "result_count": 1392 - }, - "/v2/events/": { - "result": { - "event_index": 1391, - "event": "BLOCK_PARSED", - "params": { - "block_index": 325, - "ledger_hash": "d5448d570be1e24d921a1348512dde8acc56dc1b25eebbcf5e5300ebc25ddabf", - "messages_hash": "f4fa348ae0c24987099c3b7480b1614768bc7fc3d73b28bf3d7fa72508b85c25", - "transaction_count": 1, - "txlist_hash": "b30de828d8a76e7410b82037b310cc00337755f27b9fa6165a59a602d71a79f5", - "block_time": 1781529693 - }, - "tx_hash": null, - "block_index": 325, - "block_time": 1781529693 - } - }, - "/v2/events/counts": { - "result": [ - { - "event": "NEW_POOL_WITHDRAWAL", - "count": 1 - }, - { - "event": "POOL_MATCH", - "count": 1 - }, - { - "event": "POOL_UPDATE", - "count": 3 - }, - { - "event": "NEW_POOL_DEPOSIT", - "count": 4 - }, - { - "event": "OPEN_POOL", - "count": 3 - } - ], - "next_cursor": 37, - "result_count": 42 - }, - "/v2/events/": { - "result": [ - { - "event_index": 1387, - "event": "CREDIT", - "params": { - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "asset": "XCP", - "block_index": 325, - "calling_function": "dispense", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 66, - "tx_index": 141, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00000066" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1385, - "event": "CREDIT", - "params": { - "address": null, - "asset": "XCP", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1382, - "event": "CREDIT", - "params": { - "address": null, - "asset": "MYASSETA", - "block_index": 325, - "calling_function": "utxo move", - "event": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "quantity": 2000000000, - "tx_index": 141, - "utxo": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d:0", - "utxo_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000" - }, - "tx_hash": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "block_index": 325, - "block_time": 1781529693 - }, - { - "event_index": 1350, - "event": "CREDIT", - "params": { - "address": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "block_index": 321, - "calling_function": "cancel order", - "event": "d99c71cc65fc097524b7ff82feb17a727183a0f9159733738205e174d63fcfb9", - "quantity": 1000000, - "tx_index": 0, - "utxo": null, - "utxo_address": null, - "block_time": 1781529675, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.01000000" - }, - "tx_hash": "905cabdfdd0a67b5779bb465a0ad7b5a7e2da6427a8ab81bfaa378a30713c416", - "block_index": 321, - "block_time": 1781529675 - }, - { - "event_index": 1342, - "event": "CREDIT", - "params": { - "address": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "asset": "FAIRMARK", - "block_index": 320, - "calling_function": "escrowed pool liquidity", - "event": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "quantity": 400000000, - "tx_index": 137, - "utxo": null, - "utxo_address": null, - "block_time": 1781529671, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - }, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 320, - "block_time": 1781529671 - } - ], - "next_cursor": 1323, - "result_count": 165 - }, - "/v2/events//count": { - "result": { - "event": "CREDIT", - "count": 165 - } - }, - "/v2/destructions": { - "result": [ - { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "quantity": 400000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529686, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "4.00000000" - }, - { - "tx_index": 132, - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "block_index": 311, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRFAIL", - "quantity": 600000000, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529633, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "6.00000000" - }, - { - "tx_index": 127, - "tx_hash": "d28ab5afd7ad64416ca273eed1adfa7a8a98eeb8d149f10d9284b4fd9b6832f3", - "block_index": 299, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "A95428956689590706", - "quantity": 25000000, - "tag": "pool_withdraw", - "status": "valid", - "block_time": 1781529594, - "asset_info": { - "asset_longname": null, - "description": "LP token for POOLTEST/XCP pool", - "issuer": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "divisible": true, - "locked": false, - "owner": "mvCounterpartyXXXXXXXXXXXXXXW24Hef" - }, - "quantity_normalized": "0.25000000" - }, - { - "tx_index": 120, - "tx_hash": "3ebd11688f4de7bba3a0d007f30b09fcb5e0132d637d94f8aa9f11f97cda733e", - "block_index": 242, - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "asset": "RESET", - "quantity": 12, - "tag": "reset", - "status": "valid", - "block_time": 1781529385, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": false, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.00000012" - }, - { - "tx_index": 104, - "tx_hash": "25b838a6da2ad08c4c48735696479b43dd5cb7dda6248fc4133be0302bcd4096", - "block_index": 230, - "source": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "asset": "PREMINT", - "quantity": 50, - "tag": "soft cap not reached", - "status": "valid", - "block_time": 1781529318, - "asset_info": { - "asset_longname": null, - "description": "My super description", - "issuer": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4", - "divisible": true, - "locked": false, - "owner": "bcrt1qvawcr9uhexn0jkp7pt9lj35w94w446wtfwyxg4" - }, - "quantity_normalized": "0.00000050" - } - ], - "next_cursor": 3, - "result_count": 8 - }, - "/v2/dispenses": { - "result": [ - { - "tx_index": 27, - "dispense_index": 0, - "tx_hash": "2778ddb0d81915e9178032cc7914aff5e9df7d0ee1f28a7bf8efa7d349879c4e", - "block_index": 131, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 6000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 6000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528937, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00006000", - "btc_amount_normalized": "0.00006000" - }, - { - "tx_index": 72, - "dispense_index": 0, - "tx_hash": "1d46f783bfbbd31cae75b29627d5249785ed51374b478f3f11ac4a229673d585", - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "TESTLOCKDESC", - "dispense_quantity": 4000, - "dispenser_tx_hash": "e6cb47a10b50f8515228d5cc8d3ce9f2d1d2a2d3cae7e0842945eea55aa91ed1", - "btc_amount": 4000, - "dispenser": { - "tx_index": 71, - "block_index": 196, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 6000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00006000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529178, - "asset_info": { - "asset_longname": null, - "description": "Test Locking Description", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 28, - "dispense_index": 0, - "tx_hash": "35826166e03f8b54c489290c1e27a922195c8f164961cc8df48b1fb911a19bf6", - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 4000, - "dispenser_tx_hash": "edba96ceb45c4c72dbfa84b42026fdb47dac3ed637d1c7bbb5b83bc3ec08e120", - "btc_amount": 4000, - "dispenser": { - "tx_index": 26, - "block_index": 132, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 10, - "give_remaining": 0, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00000000", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781528941, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00004000", - "btc_amount_normalized": "0.00004000" - }, - { - "tx_index": 118, - "dispense_index": 0, - "tx_hash": "925d54707e318ccf711099bb0870ade1015d2da14e4c6934b9288cc18731abad", - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "asset": "XCP", - "dispense_quantity": 3000, - "dispenser_tx_hash": "02ec5147c7394e20b73d63672cf828d4aad4e099a85ee3cd7d773f29ff7d3a09", - "btc_amount": 3000, - "dispenser": { - "tx_index": 117, - "block_index": 239, - "source": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "give_quantity": 1, - "escrow_quantity": 5000, - "satoshirate": 1, - "status": 0, - "give_remaining": 2000, - "oracle_address": null, - "last_status_tx_hash": null, - "origin": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "dispense_count": 1, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": null, - "oracle_price": null, - "fiat_unit": null, - "oracle_price_last_updated": null, - "satoshi_price": 1, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00002000", - "escrow_quantity_normalized": "0.00005000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000001" - }, - "block_time": 1781529374, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00003000", - "btc_amount_normalized": "0.00003000" - }, - { - "tx_index": 34, - "dispense_index": 0, - "tx_hash": "efcfcc570ccef5540822cf4d48dd8235a5a387ee5b32b958dde92f19064e584e", - "block_index": 138, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "asset": "XCP", - "dispense_quantity": 666, - "dispenser_tx_hash": "c161e256e0ef45abf4a428c18d41c8d2ab63f9b09123e1ac06bada4c6919f2b7", - "btc_amount": 10000, - "dispenser": { - "tx_index": 33, - "block_index": 325, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "give_quantity": 1, - "escrow_quantity": 10000, - "satoshirate": 1, - "status": 0, - "give_remaining": 9268, - "oracle_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "last_status_tx_hash": null, - "origin": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "dispense_count": 2, - "last_status_tx_source": null, - "close_block_index": null, - "fiat_price": 0.01, - "oracle_price": 66600.0, - "fiat_unit": "USD", - "oracle_price_last_updated": 129, - "satoshi_price": 16, - "give_quantity_normalized": "0.00000001", - "give_remaining_normalized": "0.00009268", - "escrow_quantity_normalized": "0.00010000", - "satoshirate_normalized": "0.00000001", - "satoshi_price_normalized": "0.00000016" - }, - "block_time": 1781528965, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "dispense_quantity_normalized": "0.00000666", - "btc_amount_normalized": "0.00010000" - } - ], - "next_cursor": null, - "result_count": 6 - }, - "/v2/sends": { - "result": [ - { - "tx_index": 62, - "tx_hash": "b42ad377f39af99412529cc6b2e0db3f443d4274ede62781429cf85e7289da84", - "block_index": 186, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "quantity": 10000000000000, - "status": "invalid: insufficient funds", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "send", - "source_address": null, - "destination_address": null, - "block_time": 1781529139, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "100000.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 50, - "tx_hash": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90", - "block_index": 154, - "source": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1:0", - "destination": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "asset": "MYASSETA", - "quantity": 2000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "block_time": 1781529031, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 50, - "tx_hash": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90", - "block_index": 154, - "source": "7d7372dae8edb2b5829e9e83e28f9b5fe9fb1b3f5c2152c19b30c85990dcd3b1:0", - "destination": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "destination_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "block_time": 1781529031, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 51, - "tx_hash": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669", - "block_index": 155, - "source": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "destination": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "asset": "MYASSETA", - "quantity": 2000000000, - "status": "valid", - "msg_index": 0, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "block_time": 1781529036, - "asset_info": { - "asset_longname": null, - "description": "My super asset A", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": false, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 51, - "tx_hash": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669", - "block_index": 155, - "source": "dec54f48df744e50840bc4184786005f3732ac6a6c860b676adf48fddfd04d90:0", - "destination": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669:1", - "asset": "XCP", - "quantity": 2000000000, - "status": "valid", - "msg_index": 1, - "memo": null, - "fee_paid": 0, - "send_type": "move", - "source_address": "bcrt1qjqev2gw826pmrmghmsq2vdaj8r56rz0zxnmmd4", - "destination_address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "block_time": 1781529036, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "20.00000000", - "fee_paid_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 46 - }, - "/v2/issuances": { - "result": [ - { - "tx_index": 35, - "tx_hash": "4a3f2b308a9dba4aa33ea336b22ef6cb2249d1a8f73ea86599b95e43339dd884", - "msg_index": 0, - "block_index": 139, - "asset": "MYASSETA", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset A", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781528970, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 51, - "tx_hash": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669", - "msg_index": 0, - "block_index": 155, - "asset": "MYASSETB", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "issuer": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset B", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529036, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 55, - "tx_hash": "4e3c863d740868abae4d884783e163e8b1ce5425229ca0925af48e2a84b91255", - "msg_index": 0, - "block_index": 159, - "asset": "A95428956980101314", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "A subnumeric asset", - "fee_paid": 0, - "status": "valid", - "asset_longname": "A95428959745315388.SUBNUMERIC", - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529051, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.00000000" - }, - { - "tx_index": 73, - "tx_hash": "407fe16fbc998198dabe1161673b842e0a1d1494dc3862661c6d027fb21be56f", - "msg_index": 0, - "block_index": 197, - "asset": "UTXOASSET", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "issuer": "bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529182, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - }, - { - "tx_index": 79, - "tx_hash": "d9795d85914715b04a569592ddf5ce19de889e17e599831703c3ef5b9c8f7b2c", - "msg_index": 0, - "block_index": 202, - "asset": "MPMASSET", - "quantity": 100000000000, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "My super asset B", - "fee_paid": 50000000, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "creation", - "locked": false, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529205, - "quantity_normalized": "1000.00000000", - "fee_paid_normalized": "0.50000000" - } - ], - "next_cursor": null, - "result_count": 77 - }, - "/v2/issuances/": { - "result": { - "tx_index": 137, - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "msg_index": 1, - "block_index": 324, - "asset": "FAIRMARK", - "quantity": 0, - "divisible": true, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "transfer": false, - "callable": false, - "call_date": 0, - "call_price": 0.0, - "description": "", - "fee_paid": 0, - "status": "valid", - "asset_longname": null, - "description_locked": false, - "fair_minting": false, - "asset_events": "close_fairminter", - "locked": true, - "reset": false, - "mime_type": "text/plain", - "block_time": 1781529686, - "quantity_normalized": "0.00000000", - "fee_paid_normalized": "0.00000000" - } - }, - "/v2/sweeps": { - "result": [ - { - "tx_index": 68, - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "block_index": 192, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "flags": 1, - "status": "valid", - "memo": "sweep my assets", - "fee_paid": 800000, - "block_time": 1781529163, - "fee_paid_normalized": "0.00800000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/sweeps/": { - "result": [ - { - "tx_index": 68, - "tx_hash": "08899dbd7e9286e1fe9da99466dee4daabc4414f3865ac98775dcd89bcbc086f", - "block_index": 192, - "source": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "destination": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "flags": 1, - "status": "valid", - "memo": "sweep my assets", - "fee_paid": 800000, - "block_time": 1781529163, - "fee_paid_normalized": "0.00800000" - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/broadcasts": { - "result": [ - { - "tx_index": 24, - "tx_hash": "2ff61da29d5eb78e0d8b5efa5db836cd2920ceb666124b1fc25712f7a9fe58b4", - "block_index": 128, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "timestamp": 4003903983, - "value": 999.0, - "fee_fraction_int": 0, - "text": "Hello, world!", - "locked": false, - "status": "valid", - "mime_type": "text/plain", - "block_time": 1781528924, - "fee_fraction_int_normalized": "0.00000000" - }, - { - "tx_index": 25, - "tx_hash": "e135d21a676dea1fdb2638bce05139bbee4708b17a214eac42565a86c6646b5e", - "block_index": 129, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "timestamp": 4003903983, - "value": 66600.0, - "fee_fraction_int": 0, - "text": "price-USD", - "locked": false, - "status": "valid", - "mime_type": "text/plain", - "block_time": 1781528928, - "fee_fraction_int_normalized": "0.00000000" - } - ], - "next_cursor": null, - "result_count": 2 - }, - "/v2/broadcasts/": { - "result": { - "tx_index": 25, - "tx_hash": "e135d21a676dea1fdb2638bce05139bbee4708b17a214eac42565a86c6646b5e", - "block_index": 129, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "timestamp": 4003903983, - "value": 66600.0, - "fee_fraction_int": 0, - "text": "price-USD", - "locked": false, - "status": "valid", - "mime_type": "text/plain", - "block_time": 1781528928, - "fee_fraction_int_normalized": "0.00000000" - } - }, - "/v2/fairminters": { - "result": [ - { - "tx_hash": "ff53b7d130c73e1606475096d65e296f4c660137260110a67c4f9f49f58a5e17", - "tx_index": 140, - "block_index": 323, - "source": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "asset": "OPENFAIR", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 0, - "quantity_by_price": 1, - "hard_cap": 0, - "burn_payment": false, - "max_mint_per_tx": 10, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 0, - "soft_cap_deadline_block": 0, - "lock_description": false, - "lock_quantity": false, - "divisible": true, - "pre_minted": false, - "status": "open", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 0, - "lp_asset": null, - "earned_quantity": null, - "paid_quantity": null, - "commission": null, - "block_time": 1781529682, - "price_normalized": "0.0000000000000000", - "hard_cap_normalized": "0.00000000", - "soft_cap_normalized": "0.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000010", - "premint_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "55a35caf592f3e7477bfddec84674a0ea4a1fb5be325c186c46ec67b1ca5a0c3", - "tx_index": 137, - "block_index": 324, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMARK", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "earned_quantity": null, - "paid_quantity": null, - "commission": null, - "block_time": 1781529686, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - }, - { - "tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "tx_index": 134, - "block_index": 315, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRMULTI", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 315, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682177", - "earned_quantity": 600000000, - "paid_quantity": 600000000, - "commission": 0, - "block_time": 1781529653, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "6.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "6.00000000" - }, - { - "tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "tx_index": 132, - "block_index": 311, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRFAIL", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 311, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428958788449033", - "earned_quantity": 200000000, - "paid_quantity": 200000000, - "commission": 0, - "block_time": 1781529633, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - { - "tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "tx_index": 129, - "block_index": 303, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "asset": "FAIRPOOL", - "asset_parent": null, - "asset_longname": null, - "description": "", - "price": 1, - "quantity_by_price": 1, - "hard_cap": 1000000000, - "burn_payment": false, - "max_mint_per_tx": 0, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "minted_asset_commission_int": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 303, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "pre_minted": false, - "status": "closed", - "max_mint_per_address": 0, - "mime_type": "text/plain", - "pool_quantity": 400000000, - "lp_asset": "A95428960030839430", - "earned_quantity": 600000000, - "paid_quantity": 600000000, - "commission": 0, - "block_time": 1781529610, - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000", - "earned_quantity_normalized": "6.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "6.00000000" - } - ], - "next_cursor": 18, - "result_count": 23 - }, - "/v2/fairmints": { - "result": [ - { - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_index": 315, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "asset": "FAIRMULTI", - "earn_quantity": 400000000, - "paid_quantity": 400000000, - "commission": 0, - "status": "valid", - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - }, - { - "tx_hash": "1fac63f1da5542b7625d659caa8f445803a807ae77f156c91335a9d3bb4b1c4c", - "tx_index": 135, - "block_index": 314, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "asset": "FAIRMULTI", - "earn_quantity": 200000000, - "paid_quantity": 200000000, - "commission": 0, - "status": "valid", - "block_time": 1781529649, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - { - "tx_hash": "d875a8176ac3c7bacb731266a4a8c8aa8500f12a0b739005c6440b23c3606b6a", - "tx_index": 133, - "block_index": 308, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "fairminter_tx_hash": "fb11368ec4ab1ab2272c19dea2012ef9e9dc591fbf36ec4fef6e4260ab084aa8", - "asset": "FAIRFAIL", - "earn_quantity": 200000000, - "paid_quantity": 200000000, - "commission": 0, - "status": "valid", - "block_time": 1781529629, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "2.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "2.00000000" - }, - { - "tx_hash": "7f7f23b610ee7f18eff58112921f046dadcb6eca2661b35716174ae252a3b3a6", - "tx_index": 131, - "block_index": 303, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "fairminter_tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "asset": "FAIRPOOL", - "earn_quantity": 300000000, - "paid_quantity": 300000000, - "commission": 0, - "status": "valid", - "block_time": 1781529610, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "3.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "3.00000000" - }, - { - "tx_hash": "48813dcbb51cc4e3e58a87f89e88732d72c0659181006a093ff8af379e5e326e", - "tx_index": 130, - "block_index": 302, - "source": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "fairminter_tx_hash": "67f7465b99a26d192979d3d27668c515bdc9fe363285457801d86fdc444bdc7b", - "asset": "FAIRPOOL", - "earn_quantity": 300000000, - "paid_quantity": 300000000, - "commission": 0, - "status": "valid", - "block_time": 1781529606, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "3.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "3.00000000" - } - ], - "next_cursor": 17, - "result_count": 22 - }, - "/v2/fairmints/": { - "result": { - "tx_hash": "897ff469533d9637461dc7eafb06d51cb79d33c44813142d8cf2e08ddf952998", - "tx_index": 136, - "block_index": 315, - "source": "bcrt1q52ux78sv396xa483qqjkt499pjqywcn63j2v78", - "fairminter_tx_hash": "454a160d9ebc3b8a7ec3010845af335f762f147d3abefd37397ecfc836c2fbc7", - "asset": "FAIRMULTI", - "earn_quantity": 400000000, - "paid_quantity": 400000000, - "commission": 0, - "status": "valid", - "block_time": 1781529653, - "asset_info": { - "asset_longname": null, - "description": "", - "issuer": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw", - "divisible": true, - "locked": true, - "owner": "bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw" - }, - "earn_quantity_normalized": "4.00000000", - "commission_normalized": "0.00000000", - "paid_quantity_normalized": "4.00000000" - } - }, - "/v2/bitcoin/addresses/utxos": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bcrt1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fyk7008wk/utxo (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" - }, - "/v2/bitcoin/addresses/
/transactions": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" - }, - "/v2/bitcoin/addresses/
/pubkey": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bcrt1q4rm0hhfgjnx768dtcu4qzvgfhnplc22ft2gjaw/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" - }, - "/v2/bitcoin/transactions/": { - "result": { - "txid": "3fe3ac10d28b8b034b52667e22a029ee248798a97bcd250138185c6e8d64a93d", - "hash": "167f75684d39d3535846012925df735d9ad6b98a1eb0eb5e781f721b6cdba85d", - "version": 2, - "size": 243, - "vsize": 162, - "weight": 645, - "locktime": 0, - "vin": [ - { - "txid": "07ef46a083d39bf0a78c8c5b821dc3652f258d60be48b032d656bf2a20720669", - "vout": 1, - "scriptSig": { - "asm": "", - "hex": "" - }, - "txinwitness": [ - "304402204f51c2d64c8d0e2616f2748cadc6734593975d42af27cd9a1b6945768b54fbe6022022b6b1607e34335717233ada394ff2cf60b007d05bc83553ced575af1c28d35a01", - "03ab961aa5bea0384703516ee07013bc6f2efc62140850cf4803ade68d64e29c15" - ], - "sequence": 4294967295 - } - ], - "vout": [ - { - "value": 1e-05, - "n": 0, - "scriptPubKey": { - "asm": "0 4aa9d623cc85384e21cbe8bea82f55499ad70b8f", - "desc": "addr(bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9)#rxjey9c0", - "hex": "00144aa9d623cc85384e21cbe8bea82f55499ad70b8f", - "address": "bcrt1qf25avg7vs5uyugwtazl2st64fxddwzu0cyxqn9", - "type": "witness_v0_keyhash" - } - }, - { - "value": 0.0, - "n": 1, - "scriptPubKey": { - "asm": "OP_RETURN 820829154367ad9871e9", - "desc": "raw(6a0a820829154367ad9871e9)#a2lk4d39", - "hex": "6a0a820829154367ad9871e9", - "type": "nulldata" - } - }, - { - "value": 49.49873799, - "n": 2, - "scriptPubKey": { - "asm": "0 e786d2670784c30638a7382d9953c9aeb4f20404", - "desc": "addr(bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a)#mu3atg8f", - "hex": "0014e786d2670784c30638a7382d9953c9aeb4f20404", - "address": "bcrt1qu7rdyec8snpsvw988qkej57f4660ypqyh5g55a", - "type": "witness_v0_keyhash" - } - } - ], - "hex": "02000000000101690672202abf56d632b048be608d252f65c31d825b8c8ca7f09bd383a046ef070100000000ffffffff03e8030000000000001600144aa9d623cc85384e21cbe8bea82f55499ad70b8f00000000000000000c6a0a820829154367ad9871e98714092701000000160014e786d2670784c30638a7382d9953c9aeb4f204040247304402204f51c2d64c8d0e2616f2748cadc6734593975d42af27cd9a1b6945768b54fbe6022022b6b1607e34335717233ada394ff2cf60b007d05bc83553ced575af1c28d35a012103ab961aa5bea0384703516ee07013bc6f2efc62140850cf4803ade68d64e29c1500000000", - "blockhash": "192b98a2db7bb38e5996be8abd88d0abb4f58f1335a4d3e03d12da56d6f04cd6", - "confirmations": 1, - "time": 1781529693, - "blocktime": 1781529693 - } - }, - "/v2/bitcoin/estimatesmartfee": { - "result": 58675 - }, - "/v2/bitcoin/transactions/decode": { - "result": { - "txid": "0af935874d4d8c588f4c30a68c39d96906bf20ba20accd4337b8fcfc0196299b", - "hash": "b265ef6af958f89b1c835f0956c5c374761e5f5d3b7910ee0e79e0e08900affd", - "version": 2, - "size": 143, - "vsize": 140, - "weight": 557, - "locktime": 0, - "vin": [ - { - "txid": "4d9512137f191591e308483bdc0408642e5520be29f418adae44eacb8045c999", - "vout": 0, - "scriptSig": { - "asm": "0 7c6b1112ed7bc76fd03af8b91d02fd6942c5a8d0", - "hex": "00147c6b1112ed7bc76fd03af8b91d02fd6942c5a8d0" - }, - "txinwitness": [ - "", - "" - ], - "sequence": 4294967295 - } - ], - "vout": [ - { - "value": 0.5, - "n": 0, - "scriptPubKey": { - "asm": "OP_DUP OP_HASH160 a11b66a67b3ff69671c8f82254099faf374b800e OP_EQUALVERIFY OP_CHECKSIG", - "desc": "addr(mvCounterpartyXXXXXXXXXXXXXXW24Hef)#3dsuzcep", - "hex": "76a914a11b66a67b3ff69671c8f82254099faf374b800e88ac", - "address": "mvCounterpartyXXXXXXXXXXXXXXW24Hef", - "type": "pubkeyhash" - } - }, - { - "value": 49.4999, - "n": 1, - "scriptPubKey": { - "asm": "0 7c6b1112ed7bc76fd03af8b91d02fd6942c5a8d0", - "desc": "addr(bcrt1q0343zyhd00rkl5p6lzu36qhad9pvt2xsad2aut)#arywlyjk", - "hex": "00147c6b1112ed7bc76fd03af8b91d02fd6942c5a8d0", - "address": "bcrt1q0343zyhd00rkl5p6lzu36qhad9pvt2xsad2aut", - "type": "witness_v0_keyhash" - } - } - ] - } - }, - "/v2/bitcoin/getmempoolinfo": { - "result": { - "loaded": true, - "size": 1, - "bytes": 159, - "usage": 1184, - "total_fee": 0.0001, - "maxmempool": 300000000, - "mempoolminfee": 0.0, - "minrelaytxfee": 0.0, - "incrementalrelayfee": 1e-05, - "unbroadcastcount": 1, - "fullrbf": true - } - }, - "/v2/mempool/events": { - "result": [ - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142 - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "ENHANCED_SEND", - "params": { - "asset": "XCP", - "block_index": 9999999, - "destination": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "memo": null, - "msg_index": 0, - "quantity": 10000, - "send_type": "send", - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "status": "valid", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "CREDIT", - "params": { - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "asset": "XCP", - "block_index": 325, - "calling_function": "send", - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "DEBIT", - "params": { - "action": "send", - "address": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "block_index": 325, - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "NEW_TRANSACTION", - "params": { - "block_hash": "mempool", - "block_index": 9999999, - "block_time": 1781529697.2448351, - "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - "destination": "", - "fee": 10000, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "transaction_type": "enhanced_send", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "utxos_info": " 2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f:1 2 0", - "btc_amount_normalized": "0.00000000" - }, - "timestamp": 1781529697.2448351 - } - ], - "next_cursor": null, - "result_count": 5 - }, - "/v2/mempool/events/": { - "result": [ - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "CREDIT", - "params": { - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "asset": "XCP", - "block_index": 325, - "calling_function": "send", - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - } - ], - "next_cursor": null, - "result_count": 1 - }, - "/v2/mempool/transactions//events": { - "result": [ - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "TRANSACTION_PARSED", - "params": { - "supported": true, - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142 - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "ENHANCED_SEND", - "params": { - "asset": "XCP", - "block_index": 9999999, - "destination": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "memo": null, - "msg_index": 0, - "quantity": 10000, - "send_type": "send", - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "status": "valid", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "CREDIT", - "params": { - "address": "bcrt1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn8x0h5g", - "asset": "XCP", - "block_index": 325, - "calling_function": "send", - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "DEBIT", - "params": { - "action": "send", - "address": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "asset": "XCP", - "block_index": 325, - "event": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "quantity": 10000, - "tx_index": 142, - "utxo": null, - "utxo_address": null, - "block_time": 1781529693, - "asset_info": { - "asset_longname": null, - "description": "The Counterparty protocol native currency", - "issuer": null, - "divisible": true, - "locked": true, - "owner": null - }, - "quantity_normalized": "0.00010000" - }, - "timestamp": 1781529697.2448351 - }, - { - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "event": "NEW_TRANSACTION", - "params": { - "block_hash": "mempool", - "block_index": 9999999, - "block_time": 1781529697.2448351, - "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", - "destination": "", - "fee": 10000, - "source": "bcrt1qcv6gfuqw0eay0uq4hnu4addcyt42s2qs92mguu", - "transaction_type": "enhanced_send", - "tx_hash": "2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f", - "tx_index": 142, - "utxos_info": " 2fae8e0e23d01c3137d8d773e9e6b77fb230c0de5d6606c5c4f279254af06f4f:1 2 0", - "btc_amount_normalized": "0.00000000" - }, - "timestamp": 1781529697.2448351 - } - ], - "next_cursor": null, - "result_count": 5 - }, - "/v2/healthz": { - "result": { - "status": "Healthy" - } - }, - "/healthz": { - "result": { - "status": "Healthy" - } - } -} \ No newline at end of file diff --git a/counterparty-core/counterpartycore/test/integrations/regtest/genapidoc.py b/counterparty-core/counterpartycore/test/integrations/regtest/genapidoc.py index b5f211c122..5db30ec70b 100644 --- a/counterparty-core/counterpartycore/test/integrations/regtest/genapidoc.py +++ b/counterparty-core/counterpartycore/test/integrations/regtest/genapidoc.py @@ -9,7 +9,7 @@ from counterpartycore.lib import config from counterpartycore.lib.api import routes from counterpartycore.lib.api.composer import DEPRECATED_CONSTRUCT_PARAMS -from counterpartycore.lib.utils import database +from counterpartycore.lib.utils import database, hashcodec, helpers CURR_DIR = os.path.dirname(os.path.realpath(__file__)) OPENAPI_FILE = os.path.join(CURR_DIR, "../../../../../openapi.json") @@ -418,9 +418,17 @@ def gen_events_doc(): def get_event_tx_hash(db, event_name): + # ``messages.tx_hash`` was replaced by a ``tx_index`` FK in the compact- + # hash storage migration; re-hydrate the legacy column via JOIN on + # ``transactions``. ``rowtracer`` converts BLOB(32) -> 64-char hex. cursor = db.cursor() cursor.execute( - "SELECT tx_hash FROM messages WHERE event=? ORDER BY rowid DESC LIMIT 1", + """SELECT t.tx_hash AS tx_hash + FROM messages m + LEFT JOIN transactions t ON t.tx_index = m.tx_index + WHERE m.event = ? + ORDER BY m.rowid DESC + LIMIT 1""", (event_name,), ) row = cursor.fetchone() @@ -580,9 +588,13 @@ def generate_regtest_fixtures(db): regtest_fixtures["$LAST_ORDER_BLOCK"] = row["block_index"] regtest_fixtures["$LAST_ORDER_TX_HASH"] = row["tx_hash"] - # block and tx with UTXOASSET orders + # block and tx with UTXOASSET orders. ``orders.give_asset`` now stores the + # compact ``asset_index`` (the rowtracer decodes it back to a name on read), + # so filter via the name->index subquery rather than the literal asset name. cursor.execute( - "SELECT block_index, tx_hash FROM orders WHERE give_asset='UTXOASSET' ORDER BY rowid DESC LIMIT 1" + "SELECT block_index, tx_hash FROM orders " + "WHERE give_asset=(SELECT asset_index FROM assets WHERE asset_name='UTXOASSET') " + "ORDER BY rowid DESC LIMIT 1" ) row = cursor.fetchone() regtest_fixtures["$LAST_UTXOASSET_ORDER_BLOCK"] = row["block_index"] @@ -621,9 +633,18 @@ def generate_regtest_fixtures(db): regtest_fixtures["$UTXO_1_ADDRESS_1"] = utxo - # get utxo with balance + # get utxo with balance. ``balances.asset`` now stores the compact + # ``asset_index`` (decoded back to a name by the rowtracer on read), so + # filter via the name->index subquery rather than the literal asset name. + # The ``utxo`` TEXT column was split into ``(utxo_tx_hash BLOB, utxo_vout)`` + # in the compact-storage migration; SELECT both so the rowtracer + # reconstructs ``row['utxo']`` (``tx_hash:vout``), and filter on + # ``utxo_tx_hash IS NOT NULL`` (the old ``utxo IS NOT NULL``). cursor.execute( - "SELECT utxo FROM balances WHERE utxo IS NOT NULL AND quantity > 0 AND asset='UTXOASSET' ORDER BY rowid DESC LIMIT 1" + "SELECT utxo_tx_hash, utxo_vout FROM balances " + "WHERE utxo_tx_hash IS NOT NULL AND quantity > 0 " + "AND asset=(SELECT asset_index FROM assets WHERE asset_name='UTXOASSET') " + "ORDER BY rowid DESC LIMIT 1" ) row = cursor.fetchone() regtest_fixtures["$UTXO_WITH_BALANCE"] = row["utxo"] @@ -639,14 +660,22 @@ def generate_regtest_fixtures(db): regtest_fixtures["$LAST_SWEEP_BLOCK"] = row["block_index"] regtest_fixtures["$LAST_SWEEP_TX_HASH"] = row["tx_hash"] - # block and tx with btcpay + # block and tx with btcpay. ``btcpays.order_match_id`` was replaced by the + # ``(order_match_tx0_index, order_match_tx1_index)`` FK pair in the compact + # match-id migration; re-hydrate tx0's hash via JOIN on ``transactions``. + # ``$ORDER_WITH_BTCPAY_HASH`` is just tx0's hash (the first half of the old + # composite id). ``hex_lower`` returns a hex string the rowtracer leaves as-is. cursor.execute( - "SELECT block_index, tx_hash, order_match_id FROM btcpays ORDER BY rowid DESC LIMIT 1" + """SELECT b.block_index AS block_index, b.tx_hash AS tx_hash, + hex_lower(t0.tx_hash) AS order_match_tx0_hash + FROM btcpays b + LEFT JOIN transactions t0 ON t0.tx_index = b.order_match_tx0_index + ORDER BY b.rowid DESC LIMIT 1""" ) row = cursor.fetchone() regtest_fixtures["$LAST_BTCPAY_BLOCK"] = row["block_index"] regtest_fixtures["$LAST_BTCPAY_TX_HASH"] = row["tx_hash"] - regtest_fixtures["$ORDER_WITH_BTCPAY_HASH"] = row["order_match_id"].split("_")[0] + regtest_fixtures["$ORDER_WITH_BTCPAY_HASH"] = row["order_match_tx0_hash"] # block and tx with broadcasts cursor.execute("SELECT block_index, tx_hash FROM broadcasts ORDER BY rowid DESC LIMIT 1") @@ -654,12 +683,18 @@ def generate_regtest_fixtures(db): regtest_fixtures["$LAST_BROADCAST_BLOCK"] = row["block_index"] regtest_fixtures["$LAST_BROADCAST_TX_HASH"] = row["tx_hash"] - # block and tx with order_matches - cursor.execute("SELECT block_index, id FROM order_matches ORDER BY rowid DESC LIMIT 1") + # block and tx with order_matches. The composite TEXT ``id`` was dropped in + # the compact match-id migration; reconstruct it from the BLOB + # ``tx0_hash``/``tx1_hash`` pair (mirrors ``helpers.MATCH_ID_SQL``). + # ``$ORDER_WITH_MATCH_HASH`` is just tx0's hash (the rowtracer hexifies it). + cursor.execute( + f"SELECT block_index, tx0_hash, {helpers.MATCH_ID_SQL} AS id " # noqa: S608 + "FROM order_matches ORDER BY rowid DESC LIMIT 1" + ) row = cursor.fetchone() regtest_fixtures["$LAST_ORDER_MATCH_BLOCK"] = row["block_index"] regtest_fixtures["$LAST_ORDER_MATCH_ID"] = row["id"] - regtest_fixtures["$ORDER_WITH_MATCH_HASH"] = row["id"].split("_")[0] + regtest_fixtures["$ORDER_WITH_MATCH_HASH"] = row["tx0_hash"] # block with cancels cursor.execute("SELECT block_index FROM cancels ORDER BY rowid DESC LIMIT 1") @@ -676,14 +711,25 @@ def generate_regtest_fixtures(db): row = cursor.fetchone() regtest_fixtures["$LAST_DEBIT_BLOCK"] = row["block_index"] - # transactions with events + # transactions with events. ``messages.tx_hash`` was dropped in the + # compact-hash storage migration; re-hydrate via JOIN on ``transactions``. cursor.execute( - "SELECT tx_hash, block_index FROM messages WHERE event='CREDIT' ORDER BY rowid DESC LIMIT 1" + """SELECT t.tx_hash AS tx_hash, m.block_index AS block_index + FROM messages m + LEFT JOIN transactions t ON t.tx_index = m.tx_index + WHERE m.event = 'CREDIT' + ORDER BY m.rowid DESC + LIMIT 1""" ) row = cursor.fetchone() regtest_fixtures["$LAST_EVENT_TX_HASH"] = row["tx_hash"] regtest_fixtures["$LAST_EVENT_BLOCK"] = row["block_index"] - cursor.execute("SELECT tx_index FROM transactions WHERE tx_hash=?", (row["tx_hash"],)) + # ``transactions.tx_hash`` is BLOB(32) at rest; convert the hex string + # back to BLOB for the WHERE binding. + cursor.execute( + "SELECT tx_index FROM transactions WHERE tx_hash=?", + (hashcodec.hash_to_db(row["tx_hash"]),), + ) row = cursor.fetchone() regtest_fixtures["$LAST_EVENT_TX_INDEX"] = row["tx_index"] diff --git a/counterparty-core/counterpartycore/test/mocks/bitcoind.py b/counterparty-core/counterpartycore/test/mocks/bitcoind.py index 29d75c73b3..3e97695dd1 100644 --- a/counterparty-core/counterpartycore/test/mocks/bitcoind.py +++ b/counterparty-core/counterpartycore/test/mocks/bitcoind.py @@ -12,7 +12,7 @@ from counterpartycore.lib.api import composer from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.parser import blocks, check, deserialize -from counterpartycore.lib.utils import helpers, multisig, opcodes, script +from counterpartycore.lib.utils import hashcodec, helpers, multisig, opcodes, script from ..fixtures.defaults import DEFAULT_PARAMS @@ -119,12 +119,14 @@ def dummy_tx( ): # we take an existing tx to avoid foreign key constraint errors cursor = ledger_db.cursor() + # ``transactions.source`` is the compact ``address_id`` FK after the + # address-normalization migration; resolve the address string to its id. if transaction_type is not None: - sql = "SELECT * FROM transactions WHERE source = ? AND transaction_type = ? ORDER BY rowid DESC LIMIT 1" + sql = "SELECT * FROM transactions WHERE source = (SELECT address_id FROM address_list WHERE address = ?) AND transaction_type = ? ORDER BY rowid DESC LIMIT 1" tx = cursor.execute(sql, (source, transaction_type)).fetchone() else: tx = cursor.execute( - f"SELECT * FROM transactions WHERE source = ? ORDER BY rowid {'ASC' if use_first_tx else 'DESC'} LIMIT 1", # noqa S608 + f"SELECT * FROM transactions WHERE source = (SELECT address_id FROM address_list WHERE address = ?) ORDER BY rowid {'ASC' if use_first_tx else 'DESC'} LIMIT 1", # noqa S608 (source,), ).fetchone() @@ -197,7 +199,8 @@ def sendrawtransaction(db, rawtransaction): mine_block(db, [decoded_tx]) cursor = db.cursor() transaction = cursor.execute( - "SELECT * FROM transactions WHERE tx_hash = ?", (decoded_tx["tx_id"],) + "SELECT * FROM transactions WHERE tx_hash = ?", + (hashcodec.hash_to_db(decoded_tx["tx_id"]),), ).fetchone() assert transaction is not None diff --git a/counterparty-core/counterpartycore/test/mocks/counterpartydbs.py b/counterparty-core/counterpartycore/test/mocks/counterpartydbs.py index bfbf3bf796..f53089f1d4 100644 --- a/counterparty-core/counterpartycore/test/mocks/counterpartydbs.py +++ b/counterparty-core/counterpartycore/test/mocks/counterpartydbs.py @@ -11,7 +11,7 @@ from counterpartycore.lib.cli.main import arg_parser from counterpartycore.lib.ledger import caches from counterpartycore.lib.ledger.currentstate import CurrentState -from counterpartycore.lib.utils import database, helpers +from counterpartycore.lib.utils import database, hashcodec, helpers from ..fixtures.defaults import DEFAULT_PARAMS from ..fixtures.ledgerdb import UNITTEST_FIXTURE @@ -182,6 +182,19 @@ def empty_ledger_db(build_dbs): os.remove(config.DATABASE) +# Tables where a legacy ``*_tx_hash`` (or ``offer_hash``) column has been +# replaced by an integer ``*_tx_index`` foreign key. The mock test helper +# below rewrites legacy hex-hash filters to the new FK form via a subquery +# on ``transactions`` so existing test fixtures keep working unchanged. +_LEGACY_HASH_TO_TX_INDEX_FK = { + "cancels": {"offer_hash": ("offer_tx_index", "transactions")}, + "dispenses": {"dispenser_tx_hash": ("dispenser_tx_index", "transactions")}, + "dispenser_refills": {"dispenser_tx_hash": ("dispenser_tx_index", "transactions")}, + "fairmints": {"fairminter_tx_hash": ("fairminter_tx_index", "transactions")}, + "pool_matches": {"order_tx_hash": ("order_tx_index", "transactions")}, +} + + def check_record(ledger_db, record): """Allow direct record access to the db.""" cursor = ledger_db.cursor() @@ -192,21 +205,56 @@ def check_record(ledger_db, record): value = cursor.execute(sql).fetchall()[0][field] assert value == record["value"] else: - sql = f"SELECT COUNT(*) AS count FROM {record['table']} WHERE " # noqa: S608 # nosec B608 + table = record["table"] + legacy_map = _LEGACY_HASH_TO_TX_INDEX_FK.get(table, {}) + sql = f"SELECT COUNT(*) AS count FROM {table} WHERE " # noqa: S608 # nosec B608 bindings = [] conditions = [] fields = [] for field in record["values"]: if record["values"][field] is not None: fields.append(field) - conditions.append(f"{field} = ?") - bindings.append(record["values"][field]) + value = record["values"][field] + if field in legacy_map: + new_col, fk_table = legacy_map[field] + conditions.append( + f"{new_col} = (SELECT tx_index FROM {fk_table} WHERE tx_hash = ?)" # nosec B608 # noqa: S608 + ) + if isinstance(value, str): + value = hashcodec.hash_to_db(value) + elif field in database.ASSET_INDEX_COLUMN_NAMES and isinstance(value, str): + # Asset-name columns are stored as the compact asset_index; + # resolve the expected name to its index for the match. + conditions.append( + f"{field} = (SELECT asset_index FROM assets WHERE asset_name = ?)" # nosec B608 # noqa: S608 + ) + elif field in database.ADDRESS_INDEX_COLUMN_NAMES and isinstance(value, str): + # Address columns are stored as the compact address_id; + # resolve the expected address to its id for the match. + conditions.append( + f"{field} = (SELECT address_id FROM address_list WHERE address = ?)" # nosec B608 # noqa: S608 + ) + elif field == "utxo" and isinstance(value, str): + # ``utxo`` (``tx_hash:vout``) is stored as the compact + # ``(utxo_tx_hash BLOB, utxo_vout)`` pair; split it. + tx_hash_hex, _, vout = value.partition(":") + conditions.append("utxo_tx_hash = ? AND utxo_vout = ?") + bindings.append(hashcodec.hash_to_db(tx_hash_hex)) + value = int(vout) + else: + conditions.append(f"{field} = ?") + if field in hashcodec.HASH_COLUMN_NAMES and isinstance(value, str): + value = hashcodec.hash_to_db(value) + bindings.append(value) sql += " AND ".join(conditions) count = cursor.execute(sql, tuple(bindings)).fetchone()["count"] ok = (record.get("not", False) and count == 0) or count == 1 if not ok: + # ``SELECT *`` (not the record's fields) so the rowtracer can + # reconstruct virtual columns like ``utxo`` (stored as the + # ``(utxo_tx_index, utxo_vout)`` pair) and decode address/asset ids. last_record = cursor.execute( - f"SELECT {', '.join(fields)} FROM {record['table']} ORDER BY rowid DESC LIMIT 1" # noqa: S608 # nosec B608 + f"SELECT * FROM {record['table']} ORDER BY rowid DESC LIMIT 1" # noqa: S608 # nosec B608 ).fetchone() print("test output", helpers.to_json(last_record, sort_keys=True)) print("expected output", helpers.to_json(record["values"], sort_keys=True)) diff --git a/counterparty-core/counterpartycore/test/units/api/apiserver_test.py b/counterparty-core/counterpartycore/test/units/api/apiserver_test.py index 5a24ce4d70..4fe0088b3c 100644 --- a/counterparty-core/counterpartycore/test/units/api/apiserver_test.py +++ b/counterparty-core/counterpartycore/test/units/api/apiserver_test.py @@ -7,7 +7,7 @@ from counterpartycore.lib.api.routes import ALL_ROUTES, ROUTES from counterpartycore.lib.messages import dispense, dividend, sweep from counterpartycore.lib.parser import blocks -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.utils import hashcodec, helpers from counterpartycore.test.mocks.counterpartydbs import ProtocolChangesDisabled @@ -163,7 +163,7 @@ def prepare_url(db, current_block_index, defaults, rawtransaction, route): "SELECT tx_hash, tx_index, block_index FROM transactions ORDER BY rowid DESC LIMIT 1" ).fetchone() utxo_with_balance = db.execute( - "SELECT * FROM balances WHERE utxo IS NOT null AND quantity > 0 ORDER BY rowid DESC LIMIT 1" + "SELECT * FROM balances WHERE utxo_tx_hash IS NOT null AND quantity > 0 ORDER BY rowid DESC LIMIT 1" ).fetchone() last_dispenser = db.execute("SELECT * FROM dispensers ORDER BY rowid DESC LIMIT 1").fetchone() last_order = db.execute("SELECT * FROM orders ORDER BY rowid DESC LIMIT 1").fetchone() @@ -417,7 +417,17 @@ def test_get_dispense(ledger_db, apiv2_client, blockchain_mock, defaults, curren with ProtocolChangesDisabled(["multiple_dispenses"]): dispense.parse(ledger_db, tx) - dispenses = ledger_db.execute("SELECT * FROM dispenses ORDER BY rowid DESC LIMIT 1").fetchone() + # ``dispenses.dispenser_tx_hash`` has been dropped from storage and + # replaced by a ``dispenser_tx_index`` FK. Re-expose the legacy hash via a + # ``LEFT JOIN`` against ``transactions`` so the test continues to read + # both ``tx_hash`` (the dispense tx) and ``dispenser_tx_hash`` (the + # dispenser tx) like before. + dispenses = ledger_db.execute( + """SELECT d.*, t.tx_hash AS dispenser_tx_hash + FROM dispenses d + LEFT JOIN transactions t ON t.tx_index = d.dispenser_tx_index + ORDER BY d.rowid DESC LIMIT 1""" + ).fetchone() url = f"/v2/dispenses/{dispenses['tx_hash']}" result = apiv2_client.get(url).json @@ -814,23 +824,22 @@ def test_get_transactions_valid(apiv2_client, monkeypatch): def test_transaction_valid_flag_without_verbose(apiv2_client, ledger_db): last_tx = ledger_db.execute( - "SELECT tx_index, block_index, block_hash, block_time FROM transactions ORDER BY tx_index DESC LIMIT 1" + "SELECT tx_index, block_index, block_time FROM transactions ORDER BY tx_index DESC LIMIT 1" ).fetchone() tx_index = last_tx["tx_index"] + 1 tx_hash = "f" * 64 ledger_db.execute( """ INSERT INTO transactions( - tx_index, tx_hash, block_index, block_hash, block_time, source, destination, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( tx_index, - tx_hash, + hashcodec.hash_to_db(tx_hash), last_tx["block_index"], - last_tx["block_hash"], last_tx["block_time"], "source", "", diff --git a/counterparty-core/counterpartycore/test/units/api/apiwatcher_test.py b/counterparty-core/counterpartycore/test/units/api/apiwatcher_test.py index cc09108474..6aec563209 100644 --- a/counterparty-core/counterpartycore/test/units/api/apiwatcher_test.py +++ b/counterparty-core/counterpartycore/test/units/api/apiwatcher_test.py @@ -199,6 +199,70 @@ def test_update_assets_info_skips_invalid_status(state_db): assert row["description"] == original_desc +def test_pool_events_in_update_events_id_fields(): + assert "POOL_UPDATE" in apiwatcher.UPDATE_EVENTS_ID_FIELDS + assert apiwatcher.UPDATE_EVENTS_ID_FIELDS["POOL_UPDATE"] == ["asset_a", "asset_b"] + + +def test_pool_events_in_events_address_fields(): + for event in ( + "OPEN_POOL", + "POOL_UPDATE", + "NEW_POOL_DEPOSIT", + "NEW_POOL_WITHDRAWAL", + "POOL_MATCH", + ): + assert event in apiwatcher.EVENTS_ADDRESS_FIELDS + + +def test_pool_tables_in_state_db_tables(): + for table in ("pools", "pool_deposits", "pool_withdrawals", "pool_matches"): + assert table in apiwatcher.STATE_DB_TABLES + + +def test_update_address_events_skips_unknown_event(state_db): + event = {"event": "UNKNOWN_EVENT_XYZ", "bindings": "{}"} + apiwatcher.update_address_events(state_db, event) # should not raise + + +def test_update_assets_info_no_description_locked(state_db): + """description_locked absent from bindings -> column not updated.""" + cursor = state_db.cursor() + asset_row = cursor.execute( + "SELECT asset, description_locked FROM assets_info WHERE asset NOT IN ('XCP', 'BTC') LIMIT 1" + ).fetchone() + if asset_row is None: + return + asset = asset_row["asset"] + original = bool(asset_row["description_locked"]) + + event = { + "event": "ASSET_ISSUANCE", + "bindings": json.dumps( + { + "status": "valid", + "asset": asset, + "asset_longname": None, + "asset_id": "1", + "issuer": "addr", + "divisible": True, + "description": "x", + "mime_type": "text/plain", + "quantity": 0, + "block_index": 200, + "locked": False, + "fee_paid": 0, + } + ), + } + apiwatcher.update_assets_info(state_db, event) + + row = cursor.execute( + "SELECT description_locked FROM assets_info WHERE asset = ?", (asset,) + ).fetchone() + assert bool(row["description_locked"]) == original + + def test_events_address_fields_keys_are_lowercase_underscore(): """Defensive: every field name listed in EVENTS_ADDRESS_FIELDS must look like a real binding key (lowercase + underscores). This would diff --git a/counterparty-core/counterpartycore/test/units/api/compose_test.py b/counterparty-core/counterpartycore/test/units/api/compose_test.py index 29f63d6ee3..d059c8e395 100644 --- a/counterparty-core/counterpartycore/test/units/api/compose_test.py +++ b/counterparty-core/counterpartycore/test/units/api/compose_test.py @@ -44,9 +44,12 @@ def test_compose_broadcast(apiv2_client, defaults): def test_compose_btcpay(apiv2_client, defaults, ledger_db): """Test compose_btcpay function via API.""" - # Get an existing order match from the database + # Get an existing order match from the database. The composite TEXT ``id`` + # was dropped from match tables; reconstruct it from the kept + # ``tx0_hash``/``tx1_hash`` BLOB columns. order_match = ledger_db.execute( - "SELECT id FROM order_matches WHERE status = 'pending' LIMIT 1" + "SELECT hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS id " + "FROM order_matches WHERE status = 'pending' LIMIT 1" ).fetchone() if order_match: address = defaults["addresses"][0] @@ -569,8 +572,8 @@ def test_compose_multiple_detach_includes_all_utxos(ledger_db, defaults): the balance-bearing UTXO is selected as the validation source.""" script_pub_key = "76a9144838d8b3588c4c7ba7c1d06f866e9b3739c6303788ac" utxo_with_balance = ledger_db.execute(""" - SELECT utxo FROM balances - WHERE quantity > 0 AND utxo IS NOT NULL + SELECT utxo_tx_hash, utxo_vout FROM balances + WHERE quantity > 0 AND utxo_tx_hash IS NOT NULL ORDER BY rowid DESC LIMIT 1 """).fetchone()["utxo"] # A UTXO without any balance, listed first to ensure the source-selection diff --git a/counterparty-core/counterpartycore/test/units/api/composer_test.py b/counterparty-core/counterpartycore/test/units/api/composer_test.py index a7917b335e..4d27c5f215 100644 --- a/counterparty-core/counterpartycore/test/units/api/composer_test.py +++ b/counterparty-core/counterpartycore/test/units/api/composer_test.py @@ -721,7 +721,7 @@ def test_ensure_utxo_is_first(defaults, monkeypatch): def test_filter_utxos_with_balances(ledger_db, defaults): utxo_with_balance = ledger_db.execute(""" - SELECT utxo FROM balances WHERE quantity > 0 AND utxo IS NOT NULL ORDER BY rowid DESC LIMIT 1 + SELECT utxo_tx_hash, utxo_vout FROM balances WHERE quantity > 0 AND utxo_tx_hash IS NOT NULL ORDER BY rowid DESC LIMIT 1 """).fetchone()["utxo"] txid, vout = utxo_with_balance.split(":") @@ -2106,7 +2106,7 @@ def test_compose_enhanced_send(ledger_db, defaults, monkeypatch): def test_compose_move(ledger_db, defaults): utxo_with_balance = ledger_db.execute(""" - SELECT utxo FROM balances WHERE quantity > 0 AND utxo IS NOT NULL ORDER BY rowid DESC LIMIT 1 + SELECT utxo_tx_hash, utxo_vout FROM balances WHERE quantity > 0 AND utxo_tx_hash IS NOT NULL ORDER BY rowid DESC LIMIT 1 """).fetchone()["utxo"] # Test basic move params = { @@ -2440,7 +2440,7 @@ def test_utxolocks_custom_input(ledger_db): def test_compose_detach(ledger_db, defaults): utxo_with_balance = ledger_db.execute(""" - SELECT utxo FROM balances WHERE quantity > 0 AND utxo IS NOT NULL ORDER BY rowid DESC LIMIT 1 + SELECT utxo_tx_hash, utxo_vout FROM balances WHERE quantity > 0 AND utxo_tx_hash IS NOT NULL ORDER BY rowid DESC LIMIT 1 """).fetchone()["utxo"] # Test basic move params = { diff --git a/counterparty-core/counterpartycore/test/units/api/dbbuilder_test.py b/counterparty-core/counterpartycore/test/units/api/dbbuilder_test.py index 2f2b384b5c..6688b3dad7 100644 --- a/counterparty-core/counterpartycore/test/units/api/dbbuilder_test.py +++ b/counterparty-core/counterpartycore/test/units/api/dbbuilder_test.py @@ -1,4 +1,5 @@ from counterpartycore.lib.api import dbbuilder +from counterpartycore.lib.utils import hashcodec # ============================================================================= # Tests for migration rollback functions @@ -275,10 +276,19 @@ def test_consolidated_balances(state_db, ledger_db, apiv2_client): ) ledger_balances = ledger_db.execute( - "SELECT *, MAX(rowid) FROM balances GROUP BY address, asset ORDER BY asset, address" + "SELECT *, MAX(rowid) FROM balances GROUP BY address, asset" ).fetchall() - api_balances = state_db.execute("SELECT * FROM balances ORDER BY asset, address").fetchall() + api_balances = state_db.execute("SELECT * FROM balances").fetchall() assert len(ledger_balances) == len(api_balances) + + # The Ledger DB stores the compact ``asset_index`` (so SQL ``ORDER BY asset`` + # sorts by index) while the State DB stores asset names; both decode to the + # same names on read, so align the two lists by (name, address, utxo). + def _balance_key(b): + return (b["asset"] or "", b["address"] or "", b["utxo"] or "") + + ledger_balances = sorted(ledger_balances, key=_balance_key) + api_balances = sorted(api_balances, key=_balance_key) for ledger_balance, api_balance in zip(ledger_balances, api_balances, strict=True): assert ledger_balance["address"] == api_balance["address"] assert ledger_balance["asset"] == api_balance["asset"] @@ -308,7 +318,8 @@ def test_consolidated_orders(state_db, ledger_db, apiv2_client): ).fetchall() for ledger_order in ledger_orders: api_order = state_db.execute( - "SELECT * FROM orders WHERE tx_hash = ?", (ledger_order["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ?", + (hashcodec.hash_to_db(ledger_order["tx_hash"]),), ).fetchone() assert ledger_order["status"] == api_order["status"] assert ledger_order["give_asset"] == api_order["give_asset"] @@ -326,8 +337,13 @@ def test_consolidated_orders(state_db, ledger_db, apiv2_client): def test_consolidated_order_matches(state_db, ledger_db, apiv2_client): + # The composite TEXT ``id`` was dropped from match tables; reconstruct it + # from the kept ``tx0_hash``/``tx1_hash`` BLOB columns and key by the + # ``(tx0_index, tx1_index)`` pair. + match_id_sql = "hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash)" sql_ledger = ( - "SELECT count(*) AS count FROM (SELECT *, MAX(rowid) FROM order_matches GROUP BY id)" + "SELECT count(*) AS count FROM " + "(SELECT *, MAX(rowid) FROM order_matches GROUP BY tx0_index, tx1_index)" ) sql_api = "SELECT count(*) AS count FROM order_matches" assert ( @@ -336,9 +352,12 @@ def test_consolidated_order_matches(state_db, ledger_db, apiv2_client): ) ledger_order_matches = ledger_db.execute( - "SELECT *, MAX(rowid) FROM order_matches GROUP BY id ORDER BY id" + f"SELECT *, {match_id_sql} AS id, MAX(rowid) FROM order_matches " # noqa: S608 + "GROUP BY tx0_index, tx1_index ORDER BY id" + ).fetchall() + api_order_matches = state_db.execute( + f"SELECT *, {match_id_sql} AS id FROM order_matches ORDER BY id" # noqa: S608 ).fetchall() - api_order_matches = state_db.execute("SELECT * FROM order_matches ORDER BY id").fetchall() assert len(ledger_order_matches) == len(api_order_matches) for ledger_order_match, api_order_match in zip( ledger_order_matches, api_order_matches, strict=True diff --git a/counterparty-core/counterpartycore/test/units/api/queries_test.py b/counterparty-core/counterpartycore/test/units/api/queries_test.py index cf9520789f..5f7a9640a9 100644 --- a/counterparty-core/counterpartycore/test/units/api/queries_test.py +++ b/counterparty-core/counterpartycore/test/units/api/queries_test.py @@ -8,6 +8,7 @@ import pytest from counterpartycore.lib import config from counterpartycore.lib.api import queries, routes, verbose +from counterpartycore.lib.utils import hashcodec # ============================================================================= # Tests for select_rows function - where clause handling @@ -196,28 +197,36 @@ def test_select_rows_with_unsupported_sort_field(state_db): def _insert_quantitative_sort_fixtures(ledger_db): """Insert two rows per quantitative table (quantities 10 then 20) used by the sort tests.""" - block_hash = ledger_db.execute( - "SELECT block_hash FROM blocks WHERE block_index = 101" - ).fetchone()["block_hash"] + # Asset columns store the compact asset_index, so register the synthetic + # assets and reference them by index in the INSERTs below. + for idx, asset_name in enumerate(("SORTSEND", "SORTISSUE", "SORTDISP", "SORTDIV"), start=1): + ledger_db.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name) VALUES (?, ?)", + (str(900000 + idx), asset_name), + ) + # Address columns store the compact address_id; register the synthetic + # addresses so address filters (e.g. broadcasts.source) resolve. + for addr in ("source", "dest", "issuer", "sort-source"): + ledger_db.execute("INSERT OR IGNORE INTO address_list (address) VALUES (?)", (addr,)) ledger_db.executemany( """ INSERT INTO transactions ( - tx_index, tx_hash, block_index, block_hash, block_time, source, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, [ - (900001, "a" * 64, 101, block_hash, 1, "source", "dest", 0, 0, b"", 1, "", "send"), - (900002, "b" * 64, 101, block_hash, 2, "source", "dest", 0, 0, b"", 1, "", "send"), - (900003, "c" * 64, 101, block_hash, 3, "source", "dest", 0, 0, b"", 1, "", "issuance"), - (900004, "d" * 64, 101, block_hash, 4, "source", "dest", 0, 0, b"", 1, "", "issuance"), - (900005, "e" * 64, 101, block_hash, 5, "source", "dest", 0, 0, b"", 1, "", "broadcast"), - (900006, "f" * 64, 101, block_hash, 6, "source", "dest", 0, 0, b"", 1, "", "broadcast"), - (900007, "1" * 64, 101, block_hash, 7, "source", "dest", 0, 0, b"", 1, "", "dispense"), - (900008, "3" * 64, 101, block_hash, 8, "source", "dest", 0, 0, b"", 1, "", "dispense"), - (900009, "5" * 64, 101, block_hash, 9, "source", "dest", 0, 0, b"", 1, "", "dividend"), - (900010, "6" * 64, 101, block_hash, 10, "source", "dest", 0, 0, b"", 1, "", "dividend"), + (900001, "a" * 64, 101, 1, "source", "dest", 0, 0, b"", 1, "", "send"), + (900002, "b" * 64, 101, 2, "source", "dest", 0, 0, b"", 1, "", "send"), + (900003, "c" * 64, 101, 3, "source", "dest", 0, 0, b"", 1, "", "issuance"), + (900004, "d" * 64, 101, 4, "source", "dest", 0, 0, b"", 1, "", "issuance"), + (900005, "e" * 64, 101, 5, "source", "dest", 0, 0, b"", 1, "", "broadcast"), + (900006, "f" * 64, 101, 6, "source", "dest", 0, 0, b"", 1, "", "broadcast"), + (900007, "1" * 64, 101, 7, "source", "dest", 0, 0, b"", 1, "", "dispense"), + (900008, "3" * 64, 101, 8, "source", "dest", 0, 0, b"", 1, "", "dispense"), + (900009, "5" * 64, 101, 9, "source", "dest", 0, 0, b"", 1, "", "dividend"), + (900010, "6" * 64, 101, 10, "source", "dest", 0, 0, b"", 1, "", "dividend"), ], ) ledger_db.executemany( @@ -225,7 +234,7 @@ def _insert_quantitative_sort_fixtures(ledger_db): INSERT INTO sends ( tx_index, tx_hash, block_index, source, destination, asset, quantity, status, msg_index, fee_paid, send_type - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, (SELECT asset_index FROM assets WHERE asset_name = ?), ?, ?, ?, ?, ?) """, [ (900001, "a" * 64, 101, "source", "dest", "SORTSEND", 10, "valid", 0, 1, "send"), @@ -237,7 +246,7 @@ def _insert_quantitative_sort_fixtures(ledger_db): INSERT INTO issuances ( tx_index, tx_hash, msg_index, block_index, asset, quantity, source, issuer, fee_paid, status - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, (SELECT asset_index FROM assets WHERE asset_name = ?), ?, ?, ?, ?, ?) """, [ (900003, "c" * 64, 0, 101, "SORTISSUE", 10, "source", "issuer", 1, "valid"), @@ -249,7 +258,7 @@ def _insert_quantitative_sort_fixtures(ledger_db): INSERT INTO broadcasts ( tx_index, tx_hash, block_index, source, timestamp, value, fee_fraction_int, text, locked, status - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, (SELECT address_id FROM address_list WHERE address = ?), ?, ?, ?, ?, ?, ?) """, [ (900005, "e" * 64, 101, "sort-source", 1, 1.0, 1, "low", 0, "valid"), @@ -260,12 +269,12 @@ def _insert_quantitative_sort_fixtures(ledger_db): """ INSERT INTO dispenses ( tx_index, dispense_index, tx_hash, block_index, source, - destination, asset, dispense_quantity, dispenser_tx_hash, btc_amount - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + destination, asset, dispense_quantity, dispenser_tx_index, btc_amount + ) VALUES (?, ?, ?, ?, ?, ?, (SELECT asset_index FROM assets WHERE asset_name = ?), ?, ?, ?) """, [ - (900007, 0, "1" * 64, 101, "source", "dest", "SORTDISP", 10, "2" * 64, 1), - (900008, 0, "3" * 64, 101, "source", "dest", "SORTDISP", 20, "4" * 64, 2), + (900007, 0, "1" * 64, 101, "source", "dest", "SORTDISP", 10, 900001, 1), + (900008, 0, "3" * 64, 101, "source", "dest", "SORTDISP", 20, 900002, 2), ], ) ledger_db.executemany( @@ -273,7 +282,8 @@ def _insert_quantitative_sort_fixtures(ledger_db): INSERT INTO dividends ( tx_index, tx_hash, block_index, source, asset, dividend_asset, quantity_per_unit, fee_paid, status - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, (SELECT asset_index FROM assets WHERE asset_name = ?), + (SELECT asset_index FROM assets WHERE asset_name = ?), ?, ?, ?) """, [ (900009, "5" * 64, 101, "source", "SORTDIV", "XCP", 10, 1, "valid"), @@ -443,8 +453,15 @@ def test_get_address_options(ledger_db, defaults): } address_with_options = defaults["addresses"][6] + # ``addresses.address`` is now the compact ``address_id`` FK; register the + # address in ``address_list`` and store its id (the API resolves the filter + # to the id too). + ledger_db.execute( + "INSERT OR IGNORE INTO address_list (address) VALUES (?)", (address_with_options,) + ) ledger_db.execute( - "INSERT INTO addresses (address, options, block_index) VALUES (?, ?, ?)", + "INSERT INTO addresses (address, options, block_index) " + "VALUES ((SELECT address_id FROM address_list WHERE address = ?), ?, ?)", (address_with_options, config.ADDRESS_OPTION_REQUIRE_MEMO, 123), ) @@ -514,7 +531,7 @@ def test_get_transactions_by_addresses_with_valid_filter(ledger_db, defaults): def test_transaction_queries_return_zero_btc_amount_for_null(ledger_db, current_block_index): """Test transaction endpoints do not expose null btc_amount values.""" block = ledger_db.execute( - "SELECT block_hash, block_time FROM blocks WHERE block_index = ?", + "SELECT block_time FROM blocks WHERE block_index = ?", (current_block_index,), ).fetchone() tx_index = ( @@ -526,14 +543,13 @@ def test_transaction_queries_return_zero_btc_amount_for_null(ledger_db, current_ tx_hash = "ab" * 32 ledger_db.execute( """INSERT INTO transactions( - tx_index, tx_hash, block_index, block_hash, block_time, source, destination, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", ( tx_index, - tx_hash, + hashcodec.hash_to_db(tx_hash), current_block_index, - block["block_hash"], block["block_time"], "", "", @@ -1657,3 +1673,176 @@ def test_get_pool_quote_withdraw_case_insensitive(state_db): lower = queries.get_pool_quote_withdraw(state_db, "poolasseta", "poolassetb", 1_000_000) assert upper == lower assert lower["pool_exists"] is True + + +# ============================================================================= +# Tests for the COUNT(*) fast-path optimization +# These verify that ``result_count`` stays accurate when ``select_rows`` +# bypasses the legacy wrap-COUNT and counts from the underlying table. +# ============================================================================= + + +def test_get_pool_deposits_by_block(ledger_db, current_block_index): + result = queries.get_pool_deposits_by_block(ledger_db, current_block_index) + assert result is not None + + +def test_get_pool_withdrawals_by_block(ledger_db, current_block_index): + result = queries.get_pool_withdrawals_by_block(ledger_db, current_block_index) + assert result is not None + + +def test_get_pool_matches_by_block(ledger_db, current_block_index): + result = queries.get_pool_matches_by_block(ledger_db, current_block_index) + assert result is not None + + +def test_get_pool_matches_by_order(state_db): + result = queries.get_pool_matches_by_order(state_db, "nonexistent_hash") + assert result is not None + + +def test_get_pool_deposits_by_address_with_cursor(state_db, defaults): + result = queries.get_pool_deposits_by_address(state_db, defaults["addresses"][0], cursor=999) + assert result is not None + + +def test_get_pool_withdrawals_by_address_with_cursor(state_db, defaults): + result = queries.get_pool_withdrawals_by_address(state_db, defaults["addresses"][0], cursor=999) + assert result is not None + + +def test_get_pool_quote_no_pool_with_orders(state_db): + """Book-only path: no pool but orders might exist.""" + result = queries.get_pool_quote(state_db, "XCP", "DIVISIBLE", 1_000_000) + assert "pool_exists" in result + assert result["pool_exists"] is False + + +def test_get_pools_with_sort(state_db): + result = queries.get_pools(state_db, sort="reserve_a:desc") + assert result is not None + + +def test_get_all_pool_matches_with_sort(state_db): + result = queries.get_all_pool_matches(state_db, sort="forward_quantity:asc") + assert result is not None + + +def test_count_fast_path_messages_no_tx_hash_filter(ledger_db): + """Counting ``messages`` without a tx_hash filter uses the no-JOIN + fast-path; the count must still match a row-by-row tally.""" + page = queries.select_rows( + ledger_db, + "messages", + limit=10, + select="message_index AS event_index, event, tx_hash, block_index", + ) + cursor = ledger_db.cursor() + actual = cursor.execute("SELECT COUNT(*) AS c FROM messages").fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_messages_with_event_filter(ledger_db): + """Event filter on ``messages`` exercises the no-JOIN fast-path with + a non-trivial WHERE clause.""" + page = queries.select_rows( + ledger_db, + "messages", + where={"event": "CREDIT"}, + limit=10, + select="message_index AS event_index, event, tx_hash, block_index", + ) + cursor = ledger_db.cursor() + actual = cursor.execute( + "SELECT COUNT(*) AS c FROM messages WHERE event = ?", ("CREDIT",) + ).fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_messages_with_tx_hash_filter(ledger_db, defaults): + """Filtering by ``tx_hash`` forces the JOIN path; ensure the wrap-COUNT + fallback still returns the correct count.""" + sample_tx = ledger_db.cursor().execute("SELECT tx_hash FROM transactions LIMIT 1").fetchone() + if not sample_tx: + return + tx_hash = sample_tx["tx_hash"] + page = queries.select_rows( + ledger_db, + "messages", + where={"tx_hash": tx_hash}, + limit=10, + select="message_index AS event_index, event, tx_hash, block_index", + ) + # No assertion on the exact value other than "matches reality". + cursor = ledger_db.cursor() + blob = bytes.fromhex(tx_hash) + actual = cursor.execute( + "SELECT COUNT(*) AS c FROM messages WHERE tx_index = (SELECT tx_index FROM transactions WHERE tx_hash = ?)", + (blob,), + ).fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_hash_fk_table(ledger_db): + """Counting a ``_HASH_FK_PROJECTIONS`` table skips the legacy hash JOIN.""" + page = queries.select_rows(ledger_db, "dispenses", limit=10) + cursor = ledger_db.cursor() + actual = cursor.execute("SELECT COUNT(*) AS c FROM dispenses").fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_transactions_with_status_override(ledger_db): + """``transactions_with_status`` filter on a column that exists on + ``transactions`` itself uses the underlying-table COUNT override.""" + page = queries.select_rows( + ledger_db, + "transactions_with_status", + where={"transaction_type": "send"}, + limit=10, + ) + cursor = ledger_db.cursor() + actual = cursor.execute( + "SELECT COUNT(*) AS c FROM transactions WHERE transaction_type = ?", ("send",) + ).fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_transactions_with_status_with_valid(ledger_db): + """When the filter references the ``valid`` column (only on + ``transactions_status``), the override is rejected and we fall back to + the wrap-COUNT path.""" + page = queries.select_rows( + ledger_db, + "transactions_with_status", + where={"valid": True}, + limit=10, + ) + cursor = ledger_db.cursor() + actual = cursor.execute( + "SELECT COUNT(*) AS c FROM transactions t " + "LEFT JOIN transactions_status ts ON t.tx_index = ts.tx_index " + "WHERE ts.valid = ?", + (True,), + ).fetchone()["c"] + assert page.result_count == actual + + +def test_count_fast_path_group_by_falls_back(ledger_db): + """``group_by`` callers must keep the wrap-COUNT semantics so the + returned count reflects the number of *groups*, not the number of + pre-group rows.""" + page = queries.select_rows( + ledger_db, + "messages", + where={"block_index": 310000}, + select="event, COUNT(*) AS event_count", + group_by="event", + cursor_field="event", + ) + cursor = ledger_db.cursor() + actual = cursor.execute( + "SELECT COUNT(*) AS c FROM (SELECT event FROM messages WHERE block_index = ? GROUP BY event)", + (310000,), + ).fetchone()["c"] + assert page.result_count == actual diff --git a/counterparty-core/counterpartycore/test/units/cli/server_test.py b/counterparty-core/counterpartycore/test/units/cli/server_test.py index 3cab81faa8..61037c956e 100644 --- a/counterparty-core/counterpartycore/test/units/cli/server_test.py +++ b/counterparty-core/counterpartycore/test/units/cli/server_test.py @@ -231,6 +231,7 @@ def __exit__(self, exc_type, exc, tb): def test_vacuum(monkeypatch): ledger_db = MagicMock() + state_db = MagicMock() class DummySpinner: def __init__(self, _message): @@ -243,12 +244,15 @@ def __exit__(self, exc_type, exc, tb): return False monkeypatch.setattr(server.database, "initialise_db", MagicMock(return_value=ledger_db)) + monkeypatch.setattr(server.database, "get_db_connection", MagicMock(return_value=state_db)) monkeypatch.setattr(server.database, "vacuum", MagicMock()) monkeypatch.setattr(server.log, "Spinner", DummySpinner) server.vacuum() - server.database.vacuum.assert_called_once_with(ledger_db) + assert server.database.vacuum.call_count == 2 + server.database.vacuum.assert_any_call(ledger_db) + server.database.vacuum.assert_any_call(state_db) def test_show_params(monkeypatch, capsys): diff --git a/counterparty-core/counterpartycore/test/units/ledger/address_normalization_test.py b/counterparty-core/counterpartycore/test/units/ledger/address_normalization_test.py new file mode 100644 index 0000000000..76f30bf8db --- /dev/null +++ b/counterparty-core/counterpartycore/test/units/ledger/address_normalization_test.py @@ -0,0 +1,63 @@ +"""Tests for the address normalization + utxo compaction read path +(``utils.database`` resolvers, bounded LRU caches, and the rowtracer's +transparent ``address_id``->string decode and ``utxo`` reconstruction).""" + +from counterpartycore.lib.utils import database + + +def test_address_resolve_roundtrip(ledger_db): + row = ledger_db.execute("SELECT address_id, address FROM address_list LIMIT 1").fetchone() + addr_id, addr = row["address_id"], row["address"] + assert database.address_index_from_name(ledger_db, addr) == addr_id + assert database.address_string_from_index(ledger_db, addr_id) == addr + # an unregistered address resolves to None (stored as NULL) + assert ( + database.address_index_from_name(ledger_db, "1NeverSeenAddrZZZZZZZZZZZZZZZZZZZZZ") is None + ) + + +def test_address_cache_lru_bounded(ledger_db, monkeypatch): + database.reset_address_caches(ledger_db) + monkeypatch.setattr(database, "ADDRESS_CACHE_MAXSIZE", 3) + rows = ledger_db.execute("SELECT address_id, address FROM address_list LIMIT 10").fetchall() + assert len(rows) >= 4, "fixture needs several addresses to exercise eviction" + for r in rows: + database.address_string_from_index(ledger_db, r["address_id"]) + cache = database._ADDRESS_STRING_BY_INDEX.get(ledger_db) # noqa: SLF001 + assert cache is not None and len(cache) <= 3 + # evicted entries still re-resolve correctly from the DB + for r in rows: + assert database.address_string_from_index(ledger_db, r["address_id"]) == r["address"] + database.reset_address_caches(ledger_db) + + +def test_reset_address_caches(ledger_db): + row = ledger_db.execute("SELECT address FROM address_list LIMIT 1").fetchone() + database.address_index_from_name(ledger_db, row["address"]) + assert database._ADDRESS_INDEX_BY_STRING.get(ledger_db) # noqa: SLF001 + database.reset_address_caches(ledger_db) + assert database._ADDRESS_INDEX_BY_STRING.get(ledger_db) is None # noqa: SLF001 + + +def test_rowtracer_decodes_address(ledger_db): + # a stored INTEGER address_id comes back as the address string + row = ledger_db.execute( + "SELECT source FROM transactions WHERE source IS NOT NULL LIMIT 1" + ).fetchone() + assert isinstance(row["source"], str) + assert database.address_index_from_name(ledger_db, row["source"]) is not None + + +def test_utxo_balance_reconstructed(ledger_db): + # the scenario attaches assets to UTXOs; reading a utxo balance reconstructs + # the ``tx_hash:vout`` string from the stored (utxo_tx_hash BLOB, utxo_vout). + row = ledger_db.execute( + "SELECT * FROM balances WHERE utxo_tx_hash IS NOT NULL LIMIT 1" + ).fetchone() + assert row is not None, "fixture should have at least one UTXO balance" + assert row.get("utxo") is not None + tx_hash_hex, sep, vout = row["utxo"].partition(":") + assert sep == ":" and len(tx_hash_hex) == 64 and vout.isdigit() + # the raw split columns are replaced by the reconstructed ``utxo`` + assert "utxo_tx_hash" not in row + assert "utxo_vout" not in row diff --git a/counterparty-core/counterpartycore/test/units/ledger/balances_test.py b/counterparty-core/counterpartycore/test/units/ledger/balances_test.py index 7f09f5a26e..634a718519 100644 --- a/counterparty-core/counterpartycore/test/units/ledger/balances_test.py +++ b/counterparty-core/counterpartycore/test/units/ledger/balances_test.py @@ -61,7 +61,13 @@ def test_balances_after_send(ledger_db, state_db, defaults, blockchain_mock): def test_get_address_assets(ledger_db, defaults): - assert balances.get_address_assets(ledger_db, defaults["addresses"][0]) == [ + # ``get_address_assets`` groups by the stored ``asset_index`` (no ORDER BY), + # so row order now follows index order rather than name order; compare as a + # name-sorted list. + assert sorted( + balances.get_address_assets(ledger_db, defaults["addresses"][0]), + key=lambda r: r["asset"], + ) == [ {"asset": "A95428956773044873"}, {"asset": "A95428959342453541"}, {"asset": "CALLABLE"}, diff --git a/counterparty-core/counterpartycore/test/units/ledger/caches_test.py b/counterparty-core/counterpartycore/test/units/ledger/caches_test.py index 702243734a..66bf818a10 100644 --- a/counterparty-core/counterpartycore/test/units/ledger/caches_test.py +++ b/counterparty-core/counterpartycore/test/units/ledger/caches_test.py @@ -1,8 +1,8 @@ from unittest.mock import patch from counterpartycore.lib import config -from counterpartycore.lib.ledger import caches -from counterpartycore.lib.utils import helpers +from counterpartycore.lib.ledger import caches, issuances +from counterpartycore.lib.utils import hashcodec, helpers def test_asset_cache(ledger_db, defaults): @@ -154,6 +154,16 @@ def test_get_asset_cache_miss_regular_asset_found(ledger_db, defaults): """Test cache miss with regular asset name that is found in DB.""" caches.reset_caches() + # ``issuances.asset`` is the compact ``asset_index`` FK, so the asset must + # be registered first; the cache-miss query resolves the name to that index. + ledger_db.execute( + "INSERT INTO assets (asset_id, asset_name, block_index, asset_longname) VALUES (?, ?, ?, ?)", + (str(issuances.generate_asset_id("NEWASSET")), "NEWASSET", 310000, None), + ) + new_asset_index = ledger_db.execute( + "SELECT asset_index FROM assets WHERE asset_name = ?", ("NEWASSET",) + ).fetchone()["asset_index"] + # Insert a valid issuance into the DB ledger_db.execute( """ @@ -163,13 +173,13 @@ def test_get_asset_cache_miss_regular_asset_found(ledger_db, defaults): call_price, description, fee_paid, locked, reset, status, asset_longname ) VALUES ( - 999, 'test_hash_regular', 0, 310000, 'NEWASSET', 1000, + 999, 'test_hash_regular', 0, 310000, ?, 1000, 1, ?, ?, 0, 0, 0, 0.0, 'Test asset', 0, 0, 0, 'valid', NULL ) """, - (defaults["addresses"][0], defaults["addresses"][0]), + (new_asset_index, defaults["addresses"][0], defaults["addresses"][0]), ) asset_cache = caches.AssetCache(ledger_db) @@ -240,22 +250,28 @@ def _get_existing_block(ledger_db): return result +def _to_blob_hash(label): + """Convert any synthetic test tx_hash to BLOB form. Uses ``hashcodec``'s + permissive logic so the same encoding is used by production code paths + that query ``WHERE tx_hash = ?`` with the same label.""" + return hashcodec.hash_to_db(label) + + def _insert_test_transaction(ledger_db, tx_index, tx_hash, source, utxos_info, transaction_type): """Helper to insert a test transaction using existing block data.""" block = _get_existing_block(ledger_db) ledger_db.execute( """ INSERT INTO transactions ( - tx_index, tx_hash, block_index, block_hash, block_time, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) + ) VALUES (?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) """, ( tx_index, - tx_hash, + _to_blob_hash(tx_hash), block["block_index"], - block["block_hash"], block["block_time"], source, utxos_info, @@ -498,16 +514,15 @@ def _insert_invalid_attach_transaction(ledger_db, tx_index, tx_hash, source, utx ledger_db.execute( """ INSERT INTO transactions ( - tx_index, tx_hash, block_index, block_hash, block_time, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) + ) VALUES (?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) """, ( tx_index, - tx_hash, + _to_blob_hash(tx_hash), block["block_index"], - block["block_hash"], block["block_time"], source, utxos_info, @@ -597,21 +612,19 @@ def test_invalid_attach_transaction_short_utxos_info(ledger_db, defaults): """Test that invalid attach transactions with short utxos_info are handled.""" caches.reset_caches() - # Insert an invalid attach transaction with short utxos_info (< 2 parts) block = _get_existing_block(ledger_db) ledger_db.execute( """ INSERT INTO transactions ( - tx_index, tx_hash, block_index, block_hash, block_time, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) + ) VALUES (?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) """, ( 90015, - "invalid_attach_short_utxos", + _to_blob_hash("invalid_attach_short_utxos"), block["block_index"], - block["block_hash"], block["block_time"], defaults["addresses"][0], "only_source", # Short utxos_info @@ -632,21 +645,19 @@ def test_invalid_attach_transaction_empty_destination(ledger_db, defaults): """Test that invalid attach transactions with empty destination are handled.""" caches.reset_caches() - # Insert an invalid attach transaction with empty destination block = _get_existing_block(ledger_db) ledger_db.execute( """ INSERT INTO transactions ( - tx_index, tx_hash, block_index, block_hash, block_time, + tx_index, tx_hash, block_index, block_time, source, destination, btc_amount, fee, data, supported, utxos_info, transaction_type - ) VALUES (?, ?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) + ) VALUES (?, ?, ?, ?, ?, NULL, 0, 10000, NULL, 1, ?, ?) """, ( 90016, - "invalid_attach_empty_dest", + _to_blob_hash("invalid_attach_empty_dest"), block["block_index"], - block["block_hash"], block["block_time"], defaults["addresses"][0], "source:0 2", # Empty destination (space as second element) diff --git a/counterparty-core/counterpartycore/test/units/ledger/events_test.py b/counterparty-core/counterpartycore/test/units/ledger/events_test.py index 16ebb65486..8462093273 100644 --- a/counterparty-core/counterpartycore/test/units/ledger/events_test.py +++ b/counterparty-core/counterpartycore/test/units/ledger/events_test.py @@ -1,6 +1,7 @@ import pytest from counterpartycore.lib import config, exceptions from counterpartycore.lib.ledger import caches, events +from counterpartycore.lib.utils import database def test_events_functions(ledger_db, defaults): @@ -37,6 +38,11 @@ def test_events_functions(ledger_db, defaults): def test_insert_record(ledger_db, defaults): caches.AssetCache(ledger_db) + # Register the synthetic asset so its compact asset_index resolves + # (destructions.asset is the integer asset_index FK, not the name). + ledger_db.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name) VALUES ('999999999', 'foobar')" + ) events.insert_record( ledger_db, "destructions", @@ -48,14 +54,18 @@ def test_insert_record(ledger_db, defaults): "ASSET_DESTRUCTION", event_info={"key": "value"}, ) - last_record = ledger_db.execute("SELECT * FROM destructions WHERE asset = 'foobar'").fetchone() + last_record = ledger_db.execute( + "SELECT * FROM destructions WHERE asset = (SELECT asset_index FROM assets WHERE asset_name = 'foobar')" + ).fetchone() assert last_record["asset"] == "foobar" def get_utxo(ledger_db, address): + # ``utxo_address`` is the compact ``address_id`` FK; resolve the address + # string to its id before filtering. return ledger_db.execute( "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", - (address,), + (database.address_index_from_name(ledger_db, address),), ).fetchone() @@ -155,32 +165,37 @@ def test_replay_events(ledger_db, defaults): f'{{"address":"{defaults["addresses"][0]}","asset":"XCP","block_index":308509,"calling_function":"recredit wager","event":"5f206584e5198c593b273cb91543ab26143b4e70f4f5d96f6c6e2c35f9835f8e_1a3748c324d1ade4ecfcc6950278ece8c35f3225740c38ce0eab3ecbfaa0960b","quantity":100000000,"tx_index":20273}}', ], ] + # ``address``/``source`` are now the compact ``address_id`` FK; resolve the + # address string before filtering. + addr_id = database.address_index_from_name(ledger_db, defaults["addresses"][0]) debits_before = ledger_db.execute( "SELECT COUNT(*) AS count FROM debits WHERE address = ? and action = ?", - (defaults["addresses"][0], "open RPS"), + (addr_id, "open RPS"), ).fetchone()["count"] credits_before = ledger_db.execute( "SELECT COUNT(*) AS count FROM credits WHERE address = ? and calling_function = ?", - (defaults["addresses"][0], "recredit wager"), + (addr_id, "recredit wager"), ).fetchone()["count"] rps_before = ledger_db.execute( "SELECT COUNT(*) AS count FROM rps WHERE source = ? and status = ?", - (defaults["addresses"][0], "matched"), + (addr_id, "matched"), ).fetchone()["count"] events.replay_events(ledger_db, rps_events) + # re-resolve: replay may have created the address row for the first time + addr_id = database.address_index_from_name(ledger_db, defaults["addresses"][0]) debits_after = ledger_db.execute( "SELECT COUNT(*) AS count FROM debits WHERE address = ? and action = ?", - (defaults["addresses"][0], "open RPS"), + (addr_id, "open RPS"), ).fetchone()["count"] credits_after = ledger_db.execute( "SELECT COUNT(*) AS count FROM credits WHERE address = ? and calling_function = ?", - (defaults["addresses"][0], "recredit wager"), + (addr_id, "recredit wager"), ).fetchone()["count"] rps_after = ledger_db.execute( "SELECT COUNT(*) AS count FROM rps WHERE source = ? and status = ?", - (defaults["addresses"][0], "matched"), + (addr_id, "matched"), ).fetchone()["count"] assert debits_before + 1 == debits_after diff --git a/counterparty-core/counterpartycore/test/units/ledger/ledgerblocks_test.py b/counterparty-core/counterpartycore/test/units/ledger/ledgerblocks_test.py index 77096c1ba0..32efe26d23 100644 --- a/counterparty-core/counterpartycore/test/units/ledger/ledgerblocks_test.py +++ b/counterparty-core/counterpartycore/test/units/ledger/ledgerblocks_test.py @@ -58,6 +58,45 @@ def test_blocks_functions(ledger_db, current_block_index): assert blocks.get_transaction(ledger_db, "foobar") is None +def test_get_last_block(ledger_db, current_block_index): + block = blocks.get_last_block(ledger_db) + assert block is not None + assert block["block_index"] == current_block_index + + +def test_get_blocks_time(ledger_db, current_block_index): + result = blocks.get_blocks_time(ledger_db, [current_block_index]) + assert current_block_index in result + assert isinstance(result[current_block_index], int) + + +def test_get_blocks_time_empty(ledger_db): + result = blocks.get_blocks_time(ledger_db, [999999999]) + assert result == {} + + +def test_tx_index_of_none(ledger_db): + assert blocks.tx_index_of(ledger_db, None) is None + + +def test_tx_index_of_found(ledger_db): + all_txs = blocks.get_transactions(ledger_db) + tx_hash = all_txs[0]["tx_hash"] + idx = blocks.tx_index_of(ledger_db, tx_hash) + assert idx == all_txs[0]["tx_index"] + + +def test_tx_index_of_not_found(ledger_db): + assert blocks.tx_index_of(ledger_db, "a" * 64) is None + + +def test_set_transaction_status(ledger_db): + all_txs = blocks.get_transactions(ledger_db) + tx_index = all_txs[0]["tx_index"] + blocks.set_transaction_status(ledger_db, tx_index, True) + blocks.set_transaction_status(ledger_db, tx_index, False) + + def test_no_blocks_table(empty_ledger_db): dummy_db = apsw.Connection(":memory:") assert blocks.last_db_index(dummy_db) == 0 diff --git a/counterparty-core/counterpartycore/test/units/ledger/migration_0010_test.py b/counterparty-core/counterpartycore/test/units/ledger/migration_0010_test.py new file mode 100644 index 0000000000..e493f4c392 --- /dev/null +++ b/counterparty-core/counterpartycore/test/units/ledger/migration_0010_test.py @@ -0,0 +1,213 @@ +"""Tests for counterpartycore.lib.ledger.migrations.0010.compact_hash_storage helpers.""" + +import importlib.util +import pathlib +import sqlite3 +from unittest.mock import MagicMock, patch + +import pytest +from counterpartycore.lib.ledger.migration_data.compact_hash_tables import ( + ADDRESS_NAME_COLUMNS, + ASSET_NAME_COLUMNS, +) +from counterpartycore.lib.utils import database + +# The migration filename starts with a digit, so we can't use a normal import. +# We patch yoyo.step so the module-level `steps = [step(apply, rollback)]` +# doesn't fail outside of a yoyo migration runner context. +_MIG_PATH = ( + pathlib.Path(__file__).parent.parent.parent.parent + / "lib/ledger/migrations/0010.compact_hash_storage.py" +) +_spec = importlib.util.spec_from_file_location("m0010", str(_MIG_PATH)) +m0010 = importlib.util.module_from_spec(_spec) +with patch("yoyo.step", return_value=MagicMock()): + _spec.loader.exec_module(m0010) + + +# --------------------------------------------------------------------------- +# Asset normalization: the flat asset-column set duplicated in +# ``utils.database`` (used by the rowtracer hot path, which must not import +# ``lib.ledger.*``) MUST stay in sync with ``ASSET_NAME_COLUMNS``. +# ``lp_asset`` is intentionally excluded (it is not normalized: an LP token is +# referenced before it is created when a pool opens). +# --------------------------------------------------------------------------- + + +def test_asset_index_column_names_in_sync(): + expected = {col for cols in ASSET_NAME_COLUMNS.values() for col in cols} + expected.discard("lp_asset") + assert database.ASSET_INDEX_COLUMN_NAMES == expected + + +# The flat address-column set duplicated in ``utils.database`` (rowtracer hot +# path) MUST stay in sync with the union of ``ADDRESS_NAME_COLUMNS`` values. +def test_address_index_column_names_in_sync(): + expected = {col for cols in ADDRESS_NAME_COLUMNS.values() for col in cols} + assert database.ADDRESS_INDEX_COLUMN_NAMES == expected + + +def test_split_utxo_roundtrip(): + # ``utxo`` (tx_hash:vout) <-> compact (BLOB tx_hash, int vout) pair. + utxo = "ab" * 32 + ":5" + tx_hash, vout = database.split_utxo(utxo) + assert isinstance(tx_hash, bytes) + assert len(tx_hash) == 32 + assert vout == 5 + assert database.utxo_from_split(tx_hash, vout) == utxo + # an address balance has no utxo + assert database.split_utxo(None) == (None, None) + assert database.utxo_from_split(None, None) is None + + +# --------------------------------------------------------------------------- +# _hex_to_blob_udf +# --------------------------------------------------------------------------- + + +def test_hex_to_blob_udf_none(): + assert m0010._hex_to_blob_udf(None) is None + + +def test_hex_to_blob_udf_bytes_passthrough(): + b = bytes.fromhex("abcd") + assert m0010._hex_to_blob_udf(b) is b + + +def test_hex_to_blob_udf_empty_string(): + assert m0010._hex_to_blob_udf("") is None + + +def test_hex_to_blob_udf_valid_hex(): + result = m0010._hex_to_blob_udf("abcd1234") + assert result == bytes.fromhex("abcd1234") + + +# --------------------------------------------------------------------------- +# rollback +# --------------------------------------------------------------------------- + + +def test_rollback_raises(): + with pytest.raises(NotImplementedError, match="cannot be rolled back"): + m0010.rollback(None) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _make_sqlite3_cursor(sql_setup): + db = sqlite3.connect(":memory:") + cursor = db.cursor() + for stmt in sql_setup: + cursor.execute(stmt) + return cursor + + +# --------------------------------------------------------------------------- +# _table_has_column — tuple-row path (stdlib sqlite3) +# --------------------------------------------------------------------------- + + +def test_table_has_column_tuple_rows_found(): + cursor = _make_sqlite3_cursor(["CREATE TABLE test_t (id INTEGER, name TEXT, value REAL)"]) + assert m0010._table_has_column(cursor, "test_t", "name") is True + + +def test_table_has_column_tuple_rows_not_found(): + cursor = _make_sqlite3_cursor(["CREATE TABLE test_t (id INTEGER, name TEXT)"]) + assert m0010._table_has_column(cursor, "test_t", "nonexistent") is False + + +def test_table_has_column_no_rows(): + cursor = _make_sqlite3_cursor([]) + assert m0010._table_has_column(cursor, "nonexistent_table", "id") is False + + +# --------------------------------------------------------------------------- +# _table_has_column — dict-row path (apsw with rowtracer via ledger_db fixture) +# --------------------------------------------------------------------------- + + +def test_table_has_column_dict_rows_found(ledger_db): + cursor = ledger_db.cursor() + assert m0010._table_has_column(cursor, "blocks", "block_index") is True + + +def test_table_has_column_dict_rows_not_found(ledger_db): + cursor = ledger_db.cursor() + assert m0010._table_has_column(cursor, "blocks", "nonexistent_col") is False + + +# --------------------------------------------------------------------------- +# _column_affinity — tuple-row path +# --------------------------------------------------------------------------- + + +def test_column_affinity_tuple_rows_found(): + cursor = _make_sqlite3_cursor(["CREATE TABLE test_t (id INTEGER, name TEXT, amount REAL)"]) + result = m0010._column_affinity(cursor, "test_t", "name") + assert result == "TEXT" + + +def test_column_affinity_tuple_rows_not_found(): + cursor = _make_sqlite3_cursor(["CREATE TABLE test_t (id INTEGER, name TEXT)"]) + result = m0010._column_affinity(cursor, "test_t", "nonexistent") + assert result is None + + +# --------------------------------------------------------------------------- +# _column_affinity — dict-row path (via ledger_db fixture) +# --------------------------------------------------------------------------- + + +def test_column_affinity_dict_rows_found(ledger_db): + cursor = ledger_db.cursor() + result = m0010._column_affinity(cursor, "blocks", "block_index") + assert result is not None + + +def test_column_affinity_dict_rows_not_found(ledger_db): + cursor = ledger_db.cursor() + result = m0010._column_affinity(cursor, "blocks", "nonexistent_col") + assert result is None + + +# --------------------------------------------------------------------------- +# _index_definitions — tuple-row path +# --------------------------------------------------------------------------- + + +def test_index_definitions_tuple_rows_no_indexes(): + cursor = _make_sqlite3_cursor(["CREATE TABLE test_t (id INTEGER, name TEXT)"]) + result = m0010._index_definitions(cursor, "test_t") + assert result == [] + + +def test_index_definitions_tuple_rows_with_index(): + cursor = _make_sqlite3_cursor( + [ + "CREATE TABLE test_t (id INTEGER, name TEXT)", + "CREATE INDEX idx_name ON test_t(name)", + ] + ) + result = m0010._index_definitions(cursor, "test_t") + assert len(result) == 1 + assert result[0][0] == "idx_name" + assert "idx_name" in result[0][1] + + +# --------------------------------------------------------------------------- +# _index_definitions — dict-row path (via ledger_db fixture) +# --------------------------------------------------------------------------- + + +def test_index_definitions_dict_rows(ledger_db): + cursor = ledger_db.cursor() + result = m0010._index_definitions(cursor, "blocks") + assert isinstance(result, list) + for name, sql in result: + assert isinstance(name, str) + assert isinstance(sql, str) diff --git a/counterparty-core/counterpartycore/test/units/ledger/supplies_test.py b/counterparty-core/counterpartycore/test/units/ledger/supplies_test.py index ae95b925c0..da230f3243 100644 --- a/counterparty-core/counterpartycore/test/units/ledger/supplies_test.py +++ b/counterparty-core/counterpartycore/test/units/ledger/supplies_test.py @@ -189,10 +189,15 @@ def test_supplies_functions(ledger_db, defaults): }, ] + # Register the synthetic asset and store its compact asset_index + # (destructions.asset is the integer asset_index FK, not the name). + ledger_db.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name) VALUES ('999999999', 'foobar')" + ) ledger_db.execute( """ - INSERT INTO destructions (asset, quantity, source, status) - VALUES ('foobar', 1000, ?, 'valid') + INSERT INTO destructions (asset, quantity, source, status) + VALUES ((SELECT asset_index FROM assets WHERE asset_name = 'foobar'), 1000, ?, 'valid') """, (defaults["addresses"][0],), ) diff --git a/counterparty-core/counterpartycore/test/units/messages/attach_test.py b/counterparty-core/counterpartycore/test/units/messages/attach_test.py index 16be2cd6e3..936a705a21 100644 --- a/counterparty-core/counterpartycore/test/units/messages/attach_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/attach_test.py @@ -3,6 +3,7 @@ from counterpartycore.lib.ledger import blocks, caches from counterpartycore.lib.messages import attach from counterpartycore.lib.parser import gettxinfo +from counterpartycore.lib.utils import hashcodec from counterpartycore.test.mocks.counterpartydbs import ProtocolChangesDisabled DUMMY_UTXO = 64 * "0" + ":1" @@ -360,7 +361,8 @@ def test_attach_to_op_return_at_vout_0_with_gate_OFF_legacy_locks_asset( attach.parse(ledger_db, tx, message) # Legacy: status=valid, asset attached to OP_RETURN at vout 0 (locked) row = ledger_db.execute( - "SELECT status, destination FROM sends WHERE tx_hash = ?", (tx["tx_hash"],) + "SELECT status, destination FROM sends WHERE tx_hash = ?", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert row is not None assert row["status"] == "valid", ( @@ -382,7 +384,8 @@ def test_attach_to_op_return_at_vout_0_with_gate_ON_rejects(ledger_db, blockchai # Gate is ON by default in tests (signet activation = 0) attach.parse(ledger_db, tx, message) row = ledger_db.execute( - "SELECT status FROM sends WHERE tx_hash = ?", (tx["tx_hash"],) + "SELECT status FROM sends WHERE tx_hash = ?", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert row is not None assert "OP_RETURN" in row["status"], ( diff --git a/counterparty-core/counterpartycore/test/units/messages/bet_test.py b/counterparty-core/counterpartycore/test/units/messages/bet_test.py index bf32268303..0b88591f73 100644 --- a/counterparty-core/counterpartycore/test/units/messages/bet_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/bet_test.py @@ -625,7 +625,13 @@ def test_cancel_bet(ledger_db, test_helpers, current_block_index): def test_cancel_bet_match(ledger_db, test_helpers, current_block_index): - bet_match = ledger_db.execute("SELECT * FROM bet_matches ORDER BY rowid LIMIT 1").fetchone() + # ``cancel_bet_match`` reads ``bet_match["id"]`` (the composite match id); + # production callers get it from getters that reconstruct it, so the test + # query must reconstruct it too (the TEXT ``id`` column was dropped). + bet_match = ledger_db.execute( + "SELECT *, hex_lower(tx0_hash) || '_' || hex_lower(tx1_hash) AS id " + "FROM bet_matches ORDER BY rowid LIMIT 1" + ).fetchone() bet.cancel_bet_match(ledger_db, bet_match, "filled", bet_match["tx0_index"]) test_helpers.check_records( diff --git a/counterparty-core/counterpartycore/test/units/messages/broadcast_test.py b/counterparty-core/counterpartycore/test/units/messages/broadcast_test.py index e7b38e7a67..6856427421 100644 --- a/counterparty-core/counterpartycore/test/units/messages/broadcast_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/broadcast_test.py @@ -5,6 +5,7 @@ from bitcoin.core import VarIntSerializer from counterpartycore.lib import config, exceptions from counterpartycore.lib.messages import broadcast +from counterpartycore.lib.utils import hashcodec from counterpartycore.test.mocks.counterpartydbs import ProtocolChangesDisabled @@ -1301,8 +1302,10 @@ def test_parse_cbor_none_value_doesnt_halt(ledger_db, blockchain_mock, defaults) message = cbor2.dumps([None, 0.0, 0, "text/plain", b""]) # Must NOT raise. broadcast.parse(ledger_db, tx, message) + row = ledger_db.execute( - "SELECT status FROM broadcasts WHERE tx_hash = ?", (tx["tx_hash"],) + "SELECT status FROM broadcasts WHERE tx_hash = ?", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert row is not None assert "invalid" in row["status"] diff --git a/counterparty-core/counterpartycore/test/units/messages/cancel_test.py b/counterparty-core/counterpartycore/test/units/messages/cancel_test.py index a5eaa4bb41..e055172644 100644 --- a/counterparty-core/counterpartycore/test/units/messages/cancel_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/cancel_test.py @@ -29,7 +29,8 @@ def test_compose(ledger_db, defaults): cancel.compose(ledger_db, "addresses", open_order["tx_hash"]) closed_bet = ledger_db.execute( - "SELECT * FROM bets WHERE source = ? ORDER BY rowid DESC LIMIT 1", + "SELECT * FROM bets WHERE source = (SELECT address_id FROM address_list WHERE address = ?) " + "ORDER BY rowid DESC LIMIT 1", (defaults["addresses"][1],), ).fetchone() diff --git a/counterparty-core/counterpartycore/test/units/messages/detach_test.py b/counterparty-core/counterpartycore/test/units/messages/detach_test.py index 7744609551..948a08fca1 100644 --- a/counterparty-core/counterpartycore/test/units/messages/detach_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/detach_test.py @@ -6,8 +6,11 @@ def get_utxo(ledger_db, address): + # ``utxo_address`` is the compact ``address_id`` FK; resolve it. ``SELECT *`` + # lets the rowtracer reconstruct the ``utxo`` string. return ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances " + "WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (address,), ).fetchone()["utxo"] diff --git a/counterparty-core/counterpartycore/test/units/messages/fairmint_test.py b/counterparty-core/counterpartycore/test/units/messages/fairmint_test.py index e3ca76e60c..ddb2f32dc0 100644 --- a/counterparty-core/counterpartycore/test/units/messages/fairmint_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/fairmint_test.py @@ -152,6 +152,12 @@ def test_compose(ledger_db, defaults): def test_compose_resolves_subasset_longname(ledger_db, defaults): asset_longname = "PARENT.already.issued" asset_name = "A95428959342453541" + # Register the asset so its compact asset_index can be stored/resolved + # (fairminters.asset / asset_parent are integer asset_index FKs, not names). + ledger_db.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name) VALUES (?, ?)", + (str(ledger.issuances.generate_asset_id(asset_name)), asset_name), + ) ledger_db.execute( """ INSERT INTO fairminters ( @@ -161,7 +167,11 @@ def test_compose_resolves_subasset_longname(ledger_db, defaults): end_block, minted_asset_commission_int, soft_cap, soft_cap_deadline_block, lock_description, lock_quantity, divisible, status - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES ( + ?, ?, ?, ?, + (SELECT asset_index FROM assets WHERE asset_name = ?), + (SELECT asset_index FROM assets WHERE asset_name = ?), + ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( "a" * 64, diff --git a/counterparty-core/counterpartycore/test/units/messages/issuance_test.py b/counterparty-core/counterpartycore/test/units/messages/issuance_test.py index 0b89994485..6f1f66b1de 100644 --- a/counterparty-core/counterpartycore/test/units/messages/issuance_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/issuance_test.py @@ -3,7 +3,7 @@ import cbor2 import pytest -from counterpartycore.lib import config, exceptions +from counterpartycore.lib import config, exceptions, ledger from counterpartycore.lib.api import apiwatcher from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.messages import issuance @@ -198,6 +198,13 @@ def test_validate(ledger_db, defaults, current_block_index): current_block_index, ) == (0, "abc", ["call_price must be a float"], 0, "", True, None, None) + # Register the asset so its compact asset_index can be stored/resolved + # (issuances.asset is the integer asset_index FK, not the name). + ledger_db.execute( + "INSERT OR IGNORE INTO assets (asset_id, asset_name, block_index) " + "VALUES (?, 'OLDCALLABLE', 310000)", + (str(ledger.issuances.generate_asset_id("OLDCALLABLE")),), + ) ledger_db.execute( """ INSERT INTO issuances ( @@ -206,7 +213,8 @@ def test_validate(ledger_db, defaults, current_block_index): call_price, description, fee_paid, locked, reset, status, asset_longname ) VALUES ( - 999999, 'test_hash_callable_lock', 0, 310000, 'OLDCALLABLE', 1000, + 999999, 'test_hash_callable_lock', 0, 310000, + (SELECT asset_index FROM assets WHERE asset_name = 'OLDCALLABLE'), 1000, 1, ?, ?, 0, 1, 1409401723, 1.5, 'Old callable asset', 0, 0, 0, 'valid', NULL diff --git a/counterparty-core/counterpartycore/test/units/messages/move_test.py b/counterparty-core/counterpartycore/test/units/messages/move_test.py index 5ebde0df8c..ee31656776 100644 --- a/counterparty-core/counterpartycore/test/units/messages/move_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/move_test.py @@ -1,13 +1,19 @@ import pytest from counterpartycore.lib import config, exceptions from counterpartycore.lib.messages import move +from counterpartycore.lib.utils import hashcodec DUMMY_UTXO = 64 * "0" + ":0" def get_utxo(ledger_db, address, asset="XCP"): + # balances stores the compact asset_index and address_id; resolve both for + # the filter. ``SELECT *`` lets the rowtracer reconstruct the ``utxo`` string + # from the stored ``(utxo_tx_index, utxo_vout)`` pair. return ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? and asset = ? AND quantity > 0", + "SELECT * FROM balances " + "WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) " + "AND asset = (SELECT asset_index FROM assets WHERE asset_name = ?) AND quantity > 0", ( address, asset, @@ -168,13 +174,19 @@ def test_move_assets_with_zero_balance( """Test move_assets skips balances with quantity == 0.""" utxo = get_utxo(ledger_db, defaults["addresses"][0]) - # Insert a balance with quantity 0 for the same utxo + # Insert a balance with quantity 0 for the same utxo. ``utxo`` is stored as + # the compact ``(utxo_tx_hash BLOB, utxo_vout)`` pair; ``utxo_address`` is + # the ``address_id`` FK. ledger_db.execute( """ - INSERT INTO balances (address, asset, quantity, utxo, utxo_address) - VALUES (NULL, 'ZEROVAL', 0, ?, ?) + INSERT INTO balances (address, asset, quantity, utxo_tx_hash, utxo_vout, utxo_address) + VALUES (NULL, 'ZEROVAL', 0, ?, ?, (SELECT address_id FROM address_list WHERE address = ?)) """, - (utxo, defaults["addresses"][0]), + ( + hashcodec.hash_to_db(utxo.split(":")[0]), + int(utxo.split(":")[1]), + defaults["addresses"][0], + ), ) tx = blockchain_mock.dummy_tx( @@ -184,15 +196,17 @@ def test_move_assets_with_zero_balance( # The zero balance should not create a send record zero_sends = ledger_db.execute( - "SELECT * FROM sends WHERE tx_hash = ? AND asset = 'ZEROVAL'", - (tx["tx_hash"],), + "SELECT * FROM sends WHERE tx_hash = ? " + "AND asset = (SELECT asset_index FROM assets WHERE asset_name = 'ZEROVAL')", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchall() assert len(zero_sends) == 0 # But XCP should still be moved xcp_sends = ledger_db.execute( - "SELECT * FROM sends WHERE tx_hash = ? AND asset = 'XCP'", - (tx["tx_hash"],), + "SELECT * FROM sends WHERE tx_hash = ? " + "AND asset = (SELECT asset_index FROM assets WHERE asset_name = 'XCP')", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchall() assert len(xcp_sends) == 1 diff --git a/counterparty-core/counterpartycore/test/units/messages/order_test.py b/counterparty-core/counterpartycore/test/units/messages/order_test.py index 8a8d531d8e..e93307ba78 100644 --- a/counterparty-core/counterpartycore/test/units/messages/order_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/order_test.py @@ -3,6 +3,7 @@ from counterpartycore.lib import ledger as ledger_mod from counterpartycore.lib.ledger.currentstate import CurrentState from counterpartycore.lib.messages import order +from counterpartycore.lib.utils import hashcodec from counterpartycore.test.mocks.counterpartydbs import ProtocolChangesDisabled @@ -870,10 +871,10 @@ def test_parse_order_invalid_data(ledger_db, blockchain_mock, defaults, test_hel "fee_provided_remaining": 10000, "fee_required": 0, "fee_required_remaining": 0, - "get_asset": "0", + "get_asset": 0, "get_quantity": 0, "get_remaining": 0, - "give_asset": "0", + "give_asset": 0, "give_quantity": 0, "give_remaining": 0, "source": defaults["addresses"][1], @@ -1202,7 +1203,7 @@ def test_parse_indefinite_order_expire_index(ledger_db, blockchain_mock, default record = ledger_db.execute( "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", - (tx["tx_hash"],), + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert record["expire_index"] is None assert record["expiration"] == 0 @@ -1217,7 +1218,7 @@ def test_parse_expiration_n_means_n_blocks(ledger_db, blockchain_mock, defaults) record = ledger_db.execute( "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", - (tx["tx_hash"],), + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert record["expire_index"] == tx["block_index"] + 99 @@ -1255,7 +1256,7 @@ def test_parse_expire_index_pre_activation(ledger_db, blockchain_mock, defaults) record = ledger_db.execute( "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", - (tx["tx_hash"],), + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert record["expire_index"] == tx["block_index"] + 100 diff --git a/counterparty-core/counterpartycore/test/units/messages/pool_match_test.py b/counterparty-core/counterpartycore/test/units/messages/pool_match_test.py index daceca2565..8ff4359c9d 100644 --- a/counterparty-core/counterpartycore/test/units/messages/pool_match_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/pool_match_test.py @@ -1,5 +1,12 @@ from counterpartycore.lib import ledger from counterpartycore.lib.messages import order, pooldeposit +from counterpartycore.lib.utils import hashcodec + +_POOL_MATCHES_BY_ORDER = """ + SELECT * FROM pool_matches WHERE order_tx_index = ( + SELECT tx_index FROM transactions WHERE tx_hash = ? + ) +""" def create_pool(ledger_db, blockchain_mock, source, asset_a, asset_b, quantity_a, quantity_b): @@ -70,7 +77,7 @@ def test_order_fills_against_pool(ledger_db, defaults, blockchain_mock, test_hel # Pool should have been matched — check pool_matches table cursor = ledger_db.cursor() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() assert len(matches) > 0, "Order should have matched against pool" @@ -109,7 +116,7 @@ def test_pool_rounding_routes_to_better_pool_before_book(ledger_db, defaults, bl cursor = ledger_db.cursor() pool_matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (trader_tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(trader_tx["tx_hash"]),) ).fetchall() assert len(pool_matches) == 1 assert pool_matches[0]["backward_quantity"] == 2 # XCP in @@ -117,7 +124,7 @@ def test_pool_rounding_routes_to_better_pool_before_book(ledger_db, defaults, bl maker_order = cursor.execute( "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", - (maker_tx["tx_hash"],), + (hashcodec.hash_to_db(maker_tx["tx_hash"]),), ).fetchone() assert maker_order["status"] == "open" # worse book order untouched @@ -143,7 +150,7 @@ def test_pool_rounding_does_not_overfill_past_book(ledger_db, defaults, blockcha cursor = ledger_db.cursor() pool_matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (trader_tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(trader_tx["tx_hash"]),) ).fetchall() assert len(pool_matches) == 1 assert pool_matches[0]["backward_quantity"] == 1 # XCP in @@ -180,7 +187,7 @@ def test_pool_declines_when_book_cheaper_than_cheapest_pool_unit( cursor = ledger_db.cursor() pool_matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (trader_tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(trader_tx["tx_hash"]),) ).fetchall() assert len(pool_matches) == 0 # pool declined; the gate kept it off the overpay @@ -209,7 +216,7 @@ def test_pool_tail_partial_fill_at_taker_limit(ledger_db, defaults, blockchain_m cursor = ledger_db.cursor() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() assert len(matches) > 0 @@ -217,7 +224,8 @@ def test_pool_tail_partial_fill_at_taker_limit(ledger_db, defaults, blockchain_m assert trader_div_after > trader_div_before orders = cursor.execute( - "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", (tx["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchall() assert 0 < orders[0]["give_remaining"] < give_quantity @@ -250,13 +258,12 @@ def test_order_respects_price_limit(ledger_db, defaults, blockchain_mock, test_h # Should NOT match against pool (price too demanding) cursor = ledger_db.cursor() - cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) - ).fetchall() + cursor.execute(_POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),)).fetchall() # Order should remain open, not filled by pool at bad price orders = cursor.execute( - "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", (tx["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchall() assert orders[0]["status"] == "open" assert orders[0]["give_remaining"] == give_quantity @@ -316,7 +323,7 @@ def test_pool_match_fee_recorded(ledger_db, defaults, blockchain_mock, test_help cursor = ledger_db.cursor() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() assert len(matches) > 0 @@ -345,7 +352,7 @@ def test_no_pool_match_for_btc_pair(ledger_db, defaults, blockchain_mock): cursor = ledger_db.cursor() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() assert len(matches) == 0 @@ -372,11 +379,12 @@ def test_pool_fee_affects_matching(ledger_db, defaults, blockchain_mock, test_he cursor = ledger_db.cursor() ord = cursor.execute( - "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", (tx["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() # Pool can't fill at 99.6% because 0.5% fee means max output is ~99.5% @@ -407,7 +415,7 @@ def test_pool_fills_generous_order(ledger_db, defaults, blockchain_mock, test_he cursor = ledger_db.cursor() matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() # Pool should fill this — any output >= 1 is acceptable @@ -449,7 +457,8 @@ def test_generous_limit_partial_pool_fill_marks_filled( cursor = ledger_db.cursor() ord = cursor.execute( - "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", (tx["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert ord["status"] == "filled", ( @@ -647,7 +656,8 @@ def test_tail_pool_fill_recredits_unused_give(ledger_db, defaults, blockchain_mo cursor = ledger_db.cursor() order_row = cursor.execute( - "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", (tx["tx_hash"],) + "SELECT * FROM orders WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert order_row["status"] == "filled" @@ -658,7 +668,7 @@ def test_tail_pool_fill_recredits_unused_give(ledger_db, defaults, blockchain_mo # back. xcp_after = ledger.balances.get_balance(ledger_db, trader, "XCP") matches = cursor.execute( - "SELECT * FROM pool_matches WHERE order_tx_hash = ?", (tx["tx_hash"],) + _POOL_MATCHES_BY_ORDER, (hashcodec.hash_to_db(tx["tx_hash"]),) ).fetchall() assert len(matches) == 1 actual_consumed = matches[0]["backward_quantity"] diff --git a/counterparty-core/counterpartycore/test/units/messages/pooldeposit_test.py b/counterparty-core/counterpartycore/test/units/messages/pooldeposit_test.py index 2b0cefe482..389d87c799 100644 --- a/counterparty-core/counterpartycore/test/units/messages/pooldeposit_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/pooldeposit_test.py @@ -758,7 +758,7 @@ def test_validate_rejects_depleted_pool_reserve(ledger_db, defaults, blockchain_ assert any("pool has no liquidity" in p for p in problems) -def test_parse_rejects_depleted_pool_reserve(ledger_db, defaults, blockchain_mock): +def test_parse_rejects_depleted_pool_reserve(ledger_db, defaults, blockchain_mock, test_helpers): quantity = defaults["quantity"] // 4 source = defaults["addresses"][0] tx = blockchain_mock.dummy_tx(ledger_db, source) @@ -778,12 +778,18 @@ def test_parse_rejects_depleted_pool_reserve(ledger_db, defaults, blockchain_moc ) pooldeposit.parse(ledger_db, tx2, data2[1:]) - cursor = ledger_db.cursor() - row = cursor.execute( - "SELECT status FROM pool_deposits WHERE tx_hash = ? ORDER BY rowid DESC LIMIT 1", - (tx2["tx_hash"],), - ).fetchone() - assert row["status"] == "invalid: pool has no liquidity" + test_helpers.check_records( + ledger_db, + [ + { + "table": "pool_deposits", + "values": { + "tx_hash": tx2["tx_hash"], + "status": "invalid: pool has no liquidity", + }, + }, + ], + ) def test_validate_first_deposit_requires_lp_asset(ledger_db, defaults): diff --git a/counterparty-core/counterpartycore/test/units/messages/replay_safe_gates_test.py b/counterparty-core/counterpartycore/test/units/messages/replay_safe_gates_test.py index 86abe68147..435c703405 100644 --- a/counterparty-core/counterpartycore/test/units/messages/replay_safe_gates_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/replay_safe_gates_test.py @@ -10,7 +10,7 @@ def test_persist_invalid_sweep_gate_off_skips_journal(ledger_db, blockchain_mock sweep.parse(ledger_db, tx, b"\x00" * 10) cursor = ledger_db.cursor() - rows = cursor.execute("SELECT * FROM sweeps WHERE tx_hash = ?", (tx["tx_hash"],)).fetchall() + rows = cursor.execute("SELECT * FROM sweeps WHERE tx_index = ?", (tx["tx_index"],)).fetchall() assert len(rows) == 0 @@ -19,6 +19,6 @@ def test_persist_invalid_sweep_gate_on_inserts(ledger_db, blockchain_mock, defau sweep.parse(ledger_db, tx, b"\x00" * 10) cursor = ledger_db.cursor() - rows = cursor.execute("SELECT * FROM sweeps WHERE tx_hash = ?", (tx["tx_hash"],)).fetchall() + rows = cursor.execute("SELECT * FROM sweeps WHERE tx_index = ?", (tx["tx_index"],)).fetchall() assert len(rows) == 1 assert rows[0]["status"].startswith("invalid:") diff --git a/counterparty-core/counterpartycore/test/units/messages/sweep_test.py b/counterparty-core/counterpartycore/test/units/messages/sweep_test.py index 334cc4fa1f..a70fc88a8b 100644 --- a/counterparty-core/counterpartycore/test/units/messages/sweep_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/sweep_test.py @@ -340,6 +340,16 @@ def test_parse_flag_1(ledger_db, blockchain_mock, defaults, test_helpers, curren def add_zero_balance(ledger_db, address, asset, tx_index, event): + # Register the asset first: balances store the compact ``asset_index`` and + # ``credit``/``debit`` only ever reference issued assets in production, so + # the synthetic asset must exist in ``assets`` to resolve its index. + ledger.events.ensure_asset( + ledger_db, + ledger.issuances.generate_asset_id(asset), + asset, + ledger.currentstate.CurrentState().current_block_index(), + None, + ) ledger.events.credit(ledger_db, address, asset, 1, tx_index, action="test setup", event=event) ledger.events.debit(ledger_db, address, asset, 1, tx_index, action="test setup", event=event) @@ -358,10 +368,10 @@ def test_parse_skips_zero_quantity_balances(ledger_db, blockchain_mock, defaults SELECT COUNT(*) AS count FROM ( SELECT quantity FROM credits - WHERE address = ? AND asset = ? AND calling_function = ? AND event = ? + WHERE address = (SELECT address_id FROM address_list WHERE address = ?) AND asset = (SELECT asset_index FROM assets WHERE asset_name = ?) AND calling_function = ? AND event = ? UNION ALL SELECT quantity FROM debits - WHERE address = ? AND asset = ? AND action = ? AND event = ? + WHERE address = (SELECT address_id FROM address_list WHERE address = ?) AND asset = (SELECT asset_index FROM assets WHERE asset_name = ?) AND action = ? AND event = ? ) """, ( @@ -394,10 +404,10 @@ def test_parse_zero_quantity_balances_legacy_path(ledger_db, blockchain_mock, de SELECT COUNT(*) AS count FROM ( SELECT quantity FROM credits - WHERE address = ? AND asset = ? AND calling_function = ? AND event = ? + WHERE address = (SELECT address_id FROM address_list WHERE address = ?) AND asset = (SELECT asset_index FROM assets WHERE asset_name = ?) AND calling_function = ? AND event = ? UNION ALL SELECT quantity FROM debits - WHERE address = ? AND asset = ? AND action = ? AND event = ? + WHERE address = (SELECT address_id FROM address_list WHERE address = ?) AND asset = (SELECT asset_index FROM assets WHERE asset_name = ?) AND action = ? AND event = ? ) """, ( @@ -453,7 +463,8 @@ def test_parse_empty_ownership_sweep_charges_no_fee(ledger_db, blockchain_mock, sweep.parse(ledger_db, tx, message) fee_debits = ledger_db.execute( - "SELECT quantity FROM debits WHERE address = ? AND asset = 'XCP' " + "SELECT quantity FROM debits WHERE address = (SELECT address_id FROM address_list WHERE address = ?) " + "AND asset = (SELECT asset_index FROM assets WHERE asset_name = 'XCP') " "AND action = 'sweep fee' AND event = ?", (source, tx["tx_hash"]), ).fetchall() @@ -479,7 +490,8 @@ def test_parse_empty_ownership_sweep_legacy_path_charges_fee(ledger_db, blockcha sweep.parse(ledger_db, tx, message) fee_debits = ledger_db.execute( - "SELECT quantity FROM debits WHERE address = ? AND asset = 'XCP' " + "SELECT quantity FROM debits WHERE address = (SELECT address_id FROM address_list WHERE address = ?) " + "AND asset = (SELECT asset_index FROM assets WHERE asset_name = 'XCP') " "AND action = 'sweep fee' AND event = ?", (source, tx["tx_hash"]), ).fetchall() diff --git a/counterparty-core/counterpartycore/test/units/messages/utxo_test.py b/counterparty-core/counterpartycore/test/units/messages/utxo_test.py index 92cdc7dfeb..66ed3e4e90 100644 --- a/counterparty-core/counterpartycore/test/units/messages/utxo_test.py +++ b/counterparty-core/counterpartycore/test/units/messages/utxo_test.py @@ -133,8 +133,11 @@ def test_parse_attach(ledger_db, blockchain_mock, defaults, test_helpers, curren def get_utxo(ledger_db, address): + # ``utxo_address`` is the compact ``address_id`` FK; resolve it. ``SELECT *`` + # lets the rowtracer reconstruct the ``utxo`` string. return ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances " + "WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (address,), ).fetchone()["utxo"] diff --git a/counterparty-core/counterpartycore/test/units/parser/blocks_test.py b/counterparty-core/counterpartycore/test/units/parser/blocks_test.py index f3ec369b92..5551c29eed 100644 --- a/counterparty-core/counterpartycore/test/units/parser/blocks_test.py +++ b/counterparty-core/counterpartycore/test/units/parser/blocks_test.py @@ -15,7 +15,7 @@ ) from counterpartycore.lib.messages.versions import mpma, send1 from counterpartycore.lib.parser import blocks, messagetype -from counterpartycore.lib.utils import database +from counterpartycore.lib.utils import database, hashcodec def test_parse_tx_simple(ledger_db, defaults, blockchain_mock, test_helpers): @@ -139,9 +139,10 @@ def test_rollback(ledger_db, test_helpers, caplog): utxos = ledger_db.execute( """ SELECT * FROM ( - SELECT utxo, MAX(rowid), quantity FROM balances GROUP BY utxo + SELECT utxo_tx_hash, utxo_vout, MAX(rowid), quantity FROM balances + GROUP BY utxo_tx_hash, utxo_vout ) - WHERE utxo IS NOT NULL AND quantity > 0 + WHERE utxo_tx_hash IS NOT NULL AND quantity > 0 """, ).fetchall() for utxo in utxos: @@ -203,9 +204,10 @@ def test_reparse(ledger_db, test_helpers, caplog): utxos = ledger_db.execute( """ SELECT * FROM ( - SELECT utxo, MAX(rowid), quantity FROM balances GROUP BY utxo + SELECT utxo_tx_hash, utxo_vout, MAX(rowid), quantity FROM balances + GROUP BY utxo_tx_hash, utxo_vout ) - WHERE utxo IS NOT NULL AND quantity > 0 + WHERE utxo_tx_hash IS NOT NULL AND quantity > 0 """, ).fetchall() for utxo in utxos: @@ -335,8 +337,14 @@ def deserialize_block_mock(block, parse_vouts, block_index): def test_create_events_indexes(ledger_db): sql = "SELECT * FROM sqlite_master WHERE type= 'index' and tbl_name = 'messages'" + # The compact-hash-storage migration (0010) now creates the runtime + # ``messages`` indexes inline so ``--api-only`` deployments don't end + # up with an unindexed messages table. Reset state to exercise the + # legacy lazy-creation path the helper still has to support. + for row in ledger_db.execute(sql).fetchall(): + ledger_db.execute(f"DROP INDEX IF EXISTS {row['name']}") # noqa: S608 # nosec B608 + database.set_config_value(ledger_db, "EVENTS_INDEXES_CREATED", None) assert len(ledger_db.execute(sql).fetchall()) == 0 - assert database.get_config_value(ledger_db, "EVENTS_INDEXES_CREATED") is None blocks.create_events_indexes(ledger_db) @@ -344,7 +352,11 @@ def test_create_events_indexes(ledger_db): assert len(ledger_db.execute(sql).fetchall()) == 6 assert database.get_config_value(ledger_db, "EVENTS_INDEXES_CREATED") == "True" + # Calling again is a no-op (``CREATE INDEX IF NOT EXISTS`` is idempotent; + # the flag-based short-circuit was dropped because it silently skipped + # creation on DBs where 0010 had dropped the indexes but left the flag). blocks.create_events_indexes(ledger_db) + assert len(ledger_db.execute(sql).fetchall()) == 6 # Tests for update_transaction with unsupported transactions (lines 110-119) @@ -357,7 +369,8 @@ def test_update_transaction_unsupported(ledger_db, defaults, blockchain_mock, te # Check that the transaction was marked as unsupported cursor = ledger_db.cursor() result = cursor.execute( - "SELECT supported FROM transactions WHERE tx_hash = ?", (tx["tx_hash"],) + "SELECT supported FROM transactions WHERE tx_hash = ?", + (hashcodec.hash_to_db(tx["tx_hash"]),), ).fetchone() assert result["supported"] == 0 @@ -857,7 +870,8 @@ def test_parse_tx_cancel(ledger_db, defaults, blockchain_mock): """Test parse_tx with cancel message""" # Get an open order to cancel open_order = ledger_db.execute( - "SELECT * FROM orders WHERE source = ? AND status = 'open' LIMIT 1", + "SELECT * FROM orders WHERE source = (SELECT address_id FROM address_list WHERE address = ?) " + "AND status = 'open' LIMIT 1", (defaults["addresses"][0],), ).fetchone() diff --git a/counterparty-core/counterpartycore/test/units/parser/gettxinfo_test.py b/counterparty-core/counterpartycore/test/units/parser/gettxinfo_test.py index 21a0d29208..a3639f34be 100644 --- a/counterparty-core/counterpartycore/test/units/parser/gettxinfo_test.py +++ b/counterparty-core/counterpartycore/test/units/parser/gettxinfo_test.py @@ -1354,7 +1354,7 @@ def test_select_utxo_destination_2(): def test_get_inputs_with_balance(ledger_db, defaults): utxo = ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (defaults["addresses"][0],), ).fetchone()["utxo"] txid, vout = utxo.split(":") @@ -1441,7 +1441,7 @@ def test_get_op_return_vout(): def test_get_utxos_info(ledger_db, defaults): utxo = ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (defaults["addresses"][0],), ).fetchone()["utxo"] txid, vout = utxo.split(":") @@ -1505,7 +1505,7 @@ def test_get_utxos_info(ledger_db, defaults): def test_update_utxo_balances_cache(ledger_db, defaults, current_block_index): utxo = ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (defaults["addresses"][0],), ).fetchone()["utxo"] @@ -1537,7 +1537,7 @@ def test_get_tx_info_5(ledger_db, defaults, monkeypatch, current_block_index): ) utxo = ledger_db.execute( - "SELECT * FROM balances WHERE utxo_address = ? AND quantity > 0", + "SELECT * FROM balances WHERE utxo_address = (SELECT address_id FROM address_list WHERE address = ?) AND quantity > 0", (defaults["addresses"][0],), ).fetchone()["utxo"] txid, vout = utxo.split(":") diff --git a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_base_test.py b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_base_test.py index f20e8e81db..49194da241 100644 --- a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_base_test.py +++ b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_base_test.py @@ -237,11 +237,16 @@ def test_clean_transaction_from_mempool(mock_db): # Appel de la fonction mempool_module.clean_transaction_from_mempool(db, "tx1") - # Vérifications + # Vérifications - tx_hash is now stored as BLOB(32) so the params are + # passed as bytes (encoded via hashcodec.hash_to_db). + expected_tx_hash = b"tx1" cursor.execute.assert_has_calls( [ - mock.call("DELETE FROM mempool WHERE tx_hash = ?", ("tx1",)), - mock.call("DELETE FROM mempool_transactions WHERE tx_hash = ?", ("tx1",)), + mock.call("DELETE FROM mempool WHERE tx_hash = ?", (expected_tx_hash,)), + mock.call( + "DELETE FROM mempool_transactions WHERE tx_hash = ?", + (expected_tx_hash,), + ), ] ) @@ -270,5 +275,8 @@ def test_clean_mempool_with_validated_transactions( assert mock_ledger_blocks.call_count == 2 # Vérifier que clean_transaction_from_mempool a été appelé pour tx1 - cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", ("tx1",)) - cursor.execute.assert_any_call("DELETE FROM mempool_transactions WHERE tx_hash = ?", ("tx1",)) + expected_tx_hash = b"tx1" + cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", (expected_tx_hash,)) + cursor.execute.assert_any_call( + "DELETE FROM mempool_transactions WHERE tx_hash = ?", (expected_tx_hash,) + ) diff --git a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_complex_test.py b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_complex_test.py index 9b9055a7f7..0eba5f8c58 100644 --- a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_complex_test.py +++ b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_complex_test.py @@ -5,6 +5,7 @@ import pytest from counterpartycore.lib import config from counterpartycore.lib.api import apiwatcher +from counterpartycore.lib.utils import hashcodec @pytest.mark.parametrize( @@ -159,10 +160,14 @@ def test_parse_mempool_transactions_tx_index_calculation( ] assert insert_block_calls, "Aucune insertion dans la table blocks trouvée" - # Vérifier que les paramètres d'insertion contiennent le bon block_index + # Vérifier que les paramètres d'insertion contiennent le bon block_index. + # ``block_hash`` is now stored as BLOB(32); compare against the encoded + # form produced by hashcodec.hash_to_db on MEMPOOL_BLOCK_HASH. block_params = insert_block_calls[0][0][1] assert block_params[0] == config.MEMPOOL_BLOCK_INDEX, "Mauvais block_index utilisé" - assert block_params[1] == config.MEMPOOL_BLOCK_HASH, "Mauvais block_hash utilisé" + assert block_params[1] == hashcodec.hash_to_db(config.MEMPOOL_BLOCK_HASH), ( + "Mauvais block_hash utilisé" + ) def test_clean_mempool_empty(mock_db, mock_backend_bitcoind): @@ -211,6 +216,10 @@ def test_clean_mempool_with_removed_transactions( # Vérifications assert cursor.execute.called - # Vérifier que clean_transaction_from_mempool a été appelé pour tx2 - cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", ("tx2",)) - cursor.execute.assert_any_call("DELETE FROM mempool_transactions WHERE tx_hash = ?", ("tx2",)) + # Vérifier que clean_transaction_from_mempool a été appelé pour tx2 - + # tx_hash is BLOB(32) at rest now. + expected_tx_hash = b"tx2" + cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", (expected_tx_hash,)) + cursor.execute.assert_any_call( + "DELETE FROM mempool_transactions WHERE tx_hash = ?", (expected_tx_hash,) + ) diff --git a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_workflow_test.py b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_workflow_test.py index 35df038f95..81c5a1b9e9 100644 --- a/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_workflow_test.py +++ b/counterparty-core/counterpartycore/test/units/parser/mempool/mempool_workflow_test.py @@ -105,14 +105,16 @@ def test_parse_and_clean_mempool( assert mock_ledger_blocks.call_count == 2 assert mock_backend_bitcoind.called - # Vérifier que clean_transaction_from_mempool a été appelé pour tx1 (validée) et tx2 (plus dans la mempool) - cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", ("tx1",)) + # Vérifier que clean_transaction_from_mempool a été appelé pour tx1 + # (validée) et tx2 (plus dans la mempool). ``tx_hash`` is stored as + # BLOB(32) at rest now. + cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", (b"tx1",)) cursor.execute.assert_any_call( - "DELETE FROM mempool_transactions WHERE tx_hash = ?", ("tx1",) + "DELETE FROM mempool_transactions WHERE tx_hash = ?", (b"tx1",) ) - cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", ("tx2",)) + cursor.execute.assert_any_call("DELETE FROM mempool WHERE tx_hash = ?", (b"tx2",)) cursor.execute.assert_any_call( - "DELETE FROM mempool_transactions WHERE tx_hash = ?", ("tx2",) + "DELETE FROM mempool_transactions WHERE tx_hash = ?", (b"tx2",) ) def test_parse_mempool_transactions_existing_in_mempool( diff --git a/counterparty-core/counterpartycore/test/units/utils/hashcodec_test.py b/counterparty-core/counterpartycore/test/units/utils/hashcodec_test.py new file mode 100644 index 0000000000..29c42de006 --- /dev/null +++ b/counterparty-core/counterpartycore/test/units/utils/hashcodec_test.py @@ -0,0 +1,209 @@ +"""Tests for counterpartycore.lib.utils.hashcodec.""" + +import sqlite3 + +import apsw +import pytest +from counterpartycore.lib.utils import hashcodec + +# --------------------------------------------------------------------------- +# hash_to_db +# --------------------------------------------------------------------------- + + +def test_hash_to_db_none(): + assert hashcodec.hash_to_db(None) is None + + +def test_hash_to_db_bytes_passthrough(): + b = b"\xab" * 32 + assert hashcodec.hash_to_db(b) is b + + +def test_hash_to_db_bytes_strict_ok(): + b = b"\xab" * 32 + assert hashcodec.hash_to_db(b, strict=True) is b + + +def test_hash_to_db_bytes_strict_wrong_length(): + with pytest.raises(ValueError, match="expected 32 bytes"): + hashcodec.hash_to_db(b"\x00" * 31, strict=True) + + +def test_hash_to_db_hex_string(): + hex_str = "ab" * 32 + assert hashcodec.hash_to_db(hex_str) == bytes.fromhex(hex_str) + + +def test_hash_to_db_empty_string_permissive(): + assert hashcodec.hash_to_db("") is None + + +def test_hash_to_db_empty_string_strict(): + with pytest.raises(ValueError, match="empty string"): + hashcodec.hash_to_db("", strict=True) + + +def test_hash_to_db_strict_wrong_hex_length(): + with pytest.raises(ValueError, match="expected 64-char hex"): + hashcodec.hash_to_db("ab" * 16, strict=True) # 32 chars, not 64 + + +def test_hash_to_db_strict_valid_hex(): + hex_str = "ab" * 32 + assert hashcodec.hash_to_db(hex_str, strict=True) == bytes.fromhex(hex_str) + + +def test_hash_to_db_non_hex_permissive_fallback(): + result = hashcodec.hash_to_db("not_hex_data") + assert result == b"not_hex_data" + + +def test_hash_to_db_unsupported_type(): + with pytest.raises(TypeError, match="unsupported type"): + hashcodec.hash_to_db(12345) + + +# --------------------------------------------------------------------------- +# hash_from_db +# --------------------------------------------------------------------------- + + +def test_hash_from_db_none(): + assert hashcodec.hash_from_db(None) is None + + +def test_hash_from_db_str_passthrough(): + s = "abc123" + assert hashcodec.hash_from_db(s) == s + + +def test_hash_from_db_bytes(): + b = bytes.fromhex("ab" * 32) + assert hashcodec.hash_from_db(b) == "ab" * 32 + + +def test_hash_from_db_unsupported_type(): + with pytest.raises(TypeError, match="unsupported type"): + hashcodec.hash_from_db(42) + + +# --------------------------------------------------------------------------- +# normalize_record_hashes +# --------------------------------------------------------------------------- + + +def test_normalize_record_hashes_converts_present_columns(): + hex_str = "cd" * 32 + record = {"tx_hash": hex_str, "other": "value"} + result = hashcodec.normalize_record_hashes(record, ["tx_hash"]) + assert result["tx_hash"] == bytes.fromhex(hex_str) + assert result["other"] == "value" + assert result is record # in-place mutation + + +def test_normalize_record_hashes_skips_absent_columns(): + record = {"block_index": 100} + result = hashcodec.normalize_record_hashes(record, ["tx_hash"]) + assert "tx_hash" not in result + assert result == {"block_index": 100} + + +def test_normalize_record_hashes_multiple_columns(): + hex_str = "ef" * 32 + record = {"tx_hash": hex_str, "block_hash": hex_str, "quantity": 99} + hashcodec.normalize_record_hashes(record, ["tx_hash", "block_hash"]) + assert record["tx_hash"] == bytes.fromhex(hex_str) + assert record["block_hash"] == bytes.fromhex(hex_str) + assert record["quantity"] == 99 + + +# --------------------------------------------------------------------------- +# register_db_functions — apsw path +# --------------------------------------------------------------------------- + + +def test_register_db_functions_apsw_hex_lower_bytes(): + db = apsw.Connection(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT hex_lower(x'ABCD')").fetchone() + assert row[0] == "abcd" + + +def test_register_db_functions_apsw_hex_lower_null(): + db = apsw.Connection(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT hex_lower(NULL)").fetchone() + assert row[0] is None + + +def test_register_db_functions_apsw_unhex_text(): + db = apsw.Connection(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT unhex('abcd')").fetchone() + assert row[0] == bytes.fromhex("abcd") + + +def test_register_db_functions_apsw_unhex_null(): + db = apsw.Connection(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT unhex(NULL)").fetchone() + assert row[0] is None + + +def test_register_db_functions_apsw_unhex_blob_passthrough(): + db = apsw.Connection(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + # Pass a BLOB literal: SQLite delivers it to the UDF as bytes + row = cursor.execute("SELECT unhex(x'AABB')").fetchone() + assert row[0] == bytes.fromhex("aabb") + + +# --------------------------------------------------------------------------- +# register_db_functions — stdlib sqlite3 path (else branch) +# --------------------------------------------------------------------------- + + +def test_register_db_functions_sqlite3_hex_lower_bytes(): + db = sqlite3.connect(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT hex_lower(x'ABCD')").fetchone() + assert row[0] == "abcd" + + +def test_register_db_functions_sqlite3_hex_lower_null(): + db = sqlite3.connect(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT hex_lower(NULL)").fetchone() + assert row[0] is None + + +def test_register_db_functions_sqlite3_hex_lower_str(): + db = sqlite3.connect(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT hex_lower('ABCDEF')").fetchone() + assert row[0] == "abcdef" + + +def test_register_db_functions_sqlite3_unhex_text(): + db = sqlite3.connect(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT unhex('abcd')").fetchone() + assert row[0] == bytes.fromhex("abcd") + + +def test_register_db_functions_sqlite3_unhex_null(): + db = sqlite3.connect(":memory:") + hashcodec.register_db_functions(db) + cursor = db.cursor() + row = cursor.execute("SELECT unhex(NULL)").fetchone() + assert row[0] is None diff --git a/counterparty-core/tools/measure_db_size.py b/counterparty-core/tools/measure_db_size.py new file mode 100644 index 0000000000..eb3178c920 --- /dev/null +++ b/counterparty-core/tools/measure_db_size.py @@ -0,0 +1,392 @@ +#!/usr/bin/python3 +"""Measure SQLite DB size breakdown to estimate hash-deduplication gains. + +Usage: + python tools/measure_db_size.py [--state ] + +Produces: + - Total DB size and free pages. + - Per-table breakdown (table pages + index pages) via the dbstat virtual table. + - Inventory of *hash columns (TEXT) and counts. + - Projected savings for three independent storage optimizations: + BLOB hashes: TEXT(64 hex) -> BLOB(32) + Hash FKs: tx_hash TEXT -> tx_index INTEGER (where applicable) + Composite IDs: composite match IDs (~129 chars) -> (tx0_index, tx1_index) INTEGERs + +The script is strictly read-only; it opens the DB with mode=ro. +""" + +import argparse +import os +import sqlite3 +import sys +from collections import defaultdict + +HASH_COLUMN_PATTERNS = ( + "tx_hash", + "block_hash", + "previous_block_hash", + "ledger_hash", + "txlist_hash", + "messages_hash", + "event_hash", + "order_hash", + "bet_hash", + "rps_hash", + "offer_hash", + "dispenser_tx_hash", + "last_status_tx_hash", + "fairminter_tx_hash", + "tx0_hash", + "tx1_hash", + "move_random_hash", + "tx0_move_random_hash", + "tx1_move_random_hash", + "order_tx_hash", +) + + +COMPOSITE_ID_TABLES = { + "order_matches": "id", + "bet_matches": "id", + "rps_matches": "id", + "order_match_expirations": "order_match_id", + "bet_match_expirations": "bet_match_id", + "bet_match_resolutions": "bet_match_id", + "rps_match_expirations": "rps_match_id", + "rpsresolves": "rps_match_id", + "btcpays": "order_match_id", +} + + +HASH_FK_CANDIDATES = { + "messages": ("tx_hash",), + "transaction_outputs": ("tx_hash",), + "dispenses": ("dispenser_tx_hash",), + "dispenser_refills": ("dispenser_tx_hash",), + "fairmints": ("fairminter_tx_hash",), + "pool_matches": ("order_tx_hash",), + "cancels": ("offer_hash",), +} + + +def human(n): + if n is None: + return "-" + units = ["B", "KB", "MB", "GB", "TB"] + i = 0 + f = float(n) + while f >= 1024 and i < len(units) - 1: + f /= 1024 + i += 1 + return f"{f:.2f} {units[i]}" + + +def open_ro(path): + uri = f"file:{path}?mode=ro" + conn = sqlite3.connect(uri, uri=True) + conn.row_factory = sqlite3.Row + return conn + + +def pragma(conn, name): + return conn.execute(f"PRAGMA {name}").fetchone()[0] + + +def list_tables(conn): + rows = conn.execute( + "SELECT name FROM sqlite_schema WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name" + ).fetchall() + return [r["name"] for r in rows] + + +def list_indexes(conn): + rows = conn.execute( + "SELECT name, tbl_name, sql FROM sqlite_schema WHERE type='index' AND tbl_name NOT LIKE 'sqlite_%' ORDER BY tbl_name, name" + ).fetchall() + return rows + + +def columns_of(conn, table): + rows = conn.execute(f"PRAGMA table_info({table})").fetchall() + return [(r["name"], (r["type"] or "").upper()) for r in rows] + + +def row_count(conn, table): + try: + return conn.execute(f"SELECT COUNT(*) AS c FROM {table}").fetchone()["c"] # noqa: S608 + except sqlite3.DatabaseError: + return None + + +def dbstat_breakdown(conn): + """Return dict {name -> bytes} using dbstat (per table/index). + + SQLite dbstat virtual table reports per-page stats; we sum pages*pagesize. + """ + page_size = pragma(conn, "page_size") + result = defaultdict(int) + cursor = conn.execute("SELECT name, pageno FROM dbstat") + for name, _pageno in cursor: + result[name] += page_size + return result, page_size + + +def is_hash_column(name): + n = name.lower() + return ( + any(n == p or n.endswith("_" + p) or n.endswith(p) for p in HASH_COLUMN_PATTERNS) + or n.endswith("_hash") + or n == "id" + and False + ) + + +def hashish_columns(conn, table): + out = [] + for name, dtype in columns_of(conn, table): + n = name.lower() + if n.endswith("_hash") or n == "tx_hash": + out.append((name, dtype)) + return out + + +def collect_hash_inventory(conn): + """Return list of (table, column, type, n_rows).""" + inventory = [] + for table in list_tables(conn): + cols = hashish_columns(conn, table) + if not cols: + continue + nrows = row_count(conn, table) + for col, dtype in cols: + inventory.append((table, col, dtype, nrows)) + return inventory + + +def measure_avg_text_len(conn, table, column): + try: + r = conn.execute( + f"SELECT AVG(LENGTH({column})) AS a, COUNT({column}) AS c FROM {table}" # noqa: S608 + ).fetchone() + return r["a"], r["c"] + except sqlite3.DatabaseError: + return None, None + + +def collect_composite_ids(conn): + """Measure avg length of composite IDs in match tables.""" + out = [] + for table, col in COMPOSITE_ID_TABLES.items(): + try: + r = conn.execute( + f"SELECT AVG(LENGTH({col})) AS a, COUNT({col}) AS c FROM {table}" # noqa: S608 + ).fetchone() + if r and r["c"]: + out.append((table, col, r["a"], r["c"])) + except sqlite3.DatabaseError: + continue + return out + + +def find_hash_indexes(conn): + indexes = list_indexes(conn) + hash_indexes = [] + for idx in indexes: + sql = (idx["sql"] or "").lower() + if not sql: + continue + if any( + p in sql + for p in ( + "tx_hash", + "block_hash", + "event_hash", + "_hash", + "(id)", + " id,", + " id)", + ) + ): + hash_indexes.append((idx["name"], idx["tbl_name"])) + return hash_indexes + + +def estimate_gains(conn, sizes): + """Estimate savings per optimization using row counts and avg col sizes.""" + inv = collect_hash_inventory(conn) + + blob_hash_per_row_savings = 64 - 32 + 1 + hash_fk_per_row_savings = 64 - 4 + + by_table = defaultdict( + lambda: {"rows": 0, "hash_cols": 0, "blob_hash_data": 0, "hash_fk_data": 0} + ) + + for table, col, _dtype, nrows in inv: + if nrows is None: + continue + by_table[table]["rows"] = nrows + by_table[table]["hash_cols"] += 1 + by_table[table]["blob_hash_data"] += nrows * blob_hash_per_row_savings + cands = HASH_FK_CANDIDATES.get(table, ()) + if col in cands: + by_table[table]["hash_fk_data"] += nrows * hash_fk_per_row_savings + + return by_table + + +def fmt_pct(part, whole): + if not whole: + return "-" + return f"{100.0 * part / whole:.1f}%" + + +def measure_db(path): + print(f"\n{'=' * 80}\nMeasuring: {path}\n{'=' * 80}") + print(f"On-disk size: {human(os.path.getsize(path))}") + conn = open_ro(path) + try: + page_size = pragma(conn, "page_size") + page_count = pragma(conn, "page_count") + freelist = pragma(conn, "freelist_count") + print(f"page_size: {page_size}, page_count: {page_count}, freelist: {freelist}") + print(f"Total pages: {human(page_size * page_count)}, free: {human(page_size * freelist)}") + + sizes, _ = dbstat_breakdown(conn) + total_used = sum(sizes.values()) + print(f"\nTotal pages used by named objects (tables+indexes): {human(total_used)}") + + tables = list_tables(conn) + idx_rows = list_indexes(conn) + idx_by_table = defaultdict(list) + for idx in idx_rows: + idx_by_table[idx["tbl_name"]].append(idx["name"]) + + rows_by_table = [] + for t in tables: + t_size = sizes.get(t, 0) + i_size = sum(sizes.get(i, 0) for i in idx_by_table[t]) + n = row_count(conn, t) + rows_by_table.append((t, n, t_size, i_size, t_size + i_size)) + rows_by_table.sort(key=lambda r: r[4], reverse=True) + + print("\nTop 30 tables by total size (table + indexes):") + print(f"{'table':40} {'rows':>14} {'table':>12} {'indexes':>12} {'total':>12} {'pct':>6}") + for name, nrows, tsz, isz, total in rows_by_table[:30]: + print( + f"{name[:40]:40} {str(nrows) if nrows is not None else '-':>14} " + f"{human(tsz):>12} {human(isz):>12} {human(total):>12} {fmt_pct(total, total_used):>6}" + ) + + print(f"\n{'-' * 80}\nHash column inventory") + print(f"{'-' * 80}") + inv = collect_hash_inventory(conn) + for table, col, dtype, nrows in inv: + avg, cnt = measure_avg_text_len(conn, table, col) + avg_s = "-" if avg is None else f"{avg:.1f}" + print( + f" {table + '.' + col:50} type={dtype:6} rows={nrows or 0:>14} " + f"avg_len={avg_s:>6} non_null={cnt or 0:>14}" + ) + + print(f"\n{'-' * 80}\nComposite match-id column inventory") + print(f"{'-' * 80}") + for table, col, avg, cnt in collect_composite_ids(conn): + print(f" {table + '.' + col:50} avg_len={avg:.1f} non_null={cnt}") + + print(f"\n{'-' * 80}\nIndexes touching hash columns") + print(f"{'-' * 80}") + hash_indexes = find_hash_indexes(conn) + total_hash_index_bytes = 0 + for name, table in hash_indexes: + sz = sizes.get(name, 0) + total_hash_index_bytes += sz + print(f" {table + '.' + name:60} size={human(sz):>12}") + print(f" TOTAL hash-related index size: {human(total_hash_index_bytes)}") + + print(f"\n{'-' * 80}\nEstimated savings per optimization (data only; index gains additive)") + print(f"{'-' * 80}") + by_table = estimate_gains(conn, sizes) + total_blob_hash_data = 0 + total_hash_fk_data = 0 + for t, info in sorted(by_table.items(), key=lambda kv: kv[1]["rows"], reverse=True): + if info["rows"] == 0: + continue + total_blob_hash_data += info["blob_hash_data"] + total_hash_fk_data += info["hash_fk_data"] + print( + f" {t:30} rows={info['rows']:>14} hash_cols={info['hash_cols']:>2} " + f"blob_hash_save~={human(info['blob_hash_data']):>10} " + f"hash_fk_save~={human(info['hash_fk_data']):>10}" + ) + print(f"\n TOTAL BLOB-hash data savings (TEXT64->BLOB32): {human(total_blob_hash_data)}") + print( + f" TOTAL hash-FK data savings (txhash->tx_index on top tables): " + f"{human(total_hash_fk_data)}" + ) + + # composite id potential savings + composite_save = 0 + for _table, _col, avg, cnt in collect_composite_ids(conn): + saving_per = max(0, (avg or 0) - 8 + 1) + composite_save += int(saving_per * cnt) + print( + f" TOTAL composite-id data savings (composite id -> (i0,i1)): {human(composite_save)}" + ) + + # rough index gains: hash-related indexes shrink ~50% with BLOB hashes + # and up to ~95% on messages_tx_* when the column is replaced by a FK. + approx_blob_hash_index_save = total_hash_index_bytes // 2 + print( + f"\n Approx BLOB-hash index savings (~50% on hash indexes): " + f"{human(approx_blob_hash_index_save)}" + ) + + grand_blob = total_blob_hash_data + approx_blob_hash_index_save + grand_blob_fk = grand_blob + total_hash_fk_data + grand_all = grand_blob_fk + composite_save + db_size = os.path.getsize(path) + print( + f"\n >>> Grand total BLOB hashes: {human(grand_blob)} " + f"({fmt_pct(grand_blob, db_size)} of DB)" + ) + print( + f" >>> Grand total BLOB hashes + hash FKs: {human(grand_blob_fk)} " + f"({fmt_pct(grand_blob_fk, db_size)} of DB)" + ) + print( + f" >>> Grand total BLOB + hash FKs + composite: {human(grand_all)} " + f"({fmt_pct(grand_all, db_size)} of DB)" + ) + + return { + "path": path, + "size": db_size, + "blob_hash_data": total_blob_hash_data, + "hash_fk_data": total_hash_fk_data, + "composite_id_data": composite_save, + "blob_hash_index_approx": approx_blob_hash_index_save, + "top_tables": rows_by_table[:10], + } + finally: + conn.close() + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("ledger_db", help="Path to counterparty.db") + parser.add_argument("--state", help="Optional path to state.db", default=None) + args = parser.parse_args() + + if not os.path.exists(args.ledger_db): + print(f"File not found: {args.ledger_db}", file=sys.stderr) + sys.exit(1) + + measure_db(args.ledger_db) + if args.state and os.path.exists(args.state): + measure_db(args.state) + + +if __name__ == "__main__": + main() diff --git a/openapi.json b/openapi.json index 3912903eb9..2f69bd115c 100644 --- a/openapi.json +++ b/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "Counterparty Core API", "version": "11.1.0", - "description": "The Counterparty Core API is the recommended way to query the state of a Counterparty node. All other methods have no official support.\n\n## Headers and HTTP Code\n\nWhen the server is not ready, that is to say when all the extant blocks have not yet been parsed, every route will return a `503` error, except `/` and those routes that are in the `/blocks`, `/transactions` and `/backend` groups.\n\nAll API responses include the following headers:\n\n* `X-COUNTERPARTY-HEIGHT` contains the last block parsed by Counterparty\n* `X-BITCOIN-HEIGHT` contains the last block known to Bitcoin Core\n* `X-COUNTERPARTY-READY` contains true if `X-COUNTERPARTY-HEIGHT` >= `X-BITCOIN-HEIGHT` - 1\n* `X-LEDGER-STATE` contains `Starting`, `Catching Up`, `Following` or `Stopping`\n\nThe v2 API uses the following HTTP response codes:\n\n* `200 OK` for successful requests.\n* `204 No Content` for successful CORS preflight (`OPTIONS`) requests.\n* `400 Bad Request` for invalid parameters, invalid compose/unpack inputs, address or transaction hash validation errors, backend RPC errors returned while handling a request, and other request-level API errors.\n* `404 Not Found` when the requested route or resource does not exist.\n* `500 Internal Server Error` for unexpected server errors before route handling can complete.\n* `503 Service Unavailable` when the API or backend is not ready, or when an unexpected route-handling error is reported as temporarily unavailable.\n\nRoutes in the `/v2/bitcoin` group proxy Bitcoin Core responses and may return the proxied status code and headers.\n\n## Responses Format\n\nAll API responses follow the following format:\n\n```\n{\n \"error\": ,\n \"result\": ,\n \"next_cursor\": ,\n \"result_count\": \n}\n```\n\n## Pagination\n\nFor all routes that return a list of results from the database, you can choose between two pagination modes:\n\n- With the `cursor` and `limit` parameters\n- With the `offset` and `limit` parameters\n\nThe `cursor` parameter allows you to get results from a certain index. This index is generally retrieved from the `next_cursor` field of the previous result (see above).\nThe `offset` parameter allows you to ignore a certain number of results before returning the rest.\n\nFor example:\n`/v2/blocks?limit=5&cursor=844575` allows you to recover blocks 844575 to 844570.\n`/v2/blocks?limit=5&offset=5` allows you to retrieve the 5th to the tenth most recent blocks.\n\nAll responses contain a `result_count` field allowing you to calculate the number of pages.\n\n## Bitcoin Core Proxy\n\nRoutes in the `/v2/bitcoin` group serve as a proxy to make requests to Bitcoin Core.\n\n## Counterparty Transaction Data\n\nEvery Counterparty action is a Bitcoin transaction that carries an embedded Counterparty message. The embedded byte stream is identified by the 8-byte `CNTRPRTY` prefix. After the prefix is removed, the parser reads a message type identifier and passes the remaining bytes to the decoder for that message type.\n\nMessage type identifiers are normally encoded as 4-byte big-endian integers. When the `short_tx_type_id` protocol change is active, nonzero message type identifiers below 256 may instead be encoded in one byte. The remaining payload is message-specific; for example, a send, issuance, order, or dispenser message each has its own unpacking logic.\n\nCounterparty data can be carried in Bitcoin outputs in different ways. The preferred compact form is `OP_RETURN` when the prefixed payload fits the configured size limit. Legacy or larger encodings may use multisig or P2SH-related data chunks, where the encoded chunks are recovered by the parser before the same `CNTRPRTY` prefix and message type rules are applied.\n\nFor application code, prefer the compose and decode helpers rather than parsing scripts manually. Compose routes accept an `encoding` parameter and return the extracted `data` field; `/v2/transactions/unpack` decodes extracted Counterparty data into a `message_type`, `message_type_id`, and message-specific `message_data`. Transaction routes with `verbose=true` can also include `unpacked_data`.\n\n## Events API\n\nOne of the new features of API v2 is the ability to make requests by events. This is the most powerful way to recover the vast majority of data.\n\n### Messages table\n\nCounterparty Core is a deterministic state machine. As each block and transaction is parsed, Core writes deterministic event records to the `messages` table. These records form an internal event journal that is used for `messages_hash` calculations, comparing state across nodes or versions, feeding API and ZeroMQ event consumers, rebuilding secondary explorer or indexer databases, and supporting deterministic logging and mempool handling.\n\nThe `messages` table is useful for operators and integrators, but it is not a stable public data model. Field names, event payloads, and backfilled historical records may change across releases. Applications that need compatibility guarantees should prefer the documented API v2 event routes instead of depending directly on the raw table.\n\nFor example to retrieve events concerning dispensers for a given block:\n\n```\n/v2/blocks//events/OPEN_DISPENSER\n/v2/blocks//events/DISPENSER_UPDATE\n/v2/blocks//events/REFILL_DISPENSER\n/v2/blocks//events/DISPENSE\n```\n\nOr to know the events triggered by a given transaction:\n\n`/v2/transactions//events`\n\nYou can also obtain the events triggered by a transaction using the `verbose` flag:\n\n`/v2/transactions?verbose=true`\n\nHowever, please note that in this way, the following events are excluded from the list of events:\n`NEW_TRANSACTION`, `TRANSACTION_PARSED`, `CREDIT`, `DEBIT`, `INCREMENT_TRANSACTION_COUNT`, `NEW_TRANSACTION_OUTPUT`.\n\n### ZeroMQ Publisher\n\nYou can enable the ZeroMQ server by starting `counterparty-server` with the `--enable-zmq-publisher` flag.\nAll events are published, each in a specific topic. You can subscribe to the events that interest you. For example in Python:\n\n```\ncontext = zmq.asyncio.Context()\nsocket = context.socket(zmq.SUB)\nsocket.setsockopt(zmq.RCVHWM, 0)\nsocket.setsockopt_string(zmq.SUBSCRIBE, \"CREDIT\")\nsocket.setsockopt_string(zmq.SUBSCRIBE, \"DEBIT\")\n```\n\nYou can use an empty string to subscribe to all events.\n\nBy default events are published on port `4001`, you can customize this port with the flag `--zmq-publisher-port`.\n\nYou can see a complete, working example in Python here: https://github.com/CounterpartyXCP/counterparty-core/blob/master/counterparty-core/tools/zmqclient.py.\n\n\n### Notes about update events\n\nFor the events `DISPENSER_UPDATE` and `ORDER_UPDATE`, depending on the reason for the update, the fields present in `params` may be different.\n\nHere are the different possibilities for `DISPENSER_UPDATE`:\n\nOn refill dispenser and on dispense:\n\n- give_remaining\n- dispense_count\n- source\n- asset\n- status\n\nOn closing dispenser with delay:\n\n- last_status_tx_hash\n- source\n- asset\n- status\n\nOn closing dispenser:\n\n- give_remaining\n- source\n- asset\n- status\n\nand those for `ORDER_UPDATE`:\n\nOn order cancellation:\n\n- status\n- tx_hash\n\nOn order match cancellation:\n\n- give_remaining\n- get_remaining\n- status\n- fee_required_remaining\n\nOn order match:\n\n- give_remaining\n- get_remaining\n- fee_required_remaining\n- fee_provided_remaining\n- status\n\n## Events Reference\n\nHere is a list of events classified by theme and for each an example response:\n\n\n### Blocks and Transactions\n\n#### `NEW_BLOCK`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1378,\n \"event\": \"NEW_BLOCK\",\n \"params\": {\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 325,\n \"block_time\": 1781529693,\n \"difficulty\": 545259519,\n \"previous_block_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\"\n },\n \"tx_hash\": null,\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1372,\n \"result_count\": 225\n}\n```\n\n#### `NEW_TRANSACTION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1379,\n \"event\": \"NEW_TRANSACTION\",\n \"params\": {\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 325,\n \"block_time\": 1781529693,\n \"btc_amount\": 1000,\n \"data\": \"0d00\",\n \"destination\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"fee\": 0,\n \"source\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"transaction_type\": \"dispense\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"utxos_info\": \"0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1365,\n \"result_count\": 142\n}\n```\n\n#### `NEW_TRANSACTION_OUTPUT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1380,\n \"event\": \"NEW_TRANSACTION_OUTPUT\",\n \"params\": {\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"out_index\": 0,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1014,\n \"result_count\": 6\n}\n```\n\n#### `BLOCK_PARSED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1391,\n \"event\": \"BLOCK_PARSED\",\n \"params\": {\n \"block_index\": 325,\n \"ledger_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"messages_hash\": \"00000000000000000000000000000000000000000000000000000000000000c9\",\n \"transaction_count\": 1,\n \"txlist_hash\": \"00000000000000000000000000000000000000000000000000000000000000a9\",\n \"block_time\": 1781529693\n },\n \"tx_hash\": null,\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1377,\n \"result_count\": 225\n}\n```\n\n#### `TRANSACTION_PARSED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1390,\n \"event\": \"TRANSACTION_PARSED\",\n \"params\": {\n \"supported\": true,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1370,\n \"result_count\": 142\n}\n```\n\n### Asset Movements\n\n#### `DEBIT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1384,\n \"event\": \"DEBIT\",\n \"params\": {\n \"action\": \"utxo move\",\n \"address\": null,\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"event\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"quantity\": 2000000000,\n \"tx_index\": 141,\n \"utxo\": \"0000000000000000000000000000000000000000000000000000000000000025:1\",\n \"utxo_address\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1381,\n \"result_count\": 137\n}\n```\n\n#### `CREDIT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1387,\n \"event\": \"CREDIT\",\n \"params\": {\n \"address\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"calling_function\": \"dispense\",\n \"event\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"quantity\": 66,\n \"tx_index\": 141,\n \"utxo\": null,\n \"utxo_address\": null,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000066\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1385,\n \"result_count\": 165\n}\n```\n\n#### `ENHANCED_SEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 689,\n \"event\": \"ENHANCED_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 203,\n \"destination\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"memo\": null,\n \"msg_index\": 0,\n \"quantity\": 1000,\n \"send_type\": \"send\",\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 80,\n \"block_time\": 1781529208,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 203,\n \"block_time\": 1781529208\n }\n ],\n \"next_cursor\": 559,\n \"result_count\": 3\n}\n```\n\n#### `MPMA_SEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 746,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 207,\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"memo\": \"memo1\",\n \"msg_index\": 2,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 84,\n \"block_time\": 1781529225,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 207,\n \"block_time\": 1781529225\n }\n ],\n \"next_cursor\": 745,\n \"result_count\": 15\n}\n```\n\n#### `SEND`\n\n```\n{\n \"result\": [],\n \"next_cursor\": null,\n \"result_count\": 0\n}\n```\n\n#### `ASSET_TRANSFER`\n\n```\n{\n \"result\": [],\n \"next_cursor\": null,\n \"result_count\": 0\n}\n```\n\n#### `SWEEP`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 604,\n \"event\": \"SWEEP\",\n \"params\": {\n \"block_index\": 192,\n \"destination\": \"bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx\",\n \"fee_paid\": 800000,\n \"flags\": 1,\n \"memo\": \"sweep my assets\",\n \"source\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 68,\n \"block_time\": 1781529163,\n \"fee_paid_normalized\": \"0.00800000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 192,\n \"block_time\": 1781529163\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ASSET_DIVIDEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 338,\n \"event\": \"ASSET_DIVIDEND\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 146,\n \"dividend_asset\": \"XCP\",\n \"fee_paid\": 20000,\n \"quantity_per_unit\": 100000000,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 42,\n \"block_time\": 1781528999,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00020000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 146,\n \"block_time\": 1781528999\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n### Asset Creation and Destruction\n\n#### `RESET_ISSUANCE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1034,\n \"event\": \"RESET_ISSUANCE\",\n \"params\": {\n \"asset\": \"RESET\",\n \"asset_events\": \"reset\",\n \"asset_longname\": null,\n \"block_index\": 242,\n \"call_date\": 0,\n \"call_price\": 0.0,\n \"callable\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"fee_paid\": 0,\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"quantity\": 1200000000,\n \"reset\": true,\n \"source\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 120,\n \"block_time\": 1781529385,\n \"quantity_normalized\": \"12.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 242,\n \"block_time\": 1781529385\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ASSET_CREATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1367,\n \"event\": \"ASSET_CREATION\",\n \"params\": {\n \"asset_id\": \"117132633401\",\n \"asset_longname\": null,\n \"asset_name\": \"OPENFAIR\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n }\n ],\n \"next_cursor\": 1340,\n \"result_count\": 39\n}\n```\n\n#### `ASSET_ISSUANCE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1375,\n \"event\": \"ASSET_ISSUANCE\",\n \"params\": {\n \"asset\": \"FAIRMARK\",\n \"asset_events\": \"close_fairminter\",\n \"asset_longname\": null,\n \"block_index\": 324,\n \"call_date\": 0,\n \"call_price\": 0.0,\n \"callable\": false,\n \"description\": \"\",\n \"description_locked\": false,\n \"divisible\": true,\n \"fair_minting\": false,\n \"fee_paid\": 0,\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"locked\": true,\n \"mime_type\": \"text/plain\",\n \"msg_index\": 1,\n \"quantity\": 0,\n \"reset\": false,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"tx_index\": 137,\n \"block_time\": 1781529686,\n \"quantity_normalized\": \"0.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781529686\n }\n ],\n \"next_cursor\": 1368,\n \"result_count\": 76\n}\n```\n\n#### `ASSET_DESTRUCTION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1376,\n \"event\": \"ASSET_DESTRUCTION\",\n \"params\": {\n \"asset\": \"FAIRMARK\",\n \"block_index\": 324,\n \"quantity\": 400000000,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"tag\": \"soft cap not reached\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"tx_index\": 137,\n \"block_time\": 1781529686,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": true,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"4.00000000\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781529686\n }\n ],\n \"next_cursor\": 1285,\n \"result_count\": 8\n}\n```\n\n### DEX\n\n#### `OPEN_ORDER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1358,\n \"event\": \"OPEN_ORDER\",\n \"params\": {\n \"block_index\": 322,\n \"expiration\": 21,\n \"expire_index\": 342,\n \"fee_provided\": 10000,\n \"fee_provided_remaining\": 10000,\n \"fee_required\": 0,\n \"fee_required_remaining\": 0,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"get_remaining\": 1000,\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"give_remaining\": 1000,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 139,\n \"block_time\": 1781529679,\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"get_remaining_normalized\": \"0.00001000\",\n \"give_remaining_normalized\": \"0.00001000\",\n \"fee_provided_normalized\": \"0.00010000\",\n \"fee_required_normalized\": \"0.00000000\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n }\n ],\n \"next_cursor\": 1353,\n \"result_count\": 12\n}\n```\n\n#### `ORDER_MATCH`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1361,\n \"event\": \"ORDER_MATCH\",\n \"params\": {\n \"backward_asset\": \"BTC\",\n \"backward_quantity\": 1000,\n \"block_index\": 322,\n \"fee_paid\": 0,\n \"forward_asset\": \"UTXOASSET\",\n \"forward_quantity\": 1000,\n \"id\": \"0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003\",\n \"match_expire_index\": 341,\n \"status\": \"pending\",\n \"tx0_address\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"tx0_block_index\": 321,\n \"tx0_expiration\": 21,\n \"tx0_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx0_index\": 138,\n \"tx1_address\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"tx1_block_index\": 322,\n \"tx1_expiration\": 21,\n \"tx1_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx1_index\": 139,\n \"block_time\": 1781529679,\n \"forward_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\"\n },\n \"backward_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"forward_quantity_normalized\": \"0.00001000\",\n \"backward_quantity_normalized\": \"0.00001000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n }\n ],\n \"next_cursor\": 712,\n \"result_count\": 5\n}\n```\n\n#### `ORDER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1360,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n }\n ],\n \"next_cursor\": 1359,\n \"result_count\": 22\n}\n```\n\n#### `ORDER_FILLED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 538,\n \"event\": \"ORDER_FILLED\",\n \"params\": {\n \"status\": \"filled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_time\": 1781529130\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ORDER_MATCH_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 882,\n \"event\": \"ORDER_MATCH_UPDATE\",\n \"params\": {\n \"id\": \"000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109\",\n \"status\": \"expired\"\n },\n \"tx_hash\": null,\n \"block_index\": 225,\n \"block_time\": 1781529297\n }\n ],\n \"next_cursor\": 706,\n \"result_count\": 4\n}\n```\n\n#### `BTC_PAY`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 539,\n \"event\": \"BTC_PAY\",\n \"params\": {\n \"block_index\": 184,\n \"btc_amount\": 2000,\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"order_match_id\": \"0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"tx_index\": 60,\n \"block_time\": 1781529130,\n \"btc_amount_normalized\": \"0.00002000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_time\": 1781529130\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `CANCEL_ORDER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1148,\n \"event\": \"CANCEL_ORDER\",\n \"params\": {\n \"block_index\": 294,\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx_index\": 122,\n \"block_time\": 1781529481\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 294,\n \"block_time\": 1781529481\n }\n ],\n \"next_cursor\": 584,\n \"result_count\": 2\n}\n```\n\n#### `ORDER_EXPIRATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1351,\n \"event\": \"ORDER_EXPIRATION\",\n \"params\": {\n \"block_index\": 321,\n \"order_hash\": \"0000000000000000000000000000000000000000000000000000000000000060\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"block_time\": 1781529675\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 321,\n \"block_time\": 1781529675\n }\n ],\n \"next_cursor\": 785,\n \"result_count\": 6\n}\n```\n\n#### `ORDER_MATCH_EXPIRATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 884,\n \"event\": \"ORDER_MATCH_EXPIRATION\",\n \"params\": {\n \"block_index\": 225,\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109\",\n \"tx0_address\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"tx1_address\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"block_time\": 1781529297\n },\n \"tx_hash\": null,\n \"block_index\": 225,\n \"block_time\": 1781529297\n }\n ],\n \"next_cursor\": 709,\n \"result_count\": 3\n}\n```\n\n### Dispenser\n\n#### `OPEN_DISPENSER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1009,\n \"event\": \"OPEN_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 238,\n \"dispense_count\": 0,\n \"escrow_quantity\": 5000,\n \"give_quantity\": 1,\n \"give_remaining\": 5000,\n \"oracle_address\": null,\n \"origin\": \"bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0\",\n \"satoshirate\": 1,\n \"source\": \"bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 117,\n \"block_time\": 1781529369,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"give_remaining_normalized\": \"0.00005000\",\n \"escrow_quantity_normalized\": \"0.00005000\",\n \"satoshirate_normalized\": \"0.00000001\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 238,\n \"block_time\": 1781529369\n }\n ],\n \"next_cursor\": 620,\n \"result_count\": 6\n}\n```\n\n#### `DISPENSER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1388,\n \"event\": \"DISPENSER_UPDATE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"dispense_count\": 2,\n \"give_remaining\": 9268,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_remaining_normalized\": \"0.00009268\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1016,\n \"result_count\": 9\n}\n```\n\n#### `REFILL_DISPENSER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 253,\n \"event\": \"REFILL_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 135,\n \"destination\": \"1KbWivLGRP4eLwy3a3cG6CVFGdYxVaCp5e\",\n \"dispense_quantity\": 10,\n \"dispenser_tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx_index\": 31,\n \"block_time\": 1781528953,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 135,\n \"block_time\": 1781528953\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `DISPENSE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1389,\n \"event\": \"DISPENSE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"dispense_index\": 0,\n \"dispense_quantity\": 66,\n \"dispenser_tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000066\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1017,\n \"result_count\": 6\n}\n```\n\n### Broadcast\n\n#### `BROADCAST`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 210,\n \"event\": \"BROADCAST\",\n \"params\": {\n \"block_index\": 129,\n \"fee_fraction_int\": 0,\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": \"valid\",\n \"text\": \"price-USD\",\n \"timestamp\": 4003903983,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"tx_index\": 25,\n \"value\": 66600.0,\n \"block_time\": 1781528928,\n \"fee_fraction_int_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"block_index\": 129,\n \"block_time\": 1781528928\n }\n ],\n \"next_cursor\": 205,\n \"result_count\": 2\n}\n```\n\n### Fair Minting\n\n#### `NEW_FAIRMINTER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1366,\n \"event\": \"NEW_FAIRMINTER\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_longname\": null,\n \"asset_parent\": null,\n \"block_index\": 323,\n \"burn_payment\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"end_block\": 0,\n \"hard_cap\": 0,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"lp_asset\": null,\n \"max_mint_per_address\": 0,\n \"max_mint_per_tx\": 10,\n \"mime_type\": \"text/plain\",\n \"minted_asset_commission_int\": 0,\n \"pool_quantity\": 0,\n \"pre_minted\": false,\n \"premint_quantity\": 0,\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"start_block\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 140,\n \"block_time\": 1781529682,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n }\n ],\n \"next_cursor\": 1339,\n \"result_count\": 23\n}\n```\n\n#### `FAIRMINTER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1374,\n \"event\": \"FAIRMINTER_UPDATE\",\n \"params\": {\n \"status\": \"closed\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781529686\n }\n ],\n \"next_cursor\": 1326,\n \"result_count\": 15\n}\n```\n\n#### `NEW_FAIRMINT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1313,\n \"event\": \"NEW_FAIRMINT\",\n \"params\": {\n \"asset\": \"FAIRMULTI\",\n \"block_index\": 315,\n \"commission\": 0,\n \"earn_quantity\": 400000000,\n \"fairminter_tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"paid_quantity\": 400000000,\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 136,\n \"block_time\": 1781529653,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": true,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"earn_quantity_normalized\": \"4.00000000\",\n \"commission_normalized\": \"0.00000000\",\n \"paid_quantity_normalized\": \"4.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 315,\n \"block_time\": 1781529653\n }\n ],\n \"next_cursor\": 1304,\n \"result_count\": 22\n}\n```\n\n### UTXO Support\n\n#### `ATTACH_TO_UTXO`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 998,\n \"event\": \"ATTACH_TO_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 237,\n \"destination\": \"0000000000000000000000000000000000000000000000000000000000000003:0\",\n \"destination_address\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"attach\",\n \"source\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 115,\n \"block_time\": 1781529363,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 237,\n \"block_time\": 1781529363\n }\n ],\n \"next_cursor\": 977,\n \"result_count\": 9\n}\n```\n\n#### `DETACH_FROM_UTXO`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 990,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHB\",\n \"block_index\": 236,\n \"destination\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"fee_paid\": 0,\n \"msg_index\": 1,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000082:0\",\n \"source_address\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"tx_index\": 114,\n \"block_time\": 1781529359,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_index\": 236,\n \"block_time\": 1781529359\n }\n ],\n \"next_cursor\": 987,\n \"result_count\": 5\n}\n```\n\n#### `UTXO_MOVE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1386,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"destination\": \"000000000000000000000000000000000000000000000000000000000000004b:0\",\n \"destination_address\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"msg_index\": 1,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000025:1\",\n \"source_address\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"next_cursor\": 1383,\n \"result_count\": 14\n}\n```\n\n### Burns\n\n#### `BURN`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 61,\n \"event\": \"BURN\",\n \"params\": {\n \"block_index\": 112,\n \"burned\": 50000000,\n \"earned\": 74999998167,\n \"source\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx_index\": 9,\n \"block_time\": 1781528859,\n \"burned_normalized\": \"0.50000000\",\n \"earned_normalized\": \"749.99998167\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 112,\n \"block_time\": 1781528859\n }\n ],\n \"next_cursor\": 58,\n \"result_count\": 10\n}\n```\n\n" + "description": "The Counterparty Core API is the recommended way to query the state of a Counterparty node. All other methods have no official support.\n\n## Headers and HTTP Code\n\nWhen the server is not ready, that is to say when all the extant blocks have not yet been parsed, every route will return a `503` error, except `/` and those routes that are in the `/blocks`, `/transactions` and `/backend` groups.\n\nAll API responses include the following headers:\n\n* `X-COUNTERPARTY-HEIGHT` contains the last block parsed by Counterparty\n* `X-BITCOIN-HEIGHT` contains the last block known to Bitcoin Core\n* `X-COUNTERPARTY-READY` contains true if `X-COUNTERPARTY-HEIGHT` >= `X-BITCOIN-HEIGHT` - 1\n* `X-LEDGER-STATE` contains `Starting`, `Catching Up`, `Following` or `Stopping`\n\nThe v2 API uses the following HTTP response codes:\n\n* `200 OK` for successful requests.\n* `204 No Content` for successful CORS preflight (`OPTIONS`) requests.\n* `400 Bad Request` for invalid parameters, invalid compose/unpack inputs, address or transaction hash validation errors, backend RPC errors returned while handling a request, and other request-level API errors.\n* `404 Not Found` when the requested route or resource does not exist.\n* `500 Internal Server Error` for unexpected server errors before route handling can complete.\n* `503 Service Unavailable` when the API or backend is not ready, or when an unexpected route-handling error is reported as temporarily unavailable.\n\nRoutes in the `/v2/bitcoin` group proxy Bitcoin Core responses and may return the proxied status code and headers.\n\n## Responses Format\n\nAll API responses follow the following format:\n\n```\n{\n \"error\": ,\n \"result\": ,\n \"next_cursor\": ,\n \"result_count\": \n}\n```\n\n## Pagination\n\nFor all routes that return a list of results from the database, you can choose between two pagination modes:\n\n- With the `cursor` and `limit` parameters\n- With the `offset` and `limit` parameters\n\nThe `cursor` parameter allows you to get results from a certain index. This index is generally retrieved from the `next_cursor` field of the previous result (see above).\nThe `offset` parameter allows you to ignore a certain number of results before returning the rest.\n\nFor example:\n`/v2/blocks?limit=5&cursor=844575` allows you to recover blocks 844575 to 844570.\n`/v2/blocks?limit=5&offset=5` allows you to retrieve the 5th to the tenth most recent blocks.\n\nAll responses contain a `result_count` field allowing you to calculate the number of pages.\n\n## Bitcoin Core Proxy\n\nRoutes in the `/v2/bitcoin` group serve as a proxy to make requests to Bitcoin Core.\n\n## Counterparty Transaction Data\n\nEvery Counterparty action is a Bitcoin transaction that carries an embedded Counterparty message. The embedded byte stream is identified by the 8-byte `CNTRPRTY` prefix. After the prefix is removed, the parser reads a message type identifier and passes the remaining bytes to the decoder for that message type.\n\nMessage type identifiers are normally encoded as 4-byte big-endian integers. When the `short_tx_type_id` protocol change is active, nonzero message type identifiers below 256 may instead be encoded in one byte. The remaining payload is message-specific; for example, a send, issuance, order, or dispenser message each has its own unpacking logic.\n\nCounterparty data can be carried in Bitcoin outputs in different ways. The preferred compact form is `OP_RETURN` when the prefixed payload fits the configured size limit. Legacy or larger encodings may use multisig or P2SH-related data chunks, where the encoded chunks are recovered by the parser before the same `CNTRPRTY` prefix and message type rules are applied.\n\nFor application code, prefer the compose and decode helpers rather than parsing scripts manually. Compose routes accept an `encoding` parameter and return the extracted `data` field; `/v2/transactions/unpack` decodes extracted Counterparty data into a `message_type`, `message_type_id`, and message-specific `message_data`. Transaction routes with `verbose=true` can also include `unpacked_data`.\n\n## Events API\n\nOne of the new features of API v2 is the ability to make requests by events. This is the most powerful way to recover the vast majority of data.\n\n### Messages table\n\nCounterparty Core is a deterministic state machine. As each block and transaction is parsed, Core writes deterministic event records to the `messages` table. These records form an internal event journal that is used for `messages_hash` calculations, comparing state across nodes or versions, feeding API and ZeroMQ event consumers, rebuilding secondary explorer or indexer databases, and supporting deterministic logging and mempool handling.\n\nThe `messages` table is useful for operators and integrators, but it is not a stable public data model. Field names, event payloads, and backfilled historical records may change across releases. Applications that need compatibility guarantees should prefer the documented API v2 event routes instead of depending directly on the raw table.\n\nFor example to retrieve events concerning dispensers for a given block:\n\n```\n/v2/blocks//events/OPEN_DISPENSER\n/v2/blocks//events/DISPENSER_UPDATE\n/v2/blocks//events/REFILL_DISPENSER\n/v2/blocks//events/DISPENSE\n```\n\nOr to know the events triggered by a given transaction:\n\n`/v2/transactions//events`\n\nYou can also obtain the events triggered by a transaction using the `verbose` flag:\n\n`/v2/transactions?verbose=true`\n\nHowever, please note that in this way, the following events are excluded from the list of events:\n`NEW_TRANSACTION`, `TRANSACTION_PARSED`, `CREDIT`, `DEBIT`, `INCREMENT_TRANSACTION_COUNT`, `NEW_TRANSACTION_OUTPUT`.\n\n### ZeroMQ Publisher\n\nYou can enable the ZeroMQ server by starting `counterparty-server` with the `--enable-zmq-publisher` flag.\nAll events are published, each in a specific topic. You can subscribe to the events that interest you. For example in Python:\n\n```\ncontext = zmq.asyncio.Context()\nsocket = context.socket(zmq.SUB)\nsocket.setsockopt(zmq.RCVHWM, 0)\nsocket.setsockopt_string(zmq.SUBSCRIBE, \"CREDIT\")\nsocket.setsockopt_string(zmq.SUBSCRIBE, \"DEBIT\")\n```\n\nYou can use an empty string to subscribe to all events.\n\nBy default events are published on port `4001`, you can customize this port with the flag `--zmq-publisher-port`.\n\nYou can see a complete, working example in Python here: https://github.com/CounterpartyXCP/counterparty-core/blob/master/counterparty-core/tools/zmqclient.py.\n\n\n### Notes about update events\n\nFor the events `DISPENSER_UPDATE` and `ORDER_UPDATE`, depending on the reason for the update, the fields present in `params` may be different.\n\nHere are the different possibilities for `DISPENSER_UPDATE`:\n\nOn refill dispenser and on dispense:\n\n- give_remaining\n- dispense_count\n- source\n- asset\n- status\n\nOn closing dispenser with delay:\n\n- last_status_tx_hash\n- source\n- asset\n- status\n\nOn closing dispenser:\n\n- give_remaining\n- source\n- asset\n- status\n\nand those for `ORDER_UPDATE`:\n\nOn order cancellation:\n\n- status\n- tx_hash\n\nOn order match cancellation:\n\n- give_remaining\n- get_remaining\n- status\n- fee_required_remaining\n\nOn order match:\n\n- give_remaining\n- get_remaining\n- fee_required_remaining\n- fee_provided_remaining\n- status\n\n## Events Reference\n\nHere is a list of events classified by theme and for each an example response:\n\n\n### Blocks and Transactions\n\n#### `NEW_BLOCK`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1378,\n \"event\": \"NEW_BLOCK\",\n \"params\": {\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000007b\",\n \"block_index\": 325,\n \"block_time\": 1781627750,\n \"difficulty\": 545259519,\n \"previous_block_hash\": \"0000000000000000000000000000000000000000000000000000000000000035\"\n },\n \"tx_hash\": null,\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1372,\n \"result_count\": 225\n}\n```\n\n#### `NEW_TRANSACTION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1379,\n \"event\": \"NEW_TRANSACTION\",\n \"params\": {\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000007b\",\n \"block_index\": 325,\n \"block_time\": 1781627750,\n \"btc_amount\": 1000,\n \"data\": \"0d00\",\n \"destination\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"fee\": 0,\n \"source\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"transaction_type\": \"dispense\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"utxos_info\": \"00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1365,\n \"result_count\": 142\n}\n```\n\n#### `NEW_TRANSACTION_OUTPUT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1380,\n \"event\": \"NEW_TRANSACTION_OUTPUT\",\n \"params\": {\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"out_index\": 0,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1014,\n \"result_count\": 6\n}\n```\n\n#### `BLOCK_PARSED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1391,\n \"event\": \"BLOCK_PARSED\",\n \"params\": {\n \"block_index\": 325,\n \"ledger_hash\": \"00000000000000000000000000000000000000000000000000000000000000cd\",\n \"messages_hash\": \"00000000000000000000000000000000000000000000000000000000000000c0\",\n \"transaction_count\": 1,\n \"txlist_hash\": \"0000000000000000000000000000000000000000000000000000000000000029\",\n \"block_time\": 1781627750\n },\n \"tx_hash\": null,\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1377,\n \"result_count\": 225\n}\n```\n\n#### `TRANSACTION_PARSED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1390,\n \"event\": \"TRANSACTION_PARSED\",\n \"params\": {\n \"supported\": true,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1370,\n \"result_count\": 142\n}\n```\n\n### Asset Movements\n\n#### `DEBIT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1384,\n \"event\": \"DEBIT\",\n \"params\": {\n \"action\": \"utxo move\",\n \"address\": null,\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"event\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"quantity\": 2000000000,\n \"tx_index\": 141,\n \"utxo\": \"00000000000000000000000000000000000000000000000000000000000000ce:1\",\n \"utxo_address\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1381,\n \"result_count\": 137\n}\n```\n\n#### `CREDIT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1387,\n \"event\": \"CREDIT\",\n \"params\": {\n \"address\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"calling_function\": \"dispense\",\n \"event\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"quantity\": 66,\n \"tx_index\": 141,\n \"utxo\": null,\n \"utxo_address\": null,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000066\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1385,\n \"result_count\": 165\n}\n```\n\n#### `ENHANCED_SEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 689,\n \"event\": \"ENHANCED_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 203,\n \"destination\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"memo\": null,\n \"msg_index\": 0,\n \"quantity\": 1000,\n \"send_type\": \"send\",\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"tx_index\": 80,\n \"block_time\": 1781627230,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"block_index\": 203,\n \"block_time\": 1781627230\n }\n ],\n \"next_cursor\": 559,\n \"result_count\": 3\n}\n```\n\n#### `MPMA_SEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 746,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 207,\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"memo\": \"memo1\",\n \"msg_index\": 2,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"tx_index\": 84,\n \"block_time\": 1781627248,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"block_index\": 207,\n \"block_time\": 1781627248\n }\n ],\n \"next_cursor\": 745,\n \"result_count\": 15\n}\n```\n\n#### `SEND`\n\n```\n{\n \"result\": [],\n \"next_cursor\": null,\n \"result_count\": 0\n}\n```\n\n#### `ASSET_TRANSFER`\n\n```\n{\n \"result\": [],\n \"next_cursor\": null,\n \"result_count\": 0\n}\n```\n\n#### `SWEEP`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 604,\n \"event\": \"SWEEP\",\n \"params\": {\n \"block_index\": 192,\n \"destination\": \"bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48\",\n \"fee_paid\": 800000,\n \"flags\": 1,\n \"memo\": \"sweep my assets\",\n \"source\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ac\",\n \"tx_index\": 68,\n \"block_time\": 1781627184,\n \"fee_paid_normalized\": \"0.00800000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ac\",\n \"block_index\": 192,\n \"block_time\": 1781627184\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ASSET_DIVIDEND`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 338,\n \"event\": \"ASSET_DIVIDEND\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 146,\n \"dividend_asset\": \"XCP\",\n \"fee_paid\": 20000,\n \"quantity_per_unit\": 100000000,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000e9\",\n \"tx_index\": 42,\n \"block_time\": 1781627018,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00020000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000e9\",\n \"block_index\": 146,\n \"block_time\": 1781627018\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n### Asset Creation and Destruction\n\n#### `RESET_ISSUANCE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1034,\n \"event\": \"RESET_ISSUANCE\",\n \"params\": {\n \"asset\": \"RESET\",\n \"asset_events\": \"reset\",\n \"asset_longname\": null,\n \"block_index\": 242,\n \"call_date\": 0,\n \"call_price\": 0.0,\n \"callable\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"fee_paid\": 0,\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"quantity\": 1200000000,\n \"reset\": true,\n \"source\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000008b\",\n \"tx_index\": 120,\n \"block_time\": 1781627431,\n \"quantity_normalized\": \"12.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000008b\",\n \"block_index\": 242,\n \"block_time\": 1781627431\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ASSET_CREATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1367,\n \"event\": \"ASSET_CREATION\",\n \"params\": {\n \"asset_id\": \"117132633401\",\n \"asset_longname\": null,\n \"asset_name\": \"OPENFAIR\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n }\n ],\n \"next_cursor\": 1340,\n \"result_count\": 39\n}\n```\n\n#### `ASSET_ISSUANCE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1375,\n \"event\": \"ASSET_ISSUANCE\",\n \"params\": {\n \"asset\": \"FAIRMARK\",\n \"asset_events\": \"close_fairminter\",\n \"asset_longname\": null,\n \"block_index\": 324,\n \"call_date\": 0,\n \"call_price\": 0.0,\n \"callable\": false,\n \"description\": \"\",\n \"description_locked\": false,\n \"divisible\": true,\n \"fair_minting\": false,\n \"fee_paid\": 0,\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"locked\": true,\n \"mime_type\": \"text/plain\",\n \"msg_index\": 1,\n \"quantity\": 0,\n \"reset\": false,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000094\",\n \"tx_index\": 137,\n \"block_time\": 1781627739,\n \"quantity_normalized\": \"0.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781627739\n }\n ],\n \"next_cursor\": 1368,\n \"result_count\": 76\n}\n```\n\n#### `ASSET_DESTRUCTION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1376,\n \"event\": \"ASSET_DESTRUCTION\",\n \"params\": {\n \"asset\": \"FAIRMARK\",\n \"block_index\": 324,\n \"quantity\": 400000000,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"tag\": \"soft cap not reached\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000094\",\n \"tx_index\": 137,\n \"block_time\": 1781627739,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": true,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"4.00000000\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781627739\n }\n ],\n \"next_cursor\": 1285,\n \"result_count\": 8\n}\n```\n\n### DEX\n\n#### `OPEN_ORDER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1358,\n \"event\": \"OPEN_ORDER\",\n \"params\": {\n \"block_index\": 322,\n \"expiration\": 21,\n \"expire_index\": 342,\n \"fee_provided\": 10000,\n \"fee_provided_remaining\": 10000,\n \"fee_required\": 0,\n \"fee_required_remaining\": 0,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"get_remaining\": 1000,\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"give_remaining\": 1000,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"tx_index\": 139,\n \"block_time\": 1781627730,\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"get_remaining_normalized\": \"0.00001000\",\n \"give_remaining_normalized\": \"0.00001000\",\n \"fee_provided_normalized\": \"0.00010000\",\n \"fee_required_normalized\": \"0.00000000\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n }\n ],\n \"next_cursor\": 1353,\n \"result_count\": 12\n}\n```\n\n#### `ORDER_MATCH`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1361,\n \"event\": \"ORDER_MATCH\",\n \"params\": {\n \"backward_asset\": \"BTC\",\n \"backward_quantity\": 1000,\n \"block_index\": 322,\n \"fee_paid\": 0,\n \"forward_asset\": \"UTXOASSET\",\n \"forward_quantity\": 1000,\n \"id\": \"00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5\",\n \"match_expire_index\": 341,\n \"status\": \"pending\",\n \"tx0_address\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"tx0_block_index\": 321,\n \"tx0_expiration\": 21,\n \"tx0_hash\": \"00000000000000000000000000000000000000000000000000000000000000ec\",\n \"tx0_index\": 138,\n \"tx1_address\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"tx1_block_index\": 322,\n \"tx1_expiration\": 21,\n \"tx1_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"tx1_index\": 139,\n \"block_time\": 1781627730,\n \"forward_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\"\n },\n \"backward_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"forward_quantity_normalized\": \"0.00001000\",\n \"backward_quantity_normalized\": \"0.00001000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n }\n ],\n \"next_cursor\": 712,\n \"result_count\": 5\n}\n```\n\n#### `ORDER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1360,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n }\n ],\n \"next_cursor\": 1359,\n \"result_count\": 22\n}\n```\n\n#### `ORDER_FILLED`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 538,\n \"event\": \"ORDER_FILLED\",\n \"params\": {\n \"status\": \"filled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000005\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_time\": 1781627149\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `ORDER_MATCH_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 882,\n \"event\": \"ORDER_MATCH_UPDATE\",\n \"params\": {\n \"id\": \"000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059\",\n \"status\": \"expired\"\n },\n \"tx_hash\": null,\n \"block_index\": 225,\n \"block_time\": 1781627326\n }\n ],\n \"next_cursor\": 706,\n \"result_count\": 4\n}\n```\n\n#### `BTC_PAY`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 539,\n \"event\": \"BTC_PAY\",\n \"params\": {\n \"block_index\": 184,\n \"btc_amount\": 2000,\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"tx_index\": 60,\n \"block_time\": 1781627149,\n \"btc_amount_normalized\": \"0.00002000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_time\": 1781627149\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `CANCEL_ORDER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1148,\n \"event\": \"CANCEL_ORDER\",\n \"params\": {\n \"block_index\": 294,\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000075\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"tx_index\": 122,\n \"block_time\": 1781627527\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"block_index\": 294,\n \"block_time\": 1781627527\n }\n ],\n \"next_cursor\": 584,\n \"result_count\": 2\n}\n```\n\n#### `ORDER_EXPIRATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1351,\n \"event\": \"ORDER_EXPIRATION\",\n \"params\": {\n \"block_index\": 321,\n \"order_hash\": \"000000000000000000000000000000000000000000000000000000000000003d\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"block_time\": 1781627725\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ec\",\n \"block_index\": 321,\n \"block_time\": 1781627725\n }\n ],\n \"next_cursor\": 785,\n \"result_count\": 6\n}\n```\n\n#### `ORDER_MATCH_EXPIRATION`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 884,\n \"event\": \"ORDER_MATCH_EXPIRATION\",\n \"params\": {\n \"block_index\": 225,\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059\",\n \"tx0_address\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"tx1_address\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"block_time\": 1781627326\n },\n \"tx_hash\": null,\n \"block_index\": 225,\n \"block_time\": 1781627326\n }\n ],\n \"next_cursor\": 709,\n \"result_count\": 3\n}\n```\n\n### Dispenser\n\n#### `OPEN_DISPENSER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1009,\n \"event\": \"OPEN_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 238,\n \"dispense_count\": 0,\n \"escrow_quantity\": 5000,\n \"give_quantity\": 1,\n \"give_remaining\": 5000,\n \"oracle_address\": null,\n \"origin\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"satoshirate\": 1,\n \"source\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000004\",\n \"tx_index\": 117,\n \"block_time\": 1781627411,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"give_remaining_normalized\": \"0.00005000\",\n \"escrow_quantity_normalized\": \"0.00005000\",\n \"satoshirate_normalized\": \"0.00000001\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000004\",\n \"block_index\": 238,\n \"block_time\": 1781627411\n }\n ],\n \"next_cursor\": 620,\n \"result_count\": 6\n}\n```\n\n#### `DISPENSER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1388,\n \"event\": \"DISPENSER_UPDATE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"dispense_count\": 2,\n \"give_remaining\": 9268,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": 0,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ab\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_remaining_normalized\": \"0.00009268\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1016,\n \"result_count\": 9\n}\n```\n\n#### `REFILL_DISPENSER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 253,\n \"event\": \"REFILL_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 135,\n \"destination\": \"1ETMS7pxnaiJ9icyKcXv6NHn6dp6kvDXup\",\n \"dispense_quantity\": 10,\n \"dispenser_tx_hash\": \"000000000000000000000000000000000000000000000000000000000000006e\",\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002a\",\n \"tx_index\": 31,\n \"block_time\": 1781626973,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002a\",\n \"block_index\": 135,\n \"block_time\": 1781626973\n }\n ],\n \"next_cursor\": null,\n \"result_count\": 1\n}\n```\n\n#### `DISPENSE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1389,\n \"event\": \"DISPENSE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"dispense_index\": 0,\n \"dispense_quantity\": 66,\n \"dispenser_tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ab\",\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000066\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1017,\n \"result_count\": 6\n}\n```\n\n### Broadcast\n\n#### `BROADCAST`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 210,\n \"event\": \"BROADCAST\",\n \"params\": {\n \"block_index\": 129,\n \"fee_fraction_int\": 0,\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": \"valid\",\n \"text\": \"price-USD\",\n \"timestamp\": 4003903983,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000d3\",\n \"tx_index\": 25,\n \"value\": 66600.0,\n \"block_time\": 1781626948,\n \"fee_fraction_int_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000d3\",\n \"block_index\": 129,\n \"block_time\": 1781626948\n }\n ],\n \"next_cursor\": 205,\n \"result_count\": 2\n}\n```\n\n### Fair Minting\n\n#### `NEW_FAIRMINTER`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1366,\n \"event\": \"NEW_FAIRMINTER\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_longname\": null,\n \"asset_parent\": null,\n \"block_index\": 323,\n \"burn_payment\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"end_block\": 0,\n \"hard_cap\": 0,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"lp_asset\": null,\n \"max_mint_per_address\": 0,\n \"max_mint_per_tx\": 10,\n \"mime_type\": \"text/plain\",\n \"minted_asset_commission_int\": 0,\n \"pool_quantity\": 0,\n \"pre_minted\": false,\n \"premint_quantity\": 0,\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"start_block\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"tx_index\": 140,\n \"block_time\": 1781627734,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n }\n ],\n \"next_cursor\": 1339,\n \"result_count\": 23\n}\n```\n\n#### `FAIRMINTER_UPDATE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1374,\n \"event\": \"FAIRMINTER_UPDATE\",\n \"params\": {\n \"status\": \"closed\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000094\"\n },\n \"tx_hash\": null,\n \"block_index\": 324,\n \"block_time\": 1781627739\n }\n ],\n \"next_cursor\": 1326,\n \"result_count\": 15\n}\n```\n\n#### `NEW_FAIRMINT`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1313,\n \"event\": \"NEW_FAIRMINT\",\n \"params\": {\n \"asset\": \"FAIRMULTI\",\n \"block_index\": 315,\n \"commission\": 0,\n \"earn_quantity\": 400000000,\n \"fairminter_tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000114\",\n \"paid_quantity\": 400000000,\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000098\",\n \"tx_index\": 136,\n \"block_time\": 1781627702,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": true,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"earn_quantity_normalized\": \"4.00000000\",\n \"commission_normalized\": \"0.00000000\",\n \"paid_quantity_normalized\": \"4.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000098\",\n \"block_index\": 315,\n \"block_time\": 1781627702\n }\n ],\n \"next_cursor\": 1304,\n \"result_count\": 22\n}\n```\n\n### UTXO Support\n\n#### `ATTACH_TO_UTXO`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 998,\n \"event\": \"ATTACH_TO_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 237,\n \"destination\": \"0000000000000000000000000000000000000000000000000000000000000020:0\",\n \"destination_address\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"attach\",\n \"source\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000020\",\n \"tx_index\": 115,\n \"block_time\": 1781627398,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000020\",\n \"block_index\": 237,\n \"block_time\": 1781627398\n }\n ],\n \"next_cursor\": 977,\n \"result_count\": 9\n}\n```\n\n#### `DETACH_FROM_UTXO`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 990,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHB\",\n \"block_index\": 236,\n \"destination\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"fee_paid\": 0,\n \"msg_index\": 1,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000fe:0\",\n \"source_address\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"tx_index\": 114,\n \"block_time\": 1781627395,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"block_index\": 236,\n \"block_time\": 1781627395\n }\n ],\n \"next_cursor\": 987,\n \"result_count\": 5\n}\n```\n\n#### `UTXO_MOVE`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 1386,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"destination\": \"00000000000000000000000000000000000000000000000000000000000000c5:0\",\n \"destination_address\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"msg_index\": 1,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000ce:1\",\n \"source_address\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"next_cursor\": 1383,\n \"result_count\": 14\n}\n```\n\n### Burns\n\n#### `BURN`\n\n```\n{\n \"result\": [\n {\n \"event_index\": 61,\n \"event\": \"BURN\",\n \"params\": {\n \"block_index\": 112,\n \"burned\": 50000000,\n \"earned\": 74999998167,\n \"source\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a3\",\n \"tx_index\": 9,\n \"block_time\": 1781626875,\n \"burned_normalized\": \"0.50000000\",\n \"earned_normalized\": \"749.99998167\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a3\",\n \"block_index\": 112,\n \"block_time\": 1781626875\n }\n ],\n \"next_cursor\": 58,\n \"result_count\": 10\n}\n```\n\n" }, "servers": [ { @@ -19,7 +19,7 @@ }, { "name": "Transactions", - "description": "\nThere are 14 types of transactions:\n\n- `broadcast`\n- `btcpay`\n- `cancel`\n- `destroy`\n- `dispenser`\n- `dispense`\n- `dividend`\n- `issuance`\n- `order`\n- `enhanced_send`\n- `mpma_send`\n- `sweep`\n- `attach`\n- `detach`\n\nHere is sample API output for each of these transactions:\n\n**Broadcast**\n\n```\n{\n \"result\": {\n \"tx_index\": 25,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"block_index\": 129,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_time\": 1781528928,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"1e851aeea6b9effb40f042800000000000604970726963652d555344\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000082:1 2 0\",\n \"transaction_type\": \"broadcast\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 210,\n \"event\": \"BROADCAST\",\n \"params\": {\n \"block_index\": 129,\n \"fee_fraction_int\": 0,\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": \"valid\",\n \"text\": \"price-USD\",\n \"timestamp\": 4003903983,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"tx_index\": 25,\n \"value\": 66600.0,\n \"block_time\": 1781528928,\n \"fee_fraction_int_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"block_index\": 129,\n \"block_time\": 1781528928\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"broadcast\",\n \"message_type_id\": 30,\n \"message_data\": {\n \"timestamp\": 4003903983,\n \"value\": 66600.0,\n \"fee_fraction_int\": 0,\n \"text\": \"price-USD\",\n \"mime_type\": \"text/plain\",\n \"status\": \"valid\",\n \"fee_fraction_int_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Btcpay**\n\n```\n{\n \"result\": {\n \"tx_index\": 60,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000025\",\n \"block_time\": 1781529130,\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"btc_amount\": 2000,\n \"fee\": 10000,\n \"data\": \"00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000a903\",\n \"supported\": true,\n \"utxos_info\": \" 000000000000000000000000000000000000000000000000000000000000002f:0 3 1\",\n \"transaction_type\": \"btcpay\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 537,\n \"event\": \"ORDER_MATCH_UPDATE\",\n \"params\": {\n \"id\": \"0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058\",\n \"order_match_id\": \"0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058\",\n \"status\": \"completed\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_time\": 1781529130\n },\n {\n \"event_index\": 538,\n \"event\": \"ORDER_FILLED\",\n \"params\": {\n \"status\": \"filled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_time\": 1781529130\n },\n {\n \"event_index\": 539,\n \"event\": \"BTC_PAY\",\n \"params\": {\n \"block_index\": 184,\n \"btc_amount\": 2000,\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"order_match_id\": \"0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"tx_index\": 60,\n \"block_time\": 1781529130,\n \"btc_amount_normalized\": \"0.00002000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_index\": 184,\n \"block_time\": 1781529130\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"btcpay\",\n \"message_type_id\": 11,\n \"message_data\": {\n \"tx0_hash\": \"0000000000000000000000000000000000000000000000000000000000000025\",\n \"tx1_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"order_match_id\": \"0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058\",\n \"status\": \"valid\"\n }\n },\n \"btc_amount_normalized\": \"0.00002000\"\n }\n}\n```\n\n**Cancel**\n\n```\n{\n \"result\": {\n \"tx_index\": 122,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 294,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_time\": 1781529481,\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"000000000000000000000000000000000000000000000000000000000000006016\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000002:1 2 0\",\n \"transaction_type\": \"cancel\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1146,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"status\": \"cancelled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 294,\n \"block_time\": 1781529481\n },\n {\n \"event_index\": 1148,\n \"event\": \"CANCEL_ORDER\",\n \"params\": {\n \"block_index\": 294,\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx_index\": 122,\n \"block_time\": 1781529481\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_index\": 294,\n \"block_time\": 1781529481\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"cancel\",\n \"message_type_id\": 70,\n \"message_data\": {\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000082\",\n \"status\": \"valid\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Destroy**\n\n```\n{\n \"error\": \"Invalid transaction hash: None\"\n}\n```\n\n**Dispenser**\n\n```\n{\n \"result\": {\n \"tx_index\": 117,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 238,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_time\": 1781529369,\n \"source\": \"bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 0,\n \"data\": \"00000000000000000000000000000000000000000000000000000000000000030100\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000003:1 2 0\",\n \"transaction_type\": \"dispenser\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1009,\n \"event\": \"OPEN_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 238,\n \"dispense_count\": 0,\n \"escrow_quantity\": 5000,\n \"give_quantity\": 1,\n \"give_remaining\": 5000,\n \"oracle_address\": null,\n \"origin\": \"bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0\",\n \"satoshirate\": 1,\n \"source\": \"bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 117,\n \"block_time\": 1781529369,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"give_remaining_normalized\": \"0.00005000\",\n \"escrow_quantity_normalized\": \"0.00005000\",\n \"satoshirate_normalized\": \"0.00000001\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 238,\n \"block_time\": 1781529369\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dispenser\",\n \"message_type_id\": 12,\n \"message_data\": {\n \"asset\": \"XCP\",\n \"give_quantity\": 1,\n \"escrow_quantity\": 5000,\n \"mainchainrate\": 1,\n \"dispenser_status\": 0,\n \"action_address\": null,\n \"oracle_address\": null,\n \"status\": \"valid\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"escrow_quantity_normalized\": \"0.00005000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Dispense**\n\n```\n{\n \"result\": {\n \"tx_index\": 141,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_time\": 1781529693,\n \"source\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"destination\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"btc_amount\": 1000,\n \"fee\": 0,\n \"data\": \"0d00\",\n \"supported\": true,\n \"utxos_info\": \"0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1\",\n \"transaction_type\": \"dispense\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1383,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 325,\n \"destination\": \"000000000000000000000000000000000000000000000000000000000000004b:0\",\n \"destination_address\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"msg_index\": 0,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000025:1\",\n \"source_address\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n },\n {\n \"event_index\": 1386,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"destination\": \"000000000000000000000000000000000000000000000000000000000000004b:0\",\n \"destination_address\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"msg_index\": 1,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000025:1\",\n \"source_address\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n },\n {\n \"event_index\": 1388,\n \"event\": \"DISPENSER_UPDATE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"dispense_count\": 2,\n \"give_remaining\": 9268,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_remaining_normalized\": \"0.00009268\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n },\n {\n \"event_index\": 1389,\n \"event\": \"DISPENSE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8\",\n \"dispense_index\": 0,\n \"dispense_quantity\": 66,\n \"dispenser_tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"tx_index\": 141,\n \"block_time\": 1781529693,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000066\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_index\": 325,\n \"block_time\": 1781529693\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dispense\",\n \"message_type_id\": 13,\n \"message_data\": {\n \"data\": \"00\"\n }\n },\n \"btc_amount_normalized\": \"0.00001000\"\n }\n}\n```\n\n**Dividend**\n\n```\n{\n \"result\": {\n \"tx_index\": 42,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 146,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_time\": 1781528999,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"320000000005f5e100000000182b37176e0000000000000001\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000032:1 2 0\",\n \"transaction_type\": \"dividend\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 338,\n \"event\": \"ASSET_DIVIDEND\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 146,\n \"dividend_asset\": \"XCP\",\n \"fee_paid\": 20000,\n \"quantity_per_unit\": 100000000,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 42,\n \"block_time\": 1781528999,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00020000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 146,\n \"block_time\": 1781528999\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dividend\",\n \"message_type_id\": 50,\n \"message_data\": {\n \"asset\": \"MYASSETA\",\n \"quantity_per_unit\": 100000000,\n \"dividend_asset\": \"XCP\",\n \"status\": \"valid\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Issuance**\n\n```\n{\n \"result\": {\n \"tx_index\": 140,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_time\": 1781529682,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"5a931b0000001b45a625390000010a0000000000000000f4f4f4f56040\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000058:1 2 0\",\n \"transaction_type\": \"fairminter\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1366,\n \"event\": \"NEW_FAIRMINTER\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_longname\": null,\n \"asset_parent\": null,\n \"block_index\": 323,\n \"burn_payment\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"end_block\": 0,\n \"hard_cap\": 0,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"lp_asset\": null,\n \"max_mint_per_address\": 0,\n \"max_mint_per_tx\": 10,\n \"mime_type\": \"text/plain\",\n \"minted_asset_commission_int\": 0,\n \"pool_quantity\": 0,\n \"pre_minted\": false,\n \"premint_quantity\": 0,\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"start_block\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 140,\n \"block_time\": 1781529682,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n },\n {\n \"event_index\": 1367,\n \"event\": \"ASSET_CREATION\",\n \"params\": {\n \"asset_id\": \"117132633401\",\n \"asset_longname\": null,\n \"asset_name\": \"OPENFAIR\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n },\n {\n \"event_index\": 1368,\n \"event\": \"ASSET_ISSUANCE\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_events\": \"open_fairminter\",\n \"asset_longname\": null,\n \"block_index\": 323,\n \"call_date\": 0,\n \"call_price\": 0,\n \"callable\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"fair_minting\": true,\n \"fee_paid\": 50000000,\n \"issuer\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"quantity\": 0,\n \"reset\": false,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 140,\n \"block_time\": 1781529682,\n \"quantity_normalized\": \"0.00000000\",\n \"fee_paid_normalized\": \"0.50000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 323,\n \"block_time\": 1781529682\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"fairminter\",\n \"message_type_id\": 90,\n \"message_data\": {\n \"asset\": \"OPENFAIR\",\n \"asset_parent\": \"\",\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"max_mint_per_tx\": 10,\n \"max_mint_per_address\": 0,\n \"hard_cap\": 0,\n \"premint_quantity\": 0,\n \"start_block\": 0,\n \"end_block\": 0,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"minted_asset_commission\": \"0.00000000\",\n \"burn_payment\": false,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"divisible\": true,\n \"mime_type\": \"text/plain\",\n \"description\": \"\",\n \"pool_quantity\": 0,\n \"lp_asset\": null,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Order**\n\n```\n{\n \"result\": {\n \"tx_index\": 139,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"block_time\": 1781529679,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"0000000000000000000000000000000000000000000000000000000000000002e800150000000000000000\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000003:1 2 0\",\n \"transaction_type\": \"order\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1358,\n \"event\": \"OPEN_ORDER\",\n \"params\": {\n \"block_index\": 322,\n \"expiration\": 21,\n \"expire_index\": 342,\n \"fee_provided\": 10000,\n \"fee_provided_remaining\": 10000,\n \"fee_required\": 0,\n \"fee_required_remaining\": 0,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"get_remaining\": 1000,\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"give_remaining\": 1000,\n \"source\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 139,\n \"block_time\": 1781529679,\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"get_remaining_normalized\": \"0.00001000\",\n \"give_remaining_normalized\": \"0.00001000\",\n \"fee_provided_normalized\": \"0.00010000\",\n \"fee_required_normalized\": \"0.00000000\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n },\n {\n \"event_index\": 1359,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n },\n {\n \"event_index\": 1360,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n },\n {\n \"event_index\": 1361,\n \"event\": \"ORDER_MATCH\",\n \"params\": {\n \"backward_asset\": \"BTC\",\n \"backward_quantity\": 1000,\n \"block_index\": 322,\n \"fee_paid\": 0,\n \"forward_asset\": \"UTXOASSET\",\n \"forward_quantity\": 1000,\n \"id\": \"0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003\",\n \"match_expire_index\": 341,\n \"status\": \"pending\",\n \"tx0_address\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"tx0_block_index\": 321,\n \"tx0_expiration\": 21,\n \"tx0_hash\": \"0000000000000000000000000000000000000000000000000000000000000002\",\n \"tx0_index\": 138,\n \"tx1_address\": \"bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll\",\n \"tx1_block_index\": 322,\n \"tx1_expiration\": 21,\n \"tx1_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx1_index\": 139,\n \"block_time\": 1781529679,\n \"forward_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\"\n },\n \"backward_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"forward_quantity_normalized\": \"0.00001000\",\n \"backward_quantity_normalized\": \"0.00001000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 322,\n \"block_time\": 1781529679\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"order\",\n \"message_type_id\": 10,\n \"message_data\": {\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"expiration\": 21,\n \"fee_required\": 0,\n \"status\": \"open\",\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"fee_required_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Enhanced_send**\n\n```\n{\n \"result\": {\n \"tx_index\": 80,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 203,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_time\": 1781529208,\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"00000000000000000000000000000000000000000000000000000000000000020c8047627a40\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000058:1 2 0\",\n \"transaction_type\": \"enhanced_send\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 684,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"status\": \"expired\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000025\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 203,\n \"block_time\": 1781529208\n },\n {\n \"event_index\": 686,\n \"event\": \"ORDER_EXPIRATION\",\n \"params\": {\n \"block_index\": 203,\n \"order_hash\": \"0000000000000000000000000000000000000000000000000000000000000025\",\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"block_time\": 1781529208\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 203,\n \"block_time\": 1781529208\n },\n {\n \"event_index\": 689,\n \"event\": \"ENHANCED_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 203,\n \"destination\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"memo\": null,\n \"msg_index\": 0,\n \"quantity\": 1000,\n \"send_type\": \"send\",\n \"source\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"tx_index\": 80,\n \"block_time\": 1781529208,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_index\": 203,\n \"block_time\": 1781529208\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"enhanced_send\",\n \"message_type_id\": 2,\n \"message_data\": {\n \"asset\": \"MPMASSET\",\n \"quantity\": 1000,\n \"address\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"memo\": null,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00001000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Mpma_send**\n\n```\n{\n \"result\": {\n \"tx_index\": 84,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 207,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_time\": 1781529225,\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000028\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000032:0 4 \",\n \"transaction_type\": \"mpma\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 744,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 207,\n \"destination\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"memo\": \"the memo\",\n \"msg_index\": 0,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 84,\n \"block_time\": 1781529225,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 207,\n \"block_time\": 1781529225\n },\n {\n \"event_index\": 745,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 207,\n \"destination\": \"bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx\",\n \"memo\": \"memo3\",\n \"msg_index\": 1,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 84,\n \"block_time\": 1781529225,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 207,\n \"block_time\": 1781529225\n },\n {\n \"event_index\": 746,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 207,\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"memo\": \"memo1\",\n \"msg_index\": 2,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"tx_index\": 84,\n \"block_time\": 1781529225,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000032\",\n \"block_index\": 207,\n \"block_time\": 1781529225\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"mpma_send\",\n \"message_type_id\": 3,\n \"message_data\": [\n {\n \"asset\": \"MPMASSET\",\n \"destination\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"quantity\": 10,\n \"memo\": \"the memo\",\n \"memo_is_hex\": false,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n {\n \"asset\": \"XCP\",\n \"destination\": \"bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35\",\n \"quantity\": 10,\n \"memo\": \"memo1\",\n \"memo_is_hex\": false,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n }\n ]\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Sweep**\n\n```\n{\n \"result\": {\n \"tx_index\": 68,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 192,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000058\",\n \"block_time\": 1781529163,\n \"source\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"0000000000000000000000000000000000000000000000000000000000000002206d7920617373657473\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000003:1 2 0\",\n \"transaction_type\": \"sweep\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 604,\n \"event\": \"SWEEP\",\n \"params\": {\n \"block_index\": 192,\n \"destination\": \"bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx\",\n \"fee_paid\": 800000,\n \"flags\": 1,\n \"memo\": \"sweep my assets\",\n \"source\": \"bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 68,\n \"block_time\": 1781529163,\n \"fee_paid_normalized\": \"0.00800000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 192,\n \"block_time\": 1781529163\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"sweep\",\n \"message_type_id\": 4,\n \"message_data\": {\n \"destination\": \"bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx\",\n \"flags\": 1,\n \"memo\": \"sweep my assets\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Attach**\n\n```\n{\n \"result\": {\n \"tx_index\": 115,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 237,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000004b\",\n \"block_time\": 1781529363,\n \"source\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"destination\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"btc_amount\": 10000,\n \"fee\": 10000,\n \"data\": \"65444554414348417c3130303030303030307c\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000003:0 3 1\",\n \"transaction_type\": \"attach\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 998,\n \"event\": \"ATTACH_TO_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 237,\n \"destination\": \"0000000000000000000000000000000000000000000000000000000000000003:0\",\n \"destination_address\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"attach\",\n \"source\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"tx_index\": 115,\n \"block_time\": 1781529363,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"block_index\": 237,\n \"block_time\": 1781529363\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"attach\",\n \"message_type_id\": 101,\n \"message_data\": {\n \"asset\": \"DETACHA\",\n \"quantity\": 100000000,\n \"destination_vout\": null,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00010000\"\n }\n}\n```\n\n**Detach**\n\n```\n{\n \"result\": {\n \"tx_index\": 114,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_index\": 236,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000002f\",\n \"block_time\": 1781529359,\n \"source\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 0,\n \"data\": \"6630\",\n \"supported\": true,\n \"utxos_info\": \"0000000000000000000000000000000000000000000000000000000000000082:0 000000000000000000000000000000000000000000000000000000000000003f:1 2 0\",\n \"transaction_type\": \"detach\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 987,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 236,\n \"destination\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000082:0\",\n \"source_address\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"tx_index\": 114,\n \"block_time\": 1781529359,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_index\": 236,\n \"block_time\": 1781529359\n },\n {\n \"event_index\": 990,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHB\",\n \"block_index\": 236,\n \"destination\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"fee_paid\": 0,\n \"msg_index\": 1,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"0000000000000000000000000000000000000000000000000000000000000082:0\",\n \"source_address\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"tx_index\": 114,\n \"block_time\": 1781529359,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000003f\",\n \"block_index\": 236,\n \"block_time\": 1781529359\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"detach\",\n \"message_type_id\": 102,\n \"message_data\": {\n \"destination\": null\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n" + "description": "\nThere are 14 types of transactions:\n\n- `broadcast`\n- `btcpay`\n- `cancel`\n- `destroy`\n- `dispenser`\n- `dispense`\n- `dividend`\n- `issuance`\n- `order`\n- `enhanced_send`\n- `mpma_send`\n- `sweep`\n- `attach`\n- `detach`\n\nHere is sample API output for each of these transactions:\n\n**Broadcast**\n\n```\n{\n \"result\": {\n \"tx_index\": 25,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000d3\",\n \"block_index\": 129,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000047\",\n \"block_time\": 1781626948,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"1e851aeea6b9effb40f042800000000000604970726963652d555344\",\n \"supported\": true,\n \"utxos_info\": \" 00000000000000000000000000000000000000000000000000000000000000d3:1 2 0\",\n \"transaction_type\": \"broadcast\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 210,\n \"event\": \"BROADCAST\",\n \"params\": {\n \"block_index\": 129,\n \"fee_fraction_int\": 0,\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": \"valid\",\n \"text\": \"price-USD\",\n \"timestamp\": 4003903983,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000d3\",\n \"tx_index\": 25,\n \"value\": 66600.0,\n \"block_time\": 1781626948,\n \"fee_fraction_int_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000d3\",\n \"block_index\": 129,\n \"block_time\": 1781626948\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"broadcast\",\n \"message_type_id\": 30,\n \"message_data\": {\n \"timestamp\": 4003903983,\n \"value\": 66600.0,\n \"fee_fraction_int\": 0,\n \"text\": \"price-USD\",\n \"mime_type\": \"text/plain\",\n \"status\": \"valid\",\n \"fee_fraction_int_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Btcpay**\n\n```\n{\n \"result\": {\n \"tx_index\": 60,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000007e\",\n \"block_time\": 1781627149,\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"btc_amount\": 2000,\n \"fee\": 10000,\n \"data\": \"000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000117e5\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000095:0 3 1\",\n \"transaction_type\": \"btcpay\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 537,\n \"event\": \"ORDER_MATCH_UPDATE\",\n \"params\": {\n \"id\": \"000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005\",\n \"status\": \"completed\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_time\": 1781627149\n },\n {\n \"event_index\": 538,\n \"event\": \"ORDER_FILLED\",\n \"params\": {\n \"status\": \"filled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000005\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_time\": 1781627149\n },\n {\n \"event_index\": 539,\n \"event\": \"BTC_PAY\",\n \"params\": {\n \"block_index\": 184,\n \"btc_amount\": 2000,\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"tx_index\": 60,\n \"block_time\": 1781627149,\n \"btc_amount_normalized\": \"0.00002000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000095\",\n \"block_index\": 184,\n \"block_time\": 1781627149\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"btcpay\",\n \"message_type_id\": 11,\n \"message_data\": {\n \"tx0_hash\": \"000000000000000000000000000000000000000000000000000000000000007d\",\n \"tx1_hash\": \"0000000000000000000000000000000000000000000000000000000000000005\",\n \"order_match_id\": \"000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005\",\n \"status\": \"valid\"\n }\n },\n \"btc_amount_normalized\": \"0.00002000\"\n }\n}\n```\n\n**Cancel**\n\n```\n{\n \"result\": {\n \"tx_index\": 122,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"block_index\": 294,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000053\",\n \"block_time\": 1781627527,\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"460000000000000000000000000000000000000000000000000000000000000075\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000108:1 2 0\",\n \"transaction_type\": \"cancel\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1146,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"status\": \"cancelled\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000075\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"block_index\": 294,\n \"block_time\": 1781627527\n },\n {\n \"event_index\": 1148,\n \"event\": \"CANCEL_ORDER\",\n \"params\": {\n \"block_index\": 294,\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000075\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"tx_index\": 122,\n \"block_time\": 1781627527\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000108\",\n \"block_index\": 294,\n \"block_time\": 1781627527\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"cancel\",\n \"message_type_id\": 70,\n \"message_data\": {\n \"offer_hash\": \"0000000000000000000000000000000000000000000000000000000000000075\",\n \"status\": \"valid\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Destroy**\n\n```\n{\n \"error\": \"Invalid transaction hash: None\"\n}\n```\n\n**Dispenser**\n\n```\n{\n \"result\": {\n \"tx_index\": 117,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000004\",\n \"block_index\": 238,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000043\",\n \"block_time\": 1781627411,\n \"source\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 0,\n \"data\": \"00000000000000000000000000000000000000000000000000000000000000300100\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000004:1 2 0\",\n \"transaction_type\": \"dispenser\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1009,\n \"event\": \"OPEN_DISPENSER\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 238,\n \"dispense_count\": 0,\n \"escrow_quantity\": 5000,\n \"give_quantity\": 1,\n \"give_remaining\": 5000,\n \"oracle_address\": null,\n \"origin\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"satoshirate\": 1,\n \"source\": \"bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s\",\n \"status\": 0,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000004\",\n \"tx_index\": 117,\n \"block_time\": 1781627411,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"give_remaining_normalized\": \"0.00005000\",\n \"escrow_quantity_normalized\": \"0.00005000\",\n \"satoshirate_normalized\": \"0.00000001\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000004\",\n \"block_index\": 238,\n \"block_time\": 1781627411\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dispenser\",\n \"message_type_id\": 12,\n \"message_data\": {\n \"asset\": \"XCP\",\n \"give_quantity\": 1,\n \"escrow_quantity\": 5000,\n \"mainchainrate\": 1,\n \"dispenser_status\": 0,\n \"action_address\": null,\n \"oracle_address\": null,\n \"status\": \"valid\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_quantity_normalized\": \"0.00000001\",\n \"escrow_quantity_normalized\": \"0.00005000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Dispense**\n\n```\n{\n \"result\": {\n \"tx_index\": 141,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000007b\",\n \"block_time\": 1781627750,\n \"source\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"destination\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"btc_amount\": 1000,\n \"fee\": 0,\n \"data\": \"0d00\",\n \"supported\": true,\n \"utxos_info\": \"00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1\",\n \"transaction_type\": \"dispense\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1383,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 325,\n \"destination\": \"00000000000000000000000000000000000000000000000000000000000000c5:0\",\n \"destination_address\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"msg_index\": 0,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000ce:1\",\n \"source_address\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n },\n {\n \"event_index\": 1386,\n \"event\": \"UTXO_MOVE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"destination\": \"00000000000000000000000000000000000000000000000000000000000000c5:0\",\n \"destination_address\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"msg_index\": 1,\n \"quantity\": 2000000000,\n \"send_type\": \"move\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000ce:1\",\n \"source_address\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"20.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n },\n {\n \"event_index\": 1388,\n \"event\": \"DISPENSER_UPDATE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"dispense_count\": 2,\n \"give_remaining\": 9268,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": 0,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ab\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"give_remaining_normalized\": \"0.00009268\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n },\n {\n \"event_index\": 1389,\n \"event\": \"DISPENSE\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 325,\n \"btc_amount\": 1000,\n \"destination\": \"bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf\",\n \"dispense_index\": 0,\n \"dispense_quantity\": 66,\n \"dispenser_tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ab\",\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"tx_index\": 141,\n \"block_time\": 1781627750,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"dispense_quantity_normalized\": \"0.00000066\",\n \"btc_amount_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000c5\",\n \"block_index\": 325,\n \"block_time\": 1781627750\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dispense\",\n \"message_type_id\": 13,\n \"message_data\": {\n \"data\": \"00\"\n }\n },\n \"btc_amount_normalized\": \"0.00001000\"\n }\n}\n```\n\n**Dividend**\n\n```\n{\n \"result\": {\n \"tx_index\": 42,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000e9\",\n \"block_index\": 146,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000097\",\n \"block_time\": 1781627018,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"320000000005f5e100000000182b37176e0000000000000001\",\n \"supported\": true,\n \"utxos_info\": \" 00000000000000000000000000000000000000000000000000000000000000e9:1 2 0\",\n \"transaction_type\": \"dividend\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 338,\n \"event\": \"ASSET_DIVIDEND\",\n \"params\": {\n \"asset\": \"MYASSETA\",\n \"block_index\": 146,\n \"dividend_asset\": \"XCP\",\n \"fee_paid\": 20000,\n \"quantity_per_unit\": 100000000,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000e9\",\n \"tx_index\": 42,\n \"block_time\": 1781627018,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00020000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000e9\",\n \"block_index\": 146,\n \"block_time\": 1781627018\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"dividend\",\n \"message_type_id\": 50,\n \"message_data\": {\n \"asset\": \"MYASSETA\",\n \"quantity_per_unit\": 100000000,\n \"dividend_asset\": \"XCP\",\n \"status\": \"valid\",\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset A\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"dividend_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_per_unit_normalized\": \"1.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Issuance**\n\n```\n{\n \"result\": {\n \"tx_index\": 140,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_hash\": \"00000000000000000000000000000000000000000000000000000000000000a2\",\n \"block_time\": 1781627734,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"5a931b0000001b45a625390000010a0000000000000000f4f4f4f56040\",\n \"supported\": true,\n \"utxos_info\": \" 00000000000000000000000000000000000000000000000000000000000000a8:1 2 0\",\n \"transaction_type\": \"fairminter\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1366,\n \"event\": \"NEW_FAIRMINTER\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_longname\": null,\n \"asset_parent\": null,\n \"block_index\": 323,\n \"burn_payment\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"end_block\": 0,\n \"hard_cap\": 0,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"lp_asset\": null,\n \"max_mint_per_address\": 0,\n \"max_mint_per_tx\": 10,\n \"mime_type\": \"text/plain\",\n \"minted_asset_commission_int\": 0,\n \"pool_quantity\": 0,\n \"pre_minted\": false,\n \"premint_quantity\": 0,\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"start_block\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"tx_index\": 140,\n \"block_time\": 1781627734,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n },\n {\n \"event_index\": 1367,\n \"event\": \"ASSET_CREATION\",\n \"params\": {\n \"asset_id\": \"117132633401\",\n \"asset_longname\": null,\n \"asset_name\": \"OPENFAIR\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n },\n {\n \"event_index\": 1368,\n \"event\": \"ASSET_ISSUANCE\",\n \"params\": {\n \"asset\": \"OPENFAIR\",\n \"asset_events\": \"open_fairminter\",\n \"asset_longname\": null,\n \"block_index\": 323,\n \"call_date\": 0,\n \"call_price\": 0,\n \"callable\": false,\n \"description\": \"\",\n \"divisible\": true,\n \"fair_minting\": true,\n \"fee_paid\": 50000000,\n \"issuer\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"locked\": false,\n \"mime_type\": \"text/plain\",\n \"quantity\": 0,\n \"reset\": false,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": \"valid\",\n \"transfer\": false,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"tx_index\": 140,\n \"block_time\": 1781627734,\n \"quantity_normalized\": \"0.00000000\",\n \"fee_paid_normalized\": \"0.50000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000a8\",\n \"block_index\": 323,\n \"block_time\": 1781627734\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"fairminter\",\n \"message_type_id\": 90,\n \"message_data\": {\n \"asset\": \"OPENFAIR\",\n \"asset_parent\": \"\",\n \"price\": 0,\n \"quantity_by_price\": 1,\n \"max_mint_per_tx\": 10,\n \"max_mint_per_address\": 0,\n \"hard_cap\": 0,\n \"premint_quantity\": 0,\n \"start_block\": 0,\n \"end_block\": 0,\n \"soft_cap\": 0,\n \"soft_cap_deadline_block\": 0,\n \"minted_asset_commission\": \"0.00000000\",\n \"burn_payment\": false,\n \"lock_description\": false,\n \"lock_quantity\": false,\n \"divisible\": true,\n \"mime_type\": \"text/plain\",\n \"description\": \"\",\n \"pool_quantity\": 0,\n \"lp_asset\": null,\n \"price_normalized\": \"0.0000000000000000\",\n \"hard_cap_normalized\": \"0.00000000\",\n \"soft_cap_normalized\": \"0.00000000\",\n \"quantity_by_price_normalized\": \"0.00000001\",\n \"max_mint_per_tx_normalized\": \"0.00000010\",\n \"premint_quantity_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Order**\n\n```\n{\n \"result\": {\n \"tx_index\": 139,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_hash\": \"00000000000000000000000000000000000000000000000000000000000000b0\",\n \"block_time\": 1781627730,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"000000000000000000000000000000000000000000000000000000000000002ce800150000000000000000\",\n \"supported\": true,\n \"utxos_info\": \" 00000000000000000000000000000000000000000000000000000000000000f5:1 2 0\",\n \"transaction_type\": \"order\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 1358,\n \"event\": \"OPEN_ORDER\",\n \"params\": {\n \"block_index\": 322,\n \"expiration\": 21,\n \"expire_index\": 342,\n \"fee_provided\": 10000,\n \"fee_provided_remaining\": 10000,\n \"fee_required\": 0,\n \"fee_required_remaining\": 0,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"get_remaining\": 1000,\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"give_remaining\": 1000,\n \"source\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"tx_index\": 139,\n \"block_time\": 1781627730,\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"get_remaining_normalized\": \"0.00001000\",\n \"give_remaining_normalized\": \"0.00001000\",\n \"fee_provided_normalized\": \"0.00010000\",\n \"fee_required_normalized\": \"0.00000000\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n },\n {\n \"event_index\": 1359,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ec\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n },\n {\n \"event_index\": 1360,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"fee_provided_remaining\": 10000,\n \"fee_required_remaining\": 0,\n \"get_remaining\": 0,\n \"give_remaining\": 0,\n \"status\": \"open\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"fee_required_remaining_normalized\": \"0.00000000\",\n \"fee_provided_remaining_normalized\": \"0.00010000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n },\n {\n \"event_index\": 1361,\n \"event\": \"ORDER_MATCH\",\n \"params\": {\n \"backward_asset\": \"BTC\",\n \"backward_quantity\": 1000,\n \"block_index\": 322,\n \"fee_paid\": 0,\n \"forward_asset\": \"UTXOASSET\",\n \"forward_quantity\": 1000,\n \"id\": \"00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5\",\n \"match_expire_index\": 341,\n \"status\": \"pending\",\n \"tx0_address\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"tx0_block_index\": 321,\n \"tx0_expiration\": 21,\n \"tx0_hash\": \"00000000000000000000000000000000000000000000000000000000000000ec\",\n \"tx0_index\": 138,\n \"tx1_address\": \"bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0\",\n \"tx1_block_index\": 322,\n \"tx1_expiration\": 21,\n \"tx1_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"tx1_index\": 139,\n \"block_time\": 1781627730,\n \"forward_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\"\n },\n \"backward_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"forward_quantity_normalized\": \"0.00001000\",\n \"backward_quantity_normalized\": \"0.00001000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000f5\",\n \"block_index\": 322,\n \"block_time\": 1781627730\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"order\",\n \"message_type_id\": 10,\n \"message_data\": {\n \"give_asset\": \"BTC\",\n \"give_quantity\": 1000,\n \"get_asset\": \"UTXOASSET\",\n \"get_quantity\": 1000,\n \"expiration\": 21,\n \"fee_required\": 0,\n \"status\": \"open\",\n \"give_asset_info\": {\n \"divisible\": true,\n \"asset_longname\": null,\n \"description\": \"The Bitcoin cryptocurrency\",\n \"locked\": false,\n \"issuer\": null\n },\n \"get_asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset\",\n \"issuer\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8\"\n },\n \"give_quantity_normalized\": \"0.00001000\",\n \"get_quantity_normalized\": \"0.00001000\",\n \"fee_required_normalized\": \"0.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Enhanced_send**\n\n```\n{\n \"result\": {\n \"tx_index\": 80,\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"block_index\": 203,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000072\",\n \"block_time\": 1781627230,\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"00000000000000000000000000000000000000000000000000000000000000218dfc13b2b140\",\n \"supported\": true,\n \"utxos_info\": \" 000000000000000000000000000000000000000000000000000000000000004f:1 2 0\",\n \"transaction_type\": \"enhanced_send\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 684,\n \"event\": \"ORDER_UPDATE\",\n \"params\": {\n \"status\": \"expired\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000007d\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"block_index\": 203,\n \"block_time\": 1781627230\n },\n {\n \"event_index\": 686,\n \"event\": \"ORDER_EXPIRATION\",\n \"params\": {\n \"block_index\": 203,\n \"order_hash\": \"000000000000000000000000000000000000000000000000000000000000007d\",\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"block_time\": 1781627230\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"block_index\": 203,\n \"block_time\": 1781627230\n },\n {\n \"event_index\": 689,\n \"event\": \"ENHANCED_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 203,\n \"destination\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"memo\": null,\n \"msg_index\": 0,\n \"quantity\": 1000,\n \"send_type\": \"send\",\n \"source\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"status\": \"valid\",\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"tx_index\": 80,\n \"block_time\": 1781627230,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00001000\"\n },\n \"tx_hash\": \"000000000000000000000000000000000000000000000000000000000000004f\",\n \"block_index\": 203,\n \"block_time\": 1781627230\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"enhanced_send\",\n \"message_type_id\": 2,\n \"message_data\": {\n \"asset\": \"MPMASSET\",\n \"quantity\": 1000,\n \"address\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"memo\": null,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00001000\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Mpma_send**\n\n```\n{\n \"result\": {\n \"tx_index\": 84,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"block_index\": 207,\n \"block_hash\": \"00000000000000000000000000000000000000000000000000000000000000aa\",\n \"block_time\": 1781627248,\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000000388\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000089:0 4 \",\n \"transaction_type\": \"mpma\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 744,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 207,\n \"destination\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"memo\": \"the memo\",\n \"msg_index\": 0,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"tx_index\": 84,\n \"block_time\": 1781627248,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"block_index\": 207,\n \"block_time\": 1781627248\n },\n {\n \"event_index\": 745,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"MPMASSET\",\n \"block_index\": 207,\n \"destination\": \"bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48\",\n \"memo\": \"memo3\",\n \"msg_index\": 1,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"tx_index\": 84,\n \"block_time\": 1781627248,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"block_index\": 207,\n \"block_time\": 1781627248\n },\n {\n \"event_index\": 746,\n \"event\": \"MPMA_SEND\",\n \"params\": {\n \"asset\": \"XCP\",\n \"block_index\": 207,\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"memo\": \"memo1\",\n \"msg_index\": 2,\n \"quantity\": 10,\n \"send_type\": \"send\",\n \"source\": \"bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"tx_index\": 84,\n \"block_time\": 1781627248,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000089\",\n \"block_index\": 207,\n \"block_time\": 1781627248\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"mpma_send\",\n \"message_type_id\": 3,\n \"message_data\": [\n {\n \"asset\": \"MPMASSET\",\n \"destination\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"quantity\": 10,\n \"memo\": \"the memo\",\n \"memo_is_hex\": false,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"My super asset B\",\n \"issuer\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\"\n },\n \"quantity_normalized\": \"0.00000010\"\n },\n {\n \"asset\": \"XCP\",\n \"destination\": \"bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp\",\n \"quantity\": 10,\n \"memo\": \"memo1\",\n \"memo_is_hex\": false,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"The Counterparty protocol native currency\",\n \"issuer\": null,\n \"divisible\": true,\n \"locked\": true,\n \"owner\": null\n },\n \"quantity_normalized\": \"0.00000010\"\n }\n ]\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Sweep**\n\n```\n{\n \"result\": {\n \"tx_index\": 68,\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ac\",\n \"block_index\": 192,\n \"block_hash\": \"00000000000000000000000000000000000000000000000000000000000000a1\",\n \"block_time\": 1781627184,\n \"source\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 10000,\n \"data\": \"0000000000000000000000000000000000000000000000000000000000000026206d7920617373657473\",\n \"supported\": true,\n \"utxos_info\": \" 00000000000000000000000000000000000000000000000000000000000000ac:1 2 0\",\n \"transaction_type\": \"sweep\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 604,\n \"event\": \"SWEEP\",\n \"params\": {\n \"block_index\": 192,\n \"destination\": \"bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48\",\n \"fee_paid\": 800000,\n \"flags\": 1,\n \"memo\": \"sweep my assets\",\n \"source\": \"bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v\",\n \"status\": \"valid\",\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ac\",\n \"tx_index\": 68,\n \"block_time\": 1781627184,\n \"fee_paid_normalized\": \"0.00800000\"\n },\n \"tx_hash\": \"00000000000000000000000000000000000000000000000000000000000000ac\",\n \"block_index\": 192,\n \"block_time\": 1781627184\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"sweep\",\n \"message_type_id\": 4,\n \"message_data\": {\n \"destination\": \"bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48\",\n \"flags\": 1,\n \"memo\": \"sweep my assets\"\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n\n**Attach**\n\n```\n{\n \"result\": {\n \"tx_index\": 115,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000020\",\n \"block_index\": 237,\n \"block_hash\": \"000000000000000000000000000000000000000000000000000000000000007c\",\n \"block_time\": 1781627398,\n \"source\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"destination\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"btc_amount\": 10000,\n \"fee\": 10000,\n \"data\": \"65444554414348417c3130303030303030307c\",\n \"supported\": true,\n \"utxos_info\": \" 0000000000000000000000000000000000000000000000000000000000000020:0 3 1\",\n \"transaction_type\": \"attach\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 998,\n \"event\": \"ATTACH_TO_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 237,\n \"destination\": \"0000000000000000000000000000000000000000000000000000000000000020:0\",\n \"destination_address\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"attach\",\n \"source\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000020\",\n \"tx_index\": 115,\n \"block_time\": 1781627398,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000020\",\n \"block_index\": 237,\n \"block_time\": 1781627398\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"attach\",\n \"message_type_id\": 101,\n \"message_data\": {\n \"asset\": \"DETACHA\",\n \"quantity\": 100000000,\n \"destination_vout\": null,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\"\n }\n },\n \"btc_amount_normalized\": \"0.00010000\"\n }\n}\n```\n\n**Detach**\n\n```\n{\n \"result\": {\n \"tx_index\": 114,\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"block_index\": 236,\n \"block_hash\": \"0000000000000000000000000000000000000000000000000000000000000093\",\n \"block_time\": 1781627395,\n \"source\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"destination\": null,\n \"btc_amount\": 0,\n \"fee\": 0,\n \"data\": \"6630\",\n \"supported\": true,\n \"utxos_info\": \"00000000000000000000000000000000000000000000000000000000000000fe:0 0000000000000000000000000000000000000000000000000000000000000106:1 2 0\",\n \"transaction_type\": \"detach\",\n \"confirmed\": true,\n \"valid\": true,\n \"events\": [\n {\n \"event_index\": 987,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHA\",\n \"block_index\": 236,\n \"destination\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"fee_paid\": 0,\n \"msg_index\": 0,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000fe:0\",\n \"source_address\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"tx_index\": 114,\n \"block_time\": 1781627395,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"block_index\": 236,\n \"block_time\": 1781627395\n },\n {\n \"event_index\": 990,\n \"event\": \"DETACH_FROM_UTXO\",\n \"params\": {\n \"asset\": \"DETACHB\",\n \"block_index\": 236,\n \"destination\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"fee_paid\": 0,\n \"msg_index\": 1,\n \"quantity\": 100000000,\n \"send_type\": \"detach\",\n \"source\": \"00000000000000000000000000000000000000000000000000000000000000fe:0\",\n \"source_address\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"status\": \"valid\",\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"tx_index\": 114,\n \"block_time\": 1781627395,\n \"asset_info\": {\n \"asset_longname\": null,\n \"description\": \"\",\n \"issuer\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\",\n \"divisible\": true,\n \"locked\": false,\n \"owner\": \"bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc\"\n },\n \"quantity_normalized\": \"1.00000000\",\n \"fee_paid_normalized\": \"0.00000000\"\n },\n \"tx_hash\": \"0000000000000000000000000000000000000000000000000000000000000106\",\n \"block_index\": 236,\n \"block_time\": 1781627395\n }\n ],\n \"unpacked_data\": {\n \"message_type\": \"detach\",\n \"message_type_id\": 102,\n \"message_data\": {\n \"destination\": null\n }\n },\n \"btc_amount_normalized\": \"0.00000000\"\n }\n}\n```\n" }, { "name": "Bitcoin" @@ -196,56 +196,56 @@ "result": [ { "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000035", "difficulty": 545259519, "transaction_count": 1 }, { "block_index": 324, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000082", - "block_time": 1781529686, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "txlist_hash": "000000000000000000000000000000000000000000000000000000000000002f", - "messages_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000035", + "block_time": 1781627739, + "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000049", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000107", + "messages_hash": "0000000000000000000000000000000000000000000000000000000000000078", + "previous_block_hash": "00000000000000000000000000000000000000000000000000000000000000a2", "difficulty": 545259519, "transaction_count": 0 }, { "block_index": 323, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000002", - "block_time": 1781529682, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000082", - "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "block_hash": "00000000000000000000000000000000000000000000000000000000000000a2", + "block_time": 1781627734, + "ledger_hash": "000000000000000000000000000000000000000000000000000000000000003c", + "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000df", + "messages_hash": "000000000000000000000000000000000000000000000000000000000000007a", + "previous_block_hash": "00000000000000000000000000000000000000000000000000000000000000b0", "difficulty": 545259519, "transaction_count": 1 }, { "block_index": 322, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000002", - "block_time": 1781529679, - "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "messages_hash": "0000000000000000000000000000000000000000000000000000000000000060", - "previous_block_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "block_hash": "00000000000000000000000000000000000000000000000000000000000000b0", + "block_time": 1781627730, + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000b3", + "txlist_hash": "000000000000000000000000000000000000000000000000000000000000011a", + "messages_hash": "0000000000000000000000000000000000000000000000000000000000000031", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000084", "difficulty": 545259519, "transaction_count": 1 }, { "block_index": 321, - "block_hash": "000000000000000000000000000000000000000000000000000000000000004b", - "block_time": 1781529675, - "ledger_hash": "000000000000000000000000000000000000000000000000000000000000004b", - "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000075", - "messages_hash": "000000000000000000000000000000000000000000000000000000000000004b", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000084", + "block_time": 1781627725, + "ledger_hash": "000000000000000000000000000000000000000000000000000000000000002d", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "messages_hash": "0000000000000000000000000000000000000000000000000000000000000041", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000085", "difficulty": 545259519, "transaction_count": 1 } @@ -288,12 +288,12 @@ "example": { "result": { "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000035", "difficulty": 545259519, "transaction_count": 1 } @@ -343,12 +343,12 @@ "example": { "result": { "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000035", "difficulty": 545259519, "transaction_count": 1 } @@ -376,7 +376,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000032" + "example": "000000000000000000000000000000000000000000000000000000000000007b" }, { "name": "verbose", @@ -398,12 +398,12 @@ "example": { "result": { "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", - "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000035", "difficulty": 545259519, "transaction_count": 1 } @@ -538,17 +538,17 @@ "result": [ { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "btc_amount": 1000, "fee": 0, "data": "0d00", "supported": true, - "utxos_info": "0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1", + "utxos_info": "00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1", "transaction_type": "dispense", "valid": true, "events": [ @@ -558,30 +558,30 @@ "params": { "asset": "MYASSETA", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 0, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -589,17 +589,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -610,9 +610,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -621,9 +621,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -634,9 +634,9 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -645,14 +645,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -664,9 +664,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "unpacked_data": { @@ -832,11 +832,11 @@ "event": "BLOCK_PARSED", "params": { "block_index": 325, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", "transaction_count": 1, - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "block_time": 1781529693 + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "block_time": 1781627750 }, "tx_hash": null }, @@ -845,10 +845,10 @@ "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "event_index": 1389, @@ -857,14 +857,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -876,7 +876,7 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "event_index": 1388, @@ -885,9 +885,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -898,22 +898,22 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -924,7 +924,7 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" } ], "next_cursor": 1386, @@ -1114,16 +1114,16 @@ "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -1134,7 +1134,7 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "event_index": 1385, @@ -1144,12 +1144,12 @@ "asset": "XCP", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -1160,7 +1160,7 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "event_index": 1382, @@ -1170,23 +1170,23 @@ "asset": "MYASSETA", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b" + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5" } ], "next_cursor": null, @@ -1306,16 +1306,16 @@ "result": [ { "block_index": 325, - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "quantity": 66, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, "utxo": null, "utxo_address": null, "credit_index": 165, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -1332,12 +1332,12 @@ "asset": "XCP", "quantity": 2000000000, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "credit_index": 164, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -1354,19 +1354,19 @@ "asset": "MYASSETA", "quantity": 2000000000, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "credit_index": 163, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" } @@ -1481,12 +1481,12 @@ "asset": "XCP", "quantity": 2000000000, "action": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "utxo": "0000000000000000000000000000000000000000000000000000000000000025:1", - "utxo_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "utxo": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "utxo_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "debit_index": 137, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -1503,19 +1503,19 @@ "asset": "MYASSETA", "quantity": 2000000000, "action": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "utxo": "0000000000000000000000000000000000000000000000000000000000000025:1", - "utxo_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "utxo": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "utxo_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "debit_index": 136, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" } @@ -1598,9 +1598,9 @@ "result": [ { "type": "order", - "object_id": "0000000000000000000000000000000000000000000000000000000000000060", + "object_id": "000000000000000000000000000000000000000000000000000000000000003d", "block_index": 321, - "block_time": 1781529675 + "block_time": 1781627725 } ], "next_cursor": null, @@ -1681,12 +1681,12 @@ "result": [ { "tx_index": 122, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000108", "block_index": 294, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "offer_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "status": "valid", - "block_time": 1781529481 + "offer_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "block_time": 1781627527 } ], "next_cursor": null, @@ -1767,21 +1767,21 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "quantity": 400000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529686, + "block_time": 1781627739, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" } @@ -1896,14 +1896,14 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "msg_index": 1, "block_index": 324, "asset": "FAIRMARK", "quantity": 0, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -1918,7 +1918,7 @@ "locked": true, "reset": false, "mime_type": "text/plain", - "block_time": 1781529686, + "block_time": 1781627739, "quantity_normalized": "0.00000000", "fee_paid_normalized": "0.00000000" } @@ -2028,10 +2028,10 @@ "result": [ { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", "asset": "MYASSETA", "quantity": 2000000000, "status": "valid", @@ -2039,26 +2039,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -2066,9 +2066,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -2170,26 +2170,26 @@ { "tx_index": 141, "dispense_index": 0, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", "btc_amount": 1000, + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "dispenser": { "tx_index": 33, "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -2204,7 +2204,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000016" }, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -2295,15 +2295,15 @@ "result": [ { "tx_index": 68, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ac", "block_index": 192, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "flags": 1, "status": "valid", "memo": "sweep my assets", "fee_paid": 800000, - "block_time": 1781529163, + "block_time": 1781627184, "fee_paid_normalized": "0.00800000" } ], @@ -2400,10 +2400,10 @@ "example": { "result": [ { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "asset_parent": null, "asset_longname": null, @@ -2431,7 +2431,7 @@ "earned_quantity": null, "paid_quantity": null, "commission": null, - "block_time": 1781529686, + "block_time": 1781627739, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -2517,24 +2517,24 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, "block_index": 315, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMULTI", "earn_quantity": 400000000, "paid_quantity": 400000000, "commission": 0, "status": "valid", - "block_time": 1781529653, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "4.00000000", "commission_normalized": "0.00000000", @@ -2892,17 +2892,17 @@ "result": [ { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "btc_amount": 1000, "fee": 0, "data": "0d00", "supported": true, - "utxos_info": "0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1", + "utxos_info": "00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1", "transaction_type": "dispense", "valid": true, "events": [ @@ -2912,30 +2912,30 @@ "params": { "asset": "MYASSETA", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 0, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -2943,17 +2943,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -2964,9 +2964,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -2975,9 +2975,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -2988,9 +2988,9 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -2999,14 +2999,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -3018,9 +3018,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "unpacked_data": { @@ -3034,17 +3034,17 @@ }, { "tx_index": 140, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "block_index": 323, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000002", - "block_time": 1781529682, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "block_hash": "00000000000000000000000000000000000000000000000000000000000000a2", + "block_time": 1781627734, + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5a931b0000001b45a625390000010a0000000000000000f4f4f4f56040", "supported": true, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000058:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000a8:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -3075,12 +3075,12 @@ "quantity_by_price": 1, "soft_cap": 0, "soft_cap_deadline_block": 0, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "start_block": 0, "status": "open", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "tx_index": 140, - "block_time": 1781529682, + "block_time": 1781627734, "price_normalized": "0.0000000000000000", "hard_cap_normalized": "0.00000000", "soft_cap_normalized": "0.00000000", @@ -3088,9 +3088,9 @@ "max_mint_per_tx_normalized": "0.00000010", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "block_index": 323, - "block_time": 1781529682 + "block_time": 1781627734 }, { "event_index": 1367, @@ -3100,11 +3100,11 @@ "asset_longname": null, "asset_name": "OPENFAIR", "block_index": 323, - "block_time": 1781529682 + "block_time": 1781627734 }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "block_index": 323, - "block_time": 1781529682 + "block_time": 1781627734 }, { "event_index": 1368, @@ -3121,23 +3121,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "issuer": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "locked": false, "mime_type": "text/plain", "quantity": 0, "reset": false, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": "valid", "transfer": false, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "tx_index": 140, - "block_time": 1781529682, + "block_time": 1781627734, "quantity_normalized": "0.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "block_index": 323, - "block_time": 1781529682 + "block_time": 1781627734 } ], "unpacked_data": { @@ -3316,7 +3316,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000003b00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000109001d7000000000" + "example": "00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000c30000000000000000" }, { "name": "block_index", @@ -3346,99 +3346,45 @@ "application/json": { "example": { "result": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "", "destination": null, - "btc_amount": 0, - "fee": 10000, + "btc_amount": null, + "fee": null, "decoded_tx": { "version": 2, "segwit": true, - "coinbase": false, + "coinbase": true, "lock_time": 0, - "tx_id": "000000000000000000000000000000000000000000000000000000000000002f", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_id": "00000000000000000000000000000000000000000000000000000000000000a4", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a4", "vtxinwit": [ [ - "000000000000000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000004b01", - "000000000000000000000000000000000000000000000000000000000000000370" + "0000000000000000000000000000000000000000000000000000000000000001" ] ], - "parsed_vouts": [ - [], - 0, - -7449770000, - "000000000000000000000000000000000000000000000000000000000000003f00f4f4f5f51a17d784001b01530821671b10026040", - [ - [ - null, - null - ], - [ - "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - 7449770000 - ] - ], - false - ], + "parsed_vouts": "ParseVout error: Encountered invalid OP_RETURN script | tx: 00000000000000000000000000000000000000000000000000000000000000a4, vout: 1", "vin": [ { - "hash": "000000000000000000000000000000000000000000000000000000000000003f", - "n": 1, + "hash": "0000000000000000000000000000000000000000000000000000000000000001", + "n": 4294967295, "sequence": 4294967295, - "script_sig": "", - "info": { - "script_pub_key": "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949", - "value": 7449780000, - "is_segwit": true - } + "script_sig": "016100", + "info": null } ], "vout": [ { - "value": 0, - "script_pub_key": "00000000000000000000000000000000000000000000000000000000000000580000000000f5c60db0f99273caa9f0c8d6bdc9d0d4f7ac7b3f7bd9f55be584" + "value": 5000000000, + "script_pub_key": "00147f1586474bacee974c331e2d4a552b78753955e0" }, { - "value": 7449770000, - "script_pub_key": "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "value": 0, + "script_pub_key": "6a24aa2100000000000000000000000000000000000000000000000000000000000000de8cf9" } ] }, - "data": "000000000000000000000000000000000000000000000000000000000000003f00f4f4f5f51a17d784001b01530821671b10026040", - "unpacked_data": { - "message_type": "fairminter", - "message_type_id": 90, - "message_data": { - "asset": "FAIRMARK", - "asset_parent": "", - "price": 1, - "quantity_by_price": 1, - "max_mint_per_tx": 0, - "max_mint_per_address": 0, - "hard_cap": 1000000000, - "premint_quantity": 0, - "start_block": 0, - "end_block": 0, - "soft_cap": 600000000, - "soft_cap_deadline_block": 324, - "minted_asset_commission": "0.00000000", - "burn_payment": false, - "lock_description": false, - "lock_quantity": true, - "divisible": true, - "mime_type": "text/plain", - "description": "", - "pool_quantity": 400000000, - "lp_asset": "A95428956661682178", - "price_normalized": "1.0000000000000000", - "hard_cap_normalized": "10.00000000", - "soft_cap_normalized": "6.00000000", - "quantity_by_price_normalized": "0.00000001", - "max_mint_per_tx_normalized": "0.00000000", - "premint_quantity_normalized": "0.00000000" - } - }, - "btc_amount_normalized": "0.00000000" + "data": null, + "unpacked_data": null } } } @@ -3464,7 +3410,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000da" }, { "name": "verbose", @@ -3485,7 +3431,7 @@ "application/json": { "example": { "result": { - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "destination": null, "btc_amount": 0, "fee": 10000, @@ -3494,26 +3440,26 @@ "segwit": true, "coinbase": false, "lock_time": 0, - "tx_id": "0000000000000000000000000000000000000000000000000000000000000003", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_id": "00000000000000000000000000000000000000000000000000000000000000da", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "vtxinwit": [ [ - "000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000028ab2524f62bb01", - "00000000000000000000000000000000000000000000000000000000000000030d" + "00000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000000000000000000000000000000000000102587ec27b99e901", + "000000000000000000000000000000000000000000000000000000000000002423" ] ], "parsed_vouts": [ [], 0, -4949940000, - "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", [ [ null, null ], [ - "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", 4949940000 ] ], @@ -3521,12 +3467,12 @@ ], "vin": [ { - "hash": "0000000000000000000000000000000000000000000000000000000000000082", + "hash": "00000000000000000000000000000000000000000000000000000000000000f6", "n": 1, "sequence": 4294967295, "script_sig": "", "info": { - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810", + "script_pub_key": "001469c534ab1c24d96348e61d99e5324d3102a95b36", "value": 4949950000, "is_segwit": true } @@ -3535,22 +3481,22 @@ "vout": [ { "value": 0, - "script_pub_key": "0000000000000000000000000000000000000000000000000000000000000060005ea58e3325f6dd" + "script_pub_key": "000000000000000000000000000000000000000000000000000000000000009d749223513968b5d8" }, { "value": 4949940000, - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810" + "script_pub_key": "001469c534ab1c24d96348e61d99e5324d3102a95b36" } ] }, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "data": "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", "unpacked_data": { "message_type": "enhanced_send", "message_type_id": 2, "message_data": { "asset": "XCP", "quantity": 10000, - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "memo": null, "asset_info": { "asset_longname": null, @@ -3589,7 +3535,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000da" } ], "responses": { @@ -3599,7 +3545,7 @@ "application/json": { "example": { "result": { - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "destination": null, "btc_amount": 0, "fee": 10000, @@ -3608,26 +3554,26 @@ "segwit": true, "coinbase": false, "lock_time": 0, - "tx_id": "0000000000000000000000000000000000000000000000000000000000000003", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_id": "00000000000000000000000000000000000000000000000000000000000000da", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "vtxinwit": [ [ - "000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000028ab2524f62bb01", - "00000000000000000000000000000000000000000000000000000000000000030d" + "00000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000000000000000000000000000000000000102587ec27b99e901", + "000000000000000000000000000000000000000000000000000000000000002423" ] ], "parsed_vouts": [ [], 0, -4949940000, - "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", [ [ null, null ], [ - "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", 4949940000 ] ], @@ -3635,12 +3581,12 @@ ], "vin": [ { - "hash": "0000000000000000000000000000000000000000000000000000000000000082", + "hash": "00000000000000000000000000000000000000000000000000000000000000f6", "n": 1, "sequence": 4294967295, "script_sig": "", "info": { - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810", + "script_pub_key": "001469c534ab1c24d96348e61d99e5324d3102a95b36", "value": 4949950000, "is_segwit": true } @@ -3649,22 +3595,22 @@ "vout": [ { "value": 0, - "script_pub_key": "0000000000000000000000000000000000000000000000000000000000000060005ea58e3325f6dd" + "script_pub_key": "000000000000000000000000000000000000000000000000000000000000009d749223513968b5d8" }, { "value": 4949940000, - "script_pub_key": "0014c33484f00e7e7a47f015bcf95eb5b822eaa82810" + "script_pub_key": "001469c534ab1c24d96348e61d99e5324d3102a95b36" } ] }, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "data": "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", "unpacked_data": { "message_type": "enhanced_send", "message_type_id": 2, "message_data": { "asset": "XCP", "quantity": 10000, - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "memo": null } } @@ -3693,7 +3639,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003ffe4ec05dab922ccdc5727cbf664cafc7cdb845de534855266314c800000000" + "example": "000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000055fe4ec05dab922ccdc5727cbf664cafc7cdb845de534855266314c800000000" }, { "name": "block_index", @@ -3775,17 +3721,17 @@ "example": { "result": { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "btc_amount": 1000, "fee": 0, "data": "0d00", "supported": true, - "utxos_info": "0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1", + "utxos_info": "00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1", "transaction_type": "dispense", "confirmed": true, "valid": true, @@ -3796,30 +3742,30 @@ "params": { "asset": "MYASSETA", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 0, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -3827,17 +3773,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -3848,9 +3794,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -3859,9 +3805,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -3872,9 +3818,9 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -3883,14 +3829,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -3902,9 +3848,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "unpacked_data": { @@ -3940,7 +3886,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "verbose", @@ -3962,17 +3908,17 @@ "example": { "result": { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529693, - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "block_hash": "000000000000000000000000000000000000000000000000000000000000007b", + "block_time": 1781627750, + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "btc_amount": 1000, "fee": 0, "data": "0d00", "supported": true, - "utxos_info": "0000000000000000000000000000000000000000000000000000000000000025:1 000000000000000000000000000000000000000000000000000000000000004b:0 3 1", + "utxos_info": "00000000000000000000000000000000000000000000000000000000000000ce:1 00000000000000000000000000000000000000000000000000000000000000c5:0 3 1", "transaction_type": "dispense", "confirmed": true, "valid": true, @@ -3983,30 +3929,30 @@ "params": { "asset": "MYASSETA", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 0, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -4014,17 +3960,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4035,9 +3981,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -4046,9 +3992,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4059,9 +4005,9 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -4070,14 +4016,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4089,9 +4035,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "unpacked_data": { @@ -4191,12 +4137,12 @@ "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -4205,14 +4151,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4224,9 +4170,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -4235,9 +4181,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4248,24 +4194,24 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4276,9 +4222,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -4286,17 +4232,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4307,9 +4253,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "next_cursor": 1385, @@ -4338,7 +4284,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "event_name", @@ -4403,12 +4349,12 @@ "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -4417,14 +4363,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4436,9 +4382,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -4447,9 +4393,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4460,24 +4406,24 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4488,9 +4434,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1386, @@ -4498,17 +4444,17 @@ "params": { "asset": "XCP", "block_index": 325, - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "msg_index": 1, "quantity": 2000000000, "send_type": "move", - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4519,9 +4465,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "next_cursor": 1385, @@ -4550,7 +4496,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "send_type", @@ -4629,10 +4575,10 @@ "result": [ { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", "asset": "MYASSETA", "quantity": 2000000000, "status": "valid", @@ -4640,26 +4586,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -4667,9 +4613,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4708,7 +4654,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "cursor", @@ -4771,26 +4717,26 @@ { "tx_index": 141, "dispense_index": 0, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", "btc_amount": 1000, + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "dispenser": { "tx_index": 33, "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -4805,7 +4751,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000016" }, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4909,16 +4855,16 @@ "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4929,9 +4875,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1385, @@ -4941,12 +4887,12 @@ "asset": "XCP", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -4957,9 +4903,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1382, @@ -4969,25 +4915,25 @@ "asset": "MYASSETA", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "next_cursor": null, @@ -5016,7 +4962,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "event", @@ -5081,16 +5027,16 @@ "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -5101,9 +5047,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1385, @@ -5113,12 +5059,12 @@ "asset": "XCP", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -5129,9 +5075,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1382, @@ -5141,25 +5087,25 @@ "asset": "MYASSETA", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "next_cursor": null, @@ -5188,7 +5134,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35,bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp,bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "type", @@ -5269,14 +5215,14 @@ "total": 156467479334, "addresses": [ { - "address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "utxo": null, "utxo_address": null, "quantity": 73090013139, "quantity_normalized": "730.90013139" }, { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "utxo": null, "utxo_address": null, "quantity": 83377466195, @@ -5320,7 +5266,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35,bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp,bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "type", @@ -5427,17 +5373,17 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000075", - "block_time": 1781529671, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000085", + "block_time": 1781627721, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, - "data": "000000000000000000000000000000000000000000000000000000000000003f00f4f4f5f51a17d784001b01530821671b10026040", + "data": "000000000000000000000000000000000000000000000000000000000000008200f4f4f5f51a17d784001b01530821671b10026040", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000002f:1 2 0", + "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000094:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -5468,12 +5414,12 @@ "quantity_by_price": 1, "soft_cap": 600000000, "soft_cap_deadline_block": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "start_block": 0, "status": "open", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529671, + "block_time": 1781627721, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -5481,9 +5427,9 @@ "max_mint_per_tx_normalized": "0.00000000", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, { "event_index": 1340, @@ -5493,11 +5439,11 @@ "asset_longname": null, "asset_name": "FAIRMARK", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, { "event_index": 1341, @@ -5514,23 +5460,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "quantity": 400000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529671, + "block_time": 1781627721, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 } ], "unpacked_data": { @@ -5570,17 +5516,17 @@ }, { "tx_index": 136, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "block_index": 315, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "block_time": 1781529653, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000090", + "block_time": 1781627702, + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5b821b000000f3bb0145821a17d78400", "supported": true, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000003:1 2 0", + "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000098:1 2 0", "transaction_type": "fairmint", "valid": true, "events": [ @@ -5592,39 +5538,39 @@ "block_index": 315, "commission": 0, "earn_quantity": 400000000, - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "paid_quantity": 400000000, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, - "block_time": 1781529653, + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "4.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "4.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "block_index": 315, - "block_time": 1781529653 + "block_time": 1781627702 }, { "event_index": 1314, "event": "FAIRMINTER_UPDATE", "params": { "soft_cap_deadline_block": 315, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f" + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "block_index": 315, - "block_time": 1781529653 + "block_time": 1781627702 }, { "event_index": 1315, @@ -5642,24 +5588,24 @@ "divisible": true, "fair_minting": false, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": true, "mime_type": "text/plain", "msg_index": 0, "quantity": 400000000, "reset": false, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "status": "valid", "transfer": false, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, - "block_time": 1781529653, + "block_time": 1781627702, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "block_index": 315, - "block_time": 1781529653 + "block_time": 1781627702 } ], "unpacked_data": { @@ -5671,10 +5617,10 @@ "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" } @@ -5683,17 +5629,17 @@ }, { "tx_index": 135, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "block_time": 1781529649, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "000000000000000000000000000000000000000000000000000000000000005b", + "block_time": 1781627699, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5b821b000000f3bb0145821a0bebc200", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000003f:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000f7:1 2 0", "transaction_type": "fairmint", "valid": true, "events": [ @@ -5705,28 +5651,28 @@ "block_index": 314, "commission": 0, "earn_quantity": 200000000, - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "paid_quantity": 200000000, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, - "block_time": 1781529649, + "block_time": 1781627699, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_time": 1781529649 + "block_time": 1781627699 }, { "event_index": 1305, @@ -5744,24 +5690,24 @@ "divisible": true, "fair_minting": true, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "msg_index": 0, "quantity": 200000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, - "block_time": 1781529649, + "block_time": 1781627699, "quantity_normalized": "2.00000000", "fee_paid_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_time": 1781529649 + "block_time": 1781627699 } ], "unpacked_data": { @@ -5773,10 +5719,10 @@ "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "2.00000000" } @@ -5785,17 +5731,17 @@ }, { "tx_index": 134, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "block_time": 1781529646, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000079", + "block_time": 1781627695, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, - "data": "000000000000000000000000000000000000000000000000000000000000008200f4f4f5f51a17d784001b01530821671b10016040", + "data": "000000000000000000000000000000000000000000000000000000000000008300f4f4f5f51a17d784001b01530821671b10016040", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000003f:1 2 0", + "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000114:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -5826,12 +5772,12 @@ "quantity_by_price": 1, "soft_cap": 600000000, "soft_cap_deadline_block": 317, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "start_block": 0, "status": "open", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, - "block_time": 1781529646, + "block_time": 1781627695, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -5839,9 +5785,9 @@ "max_mint_per_tx_normalized": "0.00000000", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, { "event_index": 1292, @@ -5851,11 +5797,11 @@ "asset_longname": null, "asset_name": "FAIRMULTI", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, { "event_index": 1293, @@ -5872,23 +5818,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "quantity": 400000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, - "block_time": 1781529646, + "block_time": 1781627695, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 } ], "unpacked_data": { @@ -5928,17 +5874,17 @@ }, { "tx_index": 133, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "block_time": 1781529629, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "000000000000000000000000000000000000000000000000000000000000008e", + "block_time": 1781627677, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5b821b000000095fccbbb31a0bebc200", "supported": true, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000032:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000a7:1 2 0", "transaction_type": "fairmint", "valid": true, "events": [ @@ -5950,28 +5896,28 @@ "block_index": 308, "commission": 0, "earn_quantity": 200000000, - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "paid_quantity": 200000000, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, - "block_time": 1781529629, + "block_time": 1781627677, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_time": 1781529629 + "block_time": 1781627677 }, { "event_index": 1272, @@ -5989,24 +5935,24 @@ "divisible": true, "fair_minting": true, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "msg_index": 0, "quantity": 200000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, - "block_time": 1781529629, + "block_time": 1781627677, "quantity_normalized": "2.00000000", "fee_paid_normalized": "0.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_time": 1781529629 + "block_time": 1781627677 } ], "unpacked_data": { @@ -6018,10 +5964,10 @@ "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "2.00000000" } @@ -6055,7 +6001,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35,bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp,bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "event_name", @@ -6122,25 +6068,25 @@ "asset": "FAIRMARK", "block_index": 324, "quantity": 400000000, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "tag": "soft cap not reached", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529686, + "block_time": 1781627739, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" }, "tx_hash": null, "block_index": 324, - "block_time": 1781529686 + "block_time": 1781627739 }, { "event_index": 1375, @@ -6158,52 +6104,52 @@ "divisible": true, "fair_minting": false, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": true, "mime_type": "text/plain", "msg_index": 1, "quantity": 0, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529686, + "block_time": 1781627739, "quantity_normalized": "0.00000000", "fee_paid_normalized": "0.00000000" }, "tx_hash": null, "block_index": 324, - "block_time": 1781529686 + "block_time": 1781627739 }, { "event_index": 1351, "event": "ORDER_EXPIRATION", "params": { "block_index": 321, - "order_hash": "0000000000000000000000000000000000000000000000000000000000000060", - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "block_time": 1781529675 + "order_hash": "000000000000000000000000000000000000000000000000000000000000003d", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", + "block_time": 1781627725 }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ec", "block_index": 321, - "block_time": 1781529675 + "block_time": 1781627725 }, { "event_index": 1350, "event": "CREDIT", "params": { - "address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "block_index": 321, "calling_function": "cancel order", - "event": "0000000000000000000000000000000000000000000000000000000000000060", + "event": "000000000000000000000000000000000000000000000000000000000000003d", "quantity": 1000000, "tx_index": 0, "utxo": null, "utxo_address": null, - "block_time": 1781529675, + "block_time": 1781627725, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -6214,9 +6160,9 @@ }, "quantity_normalized": "0.01000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ec", "block_index": 321, - "block_time": 1781529675 + "block_time": 1781627725 } ], "next_cursor": 1343, @@ -6245,7 +6191,7 @@ "schema": { "type": "string" }, - "example": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj,bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx" + "example": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v,bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48" }, { "name": "event_name", @@ -6296,19 +6242,19 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "ENHANCED_SEND", "params": { "asset": "XCP", "block_index": 9999999, - "destination": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "destination": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "memo": null, "msg_index": 0, "quantity": 10000, "send_type": "send", - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, "asset_info": { "asset_longname": null, @@ -6320,22 +6266,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "CREDIT", "params": { - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "asset": "XCP", "block_index": 325, "calling_function": "send", - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -6346,22 +6292,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "DEBIT", "params": { "action": "send", - "address": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "address": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "block_index": 325, - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -6372,27 +6318,27 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "NEW_TRANSACTION", "params": { "block_hash": "mempool", "block_index": 9999999, - "block_time": 1781529697.2448351, + "block_time": 1781627753.799265, "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "data": "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", "destination": "", "fee": 10000, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "transaction_type": "enhanced_send", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000003:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000da:1 2 0", "btc_amount_normalized": "0.00000000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 } ], "next_cursor": null, @@ -6421,7 +6367,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "verbose", @@ -6442,7 +6388,7 @@ "application/json": { "example": { "result": { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "options": 0, "block_index": null } @@ -6470,7 +6416,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "verbose", @@ -6491,7 +6437,7 @@ "application/json": { "example": { "result": { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "options": 0, "block_index": null } @@ -6519,7 +6465,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "type", @@ -6595,7 +6541,7 @@ "example": { "result": [ { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "A95428956980101314", "asset_longname": null, "quantity": 100000000000, @@ -6604,15 +6550,15 @@ "asset_info": { "asset_longname": "A95428959745315388.SUBNUMERIC", "description": "A subnumeric asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "1000.00000000" }, { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MPMASSET", "asset_longname": null, "quantity": 99999998960, @@ -6621,15 +6567,15 @@ "asset_info": { "asset_longname": null, "description": "My super asset B", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "999.99998960" }, { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MYASSETA", "asset_longname": null, "quantity": 97999999980, @@ -6638,15 +6584,15 @@ "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "979.99999980" }, { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "asset_longname": null, "quantity": 83377466195, @@ -6663,7 +6609,7 @@ "quantity_normalized": "833.77466195" }, { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "TESTLOCKDESC", "asset_longname": null, "quantity": 9999990000, @@ -6672,10 +6618,10 @@ "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "99.99990000" } @@ -6706,7 +6652,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -6782,7 +6728,7 @@ "example": { "result": [ { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "asset_longname": null, "quantity": 83377466195, @@ -6825,7 +6771,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "action", @@ -6916,38 +6862,38 @@ "result": [ { "block_index": 315, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMULTI", "quantity": 200000000, "calling_function": "unescrowed fairmint", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, "utxo": null, "utxo_address": null, "credit_index": 158, - "block_time": 1781529653, + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "2.00000000" }, { "block_index": 311, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 200000000, "calling_function": "fairmint refund", - "event": "0000000000000000000000000000000000000000000000000000000000000032", + "event": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, "utxo": null, "utxo_address": null, "credit_index": 152, - "block_time": 1781529633, + "block_time": 1781627681, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -6960,60 +6906,60 @@ }, { "block_index": 303, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "quantity": 300000000, "calling_function": "unescrowed fairmint", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "00000000000000000000000000000000000000000000000000000000000000cf", "tx_index": 131, "utxo": null, "utxo_address": null, "credit_index": 147, - "block_time": 1781529610, + "block_time": 1781627658, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "3.00000000" }, { "block_index": 303, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "quantity": 300000000, "calling_function": "unescrowed fairmint", - "event": "0000000000000000000000000000000000000000000000000000000000000025", + "event": "00000000000000000000000000000000000000000000000000000000000000d8", "tx_index": 130, "utxo": null, "utxo_address": null, "credit_index": 146, - "block_time": 1781529610, + "block_time": 1781627658, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "3.00000000" }, { "block_index": 299, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 27499999, "calling_function": "pool withdraw", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "00000000000000000000000000000000000000000000000000000000000000eb", "tx_index": 127, "utxo": null, "utxo_address": null, "credit_index": 140, - "block_time": 1781529594, + "block_time": 1781627643, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7051,7 +6997,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "action", @@ -7131,16 +7077,16 @@ "result": [ { "block_index": 320, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 50000000, "action": "fairminter fee", - "event": "000000000000000000000000000000000000000000000000000000000000002f", + "event": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, "utxo": null, "utxo_address": null, "debit_index": 132, - "block_time": 1781529671, + "block_time": 1781627721, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7153,16 +7099,16 @@ }, { "block_index": 314, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 200000000, "action": "escrowed fairmint", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, "utxo": null, "utxo_address": null, "debit_index": 128, - "block_time": 1781529649, + "block_time": 1781627699, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7175,16 +7121,16 @@ }, { "block_index": 313, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 50000000, "action": "fairminter fee", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, "utxo": null, "utxo_address": null, "debit_index": 127, - "block_time": 1781529646, + "block_time": 1781627695, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7197,16 +7143,16 @@ }, { "block_index": 308, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 200000000, "action": "escrowed fairmint", - "event": "0000000000000000000000000000000000000000000000000000000000000032", + "event": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, "utxo": null, "utxo_address": null, "debit_index": 124, - "block_time": 1781529629, + "block_time": 1781627677, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7219,16 +7165,16 @@ }, { "block_index": 307, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 50000000, "action": "fairminter fee", - "event": "0000000000000000000000000000000000000000000000000000000000000025", + "event": "00000000000000000000000000000000000000000000000000000000000000d2", "tx_index": 132, "utxo": null, "utxo_address": null, "debit_index": 123, - "block_time": 1781529625, + "block_time": 1781627673, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -7266,7 +7212,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -7360,7 +7306,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -7422,9 +7368,9 @@ "result": [ { "tx_index": 24, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000008c", "block_index": 128, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "timestamp": 4003903983, "value": 999.0, "fee_fraction_int": 0, @@ -7432,7 +7378,7 @@ "locked": false, "status": "valid", "mime_type": "text/plain", - "block_time": 1781528924, + "block_time": 1781626943, "fee_fraction_int_normalized": "0.00000000" } ], @@ -7462,7 +7408,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -7514,13 +7460,13 @@ "result": [ { "tx_index": 8, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a6", "block_index": 112, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" } @@ -7551,7 +7497,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "send_type", @@ -7630,10 +7576,10 @@ "result": [ { "tx_index": 36, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c4", "block_index": 140, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "0000000000000000000000000000000000000000000000000000000000000060:0", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "00000000000000000000000000000000000000000000000000000000000000c4:0", "asset": "MYASSETA", "quantity": 1000000000, "status": "valid", @@ -7642,15 +7588,15 @@ "fee_paid": 0, "send_type": "attach", "source_address": null, - "destination_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "block_time": 1781528974, + "destination_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "block_time": 1781626994, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "10.00000000", "fee_paid_normalized": "0.00000000" @@ -7659,7 +7605,7 @@ "tx_index": 39, "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c9", "block_index": 143, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": "00000000000000000000000000000000000000000000000000000000000000c9:0", "asset": "MYASSETA", "quantity": 1000000000, @@ -7669,25 +7615,25 @@ "fee_paid": 0, "send_type": "attach", "source_address": null, - "destination_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "block_time": 1781528987, + "destination_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "block_time": 1781627006, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "10.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 37, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000dd", "block_index": 141, - "source": "0000000000000000000000000000000000000000000000000000000000000060:0", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000c4:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000dd:0", "asset": "MYASSETA", "quantity": 1000000000, "status": "valid", @@ -7695,26 +7641,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination_address": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", - "block_time": 1781528979, + "source_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination_address": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", + "block_time": 1781626998, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "10.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 41, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000112", "block_index": 145, "source": "00000000000000000000000000000000000000000000000000000000000000c9:0", - "destination": "0000000000000000000000000000000000000000000000000000000000000075:0", + "destination": "0000000000000000000000000000000000000000000000000000000000000112:0", "asset": "MYASSETA", "quantity": 1000000000, "status": "valid", @@ -7722,26 +7668,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781528995, + "source_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627014, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "10.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 80, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000004f", "block_index": 203, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "MPMASSET", "quantity": 1000, "status": "valid", @@ -7751,14 +7697,14 @@ "send_type": "send", "source_address": null, "destination_address": null, - "block_time": 1781529208, + "block_time": 1781627230, "asset_info": { "asset_longname": null, "description": "My super asset B", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "0.00001000", "fee_paid_normalized": "0.00000000" @@ -7790,7 +7736,7 @@ "schema": { "type": "string" }, - "example": "bc1qduxrsdnc45nff2dhz9thw066emfyz9fx3rzukn" + "example": "bc1qe5pue7kpcjgssypv784hwp34qddprms8jw3guy" }, { "name": "send_type", @@ -7869,10 +7815,10 @@ "result": [ { "tx_index": 38, - "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a9", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000b8", "block_index": 142, - "source": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination": "bc1qduxrsdnc45nff2dhz9thw066emfyz9fx3rzukn", + "source": "00000000000000000000000000000000000000000000000000000000000000dd:0", + "destination": "bc1qe5pue7kpcjgssypv784hwp34qddprms8jw3guy", "asset": "MYASSETA", "quantity": 1000000000, "status": "valid", @@ -7880,16 +7826,16 @@ "memo": null, "fee_paid": 0, "send_type": "detach", - "source_address": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source_address": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "destination_address": null, - "block_time": 1781528982, + "block_time": 1781627002, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "10.00000000", "fee_paid_normalized": "0.00000000" @@ -7921,7 +7867,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -8034,7 +7980,7 @@ "schema": { "type": "string" }, - "example": "bc1qduxrsdnc45nff2dhz9thw066emfyz9fx3rzukn" + "example": "bc1qe5pue7kpcjgssypv784hwp34qddprms8jw3guy" }, { "name": "asset", @@ -8147,7 +8093,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -8199,54 +8145,54 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "quantity": 400000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529686, + "block_time": 1781627739, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" }, { "tx_index": 132, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 311, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRFAIL", "quantity": 600000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529633, + "block_time": 1781627681, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "6.00000000" }, { "tx_index": 127, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000eb", "block_index": 299, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "A95428956689590706", "quantity": 25000000, "tag": "pool_withdraw", "status": "valid", - "block_time": 1781529594, + "block_time": 1781627643, "asset_info": { "asset_longname": null, "description": "LP token for POOLTEST/XCP pool", @@ -8259,21 +8205,21 @@ }, { "tx_index": 14, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e2", "block_index": 121, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMINTB", "quantity": 300000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781528896, + "block_time": 1781626913, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "3.00000000" } @@ -8304,7 +8250,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -8397,9 +8343,9 @@ "result": [ { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -8408,7 +8354,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -8418,7 +8364,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -8436,9 +8382,9 @@ }, { "tx_index": 71, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "TESTLOCKDESC", "give_quantity": 1, "escrow_quantity": 10000, @@ -8447,7 +8393,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -8457,14 +8403,14 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "give_quantity_normalized": "0.00000001", "give_remaining_normalized": "0.00006000", @@ -8500,7 +8446,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -8593,9 +8539,9 @@ "result": [ { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -8604,7 +8550,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -8614,7 +8560,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -8632,9 +8578,9 @@ }, { "tx_index": 71, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "TESTLOCKDESC", "give_quantity": 1, "escrow_quantity": 10000, @@ -8643,7 +8589,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -8653,14 +8599,14 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "give_quantity_normalized": "0.00000001", "give_remaining_normalized": "0.00006000", @@ -8696,7 +8642,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -8789,9 +8735,9 @@ "result": [ { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -8800,7 +8746,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -8810,7 +8756,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -8828,9 +8774,9 @@ }, { "tx_index": 30, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000006e", "block_index": 141, - "source": "1KbWivLGRP4eLwy3a3cG6CVFGdYxVaCp5e", + "source": "1ETMS7pxnaiJ9icyKcXv6NHn6dp6kvDXup", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10, @@ -8838,10 +8784,10 @@ "status": 10, "give_remaining": 0, "oracle_address": null, - "last_status_tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ba", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 0, - "last_status_tx_source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "close_block_index": 141, "price": 100000000.0, "fiat_price": null, @@ -8849,7 +8795,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528979, + "block_time": 1781626998, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -8867,9 +8813,9 @@ }, { "tx_index": 71, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "TESTLOCKDESC", "give_quantity": 1, "escrow_quantity": 10000, @@ -8878,7 +8824,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -8888,14 +8834,14 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "give_quantity_normalized": "0.00000001", "give_remaining_normalized": "0.00006000", @@ -8931,7 +8877,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -8963,9 +8909,9 @@ "example": { "result": { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -8974,7 +8920,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -8984,7 +8930,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9024,7 +8970,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -9087,18 +9033,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9106,7 +9052,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9121,7 +9067,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9136,18 +9082,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9155,7 +9101,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9170,7 +9116,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9185,18 +9131,18 @@ { "tx_index": 72, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d1", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "TESTLOCKDESC", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "dispenser": { "tx_index": 71, "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9204,7 +9150,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -9219,14 +9165,14 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dispense_quantity_normalized": "0.00004000", "btc_amount_normalized": "0.00004000" @@ -9258,7 +9204,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "cursor", @@ -9321,18 +9267,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9340,7 +9286,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9355,7 +9301,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9370,18 +9316,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9389,7 +9335,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9404,7 +9350,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9419,18 +9365,18 @@ { "tx_index": 72, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d1", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "TESTLOCKDESC", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "dispenser": { "tx_index": 71, "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9438,7 +9384,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -9453,14 +9399,14 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dispense_quantity_normalized": "0.00004000", "btc_amount_normalized": "0.00004000" @@ -9468,18 +9414,18 @@ { "tx_index": 118, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e5", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 3000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 3000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "dispenser": { "tx_index": 117, "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "give_quantity": 1, "escrow_quantity": 5000, "satoshirate": 1, @@ -9487,7 +9433,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -9502,7 +9448,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9541,7 +9487,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -9614,18 +9560,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9633,7 +9579,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9648,7 +9594,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9663,18 +9609,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9682,7 +9628,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9697,7 +9643,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9736,7 +9682,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "asset", @@ -9809,18 +9755,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9828,7 +9774,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9843,7 +9789,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9858,18 +9804,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -9877,7 +9823,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -9892,7 +9838,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9907,18 +9853,18 @@ { "tx_index": 118, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e5", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 3000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 3000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "dispenser": { "tx_index": 117, "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "give_quantity": 1, "escrow_quantity": 5000, "satoshirate": 1, @@ -9926,7 +9872,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -9941,7 +9887,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -9980,7 +9926,7 @@ "schema": { "type": "string" }, - "example": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj" + "example": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v" }, { "name": "cursor", @@ -10032,15 +9978,15 @@ "result": [ { "tx_index": 68, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ac", "block_index": 192, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "flags": 1, "status": "valid", "memo": "sweep my assets", "fee_paid": 800000, - "block_time": 1781529163, + "block_time": 1781627184, "fee_paid_normalized": "0.00800000" } ], @@ -10070,7 +10016,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset_events", @@ -10154,14 +10100,14 @@ "result": [ { "tx_index": 35, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000003b", "msg_index": 0, "block_index": 139, "asset": "MYASSETA", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -10176,20 +10122,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781528970, + "block_time": 1781626990, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 55, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009b", "msg_index": 0, "block_index": 159, "asset": "A95428956980101314", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -10204,20 +10150,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529051, + "block_time": 1781627072, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 79, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000100", "msg_index": 0, "block_index": 202, "asset": "MPMASSET", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -10232,20 +10178,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529205, + "block_time": 1781627226, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 52, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000046", "msg_index": 0, "block_index": 156, "asset": "TESTLOCKDESC", "quantity": 10000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -10260,20 +10206,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529040, + "block_time": 1781627059, "quantity_normalized": "100.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 13, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000fa", "msg_index": 0, "block_index": 116, "asset": "FAIRMINTA", "quantity": 9000000000, "divisible": true, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -10288,7 +10234,7 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781528875, + "block_time": 1781626892, "quantity_normalized": "90.00000000", "fee_paid_normalized": "0.00000000" } @@ -10319,7 +10265,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "named", @@ -10383,8 +10329,8 @@ "asset": "FAIRMARK", "asset_id": "40262081844", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10393,16 +10339,16 @@ "first_issuance_block_index": 320, "last_issuance_block_index": 324, "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, + "first_issuance_block_time": 1781627721, + "last_issuance_block_time": 1781627739, "supply_normalized": "0.00000000" }, { "asset": "FAIRMULTI", "asset_id": "1046814475650", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10411,16 +10357,16 @@ "first_issuance_block_index": 313, "last_issuance_block_index": 315, "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, + "first_issuance_block_time": 1781627695, + "last_issuance_block_time": 1781627702, "supply_normalized": "10.00000000" }, { "asset": "FAIRFAIL", "asset_id": "40261958579", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10429,16 +10375,16 @@ "first_issuance_block_index": 307, "last_issuance_block_index": 311, "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, + "first_issuance_block_time": 1781627673, + "last_issuance_block_time": 1781627681, "supply_normalized": "0.00000000" }, { "asset": "FAIRPOOL", "asset_id": "40262143959", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10447,16 +10393,16 @@ "first_issuance_block_index": 301, "last_issuance_block_index": 303, "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, + "first_issuance_block_time": 1781627651, + "last_issuance_block_time": 1781627658, "supply_normalized": "10.00000000" }, { "asset": "POOLTEST", "asset_id": "124973676639", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, "supply": 1000000000, @@ -10465,8 +10411,8 @@ "first_issuance_block_index": 295, "last_issuance_block_index": 295, "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, + "first_issuance_block_time": 1781627598, + "last_issuance_block_time": 1781627598, "supply_normalized": "10.00000000" } ], @@ -10496,7 +10442,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "named", @@ -10560,8 +10506,8 @@ "asset": "FAIRMARK", "asset_id": "40262081844", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10570,16 +10516,16 @@ "first_issuance_block_index": 320, "last_issuance_block_index": 324, "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, + "first_issuance_block_time": 1781627721, + "last_issuance_block_time": 1781627739, "supply_normalized": "0.00000000" }, { "asset": "FAIRMULTI", "asset_id": "1046814475650", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10588,16 +10534,16 @@ "first_issuance_block_index": 313, "last_issuance_block_index": 315, "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, + "first_issuance_block_time": 1781627695, + "last_issuance_block_time": 1781627702, "supply_normalized": "10.00000000" }, { "asset": "FAIRFAIL", "asset_id": "40261958579", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10606,16 +10552,16 @@ "first_issuance_block_index": 307, "last_issuance_block_index": 311, "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, + "first_issuance_block_time": 1781627673, + "last_issuance_block_time": 1781627681, "supply_normalized": "0.00000000" }, { "asset": "FAIRPOOL", "asset_id": "40262143959", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10624,16 +10570,16 @@ "first_issuance_block_index": 301, "last_issuance_block_index": 303, "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, + "first_issuance_block_time": 1781627651, + "last_issuance_block_time": 1781627658, "supply_normalized": "10.00000000" }, { "asset": "POOLTEST", "asset_id": "124973676639", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, "supply": 1000000000, @@ -10642,8 +10588,8 @@ "first_issuance_block_index": 295, "last_issuance_block_index": 295, "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, + "first_issuance_block_time": 1781627598, + "last_issuance_block_time": 1781627598, "supply_normalized": "10.00000000" } ], @@ -10673,7 +10619,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "named", @@ -10737,8 +10683,8 @@ "asset": "FAIRMARK", "asset_id": "40262081844", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10747,16 +10693,16 @@ "first_issuance_block_index": 320, "last_issuance_block_index": 324, "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, + "first_issuance_block_time": 1781627721, + "last_issuance_block_time": 1781627739, "supply_normalized": "0.00000000" }, { "asset": "FAIRMULTI", "asset_id": "1046814475650", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10765,16 +10711,16 @@ "first_issuance_block_index": 313, "last_issuance_block_index": 315, "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, + "first_issuance_block_time": 1781627695, + "last_issuance_block_time": 1781627702, "supply_normalized": "10.00000000" }, { "asset": "FAIRFAIL", "asset_id": "40261958579", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -10783,16 +10729,16 @@ "first_issuance_block_index": 307, "last_issuance_block_index": 311, "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, + "first_issuance_block_time": 1781627673, + "last_issuance_block_time": 1781627681, "supply_normalized": "0.00000000" }, { "asset": "FAIRPOOL", "asset_id": "40262143959", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -10801,16 +10747,16 @@ "first_issuance_block_index": 301, "last_issuance_block_index": 303, "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, + "first_issuance_block_time": 1781627651, + "last_issuance_block_time": 1781627658, "supply_normalized": "10.00000000" }, { "asset": "POOLTEST", "asset_id": "124973676639", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, "supply": 1000000000, @@ -10819,8 +10765,8 @@ "first_issuance_block_index": 295, "last_issuance_block_index": 295, "mime_type": "text/plain", - "first_issuance_block_time": 1781529551, - "last_issuance_block_time": 1781529551, + "first_issuance_block_time": 1781627598, + "last_issuance_block_time": 1781627598, "supply_normalized": "10.00000000" } ], @@ -10850,7 +10796,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "type", @@ -10957,17 +10903,17 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000075", - "block_time": 1781529671, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000085", + "block_time": 1781627721, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, - "data": "000000000000000000000000000000000000000000000000000000000000003f00f4f4f5f51a17d784001b01530821671b10026040", + "data": "000000000000000000000000000000000000000000000000000000000000008200f4f4f5f51a17d784001b01530821671b10026040", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000002f:1 2 0", + "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000094:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -10998,12 +10944,12 @@ "quantity_by_price": 1, "soft_cap": 600000000, "soft_cap_deadline_block": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "start_block": 0, "status": "open", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529671, + "block_time": 1781627721, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -11011,9 +10957,9 @@ "max_mint_per_tx_normalized": "0.00000000", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, { "event_index": 1340, @@ -11023,11 +10969,11 @@ "asset_longname": null, "asset_name": "FAIRMARK", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 }, { "event_index": 1341, @@ -11044,23 +10990,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "quantity": 400000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, - "block_time": 1781529671, + "block_time": 1781627721, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 } ], "unpacked_data": { @@ -11100,17 +11046,17 @@ }, { "tx_index": 135, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "block_time": 1781529649, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "000000000000000000000000000000000000000000000000000000000000005b", + "block_time": 1781627699, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5b821b000000f3bb0145821a0bebc200", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000003f:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000f7:1 2 0", "transaction_type": "fairmint", "valid": true, "events": [ @@ -11122,28 +11068,28 @@ "block_index": 314, "commission": 0, "earn_quantity": 200000000, - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "paid_quantity": 200000000, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, - "block_time": 1781529649, + "block_time": 1781627699, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_time": 1781529649 + "block_time": 1781627699 }, { "event_index": 1305, @@ -11161,24 +11107,24 @@ "divisible": true, "fair_minting": true, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "msg_index": 0, "quantity": 200000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, - "block_time": 1781529649, + "block_time": 1781627699, "quantity_normalized": "2.00000000", "fee_paid_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "block_index": 314, - "block_time": 1781529649 + "block_time": 1781627699 } ], "unpacked_data": { @@ -11190,10 +11136,10 @@ "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "2.00000000" } @@ -11202,17 +11148,17 @@ }, { "tx_index": 134, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "block_time": 1781529646, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000079", + "block_time": 1781627695, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, - "data": "000000000000000000000000000000000000000000000000000000000000008200f4f4f5f51a17d784001b01530821671b10016040", + "data": "000000000000000000000000000000000000000000000000000000000000008300f4f4f5f51a17d784001b01530821671b10016040", "supported": true, - "utxos_info": " 000000000000000000000000000000000000000000000000000000000000003f:1 2 0", + "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000114:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -11243,12 +11189,12 @@ "quantity_by_price": 1, "soft_cap": 600000000, "soft_cap_deadline_block": 317, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "start_block": 0, "status": "open", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, - "block_time": 1781529646, + "block_time": 1781627695, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -11256,9 +11202,9 @@ "max_mint_per_tx_normalized": "0.00000000", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, { "event_index": 1292, @@ -11268,11 +11214,11 @@ "asset_longname": null, "asset_name": "FAIRMULTI", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 }, { "event_index": 1293, @@ -11289,23 +11235,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "quantity": 400000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, - "block_time": 1781529646, + "block_time": 1781627695, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 313, - "block_time": 1781529646 + "block_time": 1781627695 } ], "unpacked_data": { @@ -11345,17 +11291,17 @@ }, { "tx_index": 133, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "block_time": 1781529629, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "000000000000000000000000000000000000000000000000000000000000008e", + "block_time": 1781627677, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, "data": "5b821b000000095fccbbb31a0bebc200", "supported": true, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000032:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000a7:1 2 0", "transaction_type": "fairmint", "valid": true, "events": [ @@ -11367,28 +11313,28 @@ "block_index": 308, "commission": 0, "earn_quantity": 200000000, - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "paid_quantity": 200000000, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, - "block_time": 1781529629, + "block_time": 1781627677, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_time": 1781529629 + "block_time": 1781627677 }, { "event_index": 1272, @@ -11406,24 +11352,24 @@ "divisible": true, "fair_minting": true, "fee_paid": 0, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "msg_index": 0, "quantity": 200000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, - "block_time": 1781529629, + "block_time": 1781627677, "quantity_normalized": "2.00000000", "fee_paid_normalized": "0.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "block_index": 308, - "block_time": 1781529629 + "block_time": 1781627677 } ], "unpacked_data": { @@ -11435,10 +11381,10 @@ "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "2.00000000" } @@ -11447,17 +11393,17 @@ }, { "tx_index": 132, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 307, - "block_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "block_time": 1781529625, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "block_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "block_time": 1781627673, + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "destination": null, "btc_amount": 0, "fee": 10000, - "data": "000000000000000000000000000000000000000000000000000000000000004b00f4f4f5f51a17d784001b01530821e5def3096040", + "data": "000000000000000000000000000000000000000000000000000000000000008100f4f4f5f51a17d784001b01530821e5def3096040", "supported": true, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000025:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000d2:1 2 0", "transaction_type": "fairminter", "valid": true, "events": [ @@ -11488,12 +11434,12 @@ "quantity_by_price": 1, "soft_cap": 600000000, "soft_cap_deadline_block": 311, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "start_block": 0, "status": "open", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "tx_index": 132, - "block_time": 1781529625, + "block_time": 1781627673, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -11501,9 +11447,9 @@ "max_mint_per_tx_normalized": "0.00000000", "premint_quantity_normalized": "0.00000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 307, - "block_time": 1781529625 + "block_time": 1781627673 }, { "event_index": 1259, @@ -11513,11 +11459,11 @@ "asset_longname": null, "asset_name": "FAIRFAIL", "block_index": 307, - "block_time": 1781529625 + "block_time": 1781627673 }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 307, - "block_time": 1781529625 + "block_time": 1781627673 }, { "event_index": 1260, @@ -11534,23 +11480,23 @@ "divisible": true, "fair_minting": true, "fee_paid": 50000000, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "locked": false, "mime_type": "text/plain", "quantity": 400000000, "reset": false, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "status": "valid", "transfer": false, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "tx_index": 132, - "block_time": 1781529625, + "block_time": 1781627673, "quantity_normalized": "4.00000000", "fee_paid_normalized": "0.50000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 307, - "block_time": 1781529625 + "block_time": 1781627673 } ], "unpacked_data": { @@ -11615,7 +11561,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "count_unconfirmed", @@ -11725,7 +11671,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -11787,22 +11733,22 @@ "result": [ { "tx_index": 42, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e9", "block_index": 146, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MYASSETA", "dividend_asset": "XCP", "quantity_per_unit": 100000000, "fee_paid": 20000, "status": "valid", - "block_time": 1781528999, + "block_time": 1781627018, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dividend_asset_info": { "asset_longname": null, @@ -11842,7 +11788,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -11921,9 +11867,9 @@ "result": [ { "tx_index": 56, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000033", "block_index": 181, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -11941,7 +11887,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529066, + "block_time": 1781627088, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -11970,9 +11916,9 @@ }, { "tx_index": 58, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000007d", "block_index": 203, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 10000, "give_remaining": 5000, @@ -11990,7 +11936,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529208, + "block_time": 1781627230, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -12019,9 +11965,9 @@ }, { "tx_index": 65, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c1", "block_index": 190, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -12039,7 +11985,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529154, + "block_time": 1781627176, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -12068,9 +12014,9 @@ }, { "tx_index": 67, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000010c", "block_index": 212, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 0, @@ -12088,7 +12034,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529245, + "block_time": 1781627270, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -12142,7 +12088,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "status", @@ -12208,10 +12154,10 @@ "example": { "result": [ { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "asset_parent": null, "asset_longname": null, @@ -12239,7 +12185,7 @@ "earned_quantity": null, "paid_quantity": null, "commission": null, - "block_time": 1781529686, + "block_time": 1781627739, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -12248,10 +12194,10 @@ "premint_quantity_normalized": "0.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, "block_index": 315, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMULTI", "asset_parent": null, "asset_longname": null, @@ -12279,7 +12225,7 @@ "earned_quantity": 600000000, "paid_quantity": 600000000, "commission": 0, - "block_time": 1781529653, + "block_time": 1781627702, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -12291,10 +12237,10 @@ "paid_quantity_normalized": "6.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "tx_index": 132, "block_index": 311, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRFAIL", "asset_parent": null, "asset_longname": null, @@ -12322,7 +12268,7 @@ "earned_quantity": 200000000, "paid_quantity": 200000000, "commission": 0, - "block_time": 1781529633, + "block_time": 1781627681, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -12334,10 +12280,10 @@ "paid_quantity_normalized": "2.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", "tx_index": 129, "block_index": 303, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "asset_parent": null, "asset_longname": null, @@ -12365,7 +12311,7 @@ "earned_quantity": 600000000, "paid_quantity": 600000000, "commission": 0, - "block_time": 1781529610, + "block_time": 1781627658, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -12377,10 +12323,10 @@ "paid_quantity_normalized": "6.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000073", "tx_index": 47, "block_index": 153, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "HARDCSOFT", "asset_parent": null, "asset_longname": null, @@ -12408,7 +12354,7 @@ "earned_quantity": 2000000000, "paid_quantity": 2000000000, "commission": 0, - "block_time": 1781529027, + "block_time": 1781627045, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "20.00000000", "soft_cap_normalized": "10.00000000", @@ -12420,10 +12366,10 @@ "paid_quantity_normalized": "20.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000006d", "tx_index": 44, "block_index": 150, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FREEFAIRMINT", "asset_parent": null, "asset_longname": null, @@ -12451,7 +12397,7 @@ "earned_quantity": 180, "paid_quantity": 0, "commission": 0, - "block_time": 1781529015, + "block_time": 1781627032, "price_normalized": "0.0000000000000000", "hard_cap_normalized": "0.00000180", "soft_cap_normalized": "0.00000000", @@ -12463,10 +12409,10 @@ "paid_quantity_normalized": "0.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e7", "tx_index": 43, "block_index": 147, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "A95428958968845068", "asset_parent": "MYASSETA", "asset_longname": "MYASSETA.SUBMYASSETA", @@ -12494,7 +12440,7 @@ "earned_quantity": null, "paid_quantity": null, "commission": null, - "block_time": 1781529003, + "block_time": 1781627021, "price_normalized": "0.2000000000000000", "hard_cap_normalized": "0.00000000", "soft_cap_normalized": "0.00000000", @@ -12503,10 +12449,10 @@ "premint_quantity_normalized": "0.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000004c", "tx_index": 22, "block_index": 126, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMINTD", "asset_parent": null, "asset_longname": null, @@ -12534,7 +12480,7 @@ "earned_quantity": 40, "paid_quantity": 34, "commission": 0, - "block_time": 1781528916, + "block_time": 1781626934, "price_normalized": "0.8500000000000000", "hard_cap_normalized": "0.00000000", "soft_cap_normalized": "0.00000000", @@ -12546,10 +12492,10 @@ "paid_quantity_normalized": "0.00000034" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a9", "tx_index": 18, "block_index": 122, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMINTC", "asset_parent": null, "asset_longname": null, @@ -12577,7 +12523,7 @@ "earned_quantity": 25, "paid_quantity": 5, "commission": 0, - "block_time": 1781528900, + "block_time": 1781626917, "price_normalized": "0.2000000000000000", "hard_cap_normalized": "0.00000000", "soft_cap_normalized": "0.00000000", @@ -12589,10 +12535,10 @@ "paid_quantity_normalized": "0.00000005" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e2", "tx_index": 14, "block_index": 121, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMINTB", "asset_parent": null, "asset_longname": null, @@ -12620,7 +12566,7 @@ "earned_quantity": 300000000, "paid_quantity": 300000000, "commission": 0, - "block_time": 1781528896, + "block_time": 1781626913, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "100.00000000", "soft_cap_normalized": "10.00000000", @@ -12632,10 +12578,10 @@ "paid_quantity_normalized": "3.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000113", "tx_index": 10, "block_index": 116, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMINTA", "asset_parent": null, "asset_longname": null, @@ -12663,7 +12609,7 @@ "earned_quantity": 10000000000, "paid_quantity": 10000000000, "commission": 0, - "block_time": 1781528875, + "block_time": 1781626892, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "100.00000000", "soft_cap_normalized": "10.00000000", @@ -12701,7 +12647,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "cursor", @@ -12751,240 +12697,240 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, "block_index": 315, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMULTI", "earn_quantity": 400000000, "paid_quantity": 400000000, "commission": 0, "status": "valid", - "block_time": 1781529653, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "4.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "4.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ed", "tx_index": 48, "block_index": 152, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "HARDCSOFT", "earn_quantity": 1000000000, "paid_quantity": 1000000000, "commission": 0, "status": "valid", - "block_time": 1781529024, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000073", + "block_time": 1781627041, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "10.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "10.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ee", "tx_index": 46, "block_index": 150, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FREEFAIRMINT", "earn_quantity": 80, "paid_quantity": 0, "commission": 0, "status": "valid", - "block_time": 1781529015, + "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000006d", + "block_time": 1781627032, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000080", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000006f", "tx_index": 45, "block_index": 149, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FREEFAIRMINT", "earn_quantity": 100, "paid_quantity": 0, "commission": 0, "status": "valid", - "block_time": 1781529011, + "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000006d", + "block_time": 1781627028, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000100", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000004a", "tx_index": 23, "block_index": 127, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTD", "earn_quantity": 40, "paid_quantity": 34, "commission": 0, "status": "valid", - "block_time": 1781528921, + "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000004c", + "block_time": 1781626939, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000040", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000034" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000040", "tx_index": 21, "block_index": 125, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTC", "earn_quantity": 15, "paid_quantity": 3, "commission": 0, "status": "valid", - "block_time": 1781528912, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000a9", + "block_time": 1781626931, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000015", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000003" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009a", "tx_index": 20, "block_index": 124, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTC", "earn_quantity": 5, "paid_quantity": 1, "commission": 0, "status": "valid", - "block_time": 1781528908, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000a9", + "block_time": 1781626926, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000005", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000001" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f4", "tx_index": 19, "block_index": 123, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTC", "earn_quantity": 5, "paid_quantity": 1, "commission": 0, "status": "valid", - "block_time": 1781528903, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000a9", + "block_time": 1781626921, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "0.00000005", "commission_normalized": "0.00000000", "paid_quantity_normalized": "0.00000001" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f8", "tx_index": 15, "block_index": 118, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTB", "earn_quantity": 100000000, "paid_quantity": 100000000, "commission": 0, "status": "valid", - "block_time": 1781528884, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000e2", + "block_time": 1781626900, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "1.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "1.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000010d", "tx_index": 11, "block_index": 114, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMINTA", "earn_quantity": 500000000, "paid_quantity": 500000000, "commission": 0, "status": "valid", - "block_time": 1781528867, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000113", + "block_time": 1781626885, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "5.00000000", "commission_normalized": "0.00000000", @@ -13017,7 +12963,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "asset", @@ -13102,7 +13048,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000025:0" + "example": "00000000000000000000000000000000000000000000000000000000000000b2:0" }, { "name": "cursor", @@ -13156,15 +13102,15 @@ "asset": "UTXOASSET", "asset_longname": null, "quantity": 1000000000, - "utxo": "0000000000000000000000000000000000000000000000000000000000000025:0", - "utxo_address": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "utxo": "00000000000000000000000000000000000000000000000000000000000000b2:0", + "utxo_address": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "asset_info": { "asset_longname": null, "description": "My super asset", - "issuer": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "issuer": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "divisible": true, "locked": false, - "owner": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv" + "owner": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8" }, "quantity_normalized": "10.00000000" } @@ -13243,7 +13189,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "feed_address", @@ -13253,7 +13199,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "bet_type", @@ -13545,14 +13491,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000753109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000008a552b78753955e000000000", "btc_in": 7449770000, "btc_out": 330, "btc_change": 7449769670, "btc_fee": 0, - "data": "00000000000000000000000000000000000000000000000000000000000000038f400000000000000013b000000064", + "data": "00000000000000000000000000000000000000000000000000000000000000658f400000000000000013b000000064", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 7449770000 @@ -13562,10 +13508,10 @@ "adjusted_vsize": 199, "sigops_count": 1 }, - "psbt": "cHNidP8BAKsCAAAAAcOgpRx7xm7EhsEl41v7oaQOSmeE7N2/d3Q+L1mvXKNVAQAAAAD/////A0oBAAAAAAAAFgAUorhvHgyJdG7U8QAlZdSlDIBHYnoAAAAAAAAAADFqL66mn9lAoUJgso2cSe/vuAETR64+gmw9K6lgrPiXaRCDf1Ozq0gkL2GeagvUQbaSxnYKvAEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAAAA==", + "psbt": "cHNidP8BAKsCAAAAAQ5fEGp6JTsIIIxML57Ag15quA5UhLuc79wqxGGAJYllAQAAAAD/////A0oBAAAAAAAAFgAUUbwJCh1a0PSa8LD+lUE9jfwTsrEAAAAAAAAAADFqL+eTrxwN40d7cYzClzzyulYx/p0QIsK6hyuur0lIXZIHhjzDaY2U+V5PXSuDpBrSxnYKvAEAAAAWABR/FYZHS6zul0wzHi1KVSt4dTlV4AAAAAAAAAAAAA==", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "feed_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "feed_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "bet_type": 2, "deadline": 3000000000, "wager_quantity": 1000, @@ -13601,7 +13547,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "timestamp", @@ -13877,14 +13823,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000323109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000010e00000000000000000000000000000000000000000000000000000000000000d4552b78753955e000000000", "btc_in": 5000100000, "btc_out": 0, "btc_change": 5000100000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000003f48656c6c6f2c20776f726c642122", + "data": "000000000000000000000000000000000000000000000000000000000000006448656c6c6f2c20776f726c642122", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000100000 @@ -13894,9 +13840,9 @@ "adjusted_vsize": 167, "sigops_count": 1 }, - "psbt": "cHNidP8BAIsCAAAAAfXsA+ATGQyyRhpjOTo/mTwZ4H+bFZMAWqfJm+/dFth/AAAAAAD/////AgAAAAAAAAAAMGouIxvPkmTehltzxM7s+X0BCPcxGLBsWVyDwZES+EVEkNRFDWeteKxDRr3IUp6jsaB4ByoBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", + "psbt": "cHNidP8BAIsCAAAAATPmI2JhvDr/x4Cou//tMH58ce/yrNDhzxqwQhUi9M+dAAAAAAD/////AgAAAAAAAAAAMGoujVJL3fqG7lGaWcELjTIIatyTPnrxQCNUcwWa7HGQW5SXy9yxcRCirRySWp0St6B4ByoBAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAA==", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "timestamp": 4003903985, "value": 100.0, "fee_fraction": 0.05, @@ -13930,7 +13876,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "order_match_id", @@ -13940,7 +13886,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5" }, { "name": "encoding", @@ -14162,14 +14108,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000003f4900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000dc0000000000000000000000000000000000000000000000000000000000000116000000000000000000000000000000000000000000000000000000000000010500000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000bfe000000000", "btc_in": 5000010000, "btc_out": 1000, "btc_change": 5000009000, "btc_fee": 0, - "data": "0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000003f000000000000000065", + "data": "0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000010907f3e33a0ffb969b0e", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -14179,10 +14125,10 @@ "adjusted_vsize": 225, "sigops_count": 1 }, - "psbt": "cHNidP8BAMUCAAAAAd5VsO4HDCEN/COfWPyHM2oXpGLBa2n9x1Qg08Aiqis3AAAAAAD/////A+gDAAAAAAAAFgAUu8IrhedFhVY/pQJ9ACLSfgEdJJYAAAAAAAAAAEtqSSfBwhRiP+awfk26n0YDlwTiCh60bIMgvJvAc2fP1xWM4zAcwFYrmTFiRbXxmznTQVvbF6bNUHNYDqJfnMjszNyl/4az+cd7YjcoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAAA", + "psbt": "cHNidP8BAMUCAAAAAbXEUiJVRIy4zIKx4kBsL85q1QSt7O1S4cAw+Kjf06TCAAAAAAD/////A+gDAAAAAAAAFgAUC3bZlgHs9cLli4o/Q2Jv9yfrc4YAAAAAAAAAAEtqSXQF/qM+qITd0xHfzeAR2QONEvCe3hnnbbboZbH9VdmbEpgnJCOFDKS2Z8MzHE3+m7JZIeikuWaiAYjZ1FqKLkfxc81I7URSiHcoFQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAAA", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "order_match_id": "0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "order_match_id": "00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5", "skip_validation": true }, "name": "btcpay" @@ -14211,7 +14157,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "quantity", @@ -14453,14 +14399,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000003f2894cded1dabc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005a4bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 1000, "btc_change": 5000009000, "btc_fee": 0, "data": null, "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -14470,9 +14416,9 @@ "adjusted_vsize": 144, "sigops_count": 5 }, - "psbt": "cHNidP8BAHQCAAAAAQI9IQbLjUoX6JTrrZa24GSmhYVHzjjUyfvs/4Iaw9Z3AAAAAAD/////AugDAAAAAAAAGXapFKEbZqZ7P/aWccj4IlQJn683S4AOiKwoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", + "psbt": "cHNidP8BAHQCAAAAAfjr0KiJw3J1CyjW35JpuPAsYjBBi7fjUj+4uTbHgFDiAAAAAAD/////AugDAAAAAAAAGXapFKEbZqZ7P/aWccj4IlQJn683S4AOiKwoFQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "quantity": 1000, "overburn": false, "skip_validation": true @@ -14503,7 +14449,7 @@ "schema": { "type": "string" }, - "example": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll" + "example": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0" }, { "name": "offer_hash", @@ -14513,7 +14459,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000f5" }, { "name": "encoding", @@ -14735,14 +14681,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000c90b8f00000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000096eea500000000", "btc_in": 4949915000, "btc_out": 0, "btc_change": 4949915000, "btc_fee": 0, - "data": "0000000000000000000000000000000000000000000000000000000000000032a06ef3afd3f323a801", + "data": "434e5452505254594600000000000000000000000000000000000000000000000000000000000000f5", "lock_scripts": [ - "00144aa9d623cc85384e21cbe8bea82f55499ad70b8f" + "0014c939ecea16ff55e22d0e6a2b709eb4dedcc8eea5" ], "inputs_values": [ 4949915000 @@ -14752,10 +14698,10 @@ "adjusted_vsize": 162, "sigops_count": 1 }, - "psbt": "cHNidP8BAIYCAAAAAXWtPxz1/WD4hqo/gTBeU1IjbZf+tupuVhFwwnum5UQyAQAAAAD/////AgAAAAAAAAAAK2opkT2ZSUOjYaCDL+XZywOpcjBVPNzVWMDEyyhnthk4mLXIaHrT0unNHyh4tQknAQAAABYAFEqp1iPMhThOIcvovqgvVUma1wuPAAAAAAAAAAA=", + "psbt": "cHNidP8BAIYCAAAAAYBh2RGIWm/a6fAeur+SxbAI6H1pFuc+dPj2CIYq9bsZAQAAAAD/////AgAAAAAAAAAAK2oplmJTG3LcnTt0oncadAEbjNOu4cW2UwASm70fhTH7vwb9dow2FHFmnol4tQknAQAAABYAFMk57OoW/1XiLQ5qK3CetN7cyO6lAAAAAAAAAAA=", "params": { - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "offer_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "offer_hash": "00000000000000000000000000000000000000000000000000000000000000f5", "skip_validation": true }, "name": "cancel" @@ -14784,7 +14730,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -15036,14 +14982,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000204b67d788b49c0dbd89d4723847e21d715e117f6c2911496019800000000000000000000000000000000000000000000000000000000000000023b0000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000d700001600147f1586474bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "0000000000000000000000000000000000000000000000000000000000000058", + "data": "000000000000000000000000000000000000000000000000000000000000006a", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -15053,9 +14999,9 @@ "adjusted_vsize": 153, "sigops_count": 1 }, - "psbt": "cHNidP8BAH0CAAAAAcF6Y6HEn/X6GntCnrYBfZWW2Zgm+DEwoTWnIIGikK8oAAAAAAD/////AgAAAAAAAAAAImogR7ODykAlBLZ9eItJwNvYnUcjhH4h1xXhF/bCkRSWAZgQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", + "psbt": "cHNidP8BAH0CAAAAAeI6KNCMGmXcmJ6gbBVtPy6nFZp1ny0ZGWUFPKa6i41KAAAAAAD/////AgAAAAAAAAAAImogL5YxL5K6pSzWdEo8uMwpPAN/Bj4diXVrH+Pndz3gg6cQGQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 1000, "tag": "\"bugs!\"", @@ -15096,7 +15042,7 @@ "schema": { "type": "string" }, - "example": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8" + "example": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf" }, { "name": "asset", @@ -15386,14 +15332,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029f9000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000002f2040400000000", + "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000004ba59cc600000000", "btc_in": 4949873799, "btc_out": 0, "btc_change": 4949873799, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000004be8000000000000006400", + "data": "0000000000000000000000000000000000000000000000000000000000000063e8000000000000006400", "lock_scripts": [ - "0014e786d2670784c30638a7382d9953c9aeb4f20404" + "0014e7fb34fc155b472747a38d8b0806d155c4a59cc6" ], "inputs_values": [ 4949873799 @@ -15403,9 +15349,9 @@ "adjusted_vsize": 163, "sigops_count": 1 }, - "psbt": "cHNidP8BAIcCAAAAAT2pZI1uXBg4ASXNe6mYhyTuKaAifmZSSwOLi9IQrOM/AgAAAAD/////AgAAAAAAAAAALGoq60JAGESenFnQTy1fGIJErgxd1KgL1FU1n3+zeMX7jOyRkcAYtn5IAY1DhxQJJwEAAAAWABTnhtJnB4TDBjinOC2ZU8mutPIEBAAAAAAAAAAA", + "psbt": "cHNidP8BAIcCAAAAAXqI8QIl3PaUOQVFffx95yI0lwEC8DZVlVq57uxsZTONAgAAAAD/////AgAAAAAAAAAALGoqxhvcWnxBsChHQssGnLgoQp0H5PGdyXWvqJR8onS0Q6iFjuZf8kcqi3GjhxQJJwEAAAAWABTn+zT8FVtHJ0ejjYsIBtFVxKWcxgAAAAAAAAAA", "params": { - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "give_quantity": 1000, "escrow_quantity": 1000, @@ -15451,7 +15397,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "quantity_per_unit", @@ -15703,14 +15649,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000a9000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000005d0000001600147f1586474bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000000201", + "data": "000000000000000000000000000000000000000000000000000000000000006601", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -15720,9 +15666,9 @@ "adjusted_vsize": 154, "sigops_count": 1 }, - "psbt": "cHNidP8BAH4CAAAAAY8Yc+k8PabaIZSqcOTPxkbqjcGz/oRr0rolICCFMaubAAAAAAD/////AgAAAAAAAAAAI2oh8M2PhKEdwy6GNM9d5852wRe7ifSGLCkG+pNCqDk8WNapEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", + "psbt": "cHNidP8BAH4CAAAAAXx8XXOTtUfE1uqM6kAG5CaQUT6EqqRupYvqSpqmDxKsAAAAAAD/////AgAAAAAAAAAAI2ohr01kb3p2Q0ZqZlVwdH9IF0SUAHLeVlCGszA6tj97HQIPEBkGKgEAAAAWABR/FYZHS6zul0wzHi1KVSt4dTlV4AAAAAAAAAAA", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "quantity_per_unit": 1, "asset": "MYASSETA", "dividend_asset": "XCP", @@ -15730,10 +15676,10 @@ "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dividend_asset_info": { "asset_longname": null, @@ -15772,7 +15718,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -15816,7 +15762,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -15846,7 +15792,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "divisible", @@ -16117,14 +16063,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000002f6fbdd2894cded1dabc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000fc1586474bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 330, "btc_change": 5000009670, "btc_fee": 0, "data": "434e54525052545916871b00000001a956fbdf1903e8f5f4f460f6", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -16134,12 +16080,12 @@ "adjusted_vsize": 179, "sigops_count": 1 }, - "psbt": "cHNidP8BAJcCAAAAAU9nb9P4e/rPMXoVEJtDBhQQ86s6MvJmCTaPPi0d0fSFAAAAAAD/////A0oBAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAB1qG8Sm5MbXCGvWdptT+PpCevpjntZuo6SpYuU4zMYXBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAAA=", + "psbt": "cHNidP8BAJcCAAAAAfyEiuWiWbkph1+Qyamlv6weUrZtMgPvAOrfl+yju/3wAAAAAAD/////A0oBAAAAAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAB1qGyTnD5avdwXRK2LrDR5ABCUA+QlkevTKv7UeE8YXBioBAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCPTEST", "quantity": 1000, - "transfer_destination": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "transfer_destination": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "lock": false, "reset": false, @@ -16174,7 +16120,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "assets", @@ -16194,7 +16140,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35,bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp,bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "quantities", @@ -16463,14 +16409,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002910000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000036f1e0c89746ed4f1002565d4a50c8047627a00000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000b4577636860b9bf4dbe2007c4e188df72102f900000000000000000000000000000000000000000000000000000000000000aeaed0e206270100000016001451bc090a1d5ad0f49af0b0fe95413d8dfc13b2b100000000", "btc_in": 4949732000, "btc_out": 2000, "btc_change": 4949730000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000030000000000240000000000000004000000000000000100", + "data": "000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000b60000000000240000000000000004000000000000000100", "lock_scripts": [ - "0014a2b86f1e0c89746ed4f1002565d4a50c8047627a" + "001451bc090a1d5ad0f49af0b0fe95413d8dfc13b2b1" ], "inputs_values": [ 4949732000 @@ -16480,18 +16426,18 @@ "adjusted_vsize": 805, "sigops_count": 161 }, - "psbt": "cHNidP8BAP02AQIAAAABmCmV343g8owtFBNIxDOdtxzVBvvqxx1GN5Y9U2n0f4kBAAAAAP////8D6AMAAAAAAABpUSEDXutY6dk1YDEXldinswmJVIKFaO994kfNYiPhhj2t/iMhA7aklmbnMFq3Q0YQlEW9nN7UYei+iW1lBXVK+86DyHMkIQILNKY8a6l6hPT5btcHyU40ZP/7XE/hdzYcqmUeUZX7zFOu6AMAAAAAAABpUSECQetY6dk1YDEXhtilM6F/r1+J/CKQ/+wKSCbQj4FuAjMhAp/tF8RfX0S7yjJ+QLS9ubsAxOQ+zg8fRXVKxyA8TMq+IQILNKY8a6l6hPT5btcHyU40ZP/7XE/hdzYcqmUeUZX7zFOu0OIGJwEAAAAWABSiuG8eDIl0btTxACVl1KUMgEdiegAAAAAAAAAAAA==", + "psbt": "cHNidP8BAP02AQIAAAABKkXMWsVYErnUe5jvop2UUFhWTOgS/YNb9X9FrwDQ0WcBAAAAAP////8D6AMAAAAAAABpUSECm1QEAQyFPjIOGWqzAK2+S4qSN5C6Kr53buA/UOQFiCAhA+Zu7ixzNNcyH3KMWBVSdxcyavvKlbkqtNviPJLxnDQyIQL5eC7y+8AgeD5j1HpLjQRLNAKZpkWRuZiVL4xfCIhQNlOu6AMAAAAAAABpUSEDhFQEAQyFPjIOCmqxgNKrzc39m34tZo1pQ65qe5xwsSMhA7OOb33PPd0vRaJ4wuXiiYJzV3Y2hgub9NviAHxOGI33IQL5eC7y+8AgeD5j1HpLjQRLNAKZpkWRuZiVL4xfCIhQNlOu0OIGJwEAAAAWABRRvAkKHVrQ9JrwsP6VQT2N/BOysQAAAAAAAAAAAA==", "params": { - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset_dest_quant_list": [ [ "XCP", - "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", 1 ], [ "FAIRMINTC", - "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", 2 ] ], @@ -16525,7 +16471,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "give_asset", @@ -16807,14 +16753,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000291dabc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000011500000000000000000000000000000000000000000000000000000000000000ea4c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000002fd500000000000003e800640000000000000064", + "data": "0000000000000000000000000000000000000000000000000000000000000061d500000000000003e800640000000000000064", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -16824,9 +16770,9 @@ "adjusted_vsize": 172, "sigops_count": 1 }, - "psbt": "cHNidP8BAJACAAAAAWScbObjQNmfRQIHAS+AlW7rFMZNCVkSm4n8Vj/HPC1xAAAAAAD/////AgAAAAAAAAAANWozrB3m3biEST6GUSnKJV/PhhEWCqhXGgSpKY4azuaGmYFT7xCF/OzZtE/jjvk3P2UuDdoxEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", + "psbt": "cHNidP8BAJACAAAAAe1Dm9Ul/MkD40LMcWfU9MK5cGui4tDqL2RaIMYDHyV3AAAAAAD/////AgAAAAAAAAAANWozxmxgoZU09U8z3JLHMCKG5z4dJqB9gQr5KUmoWCg+JmCLq1B68Ca78oLzYtqbwP4qDVw8EBkGKgEAAAAWABR/FYZHS6zul0wzHi1KVSt4dTlV4AAAAAAAAAAA", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "get_asset": "BURNER", @@ -16845,10 +16791,10 @@ "get_asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "give_quantity_normalized": "0.00001000", "get_quantity_normalized": "0.00001000", @@ -16880,7 +16826,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "destination", @@ -16890,7 +16836,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "asset", @@ -17171,14 +17117,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000023b0000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000371000000000000000000000000000000000000000000000000000000000000000420000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "00000000000000000000000000000000000000000000000000000000000000250c8047627a40", + "data": "000000000000000000000000000000000000000000000000000000000000005e8dfc13b2b140", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -17188,10 +17134,10 @@ "adjusted_vsize": 159, "sigops_count": 1 }, - "psbt": "cHNidP8BAIMCAAAAAbiFr02MJU7zSS3z0LvdXK19/989CkymzRIA53pC5yswAAAAAAD/////AgAAAAAAAAAAKGompLVXSm8Stbu/CRYtEO9P7VnfAXPOqyRHEmfIZRwMdun4b4L2aNYQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", + "psbt": "cHNidP8BAIMCAAAAAfwOFezVWk/kW0zQRR2e3zuE5fUhUzgMGvdZQHbRZ93yAAAAAAD/////AgAAAAAAAAAAKGom9b0Fq9wNFCl++U0u5zb0VWx3FGjrKHTssRTpS79HM01sYCp8E5oQGQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "quantity": 1000, "memo": null, @@ -17235,7 +17181,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "destination", @@ -17245,7 +17191,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "flags", @@ -17487,14 +17433,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000020000", + "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000420000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "00000000000000000000000000000000000000000000000000000000000000587a0742ffff", + "data": "0000000000000000000000000000000000000000000000000000000000000060b10742ffff", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -17504,10 +17450,10 @@ "adjusted_vsize": 158, "sigops_count": 1 }, - "psbt": "cHNidP8BAIICAAAAAc0gUq8vckU/o1f6t7MUcB/yVoaj2c1PIma9J6grG+yLAAAAAAD/////AgAAAAAAAAAAJ2olecVYyeODTRSd+WgMNvbvqyKwL1cZP1+F75rr3RgDnTpfxBq9+BAZBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", + "psbt": "cHNidP8BAIICAAAAAUeecP5a19C3bpfYhGfdrJHElmznKDKz3GU5Q9gvFfCCAAAAAAD/////AgAAAAAAAAAAJ2olE1xGEwvutaVQwtwSo+6yA3S2plWzCexS5x1A0e1vS6Aj9kBDJBAZBioBAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAA==", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "flags": 7, "memo": "FFFF", "skip_validation": true @@ -17539,7 +17485,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -17573,7 +17519,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "dispenser", @@ -17583,7 +17529,7 @@ "schema": { "type": "string" }, - "example": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx" + "example": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48" }, { "name": "quantity", @@ -17815,14 +17761,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000a90000000000000000000000000000000000000000000000000000000000000025294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000990000000000000000000000000000000000000000000000000000000000000103000000000000000000000000000000000000000000000000000000000000005055e000000000", "btc_in": 5000010000, "btc_out": 1000, "btc_change": 5000009000, "btc_fee": 0, "data": "434e5452505254590d00", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -17832,12 +17778,12 @@ "adjusted_vsize": 162, "sigops_count": 1 }, - "psbt": "cHNidP8BAIYCAAAAAb61xKn8/dF1Kk5q2VPy+WDuavzkaiAE8SoIPQmZcaZsAAAAAAD/////A+gDAAAAAAAAFgAUwzSE8A5+ekfwFbz5XrW4IuqoKBAAAAAAAAAAAAxqCqJN4gpYnT/rjdQoFQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAAA", + "psbt": "cHNidP8BAIYCAAAAAUW7aZjwd66PffwzORAVrbJFGoF0aURMVuYjlmgEnGLWAAAAAAD/////A+gDAAAAAAAAFgAUacU0qxwk2WNI5h2Z5TJNMQKpWzYAAAAAAAAAAAxqCpTF6prbGlswB+EoFQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAAA", "params": { "quantity": 1000, "skip_validation": true, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "dispenser": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "dispenser": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "quantity_normalized": "0.00001000" }, "name": "dispense" @@ -17866,7 +17812,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -18320,14 +18266,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000002f000000160014a8f6fbdd2894cded1dabc72a013109bcc3fc294900000000", + "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b10000001600147f1586474bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000002540", + "data": "000000000000000000000000000000000000000000000000000000000000006840", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -18337,9 +18283,9 @@ "adjusted_vsize": 154, "sigops_count": 1 }, - "psbt": "cHNidP8BAH4CAAAAAfMn5Gb/M8DGtauTGsNDIHVGOwS9duy23XWtCYjo39b1AAAAAAD/////AgAAAAAAAAAAI2ohnuO/sWGKSroCuYwZ4JvGAsdX313ePw0IqnOV6BamzmK6EBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", + "psbt": "cHNidP8BAH4CAAAAAXe7Lm8t+fT6iuig+3uJ063D4qmCZLe2gl2vAENDYn0oAAAAAAD/////AgAAAAAAAAAAI2ohZ/aoyEyhfR+KQNKFjHD53v4B9lMFGQKD7K4red2zcha2EBkGKgEAAAAWABR/FYZHS6zul0wzHi1KVSt4dTlV4AAAAAAAAAAA", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MYASSET", "asset_parent": "", "price": 10, @@ -18395,7 +18341,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -18637,14 +18583,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000a9ed1dabc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000011b974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, "data": "434e5452505254595b821b0000001b45a6253900", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -18654,19 +18600,19 @@ "adjusted_vsize": 141, "sigops_count": 1 }, - "psbt": "cHNidP8BAHECAAAAATNwzplES97kY7t343wsNDbdNfPlKBOxrJtJnlPEQZCUAAAAAAD/////AgAAAAAAAAAAFmoUJJfAk9xrg8snjOXUYjlDuhOozcUQGQYqAQAAABYAFKj2+90olM3tHavHKgExCbzD/ClJAAAAAAAAAAA=", + "psbt": "cHNidP8BAHECAAAAAf36WL+Jqvq0g79zedVqgWHvEmOTPoMxZ+LQ22pjEoT+AAAAAAD/////AgAAAAAAAAAAFmoUBugxC6f5/1JkUPtBKFmbicRgsv0QGQYqAQAAABYAFH8VhkdLrO6XTDMeLUpVK3h1OVXgAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "OPENFAIR", "quantity": 0, "skip_validation": true, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "issuer": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "divisible": true, "locked": false, - "owner": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll" + "owner": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0" }, "quantity_normalized": "0.00000000" }, @@ -18696,7 +18642,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset_a", @@ -18978,14 +18924,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000003ffbdd2894cded1dabc72a013109bcc3fc294900000000", + "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000011900000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000004e86474bacee974c331e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "000000000000000000000000000000000000000000000000000000000000002f4000000000000f424000000000000000000000000000000000", + "data": "000000000000000000000000000000000000000000000000000000000000006b4000000000000f424000000000000000000000000000000000", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -18995,9 +18941,9 @@ "adjusted_vsize": 178, "sigops_count": 1 }, - "psbt": "cHNidP8BAJYCAAAAAb4C/Vswont18uHrszABX4HkPbPoQ3ZlliEvk063xxxaAAAAAAD/////AgAAAAAAAAAAO2o5ijzUWoexgAsICfeyhF3NJsLPVE3odal5WYcUWSdAttIUlxz4Q17xx5qFzN+hv2sac/bgkpvoGuXyEBkGKgEAAAAWABSo9vvdKJTN7R2rxyoBMQm8w/wpSQAAAAAAAAAA", + "psbt": "cHNidP8BAJYCAAAAAVXpAHMKF8KOu76Ojp3nEDQW9RsPWfAAuHxwhfkRY7tKAAAAAAD/////AgAAAAAAAAAAO2o599Xhxj7DjBmmskZl7x7tEsPNRtcxROHK8VQaeKl4EkooWECl6xkvNgLiI9Ysu0D8Z1i0/L3f5a7/EBkGKgEAAAAWABR/FYZHS6zul0wzHi1KVSt4dTlV4AAAAAAAAAAA", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "XCP", "asset_b": "POOLTEST", "quantity_a": 1000000, @@ -19016,10 +18962,10 @@ "asset_b_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_a_normalized": "0.01000000", "quantity_b_normalized": "0.01000000" @@ -19051,7 +18997,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -19085,7 +19031,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset_a", @@ -19368,14 +19314,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003fc72a013109bcc3fc294900000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000e81e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 0, "btc_change": 5000010000, "btc_fee": 0, - "data": "00000000000000000000000000000000000000000000000000000000000000754000000000000000000000000000000000", + "data": "000000000000000000000000000000000000000000000000000000000000006c4000000000000000000000000000000000", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -19385,9 +19331,9 @@ "adjusted_vsize": 170, "sigops_count": 1 }, - "psbt": "cHNidP8BAI4CAAAAAeJFByLZqczKhpQF4rPO5Pwu5JIdlnufrue1HelXmzvWAAAAAAD/////AgAAAAAAAAAAM2oxmQSPkMhvEgQ3yRep6Tau1WABwHN3rE83xByqNdE0g2t5IhhwnFY4ezp61kYGWiILnBAZBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAA==", + "psbt": "cHNidP8BAI4CAAAAARBaiQCLfhFt0MFViOuzZjLLCKS98guLbYitKpAnfWK5AAAAAAD/////AgAAAAAAAAAAM2ox4eJSTkSeYEQUuWQhHr6i6nGx5+HjdB5cW1NsZbtfwqYPBxWviNW7sY+bzrzPmvC1NRAZBioBAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAA==", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "XCP", "asset_b": "POOLTEST", "quantity": 1000000, @@ -19405,10 +19351,10 @@ "asset_b_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } }, "name": "poolwithdraw", @@ -19438,7 +19384,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -19593,10 +19539,10 @@ "asset_a_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "asset_b_info": { "asset_longname": null, @@ -19699,7 +19645,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -19959,14 +19905,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "0000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000c9c72a013109bcc3fc294900000000", + "rawtransaction": "00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010f00000000000000000000000000000000000000000000000000000000000000b51e2d4a552b78753955e000000000", "btc_in": 5000010000, "btc_out": 546, "btc_change": 5000009454, "btc_fee": 0, "data": "434e545250525459655843507c313030307c", "lock_scripts": [ - "0014a8f6fbdd2894cded1dabc72a013109bcc3fc2949" + "00147f1586474bacee974c331e2d4a552b78753955e0" ], "inputs_values": [ 5000010000 @@ -19976,9 +19922,9 @@ "adjusted_vsize": 170, "sigops_count": 1 }, - "psbt": "cHNidP8BAI4CAAAAAatUmp/+o/u1ZGCBuWysxmepvvKMa7BQcCkTmBlupUnWAAAAAAD/////AyICAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAABRqEte044alaoLm5pG9Anon90Hqoe4WBioBAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUkAAAAAAAAAAAA=", + "psbt": "cHNidP8BAI4CAAAAAYkYyu94zktKd97YhgB/3Yk85DeEKOGG7jZruwE/0OVPAAAAAAD/////AyICAAAAAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAABRqEql1zYoC7maALGDlBtZiy8Q3qe4WBioBAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeAAAAAAAAAAAAA=", "params": { - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 1000, "utxo_value": null, @@ -20021,7 +19967,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -20055,7 +20001,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000025:0" + "example": "00000000000000000000000000000000000000000000000000000000000000b2:0" }, { "name": "destination", @@ -20065,7 +20011,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "encoding", @@ -20287,14 +20233,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000004b85563fa5027d0022d27e011d249600000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000104f5c2e58b8a3f43626ff727eb738600000000", "btc_in": 10000, "btc_out": 0, "btc_change": 10000, "btc_fee": 0, - "data": "00000000000000000000000000000000000000000000000000000000000000607534717a766766686e706c633232667432676a6177", + "data": "0000000000000000000000000000000000000000000000000000000000000069636b35353466743070366e6a343071346376377a6d", "lock_scripts": [ - "0014bbc22b85e74585563fa5027d0022d27e011d2496" + "00140b76d99601ecf5c2e58b8a3f43626ff727eb7386" ], "inputs_values": [ 10000 @@ -20304,10 +20250,10 @@ "adjusted_vsize": 174, "sigops_count": 1 }, - "psbt": "cHNidP8BAJICAAAAAQsYHBRgJZwhCLPWu+X+mNtybCXp2nes64I4ajyD0K2VAAAAAAD/////AgAAAAAAAAAAN2o1aGRcXfQqwjIZytideIqdhNlwb4ivW0ckrRvU07pHmo6qu3fUirnId2BINsIbn8Szd8puIyYQJwAAAAAAABYAFLvCK4XnRYVWP6UCfQAi0n4BHSSWAAAAAAAAAAA=", + "psbt": "cHNidP8BAJICAAAAAdopgyw1Vk3cbC5OZ63ihcgH9iCFjpICJ52+jMYCpFR9AAAAAAD/////AgAAAAAAAAAAN2o1woKtAduT1UyDzSAY+r+L+wk4L3ZDzA3dr18fx0zbLQBjuxUkP1/c1erQGZaBu3aghjXdSuEQJwAAAAAAABYAFAt22ZYB7PXC5YuKP0Nib/cn63OGAAAAAAAAAAA=", "params": { - "source": "0000000000000000000000000000000000000000000000000000000000000025:0", - "destination": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "00000000000000000000000000000000000000000000000000000000000000b2:0", + "destination": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "skip_validation": true }, "name": "detach" @@ -20336,7 +20282,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000025:0" + "example": "00000000000000000000000000000000000000000000000000000000000000b2:0" }, { "name": "destination", @@ -20346,7 +20292,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "utxo_value", @@ -20577,14 +20523,14 @@ "application/json": { "example": { "result": { - "rawtransaction": "000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000060563fa5027d0022d27e011d249600000000", + "rawtransaction": "000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000f10000000000000000000000000000000000000000000000000000000000000111c2e58b8a3f43626ff727eb738600000000", "btc_in": 10000, "btc_out": 546, "btc_change": 9454, "btc_fee": 0, "data": null, "lock_scripts": [ - "0014bbc22b85e74585563fa5027d0022d27e011d2496" + "00140b76d99601ecf5c2e58b8a3f43626ff727eb7386" ], "inputs_values": [ 10000 @@ -20594,10 +20540,10 @@ "adjusted_vsize": 141, "sigops_count": 1 }, - "psbt": "cHNidP8BAHECAAAAAQsYHBRgJZwhCLPWu+X+mNtybCXp2nes64I4ajyD0K2VAAAAAAD/////AiICAAAAAAAAFgAUqPb73SiUze0dq8cqATEJvMP8KUnuJAAAAAAAABYAFLvCK4XnRYVWP6UCfQAi0n4BHSSWAAAAAAAAAAA=", + "psbt": "cHNidP8BAHECAAAAAdopgyw1Vk3cbC5OZ63ihcgH9iCFjpICJ52+jMYCpFR9AAAAAAD/////AiICAAAAAAAAFgAUfxWGR0us7pdMMx4tSlUreHU5VeDuJAAAAAAAABYAFAt22ZYB7PXC5YuKP0Nib/cn63OGAAAAAAAAAAA=", "params": { - "source": "0000000000000000000000000000000000000000000000000000000000000025:0", - "destination": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "00000000000000000000000000000000000000000000000000000000000000b2:0", + "destination": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "utxo_value": null, "skip_validation": true }, @@ -20627,7 +20573,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000025:0" + "example": "00000000000000000000000000000000000000000000000000000000000000b2:0" }, { "name": "destination", @@ -20637,7 +20583,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "encoding", @@ -20858,7 +20804,7 @@ "content": { "application/json": { "example": { - "error": "No UTXOs found for 0000000000000000000000000000000000000000000000000000000000000025:0, provide UTXOs with the `inputs_set` parameter" + "error": "No UTXOs found for 00000000000000000000000000000000000000000000000000000000000000b2:0, provide UTXOs with the `inputs_set` parameter" } } } @@ -20883,7 +20829,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -20971,8 +20917,8 @@ "asset": "OPENFAIR", "asset_id": "117132633401", "asset_longname": null, - "issuer": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "owner": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "issuer": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "owner": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "divisible": true, "locked": false, "supply": 0, @@ -20981,16 +20927,16 @@ "first_issuance_block_index": 323, "last_issuance_block_index": 323, "mime_type": "text/plain", - "first_issuance_block_time": 1781529682, - "last_issuance_block_time": 1781529682, + "first_issuance_block_time": 1781627734, + "last_issuance_block_time": 1781627734, "supply_normalized": "0.00000000" }, { "asset": "FAIRMARK", "asset_id": "40262081844", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -20999,16 +20945,16 @@ "first_issuance_block_index": 320, "last_issuance_block_index": 324, "mime_type": "text/plain", - "first_issuance_block_time": 1781529671, - "last_issuance_block_time": 1781529686, + "first_issuance_block_time": 1781627721, + "last_issuance_block_time": 1781627739, "supply_normalized": "0.00000000" }, { "asset": "FAIRMULTI", "asset_id": "1046814475650", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -21017,16 +20963,16 @@ "first_issuance_block_index": 313, "last_issuance_block_index": 315, "mime_type": "text/plain", - "first_issuance_block_time": 1781529646, - "last_issuance_block_time": 1781529653, + "first_issuance_block_time": 1781627695, + "last_issuance_block_time": 1781627702, "supply_normalized": "10.00000000" }, { "asset": "FAIRFAIL", "asset_id": "40261958579", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 0, @@ -21035,16 +20981,16 @@ "first_issuance_block_index": 307, "last_issuance_block_index": 311, "mime_type": "text/plain", - "first_issuance_block_time": 1781529625, - "last_issuance_block_time": 1781529633, + "first_issuance_block_time": 1781627673, + "last_issuance_block_time": 1781627681, "supply_normalized": "0.00000000" }, { "asset": "FAIRPOOL", "asset_id": "40262143959", "asset_longname": null, - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, "supply": 1000000000, @@ -21053,8 +20999,8 @@ "first_issuance_block_index": 301, "last_issuance_block_index": 303, "mime_type": "text/plain", - "first_issuance_block_time": 1781529602, - "last_issuance_block_time": 1781529610, + "first_issuance_block_time": 1781627651, + "last_issuance_block_time": 1781627658, "supply_normalized": "10.00000000" } ], @@ -21108,8 +21054,8 @@ "asset": "BURNER", "asset_id": "21328597", "asset_longname": null, - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, "supply": 100000000, @@ -21118,8 +21064,8 @@ "first_issuance_block_index": 222, "last_issuance_block_index": 223, "mime_type": "text/plain", - "first_issuance_block_time": 1781529285, - "last_issuance_block_time": 1781529289, + "first_issuance_block_time": 1781627312, + "last_issuance_block_time": 1781627317, "supply_normalized": "1.00000000" } } @@ -21222,7 +21168,7 @@ "example": { "result": [ { - "address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "utxo": null, "utxo_address": null, "asset": "BURNER", @@ -21231,15 +21177,15 @@ "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.80000000" }, { - "address": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "address": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "utxo": null, "utxo_address": null, "asset": "BURNER", @@ -21248,10 +21194,10 @@ "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.20000000" } @@ -21292,7 +21238,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "verbose", @@ -21314,7 +21260,7 @@ "example": { "result": [ { - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "asset_longname": null, "quantity": 83377466195, @@ -21454,9 +21400,9 @@ "result": [ { "tx_index": 56, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000033", "block_index": 181, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -21474,7 +21420,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529066, + "block_time": 1781627088, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21503,9 +21449,9 @@ }, { "tx_index": 58, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000007d", "block_index": 203, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 10000, "give_remaining": 5000, @@ -21523,7 +21469,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529208, + "block_time": 1781627230, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21552,9 +21498,9 @@ }, { "tx_index": 65, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c1", "block_index": 190, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -21572,7 +21518,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529154, + "block_time": 1781627176, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21601,9 +21547,9 @@ }, { "tx_index": 67, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000010c", "block_index": 212, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 0, @@ -21621,7 +21567,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529245, + "block_time": 1781627270, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21650,9 +21596,9 @@ }, { "tx_index": 125, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000027", "block_index": 297, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "give_asset": "XCP", "give_quantity": 10000000, "give_remaining": 0, @@ -21670,7 +21616,7 @@ "give_asset_divisible": true, "give_price": 1e-07, "get_price": 10000000.0, - "block_time": 1781529585, + "block_time": 1781627635, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21682,10 +21628,10 @@ "get_asset_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "give_quantity_normalized": "0.10000000", "get_quantity_normalized": "0.00000001", @@ -21829,13 +21775,12 @@ "example": { "result": [ { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 3000, "backward_asset": "BTC", @@ -21850,7 +21795,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529216, + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000059", + "block_time": 1781627238, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21873,13 +21819,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 59, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000005", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 2000, "backward_asset": "BTC", @@ -21894,7 +21839,8 @@ "status": "completed", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529130, + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005", + "block_time": 1781627149, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21917,13 +21863,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000003", "tx0_index": 56, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000033", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 57, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000087", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -21938,7 +21883,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529066, + "id": "0000000000000000000000000000000000000000000000000000000000000033_0000000000000000000000000000000000000000000000000000000000000087", + "block_time": 1781627088, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -21961,13 +21907,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 67, - "tx0_hash": "000000000000000000000000000000000000000000000000000000000000003f", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000010c", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -21982,7 +21927,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529297, + "id": "000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059", + "block_time": 1781627326, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22122,45 +22068,45 @@ "result": [ { "block_index": 223, - "address": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "address": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "asset": "BURNER", "quantity": 20000000, "calling_function": "fairmint commission", - "event": "000000000000000000000000000000000000000000000000000000000000002f", + "event": "000000000000000000000000000000000000000000000000000000000000009f", "tx_index": 100, "utxo": null, "utxo_address": null, "credit_index": 114, - "block_time": 1781529289, + "block_time": 1781627317, "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.20000000" }, { "block_index": 223, - "address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "BURNER", "quantity": 80000000, "calling_function": "fairmint", - "event": "000000000000000000000000000000000000000000000000000000000000002f", + "event": "000000000000000000000000000000000000000000000000000000000000009f", "tx_index": 100, "utxo": null, "utxo_address": null, "credit_index": 113, - "block_time": 1781529289, + "block_time": 1781627317, "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.80000000" } @@ -22275,12 +22221,12 @@ "asset": "XCP", "quantity": 2000000000, "action": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "utxo": "0000000000000000000000000000000000000000000000000000000000000025:1", - "utxo_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "utxo": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "utxo_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "debit_index": 137, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22293,16 +22239,16 @@ }, { "block_index": 323, - "address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "XCP", "quantity": 50000000, "action": "fairminter fee", - "event": "0000000000000000000000000000000000000000000000000000000000000058", + "event": "00000000000000000000000000000000000000000000000000000000000000a8", "tx_index": 140, "utxo": null, "utxo_address": null, "debit_index": 134, - "block_time": 1781529682, + "block_time": 1781627734, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22315,16 +22261,16 @@ }, { "block_index": 320, - "address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "quantity": 50000000, "action": "fairminter fee", - "event": "000000000000000000000000000000000000000000000000000000000000002f", + "event": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, "utxo": null, "utxo_address": null, "debit_index": 132, - "block_time": 1781529671, + "block_time": 1781627721, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22341,12 +22287,12 @@ "asset": "XCP", "quantity": 600000000, "action": "unescrowed fairmint payment", - "event": "000000000000000000000000000000000000000000000000000000000000003f", + "event": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 0, "utxo": null, "utxo_address": null, "debit_index": 131, - "block_time": 1781529653, + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22359,16 +22305,16 @@ }, { "block_index": 315, - "address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "quantity": 400000000, "action": "escrowed fairmint", - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, "utxo": null, "utxo_address": null, "debit_index": 129, - "block_time": 1781529653, + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22458,14 +22404,14 @@ "result": [ { "tx_index": 100, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009f", "block_index": 223, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "XCP", "quantity": 100000000, "tag": "burn fairmint payment", "status": "valid", - "block_time": 1781529289, + "block_time": 1781627317, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22478,14 +22424,14 @@ }, { "tx_index": 69, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f6", "block_index": 193, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "quantity": 1, "tag": "64657374726f79", "status": "valid", - "block_time": 1781529167, + "block_time": 1781627188, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22693,14 +22639,14 @@ "result": [ { "tx_index": 100, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009f", "msg_index": 0, "block_index": 223, "asset": "BURNER", "quantity": 100000000, "divisible": true, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "transfer": false, "callable": false, "call_date": 0, @@ -22715,20 +22661,20 @@ "locked": true, "reset": false, "mime_type": "text/plain", - "block_time": 1781529289, + "block_time": 1781627317, "quantity_normalized": "1.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 99, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000048", "msg_index": 0, "block_index": 222, "asset": "BURNER", "quantity": 0, "divisible": true, - "source": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "source": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "transfer": false, "callable": false, "call_date": 0, @@ -22743,7 +22689,7 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529285, + "block_time": 1781627312, "quantity_normalized": "0.00000000", "fee_paid_normalized": "0.50000000" } @@ -22853,10 +22799,10 @@ "result": [ { "tx_index": 62, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", "block_index": 186, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "quantity": 10000000000000, "status": "invalid: insufficient funds", @@ -22866,7 +22812,7 @@ "send_type": "send", "source_address": null, "destination_address": null, - "block_time": 1781529139, + "block_time": 1781627156, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22880,10 +22826,10 @@ }, { "tx_index": 50, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000fd", "block_index": 154, - "source": "0000000000000000000000000000000000000000000000000000000000000075:0", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "0000000000000000000000000000000000000000000000000000000000000112:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000fd:0", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -22891,9 +22837,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "block_time": 1781529031, + "source_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "block_time": 1781627051, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22907,10 +22853,10 @@ }, { "tx_index": 51, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ce", "block_index": 155, - "source": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination": "0000000000000000000000000000000000000000000000000000000000000025:1", + "source": "00000000000000000000000000000000000000000000000000000000000000fd:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000ce:1", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -22918,9 +22864,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "block_time": 1781529036, + "source_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "block_time": 1781627055, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22934,10 +22880,10 @@ }, { "tx_index": 141, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "0000000000000000000000000000000000000000000000000000000000000025:1", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "00000000000000000000000000000000000000000000000000000000000000ce:1", + "destination": "00000000000000000000000000000000000000000000000000000000000000c5:0", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -22945,9 +22891,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "destination_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "source_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "destination_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -22961,10 +22907,10 @@ }, { "tx_index": 63, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000054", "block_index": 187, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "quantity": 10000, "status": "valid", @@ -22974,7 +22920,7 @@ "send_type": "send", "source_address": null, "destination_address": null, - "block_time": 1781529142, + "block_time": 1781627162, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23106,9 +23052,9 @@ "result": [ { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -23117,7 +23063,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23127,7 +23073,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23145,9 +23091,9 @@ }, { "tx_index": 29, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000092", "block_index": 133, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -23156,7 +23102,7 @@ "give_remaining": 10000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "origin": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "dispense_count": 0, "last_status_tx_source": null, "close_block_index": null, @@ -23166,7 +23112,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528944, + "block_time": 1781626964, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23184,9 +23130,9 @@ }, { "tx_index": 30, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000006e", "block_index": 141, - "source": "1KbWivLGRP4eLwy3a3cG6CVFGdYxVaCp5e", + "source": "1ETMS7pxnaiJ9icyKcXv6NHn6dp6kvDXup", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10, @@ -23194,10 +23140,10 @@ "status": 10, "give_remaining": 0, "oracle_address": null, - "last_status_tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ba", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 0, - "last_status_tx_source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "close_block_index": 141, "price": 100000000.0, "fiat_price": null, @@ -23205,7 +23151,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528979, + "block_time": 1781626998, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23223,18 +23169,18 @@ }, { "tx_index": 33, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23244,7 +23190,7 @@ "fiat_unit": "USD", "oracle_price_last_updated": 129, "satoshi_price": 16, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23262,9 +23208,9 @@ }, { "tx_index": 117, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 5000, @@ -23273,7 +23219,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -23283,7 +23229,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23326,7 +23272,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "asset", @@ -23358,9 +23304,9 @@ "example": { "result": { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -23369,7 +23315,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23379,7 +23325,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23481,7 +23427,7 @@ "result": [ { "asset": "BURNER", - "address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "quantity": 80000000, "escrow": null, "cursor_id": "balances_59", @@ -23490,16 +23436,16 @@ "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.80000000" }, { "asset": "BURNER", - "address": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "address": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "quantity": 20000000, "escrow": null, "cursor_id": "balances_60", @@ -23508,10 +23454,10 @@ "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.20000000" } @@ -23614,18 +23560,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -23633,7 +23579,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23648,7 +23594,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23663,18 +23609,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -23682,7 +23628,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23697,7 +23643,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23712,18 +23658,18 @@ { "tx_index": 118, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e5", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 3000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 3000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "dispenser": { "tx_index": 117, "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "give_quantity": 1, "escrow_quantity": 5000, "satoshirate": 1, @@ -23731,7 +23677,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -23746,7 +23692,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23761,26 +23707,26 @@ { "tx_index": 34, "dispense_index": 0, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000b9", "block_index": 138, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "asset": "XCP", "dispense_quantity": 666, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", "btc_amount": 10000, + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "dispenser": { "tx_index": 33, "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23795,7 +23741,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000016" }, - "block_time": 1781528965, + "block_time": 1781626985, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -23810,26 +23756,26 @@ { "tx_index": 141, "dispense_index": 0, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", "btc_amount": 1000, + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "dispenser": { "tx_index": 33, "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -23844,7 +23790,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000016" }, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -24025,10 +23971,10 @@ "example": { "result": [ { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000048", "tx_index": 99, "block_index": 223, - "source": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "source": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "asset": "BURNER", "asset_parent": null, "asset_longname": null, @@ -24056,7 +24002,7 @@ "earned_quantity": 80000000, "paid_quantity": 100000000, "commission": 20000000, - "block_time": 1781529289, + "block_time": 1781627317, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "1.00000000", "soft_cap_normalized": "0.00000000", @@ -24144,24 +24090,24 @@ "example": { "result": [ { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009f", "tx_index": 100, "block_index": 223, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "BURNER", "earn_quantity": 80000000, "paid_quantity": 100000000, "commission": 20000000, "status": "valid", - "block_time": 1781529289, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000048", + "block_time": 1781627317, "asset_info": { "asset_longname": null, "description": "let's burn it", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": true, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "earn_quantity_normalized": "0.80000000", "commission_normalized": "0.20000000", @@ -24194,7 +24140,7 @@ "schema": { "type": "string" }, - "example": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja" + "example": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z" }, { "name": "asset", @@ -24366,9 +24312,9 @@ "result": [ { "tx_index": 56, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000033", "block_index": 181, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -24386,7 +24332,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529066, + "block_time": 1781627088, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -24415,9 +24361,9 @@ }, { "tx_index": 58, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000007d", "block_index": 203, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 10000, "give_remaining": 5000, @@ -24435,7 +24381,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529208, + "block_time": 1781627230, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -24464,9 +24410,9 @@ }, { "tx_index": 59, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000005", "block_index": 184, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "give_asset": "BTC", "give_quantity": 2000, "give_remaining": 0, @@ -24484,7 +24430,7 @@ "give_asset_divisible": false, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529130, + "block_time": 1781627149, "give_asset_info": { "divisible": true, "asset_longname": null, @@ -24513,9 +24459,9 @@ }, { "tx_index": 61, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000109", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000059", "block_index": 206, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "give_asset": "BTC", "give_quantity": 3000, "give_remaining": 2000, @@ -24533,7 +24479,7 @@ "give_asset_divisible": false, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529221, + "block_time": 1781627242, "give_asset_info": { "divisible": true, "asset_longname": null, @@ -24562,9 +24508,9 @@ }, { "tx_index": 65, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c1", "block_index": 190, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -24582,7 +24528,7 @@ "give_asset_divisible": true, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529154, + "block_time": 1781627176, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -24636,7 +24582,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000f5" }, { "name": "verbose", @@ -24658,9 +24604,9 @@ "example": { "result": { "tx_index": 139, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f5", "block_index": 322, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_asset": "BTC", "give_quantity": 1000, "give_remaining": 0, @@ -24678,7 +24624,7 @@ "give_asset_divisible": false, "give_price": 1.0, "get_price": 1.0, - "block_time": 1781529679, + "block_time": 1781627730, "give_asset_info": { "divisible": true, "asset_longname": null, @@ -24689,10 +24635,10 @@ "get_asset_info": { "asset_longname": null, "description": "My super asset", - "issuer": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "issuer": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "divisible": true, "locked": false, - "owner": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv" + "owner": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8" }, "give_quantity_normalized": "0.00001000", "get_quantity_normalized": "0.00001000", @@ -24729,7 +24675,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000002" + "example": "00000000000000000000000000000000000000000000000000000000000000ec" }, { "name": "status", @@ -24815,13 +24761,12 @@ "example": { "result": [ { - "id": "0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003", "tx0_index": 138, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000002", - "tx0_address": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "tx0_hash": "00000000000000000000000000000000000000000000000000000000000000ec", + "tx0_address": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "tx1_index": 139, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "tx1_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "tx1_hash": "00000000000000000000000000000000000000000000000000000000000000f5", + "tx1_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "forward_asset": "UTXOASSET", "forward_quantity": 1000, "backward_asset": "BTC", @@ -24836,14 +24781,15 @@ "status": "pending", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529679, + "id": "00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5", + "block_time": 1781627730, "forward_asset_info": { "asset_longname": null, "description": "My super asset", - "issuer": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "issuer": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "divisible": true, "locked": false, - "owner": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv" + "owner": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8" }, "backward_asset_info": { "divisible": true, @@ -24885,7 +24831,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000025" + "example": "000000000000000000000000000000000000000000000000000000000000007d" }, { "name": "cursor", @@ -24937,14 +24883,14 @@ "result": [ { "tx_index": 60, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000095", "block_index": 184, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "destination": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", + "destination": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "btc_amount": 2000, - "order_match_id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058", "status": "valid", - "block_time": 1781529130, + "order_match_id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005", + "block_time": 1781627149, "btc_amount_normalized": "0.00002000" } ], @@ -25063,9 +25009,9 @@ "result": [ { "tx_index": 59, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000005", "block_index": 184, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "give_asset": "BTC", "give_quantity": 2000, "give_remaining": 0, @@ -25086,7 +25032,7 @@ "market_pair": "BTC/XCP", "market_dir": "SELL", "market_price": "1.00000000", - "block_time": 1781529130, + "block_time": 1781627149, "give_asset_info": { "divisible": true, "asset_longname": null, @@ -25116,9 +25062,9 @@ }, { "tx_index": 61, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000109", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000059", "block_index": 206, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "give_asset": "BTC", "give_quantity": 3000, "give_remaining": 2000, @@ -25139,7 +25085,7 @@ "market_pair": "BTC/XCP", "market_dir": "SELL", "market_price": "1.00000000", - "block_time": 1781529221, + "block_time": 1781627242, "give_asset_info": { "divisible": true, "asset_longname": null, @@ -25169,9 +25115,9 @@ }, { "tx_index": 56, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000033", "block_index": 181, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -25192,7 +25138,7 @@ "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529066, + "block_time": 1781627088, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25222,9 +25168,9 @@ }, { "tx_index": 58, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000007d", "block_index": 203, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 10000, "give_remaining": 5000, @@ -25245,7 +25191,7 @@ "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529208, + "block_time": 1781627230, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25275,9 +25221,9 @@ }, { "tx_index": 65, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c1", "block_index": 190, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_asset": "XCP", "give_quantity": 1000, "give_remaining": 1000, @@ -25298,7 +25244,7 @@ "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529154, + "block_time": 1781627176, "give_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25449,13 +25395,12 @@ "example": { "result": [ { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 3000, "backward_asset": "BTC", @@ -25468,10 +25413,11 @@ "match_expire_index": 204, "fee_paid": 0, "status": "expired", + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000059", "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529216, + "block_time": 1781627238, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25493,13 +25439,12 @@ "market_price_normalized": "1.00000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 59, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000005", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 2000, "backward_asset": "BTC", @@ -25512,10 +25457,11 @@ "match_expire_index": 202, "fee_paid": 0, "status": "completed", + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005", "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529130, + "block_time": 1781627149, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25537,13 +25483,12 @@ "market_price_normalized": "1.00000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000003", "tx0_index": 56, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000033", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 57, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000087", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -25556,10 +25501,11 @@ "match_expire_index": 180, "fee_paid": 0, "status": "expired", + "id": "0000000000000000000000000000000000000000000000000000000000000033_0000000000000000000000000000000000000000000000000000000000000087", "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529066, + "block_time": 1781627088, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25581,13 +25527,12 @@ "market_price_normalized": "1.00000000" }, { - "id": "000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 67, - "tx0_hash": "000000000000000000000000000000000000000000000000000000000000003f", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000010c", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -25600,10 +25545,11 @@ "match_expire_index": 224, "fee_paid": 0, "status": "expired", + "id": "000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059", "market_pair": "BTC/XCP", "market_dir": "BUY", "market_price": "1.00000000", - "block_time": 1781529297, + "block_time": 1781627326, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25727,13 +25673,12 @@ "example": { "result": [ { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 3000, "backward_asset": "BTC", @@ -25748,7 +25693,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529216, + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000059", + "block_time": 1781627238, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25771,13 +25717,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000058", "tx0_index": 58, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000007d", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 59, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000005", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 2000, "backward_asset": "BTC", @@ -25792,7 +25737,8 @@ "status": "completed", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529130, + "id": "000000000000000000000000000000000000000000000000000000000000007d_0000000000000000000000000000000000000000000000000000000000000005", + "block_time": 1781627149, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25815,13 +25761,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000025_0000000000000000000000000000000000000000000000000000000000000003", "tx0_index": 56, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000025", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000033", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 57, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "tx1_address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000087", + "tx1_address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -25836,7 +25781,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529066, + "id": "0000000000000000000000000000000000000000000000000000000000000033_0000000000000000000000000000000000000000000000000000000000000087", + "block_time": 1781627088, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25859,13 +25805,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "000000000000000000000000000000000000000000000000000000000000003f_0000000000000000000000000000000000000000000000000000000000000109", "tx0_index": 67, - "tx0_hash": "000000000000000000000000000000000000000000000000000000000000003f", - "tx0_address": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "tx0_hash": "000000000000000000000000000000000000000000000000000000000000010c", + "tx0_address": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "tx1_index": 61, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000109", - "tx1_address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000059", + "tx1_address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "forward_asset": "XCP", "forward_quantity": 1000, "backward_asset": "BTC", @@ -25880,7 +25825,8 @@ "status": "expired", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529297, + "id": "000000000000000000000000000000000000000000000000000000000000010c_0000000000000000000000000000000000000000000000000000000000000059", + "block_time": 1781627326, "forward_asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -25903,13 +25849,12 @@ "backward_price_normalized": "1.0000000000000000" }, { - "id": "0000000000000000000000000000000000000000000000000000000000000002_0000000000000000000000000000000000000000000000000000000000000003", "tx0_index": 138, - "tx0_hash": "0000000000000000000000000000000000000000000000000000000000000002", - "tx0_address": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "tx0_hash": "00000000000000000000000000000000000000000000000000000000000000ec", + "tx0_address": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "tx1_index": 139, - "tx1_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "tx1_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "tx1_hash": "00000000000000000000000000000000000000000000000000000000000000f5", + "tx1_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "forward_asset": "UTXOASSET", "forward_quantity": 1000, "backward_asset": "BTC", @@ -25924,14 +25869,15 @@ "status": "pending", "backward_price": 1.0, "forward_price": 1.0, - "block_time": 1781529679, + "id": "00000000000000000000000000000000000000000000000000000000000000ec_00000000000000000000000000000000000000000000000000000000000000f5", + "block_time": 1781627730, "forward_asset_info": { "asset_longname": null, "description": "My super asset", - "issuer": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "issuer": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "divisible": true, "locked": false, - "owner": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv" + "owner": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8" }, "backward_asset_info": { "divisible": true, @@ -25973,7 +25919,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000002" + "example": "00000000000000000000000000000000000000000000000000000000000000ec" }, { "name": "cursor", @@ -26187,22 +26133,22 @@ "result": [ { "tx_index": 129, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", "block_index": 303, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "FAIRPOOL", "asset_b": "XCP", "reserve_a": 400000000, "reserve_b": 600000000, "lp_asset": "A95428960030839430", - "block_time": 1781529610, + "block_time": 1781627658, "asset_a_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26225,22 +26171,22 @@ }, { "tx_index": 134, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 315, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "FAIRMULTI", "asset_b": "XCP", "reserve_a": 400000000, "reserve_b": 600000000, "lp_asset": "A95428956661682177", - "block_time": 1781529653, + "block_time": 1781627702, "asset_a_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26263,22 +26209,22 @@ }, { "tx_index": 124, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000028", "block_index": 299, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "POOLTEST", "asset_b": "XCP", "reserve_a": 109553931, "reserve_b": 132500000, "lp_asset": "A95428956689590706", - "block_time": 1781529594, + "block_time": 1781627643, "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26358,22 +26304,22 @@ "example": { "result": { "tx_index": 124, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000028", "block_index": 299, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "POOLTEST", "asset_b": "XCP", "reserve_a": 109553931, "reserve_b": 132500000, "lp_asset": "A95428956689590706", - "block_time": 1781529594, + "block_time": 1781627643, "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26762,7 +26708,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -26814,23 +26760,23 @@ "result": [ { "tx_index": 134, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "block_index": 315, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "FAIRMULTI", "asset_b": "XCP", "quantity_a": 400000000, "quantity_b": 600000000, "quantity_minted": 489897948, "status": "valid", - "block_time": 1781529653, + "block_time": 1781627702, "asset_a_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26846,23 +26792,23 @@ }, { "tx_index": 129, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", "block_index": 303, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "FAIRPOOL", "asset_b": "XCP", "quantity_a": 400000000, "quantity_b": 600000000, "quantity_minted": 489897948, "status": "valid", - "block_time": 1781529610, + "block_time": 1781627658, "asset_a_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26878,23 +26824,23 @@ }, { "tx_index": 126, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000b7", "block_index": 298, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "POOLTEST", "asset_b": "XCP", "quantity_a": 41341106, "quantity_b": 50000000, "quantity_minted": 45454545, "status": "valid", - "block_time": 1781529589, + "block_time": 1781627639, "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26910,23 +26856,23 @@ }, { "tx_index": 124, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000028", "block_index": 296, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "POOLTEST", "asset_b": "XCP", "quantity_a": 100000000, "quantity_b": 100000000, "quantity_minted": 100000000, "status": "valid", - "block_time": 1781529582, + "block_time": 1781627629, "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -26967,7 +26913,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -27019,23 +26965,23 @@ "result": [ { "tx_index": 127, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000eb", "block_index": 299, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset_a": "POOLTEST", "asset_b": "XCP", "quantity_destroyed": 25000000, "quantity_a": 22737608, "quantity_b": 27499999, "status": "valid", - "block_time": 1781529594, + "block_time": 1781627643, "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -27076,7 +27022,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, { "name": "cursor", @@ -27136,10 +27082,10 @@ "asset_a_info": { "asset_longname": null, "description": "Pool test asset", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "asset_b_info": { "asset_longname": null, @@ -27271,7 +27217,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000032" + "example": "0000000000000000000000000000000000000000000000000000000000000088" }, { "name": "verbose", @@ -27316,7 +27262,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000032" + "example": "0000000000000000000000000000000000000000000000000000000000000088" }, { "name": "status", @@ -27411,7 +27357,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000058" + "example": "0000000000000000000000000000000000000000000000000000000000000056" }, { "name": "cursor", @@ -27529,61 +27475,61 @@ "result": [ { "tx_index": 9, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a3", "block_index": 112, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" }, { "tx_index": 8, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a6", "block_index": 112, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" }, { "tx_index": 7, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000076", "block_index": 112, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" }, { "tx_index": 6, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f9", "block_index": 112, - "source": "bc1qduxrsdnc45nff2dhz9thw066emfyz9fx3rzukn", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" }, { "tx_index": 5, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000bc", "block_index": 112, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "burned": 50000000, "earned": 74999998167, "status": "valid", - "block_time": 1781528859, + "block_time": 1781626875, "burned_normalized": "0.50000000", "earned_normalized": "749.99998167" } @@ -27697,9 +27643,9 @@ "result": [ { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -27708,7 +27654,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -27718,7 +27664,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -27736,9 +27682,9 @@ }, { "tx_index": 29, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000092", "block_index": 133, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -27747,7 +27693,7 @@ "give_remaining": 10000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "origin": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "dispense_count": 0, "last_status_tx_source": null, "close_block_index": null, @@ -27757,7 +27703,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528944, + "block_time": 1781626964, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -27775,9 +27721,9 @@ }, { "tx_index": 30, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000006e", "block_index": 141, - "source": "1KbWivLGRP4eLwy3a3cG6CVFGdYxVaCp5e", + "source": "1ETMS7pxnaiJ9icyKcXv6NHn6dp6kvDXup", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10, @@ -27785,10 +27731,10 @@ "status": 10, "give_remaining": 0, "oracle_address": null, - "last_status_tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ba", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 0, - "last_status_tx_source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "last_status_tx_source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "close_block_index": 141, "price": 100000000.0, "fiat_price": null, @@ -27796,7 +27742,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528979, + "block_time": 1781626998, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -27814,9 +27760,9 @@ }, { "tx_index": 71, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "TESTLOCKDESC", "give_quantity": 1, "escrow_quantity": 10000, @@ -27825,7 +27771,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -27835,14 +27781,14 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "give_quantity_normalized": "0.00000001", "give_remaining_normalized": "0.00006000", @@ -27853,9 +27799,9 @@ }, { "tx_index": 117, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 5000, @@ -27864,7 +27810,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -27874,7 +27820,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -27917,7 +27863,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000060" + "example": "0000000000000000000000000000000000000000000000000000000000000118" }, { "name": "verbose", @@ -27939,9 +27885,9 @@ "example": { "result": { "tx_index": 26, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "XCP", "give_quantity": 1, "escrow_quantity": 10000, @@ -27950,7 +27896,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -27960,7 +27906,7 @@ "fiat_unit": null, "oracle_price_last_updated": null, "satoshi_price": 1, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28000,7 +27946,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000060" + "example": "0000000000000000000000000000000000000000000000000000000000000118" }, { "name": "cursor", @@ -28063,18 +28009,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -28082,7 +28028,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -28097,7 +28043,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28112,18 +28058,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -28131,7 +28077,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -28146,7 +28092,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28237,22 +28183,22 @@ "result": [ { "tx_index": 42, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e9", "block_index": 146, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MYASSETA", "dividend_asset": "XCP", "quantity_per_unit": 100000000, "fee_paid": 20000, "status": "valid", - "block_time": 1781528999, + "block_time": 1781627018, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dividend_asset_info": { "asset_longname": null, @@ -28292,7 +28238,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000032" + "example": "00000000000000000000000000000000000000000000000000000000000000e9" }, { "name": "verbose", @@ -28314,22 +28260,22 @@ "example": { "result": { "tx_index": 42, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e9", "block_index": 146, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "MYASSETA", "dividend_asset": "XCP", "quantity_per_unit": 100000000, "fee_paid": 20000, "status": "valid", - "block_time": 1781528999, + "block_time": 1781627018, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dividend_asset_info": { "asset_longname": null, @@ -28366,7 +28312,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000032" + "example": "00000000000000000000000000000000000000000000000000000000000000e9" }, { "name": "cursor", @@ -28422,12 +28368,12 @@ "asset": "XCP", "quantity": 2000000000, "calling_function": "dividend", - "event": "0000000000000000000000000000000000000000000000000000000000000032", + "event": "00000000000000000000000000000000000000000000000000000000000000e9", "tx_index": 42, - "utxo": "0000000000000000000000000000000000000000000000000000000000000075:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "utxo": "0000000000000000000000000000000000000000000000000000000000000112:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "credit_index": 51, - "block_time": 1781528999, + "block_time": 1781627018, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28520,27 +28466,27 @@ "event": "BLOCK_PARSED", "params": { "block_index": 325, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", "transaction_count": 1, - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "block_time": 1781529693 + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "block_time": 1781627750 }, "tx_hash": null, "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1390, "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141 }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1389, @@ -28549,14 +28495,14 @@ "asset": "XCP", "block_index": 325, "btc_amount": 1000, - "destination": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "destination": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "dispense_index": 0, "dispense_quantity": 66, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "tx_index": 141, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28568,9 +28514,9 @@ "dispense_quantity_normalized": "0.00000066", "btc_amount_normalized": "0.00001000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1388, @@ -28579,9 +28525,9 @@ "asset": "XCP", "dispense_count": 2, "give_remaining": 9268, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "status": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28592,24 +28538,24 @@ }, "give_remaining_normalized": "0.00009268" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28620,9 +28566,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } ], "next_cursor": 1386, @@ -28676,15 +28622,15 @@ "event": "BLOCK_PARSED", "params": { "block_index": 325, - "ledger_hash": "0000000000000000000000000000000000000000000000000000000000000003", - "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c9", + "ledger_hash": "00000000000000000000000000000000000000000000000000000000000000cd", + "messages_hash": "00000000000000000000000000000000000000000000000000000000000000c0", "transaction_count": 1, - "txlist_hash": "00000000000000000000000000000000000000000000000000000000000000a9", - "block_time": 1781529693 + "txlist_hash": "0000000000000000000000000000000000000000000000000000000000000029", + "block_time": 1781627750 }, "tx_hash": null, "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 } } } @@ -28852,16 +28798,16 @@ "event_index": 1387, "event": "CREDIT", "params": { - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "asset": "XCP", "block_index": 325, "calling_function": "dispense", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 66, "tx_index": 141, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28872,9 +28818,9 @@ }, "quantity_normalized": "0.00000066" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1385, @@ -28884,12 +28830,12 @@ "asset": "XCP", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28900,9 +28846,9 @@ }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1382, @@ -28912,40 +28858,40 @@ "asset": "MYASSETA", "block_index": 325, "calling_function": "utxo move", - "event": "000000000000000000000000000000000000000000000000000000000000004b", + "event": "00000000000000000000000000000000000000000000000000000000000000c5", "quantity": 2000000000, "tx_index": 141, - "utxo": "000000000000000000000000000000000000000000000000000000000000004b:0", - "utxo_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "block_time": 1781529693, + "utxo": "00000000000000000000000000000000000000000000000000000000000000c5:0", + "utxo_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000c5", "block_index": 325, - "block_time": 1781529693 + "block_time": 1781627750 }, { "event_index": 1350, "event": "CREDIT", "params": { - "address": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "address": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "block_index": 321, "calling_function": "cancel order", - "event": "0000000000000000000000000000000000000000000000000000000000000060", + "event": "000000000000000000000000000000000000000000000000000000000000003d", "quantity": 1000000, "tx_index": 0, "utxo": null, "utxo_address": null, - "block_time": 1781529675, + "block_time": 1781627725, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -28956,9 +28902,9 @@ }, "quantity_normalized": "0.01000000" }, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ec", "block_index": 321, - "block_time": 1781529675 + "block_time": 1781627725 }, { "event_index": 1342, @@ -28968,25 +28914,25 @@ "asset": "FAIRMARK", "block_index": 320, "calling_function": "escrowed pool liquidity", - "event": "000000000000000000000000000000000000000000000000000000000000002f", + "event": "0000000000000000000000000000000000000000000000000000000000000094", "quantity": 400000000, "tx_index": 137, "utxo": null, "utxo_address": null, - "block_time": 1781529671, + "block_time": 1781627721, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" }, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 320, - "block_time": 1781529671 + "block_time": 1781627721 } ], "next_cursor": 1323, @@ -29105,54 +29051,54 @@ "result": [ { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "quantity": 400000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529686, + "block_time": 1781627739, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "4.00000000" }, { "tx_index": 132, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "block_index": 311, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRFAIL", "quantity": 600000000, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529633, + "block_time": 1781627681, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "6.00000000" }, { "tx_index": 127, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000eb", "block_index": 299, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "A95428956689590706", "quantity": 25000000, "tag": "pool_withdraw", "status": "valid", - "block_time": 1781529594, + "block_time": 1781627643, "asset_info": { "asset_longname": null, "description": "LP token for POOLTEST/XCP pool", @@ -29165,41 +29111,41 @@ }, { "tx_index": 120, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000008b", "block_index": 242, - "source": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "source": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "asset": "RESET", "quantity": 12, "tag": "reset", "status": "valid", - "block_time": 1781529385, + "block_time": 1781627431, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": false, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.00000012" }, { "tx_index": 104, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000080", "block_index": 230, - "source": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "source": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "asset": "PREMINT", "quantity": 50, "tag": "soft cap not reached", "status": "valid", - "block_time": 1781529318, + "block_time": 1781627348, "asset_info": { "asset_longname": null, "description": "My super description", - "issuer": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0", + "issuer": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc", "divisible": true, "locked": false, - "owner": "bc1qvawcr9uhexn0jkp7pt9lj35w94w446wtppxcy0" + "owner": "bc1qzcjqss4qygu4nj76lh3ak6nmuzetc7qktptmnc" }, "quantity_normalized": "0.00000050" } @@ -29283,18 +29229,18 @@ { "tx_index": 27, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000002", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000091", "block_index": 131, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 6000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 6000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -29302,7 +29248,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -29317,7 +29263,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528937, + "block_time": 1781626956, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29332,18 +29278,18 @@ { "tx_index": 72, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d1", "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "TESTLOCKDESC", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000070", "dispenser": { "tx_index": 71, "block_index": 196, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -29351,7 +29297,7 @@ "give_remaining": 6000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -29366,14 +29312,14 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529178, + "block_time": 1781627199, "asset_info": { "asset_longname": null, "description": "Test Locking Description", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "dispense_quantity_normalized": "0.00004000", "btc_amount_normalized": "0.00004000" @@ -29381,18 +29327,18 @@ { "tx_index": 28, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a0", "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 4000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000060", "btc_amount": 4000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000118", "dispenser": { "tx_index": 26, "block_index": 132, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, @@ -29400,7 +29346,7 @@ "give_remaining": 0, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "origin": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -29415,7 +29361,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781528941, + "block_time": 1781626959, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29430,18 +29376,18 @@ { "tx_index": 118, "dispense_index": 0, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000e5", "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "XCP", "dispense_quantity": 3000, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", "btc_amount": 3000, + "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000004", "dispenser": { "tx_index": 117, "block_index": 239, - "source": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "source": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "give_quantity": 1, "escrow_quantity": 5000, "satoshirate": 1, @@ -29449,7 +29395,7 @@ "give_remaining": 2000, "oracle_address": null, "last_status_tx_hash": null, - "origin": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", + "origin": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", "dispense_count": 1, "last_status_tx_source": null, "close_block_index": null, @@ -29464,7 +29410,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000001" }, - "block_time": 1781529374, + "block_time": 1781627416, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29479,26 +29425,26 @@ { "tx_index": 34, "dispense_index": 0, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000b9", "block_index": 138, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "asset": "XCP", "dispense_quantity": 666, - "dispenser_tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", "btc_amount": 10000, + "dispenser_tx_hash": "00000000000000000000000000000000000000000000000000000000000000ab", "dispenser": { "tx_index": 33, "block_index": 325, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "give_quantity": 1, "escrow_quantity": 10000, "satoshirate": 1, "status": 0, "give_remaining": 9268, - "oracle_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "oracle_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "last_status_tx_hash": null, - "origin": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "origin": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "dispense_count": 2, "last_status_tx_source": null, "close_block_index": null, @@ -29513,7 +29459,7 @@ "satoshirate_normalized": "0.00000001", "satoshi_price_normalized": "0.00000016" }, - "block_time": 1781528965, + "block_time": 1781626985, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29658,10 +29604,10 @@ "result": [ { "tx_index": 62, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000075", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", "block_index": 186, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "quantity": 10000000000000, "status": "invalid: insufficient funds", @@ -29671,7 +29617,7 @@ "send_type": "send", "source_address": null, "destination_address": null, - "block_time": 1781529139, + "block_time": 1781627156, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29685,10 +29631,10 @@ }, { "tx_index": 50, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000fd", "block_index": 154, - "source": "0000000000000000000000000000000000000000000000000000000000000075:0", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "0000000000000000000000000000000000000000000000000000000000000112:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000fd:0", "asset": "MYASSETA", "quantity": 2000000000, "status": "valid", @@ -29696,26 +29642,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "block_time": 1781529031, + "source_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "block_time": 1781627051, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 50, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000004b", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000fd", "block_index": 154, - "source": "0000000000000000000000000000000000000000000000000000000000000075:0", - "destination": "000000000000000000000000000000000000000000000000000000000000004b:0", + "source": "0000000000000000000000000000000000000000000000000000000000000112:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000fd:0", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -29723,9 +29669,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", - "destination_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "block_time": 1781529031, + "source_address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", + "destination_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "block_time": 1781627051, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29739,10 +29685,10 @@ }, { "tx_index": 51, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ce", "block_index": 155, - "source": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination": "0000000000000000000000000000000000000000000000000000000000000025:1", + "source": "00000000000000000000000000000000000000000000000000000000000000fd:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000ce:1", "asset": "MYASSETA", "quantity": 2000000000, "status": "valid", @@ -29750,26 +29696,26 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "block_time": 1781529036, + "source_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "block_time": 1781627055, "asset_info": { "asset_longname": null, "description": "My super asset A", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": false, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "quantity_normalized": "20.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 51, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ce", "block_index": 155, - "source": "000000000000000000000000000000000000000000000000000000000000004b:0", - "destination": "0000000000000000000000000000000000000000000000000000000000000025:1", + "source": "00000000000000000000000000000000000000000000000000000000000000fd:0", + "destination": "00000000000000000000000000000000000000000000000000000000000000ce:1", "asset": "XCP", "quantity": 2000000000, "status": "valid", @@ -29777,9 +29723,9 @@ "memo": null, "fee_paid": 0, "send_type": "move", - "source_address": "bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0", - "destination_address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "block_time": 1781529036, + "source_address": "bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s", + "destination_address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "block_time": 1781627055, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -29892,14 +29838,14 @@ "result": [ { "tx_index": 35, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000003b", "msg_index": 0, "block_index": 139, "asset": "MYASSETA", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -29914,20 +29860,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781528970, + "block_time": 1781626990, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 51, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ce", "msg_index": 0, "block_index": 155, "asset": "MYASSETB", "quantity": 100000000000, "divisible": true, - "source": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", - "issuer": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "source": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", + "issuer": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "transfer": false, "callable": false, "call_date": 0, @@ -29942,20 +29888,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529036, + "block_time": 1781627055, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 55, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000009b", "msg_index": 0, "block_index": 159, "asset": "A95428956980101314", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -29970,20 +29916,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529051, + "block_time": 1781627072, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.00000000" }, { "tx_index": 73, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000045", "msg_index": 0, "block_index": 197, "asset": "UTXOASSET", "quantity": 100000000000, "divisible": true, - "source": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", - "issuer": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv", + "source": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", + "issuer": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8", "transfer": false, "callable": false, "call_date": 0, @@ -29998,20 +29944,20 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529182, + "block_time": 1781627203, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" }, { "tx_index": 79, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000100", "msg_index": 0, "block_index": 202, "asset": "MPMASSET", "quantity": 100000000000, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -30026,7 +29972,7 @@ "locked": false, "reset": false, "mime_type": "text/plain", - "block_time": 1781529205, + "block_time": 1781627226, "quantity_normalized": "1000.00000000", "fee_paid_normalized": "0.50000000" } @@ -30057,7 +30003,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000002f" + "example": "0000000000000000000000000000000000000000000000000000000000000094" }, { "name": "verbose", @@ -30079,14 +30025,14 @@ "example": { "result": { "tx_index": 137, - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "msg_index": 1, "block_index": 324, "asset": "FAIRMARK", "quantity": 0, "divisible": true, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "transfer": false, "callable": false, "call_date": 0, @@ -30101,7 +30047,7 @@ "locked": true, "reset": false, "mime_type": "text/plain", - "block_time": 1781529686, + "block_time": 1781627739, "quantity_normalized": "0.00000000", "fee_paid_normalized": "0.00000000" } @@ -30171,15 +30117,15 @@ "result": [ { "tx_index": 68, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ac", "block_index": 192, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "flags": 1, "status": "valid", "memo": "sweep my assets", "fee_paid": 800000, - "block_time": 1781529163, + "block_time": 1781627184, "fee_paid_normalized": "0.00800000" } ], @@ -30209,7 +30155,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000ac" }, { "name": "verbose", @@ -30232,15 +30178,15 @@ "result": [ { "tx_index": 68, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000ac", "block_index": 192, - "source": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", - "destination": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", + "destination": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "flags": 1, "status": "valid", "memo": "sweep my assets", "fee_paid": 800000, - "block_time": 1781529163, + "block_time": 1781627184, "fee_paid_normalized": "0.00800000" } ], @@ -30322,9 +30268,9 @@ "result": [ { "tx_index": 24, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "000000000000000000000000000000000000000000000000000000000000008c", "block_index": 128, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "timestamp": 4003903983, "value": 999.0, "fee_fraction_int": 0, @@ -30332,14 +30278,14 @@ "locked": false, "status": "valid", "mime_type": "text/plain", - "block_time": 1781528924, + "block_time": 1781626943, "fee_fraction_int_normalized": "0.00000000" }, { "tx_index": 25, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d3", "block_index": 129, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "timestamp": 4003903983, "value": 66600.0, "fee_fraction_int": 0, @@ -30347,7 +30293,7 @@ "locked": false, "status": "valid", "mime_type": "text/plain", - "block_time": 1781528928, + "block_time": 1781626948, "fee_fraction_int_normalized": "0.00000000" } ], @@ -30377,7 +30323,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000082" + "example": "00000000000000000000000000000000000000000000000000000000000000d3" }, { "name": "verbose", @@ -30399,9 +30345,9 @@ "example": { "result": { "tx_index": 25, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000082", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d3", "block_index": 129, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "timestamp": 4003903983, "value": 66600.0, "fee_fraction_int": 0, @@ -30409,7 +30355,7 @@ "locked": false, "status": "valid", "mime_type": "text/plain", - "block_time": 1781528928, + "block_time": 1781626948, "fee_fraction_int_normalized": "0.00000000" } } @@ -30493,10 +30439,10 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000058", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a8", "tx_index": 140, "block_index": 323, - "source": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "source": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "asset": "OPENFAIR", "asset_parent": null, "asset_longname": null, @@ -30524,7 +30470,7 @@ "earned_quantity": null, "paid_quantity": null, "commission": null, - "block_time": 1781529682, + "block_time": 1781627734, "price_normalized": "0.0000000000000000", "hard_cap_normalized": "0.00000000", "soft_cap_normalized": "0.00000000", @@ -30533,10 +30479,10 @@ "premint_quantity_normalized": "0.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000002f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000094", "tx_index": 137, "block_index": 324, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMARK", "asset_parent": null, "asset_longname": null, @@ -30564,7 +30510,7 @@ "earned_quantity": null, "paid_quantity": null, "commission": null, - "block_time": 1781529686, + "block_time": 1781627739, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -30573,10 +30519,10 @@ "premint_quantity_normalized": "0.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", "tx_index": 134, "block_index": 315, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMULTI", "asset_parent": null, "asset_longname": null, @@ -30604,7 +30550,7 @@ "earned_quantity": 600000000, "paid_quantity": 600000000, "commission": 0, - "block_time": 1781529653, + "block_time": 1781627702, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -30616,10 +30562,10 @@ "paid_quantity_normalized": "6.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", "tx_index": 132, "block_index": 311, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRFAIL", "asset_parent": null, "asset_longname": null, @@ -30647,7 +30593,7 @@ "earned_quantity": 200000000, "paid_quantity": 200000000, "commission": 0, - "block_time": 1781529633, + "block_time": 1781627681, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -30659,10 +30605,10 @@ "paid_quantity_normalized": "2.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", "tx_index": 129, "block_index": 303, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "asset_parent": null, "asset_longname": null, @@ -30690,7 +30636,7 @@ "earned_quantity": 600000000, "paid_quantity": 600000000, "commission": 0, - "block_time": 1781529610, + "block_time": 1781627658, "price_normalized": "1.0000000000000000", "hard_cap_normalized": "10.00000000", "soft_cap_normalized": "6.00000000", @@ -30871,120 +30817,120 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, "block_index": 315, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMULTI", "earn_quantity": 400000000, "paid_quantity": 400000000, "commission": 0, "status": "valid", - "block_time": 1781529653, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "4.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "4.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000f7", "tx_index": 135, "block_index": 314, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRMULTI", "earn_quantity": 200000000, "paid_quantity": 200000000, "commission": 0, "status": "valid", - "block_time": 1781529649, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", + "block_time": 1781627699, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000032", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000a7", "tx_index": 133, "block_index": 308, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRFAIL", "earn_quantity": 200000000, "paid_quantity": 200000000, "commission": 0, "status": "valid", - "block_time": 1781529629, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000d2", + "block_time": 1781627677, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "2.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "2.00000000" }, { - "tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000cf", "tx_index": 131, "block_index": 303, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "earn_quantity": 300000000, "paid_quantity": 300000000, "commission": 0, "status": "valid", - "block_time": 1781529610, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", + "block_time": 1781627658, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "3.00000000", "commission_normalized": "0.00000000", "paid_quantity_normalized": "3.00000000" }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000d8", "tx_index": 130, "block_index": 302, - "source": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", - "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000025", + "source": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "asset": "FAIRPOOL", "earn_quantity": 300000000, "paid_quantity": 300000000, "commission": 0, "status": "valid", - "block_time": 1781529606, + "fairminter_tx_hash": "00000000000000000000000000000000000000000000000000000000000000cb", + "block_time": 1781627655, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "3.00000000", "commission_normalized": "0.00000000", @@ -31017,7 +30963,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "0000000000000000000000000000000000000000000000000000000000000098" }, { "name": "verbose", @@ -31038,24 +30984,24 @@ "application/json": { "example": { "result": { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "0000000000000000000000000000000000000000000000000000000000000098", "tx_index": 136, "block_index": 315, - "source": "bc1q52ux78sv396xa483qqjkt499pjqywcn6eagjja", - "fairminter_tx_hash": "000000000000000000000000000000000000000000000000000000000000003f", + "source": "bc1q2x7qjzsattg0fxhskrlf2sfa3h7p8v434uph7z", "asset": "FAIRMULTI", "earn_quantity": 400000000, "paid_quantity": 400000000, "commission": 0, "status": "valid", - "block_time": 1781529653, + "fairminter_tx_hash": "0000000000000000000000000000000000000000000000000000000000000114", + "block_time": 1781627702, "asset_info": { "asset_longname": null, "description": "", - "issuer": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35", + "issuer": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp", "divisible": true, "locked": true, - "owner": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "owner": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" }, "earn_quantity_normalized": "4.00000000", "commission_normalized": "0.00000000", @@ -31085,7 +31031,7 @@ "schema": { "type": "string" }, - "example": "bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv,bc1qjqev2gw826pmrmghmsq2vdaj8r56rz0zwue9p0" + "example": "bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8,bc1qr8chm2ekdms2wuxuy2cmm48x336j95dnnn548s" }, { "name": "unconfirmed", @@ -31104,7 +31050,7 @@ "content": { "application/json": { "example": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1qh0pzhp08gkz4v0a9qf7sqgkj0cq36fykkqdezv/utxo (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" + "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1qpdmdn9span6u9evt3gl5xcn07un7kuuxtk3nl8/utxo (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" } } } @@ -31129,7 +31075,7 @@ "schema": { "type": "string" }, - "example": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj" + "example": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v" }, { "name": "unconfirmed", @@ -31148,7 +31094,7 @@ "content": { "application/json": { "example": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" + "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" } } } @@ -31208,7 +31154,7 @@ "schema": { "type": "string" }, - "example": "bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35" + "example": "bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp" } ], "responses": { @@ -31217,7 +31163,7 @@ "content": { "application/json": { "example": { - "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1q4rm0hhfgjnx768dtcu4qzvgfhnplc22fr92v35/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" + "error": "All Electrs backends failed. Last error: HTTPConnectionPool(host='localhost', port=3002): Max retries exceeded with url: /address/bc1q0u2cv36t4nhfwnpnrck554ft0p6nj40qahwqwp/txs (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused'))" } } } @@ -31242,7 +31188,7 @@ "schema": { "type": "string" }, - "example": "000000000000000000000000000000000000000000000000000000000000004b" + "example": "00000000000000000000000000000000000000000000000000000000000000c5" }, { "name": "result_format", @@ -31262,8 +31208,8 @@ "application/json": { "example": { "result": { - "txid": "000000000000000000000000000000000000000000000000000000000000004b", - "hash": "0000000000000000000000000000000000000000000000000000000000000003", + "txid": "00000000000000000000000000000000000000000000000000000000000000c5", + "hash": "00000000000000000000000000000000000000000000000000000000000000c8", "version": 2, "size": 243, "vsize": 162, @@ -31271,15 +31217,15 @@ "locktime": 0, "vin": [ { - "txid": "0000000000000000000000000000000000000000000000000000000000000025", + "txid": "00000000000000000000000000000000000000000000000000000000000000ce", "vout": 1, "scriptSig": { "asm": "", "hex": "" }, "txinwitness": [ - "0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000007575af1c28d35a01", - "000000000000000000000000000000000000000000000000000000000000000315" + "30440220712856c9f54f14e7f432e0bd924a909160ba60e70fb600000000000000000000000000000000000000000000000000000000000000cc6dca330713bf931ce212c65901", + "000000000000000000000000000000000000000000000000000000000000001f9f" ], "sequence": 4294967295 } @@ -31289,10 +31235,10 @@ "value": 1e-05, "n": 0, "scriptPubKey": { - "asm": "0 4aa9d623cc85384e21cbe8bea82f55499ad70b8f", - "desc": "addr(bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll)#rxjey9c0", - "hex": "00144aa9d623cc85384e21cbe8bea82f55499ad70b8f", - "address": "bc1qf25avg7vs5uyugwtazl2st64fxddwzu0sty7ll", + "asm": "0 c939ecea16ff55e22d0e6a2b709eb4dedcc8eea5", + "desc": "addr(bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0)#05l0f8q2", + "hex": "0014c939ecea16ff55e22d0e6a2b709eb4dedcc8eea5", + "address": "bc1qeyu7e6skla27ytgwdg4hp845mmwv3m49x5hpp0", "type": "witness_v0_keyhash" } }, @@ -31300,9 +31246,9 @@ "value": 0.0, "n": 1, "scriptPubKey": { - "asm": "OP_RETURN 820829154367ad9871e9", - "desc": "raw(6a0a820829154367ad9871e9)#a2lk4d39", - "hex": "6a0a820829154367ad9871e9", + "asm": "OP_RETURN a4aa5b459a02d1963afc", + "desc": "raw(6a0aa4aa5b459a02d1963afc)#kpy0hzar", + "hex": "6a0aa4aa5b459a02d1963afc", "type": "nulldata" } }, @@ -31310,19 +31256,19 @@ "value": 49.49873799, "n": 2, "scriptPubKey": { - "asm": "0 e786d2670784c30638a7382d9953c9aeb4f20404", - "desc": "addr(bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8)#mu3atg8f", - "hex": "0014e786d2670784c30638a7382d9953c9aeb4f20404", - "address": "bc1qu7rdyec8snpsvw988qkej57f4660ypqylm22c8", + "asm": "0 e7fb34fc155b472747a38d8b0806d155c4a59cc6", + "desc": "addr(bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf)#mws4zv9k", + "hex": "0014e7fb34fc155b472747a38d8b0806d155c4a59cc6", + "address": "bc1qulanflq4tdrjw3ar3k9sspk32hz2t8xxd0x0cf", "type": "witness_v0_keyhash" } } ], - "hex": "0000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002fc62140850cf4803ade68d64e29c1500000000", - "blockhash": "0000000000000000000000000000000000000000000000000000000000000032", + "hex": "000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000a572e38ab47c34983e47851a848aa49f00000000", + "blockhash": "000000000000000000000000000000000000000000000000000000000000007b", "confirmations": 1, - "time": 1781529693, - "blocktime": 1781529693 + "time": 1781627750, + "blocktime": 1781627750 } } } @@ -31420,7 +31366,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000251d02fd6942c5a8d002000000000000" + "example": "0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000002b1d02fd6942c5a8d002000000000000" } ], "responses": { @@ -31430,8 +31376,8 @@ "application/json": { "example": { "result": { - "txid": "0000000000000000000000000000000000000000000000000000000000000025", - "hash": "0000000000000000000000000000000000000000000000000000000000000060", + "txid": "000000000000000000000000000000000000000000000000000000000000002e", + "hash": "00000000000000000000000000000000000000000000000000000000000000e4", "version": 2, "size": 143, "vsize": 140, @@ -31439,7 +31385,7 @@ "locktime": 0, "vin": [ { - "txid": "0000000000000000000000000000000000000000000000000000000000000082", + "txid": "0000000000000000000000000000000000000000000000000000000000000077", "vout": 0, "scriptSig": { "asm": "0 7c6b1112ed7bc76fd03af8b91d02fd6942c5a8d0", @@ -31595,29 +31541,29 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142 }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "ENHANCED_SEND", "params": { "asset": "XCP", "block_index": 9999999, - "destination": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "destination": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "memo": null, "msg_index": 0, "quantity": 10000, "send_type": "send", - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, "asset_info": { "asset_longname": null, @@ -31629,22 +31575,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "CREDIT", "params": { - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "asset": "XCP", "block_index": 325, "calling_function": "send", - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -31655,22 +31601,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "DEBIT", "params": { "action": "send", - "address": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "address": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "block_index": 325, - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -31681,27 +31627,27 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "NEW_TRANSACTION", "params": { "block_hash": "mempool", "block_index": 9999999, - "block_time": 1781529697.2448351, + "block_time": 1781627753.799265, "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "data": "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", "destination": "", "fee": 10000, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "transaction_type": "enhanced_send", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000003:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000da:1 2 0", "btc_amount_normalized": "0.00000000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 } ], "next_cursor": null, @@ -31781,19 +31727,19 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "CREDIT", "params": { - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "asset": "XCP", "block_index": 325, "calling_function": "send", - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -31804,7 +31750,7 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 } ], "next_cursor": null, @@ -31833,7 +31779,7 @@ "schema": { "type": "string" }, - "example": "0000000000000000000000000000000000000000000000000000000000000003" + "example": "00000000000000000000000000000000000000000000000000000000000000da" }, { "name": "event_name", @@ -31893,29 +31839,29 @@ "example": { "result": [ { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "TRANSACTION_PARSED", "params": { "supported": true, - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142 }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "ENHANCED_SEND", "params": { "asset": "XCP", "block_index": 9999999, - "destination": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "destination": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "memo": null, "msg_index": 0, "quantity": 10000, "send_type": "send", - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "status": "valid", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, "asset_info": { "asset_longname": null, @@ -31927,22 +31873,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "CREDIT", "params": { - "address": "bc1qc0rmvr0yx0ng2nas2vkd8wxyxrlehzpn0fdfcj", + "address": "bc1q4f9dmx4g5m43e70djrj3vmevmpttez3am3aa2v", "asset": "XCP", "block_index": 325, "calling_function": "send", - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -31953,22 +31899,22 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "DEBIT", "params": { "action": "send", - "address": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "address": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "asset": "XCP", "block_index": 325, - "event": "0000000000000000000000000000000000000000000000000000000000000003", + "event": "00000000000000000000000000000000000000000000000000000000000000da", "quantity": 10000, "tx_index": 142, "utxo": null, "utxo_address": null, - "block_time": 1781529693, + "block_time": 1781627750, "asset_info": { "asset_longname": null, "description": "The Counterparty protocol native currency", @@ -31979,27 +31925,27 @@ }, "quantity_normalized": "0.00010000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 }, { - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "event": "NEW_TRANSACTION", "params": { "block_hash": "mempool", "block_index": 9999999, - "block_time": 1781529697.2448351, + "block_time": 1781627753.799265, "btc_amount": 0, - "data": "028401192710560300c3c7b60de433e6854fb0532cd3b8c430ff9b883340", + "data": "028401192710560300aa4add9aa8a6eb1cf9ed90e5166f2cd856bc8a3d40", "destination": "", "fee": 10000, - "source": "bc1qcv6gfuqw0eay0uq4hnu4addcyt42s2qsd9eksx", + "source": "bc1qd8znf2cuynvkxj8xrkv72vjdxyp2jkekedyz48", "transaction_type": "enhanced_send", - "tx_hash": "0000000000000000000000000000000000000000000000000000000000000003", + "tx_hash": "00000000000000000000000000000000000000000000000000000000000000da", "tx_index": 142, - "utxos_info": " 0000000000000000000000000000000000000000000000000000000000000003:1 2 0", + "utxos_info": " 00000000000000000000000000000000000000000000000000000000000000da:1 2 0", "btc_amount_normalized": "0.00000000" }, - "timestamp": 1781529697.2448351 + "timestamp": 1781627753.799265 } ], "next_cursor": null, diff --git a/release-notes/release-notes-v11.1.1.md b/release-notes/release-notes-v11.1.1.md index bc30497da0..9ade87cea6 100644 --- a/release-notes/release-notes-v11.1.1.md +++ b/release-notes/release-notes-v11.1.1.md @@ -28,6 +28,7 @@ pip install -e . counterparty-server start ``` +The Ledger DB is automatically compacted on first start of v11.1.1 (migration `0010.compact_hash_storage`); this migration rewrites hash columns and runs `VACUUM`, so the first startup may take noticeably longer on large databases. # ChangeLog @@ -48,6 +49,14 @@ The activation block height is not yet set (placeholder `9999999`): - `fix_fairminter_commission_minimum`: rejects a `minted_asset_commission` between 0 and 0.0000001 (which would round to zero). - Add **fairmint pool seeding** behind a new `fairmint_pool` gate: `compose_fairminter` accepts two new optional fields — `pool_quantity` (tokens to reserve for the AMM pool) and `lp_asset` (numeric asset to use as LP token, auto-generated if omitted) — which, when the fairminter closes at soft cap, automatically creates a constant-product AMM pool seeded with `pool_quantity` of the minted asset and the corresponding XCP proceeds; `hard_cap` must equal `existing_supply + premint_quantity + pool_quantity + soft_cap` (all mintable supply is reserved for buyers or the pool), `burn_payment` is disallowed, and the issuer must hold sufficient XCP to cover the pool-deposit gas fee at compose time; pool creation is deferred to the `after_block` hook so it is gated on the same block as fairminter close; the LP token is earmarked against the active fairminter to prevent griefing. +## Performance + +- Compact hash storage in the Ledger DB: transaction hashes, block hashes and other fixed-size hex strings are now stored as raw 32-byte BLOBs instead of 64-char hex strings, cutting hash-column storage roughly in half. A new migration (`0010.compact_hash_storage`) rewrites all affected tables and runs `VACUUM` afterwards; a new `hashcodec` module handles encoding/decoding transparently so the rest of the codebase is unaffected. +- Composite match-ID normalization (folded into `0010.compact_hash_storage`): the 129-char `tx0hash_tx1hash` TEXT match id is replaced by an integer `(tx0_index, tx1_index)` foreign-key pair on `order_matches`, `bet_matches`, `rps_matches`, the three `*_match_expirations` tables, `bet_match_resolutions`, `btcpays` and `rpsresolves`. The textual `id` / `*_match_id` is reconstructed on read at the API and consensus boundaries, so the public API surface and the consensus hashes are unchanged. +- Asset normalization (folded into `0010.compact_hash_storage`): the `assets` table gains a compact, sequentially-assigned `asset_index INTEGER PRIMARY KEY` surrogate, and every asset-name TEXT column (`asset`, `give_asset`, `get_asset`, `forward_asset`, `backward_asset`, `dividend_asset`, `asset_parent`, `asset_a`, `asset_b` on `balances`, `credits`, `debits`, `sends`, `orders`, `order_matches`, `issuances`, `dividends`, `dispensers`, `dispenses`, `dispenser_refills`, `fairminters`, `fairmints`, `destructions`, `pools`, `pool_deposits`, `pool_withdrawals`, `pool_matches`) is replaced by the compact integer `asset_index` foreign key — 1–3 bytes per reference instead of the full asset name. The protocol `assets.asset_id` and `lp_asset` columns stay TEXT. The asset name is transparently restored on read (the `rowtracer` decodes `asset_index` → name) and re-encoded on write, so consensus hashes and the public API (which still returns/filters by asset name) are unchanged. The State DB keeps asset names (the consolidation decodes index → name while the Ledger DB is attached). Note: invalid records referencing a never-registered asset store `NULL`. +- Address normalization (folded into `0010.compact_hash_storage`): a new `address_list(address_id INTEGER PRIMARY KEY, address TEXT UNIQUE)` table assigns every distinct address a compact id, and every address TEXT column (`source`, `destination`, `address`, `source_address`, `destination_address`, `issuer`, `feed_address`, `tx0_address`, `tx1_address`, `winner`, `oracle_address`, `origin`, `last_status_tx_source`, `utxo_address` across the ledger tables) is replaced by the compact integer `address_id` foreign key. The address string is transparently restored on read (the `rowtracer` decodes `address_id` → address) and re-encoded on write, so consensus hashes and the public API (which still returns/filters by address) are unchanged. The State DB keeps addresses as strings (the consolidation decodes id → address while the Ledger DB is attached). The existing `addresses` options-history table is preserved; its `address` column is FK'd onto `address_list`. `mempool.addresses` (a comma-separated list) and `mempool_transactions` are left as TEXT. +- UTXO column compaction (folded into `0010.compact_hash_storage`): the `utxo TEXT` column (`tx_hash:vout`, ~67 chars) on `balances`, `credits` and `debits` is replaced by a compact `(utxo_tx_hash BLOB(32), utxo_vout INTEGER)` pair (~36 bytes). The `tx_hash` is stored as a raw BLOB rather than a `tx_index` foreign key because an attached UTXO may reference any valid bitcoin transaction (not only Counterparty transactions). The `utxo` string is transparently reconstructed on read by the `rowtracer`, so consensus hashes and the public API are unchanged. + ## Bugfixes - Close fairminter when hard cap is hit after the soft-cap deadline has passed