Skip to content

Commit

Permalink
Align *_txs to return consistent data
Browse files Browse the repository at this point in the history
  • Loading branch information
rdlrt committed Aug 24, 2023
1 parent e4569e4 commit 024a75d
Show file tree
Hide file tree
Showing 9 changed files with 329 additions and 104 deletions.
53 changes: 53 additions & 0 deletions files/grest/rpc/account/account_txs.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
CREATE OR REPLACE FUNCTION grest.account_txs(_stake_address text, _after_block_height integer DEFAULT 0)
RETURNS TABLE (
tx_hash text,
epoch_no word31type,
block_height word31type,
block_time integer
)
LANGUAGE plpgsql
AS $$
DECLARE
_tx_id_min bigint;
_tx_id_list bigint[];
BEGIN
SELECT INTO _tx_id_min id
FROM tx
WHERE block_id >= (SELECT id FROM block WHERE block_no >= _after_block_height ORDER BY id limit 1)
ORDER BY id limit 1;

-- all tx_out & tx_in tx ids
SELECT INTO _tx_id_list ARRAY_AGG(tx_id)
FROM (
SELECT tx_id
FROM tx_out
WHERE stake_address_id = ANY(SELECT id FROM stake_address WHERE view = _stake_address)
AND tx_id >= _tx_id_min
--
UNION
--
SELECT tx_in_id AS tx_id
FROM tx_out
LEFT JOIN tx_in ON tx_out.tx_id = tx_in.tx_out_id
AND tx_out.index = tx_in.tx_out_index
WHERE
tx_in.tx_in_id IS NOT NULL
AND tx_out.stake_address_id = ANY(SELECT id FROM stake_address WHERE view = _stake_address)
AND tx_in.tx_in_id >= _tx_id_min
) AS tmp;

RETURN QUERY
SELECT
DISTINCT(ENCODE(tx.hash, 'hex')) AS tx_hash,
b.epoch_no,
b.block_no AS block_height,
EXTRACT(EPOCH FROM b.time)::integer AS block_time
FROM public.tx
INNER JOIN public.block AS b ON b.id = tx.block_id
WHERE tx.id = ANY(_tx_id_list)
AND block.block_no >= _after_block_height
ORDER BY block.block_no DESC;
END;
$$;

COMMENT ON FUNCTION grest.account_txs IS 'Get transactions associated with a given stake address'; -- noqa: LT01
88 changes: 68 additions & 20 deletions files/grest/rpc/account/account_utxos.sql
Original file line number Diff line number Diff line change
@@ -1,34 +1,82 @@
CREATE OR REPLACE FUNCTION grest.account_utxos(_stake_address text)
CREATE OR REPLACE FUNCTION grest.account_utxos(_stake_addresses text [], _extended boolean DEFAULT false)
RETURNS TABLE (
tx_hash text,
tx_index smallint,
address varchar,
address text,
value text,
stake_address text,
payment_cred text,
epoch_no word31type,
block_height word31type,
block_time integer
block_time integer,
datum_hash text,
inline_datum jsonb,
reference_script jsonb,
asset_list jsonb,
is_spent boolean
)
LANGUAGE plpgsql
AS $$
DECLARE
known_addresses varchar[];
BEGIN
RETURN QUERY
SELECT
ENCODE(tx.hash,'hex') AS tx_hash,
tx_out.index::smallint AS tx_index,
tx_out.address,
tx_out.value::text AS value,
b.block_no AS block_height,
EXTRACT(EPOCH FROM b.time)::integer AS block_time
FROM
tx_out
LEFT JOIN tx_in ON tx_in.tx_out_id = tx_out.tx_id
AND tx_in.tx_out_index = tx_out.index
INNER JOIN tx ON tx.id = tx_out.tx_id
SELECT
ENCODE(tx.hash, 'hex')::text AS tx_hash,
tx_out.index::smallint,
tx_out.address::text,
tx_out.value::text,
sa.view::text as stake_address,
ENCODE(tx_out.payment_cred, 'hex') AS payment_cred,
b.epoch_no,
b.block_no,
EXTRACT(EPOCH FROM b.time)::integer AS block_time,
ENCODE(tx_out.data_hash, 'hex') AS datum_hash,
(CASE
WHEN _extended = false OR tx_out.inline_datum_id IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'bytes', ENCODE(datum.bytes, 'hex'),
'value', datum.value
)
END) AS inline_datum,
(CASE
WHEN _extended = false OR tx_out.reference_script_id IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'hash', ENCODE(script.hash, 'hex'),
'bytes', ENCODE(script.bytes, 'hex'),
'value', script.json,
'type', script.type::text,
'size', script.serialised_size
)
END) AS reference_script,
(CASE
WHEN _extended = false OR ma.policy IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'policy_id', ENCODE(ma.policy, 'hex'),
'asset_name', ENCODE(ma.name, 'hex'),
'fingerprint', ma.fingerprint,
'decimals', aic.decimals,
'quantity', mto.quantity::text
)
END
) AS asset_list,
(CASE
WHEN tx_out.consumed_by_tx_in_id IS NULL THEN false
ELSE true
END) AS is_spent
FROM tx_out
INNER JOIN tx ON tx_out.tx_id = tx.id
LEFT JOIN stake_address AS sa ON tx_out.stake_address_id = sa.id
LEFT JOIN block AS b ON b.id = tx.block_id
WHERE
tx_in.tx_out_id IS NULL
AND
tx_out.stake_address_id = (SELECT id FROM stake_address WHERE view = _stake_address);
LEFT JOIN ma_tx_out AS mto ON mto.tx_out_id = tx_out.id
LEFT JOIN multi_asset AS ma ON ma.id = mto.ident
LEFT JOIN grest.asset_info_cache AS aic ON aic.asset_id = ma.id
LEFT JOIN datum ON datum.id = tx_out.inline_datum_id
LEFT JOIN script ON script.id = tx_out.reference_script_id
WHERE
tx_out.stake_address_id IN (SELECT sa.id FROM stake_address AS sa WHERE sa.view = ANY(_stake_addresses))
;
END;
$$;

COMMENT ON FUNCTION grest.account_utxos IS 'Get non-empty UTxOs associated with a given stake address'; -- noqa: LT01
COMMENT ON FUNCTION grest.address_utxos IS 'Get UTxO details for requested addresses'; -- noqa: LT01
2 changes: 1 addition & 1 deletion files/grest/rpc/address/address_info.sql
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ BEGIN
END;
$$;

COMMENT ON FUNCTION grest.address_info IS 'Get bulk address info - balance, associated stake address (if any) and UTXO set'; -- noqa: LT01
COMMENT ON FUNCTION grest.address_info IS 'Get bulk address info - balance, associated stake address (if any) and UTXO set'; -- noqa: LT01
39 changes: 15 additions & 24 deletions files/grest/rpc/address/address_txs.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,42 +19,33 @@ BEGIN
-- all tx_out & tx_in tx ids
SELECT INTO _tx_id_list ARRAY_AGG(tx_id)
FROM (
SELECT
tx_id
FROM
tx_out
WHERE
address = ANY(_addresses)
SELECT tx_id
FROM tx_out
WHERE address = ANY(_addresses)
AND tx_id >= _tx_id_min
--
UNION
--
SELECT
tx_in_id AS tx_id
FROM
tx_out
LEFT JOIN tx_in ON tx_out.tx_id = tx_in.tx_out_id
AND tx_out.index = tx_in.tx_out_index
WHERE
tx_in.tx_in_id IS NOT NULL
SELECT tx_in_id AS tx_id
FROM tx_out
LEFT JOIN tx_in ON tx_out.tx_id = tx_in.tx_out_id
AND tx_out.index = tx_in.tx_out_index
WHERE tx_in.tx_in_id IS NOT NULL
AND tx_out.address = ANY(_addresses)
AND tx_in.tx_in_id >= _tx_id_min
) AS tmp;

RETURN QUERY
SELECT
DISTINCT(ENCODE(tx.hash, 'hex')) AS tx_hash,
block.epoch_no,
block.block_no,
EXTRACT(EPOCH FROM block.time)::integer
FROM
public.tx
INNER JOIN public.block ON block.id = tx.block_id
WHERE
tx.id = ANY(_tx_id_list)
b.epoch_no,
b.block_no AS block_height,
EXTRACT(EPOCH FROM b.time)::integer AS block_time
FROM public.tx
INNER JOIN public.block AS b ON b.id = tx.block_id
WHERE tx.id = ANY(_tx_id_list)
AND block.block_no >= _after_block_height
ORDER BY
block.block_no DESC;
ORDER BY block.block_no DESC;
END;
$$;

Expand Down
82 changes: 82 additions & 0 deletions files/grest/rpc/address/address_utxos.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
CREATE OR REPLACE FUNCTION grest.address_utxos(_addresses text [], _extended boolean DEFAULT false)
RETURNS TABLE (
tx_hash text,
tx_index smallint,
address text,
value text,
stake_address text,
payment_cred text,
epoch_no word31type,
block_height word31type,
block_time integer,
datum_hash text,
inline_datum jsonb,
reference_script jsonb,
asset_list jsonb,
is_spent boolean
)
LANGUAGE plpgsql
AS $$
DECLARE
known_addresses varchar[];
BEGIN
RETURN QUERY
SELECT
ENCODE(tx.hash, 'hex')::text AS tx_hash,
tx_out.index::smallint,
tx_out.address::text,
tx_out.value::text,
sa.view::text as stake_address,
ENCODE(tx_out.payment_cred, 'hex') AS payment_cred,
b.epoch_no,
b.block_no,
EXTRACT(EPOCH FROM b.time)::integer AS block_time,
ENCODE(tx_out.data_hash, 'hex') AS datum_hash,
(CASE
WHEN _extended = false OR tx_out.inline_datum_id IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'bytes', ENCODE(datum.bytes, 'hex'),
'value', datum.value
)
END) AS inline_datum,
(CASE
WHEN _extended = false OR tx_out.reference_script_id IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'hash', ENCODE(script.hash, 'hex'),
'bytes', ENCODE(script.bytes, 'hex'),
'value', script.json,
'type', script.type::text,
'size', script.serialised_size
)
END) AS reference_script,
(CASE
WHEN _extended = false OR ma.policy IS NULL THEN NULL
ELSE JSONB_BUILD_OBJECT(
'policy_id', ENCODE(ma.policy, 'hex'),
'asset_name', ENCODE(ma.name, 'hex'),
'fingerprint', ma.fingerprint,
'decimals', aic.decimals,
'quantity', mto.quantity::text
)
END
) AS asset_list,
(CASE
WHEN tx_out.consumed_by_tx_in_id IS NULL THEN false
ELSE true
END) AS is_spent
FROM tx_out
INNER JOIN tx ON tx_out.tx_id = tx.id
LEFT JOIN stake_address AS sa ON tx_out.stake_address_id = sa.id
LEFT JOIN block AS b ON b.id = tx.block_id
LEFT JOIN ma_tx_out AS mto ON mto.tx_out_id = tx_out.id
LEFT JOIN multi_asset AS ma ON ma.id = mto.ident
LEFT JOIN grest.asset_info_cache AS aic ON aic.asset_id = ma.id
LEFT JOIN datum ON datum.id = tx_out.inline_datum_id
LEFT JOIN script ON script.id = tx_out.reference_script_id
WHERE
tx_out.address = ANY(_addresses)
;
END;
$$;

COMMENT ON FUNCTION grest.address_utxos IS 'Get UTxO details for requested addresses'; -- noqa: LT01
44 changes: 18 additions & 26 deletions files/grest/rpc/address/credential_txs.sql
Original file line number Diff line number Diff line change
Expand Up @@ -16,53 +16,45 @@ BEGIN
SELECT INTO _payment_cred_bytea ARRAY_AGG(cred_bytea)
FROM (
SELECT DECODE(cred_hex, 'hex') AS cred_bytea
FROM
UNNEST(_payment_credentials) AS cred_hex
FROM UNNEST(_payment_credentials) AS cred_hex
) AS tmp;

SELECT INTO _tx_id_min id
FROM tx
WHERE block_id >= (SELECT id FROM block WHERE block_no = _after_block_height)
ORDER BY id limit 1;
FROM tx
WHERE block_id >= (SELECT id FROM block WHERE block_no >= _after_block_height ORDER BY id limit 1)
ORDER BY id limit 1;

-- all tx_out & tx_in tx ids
SELECT INTO _tx_id_list ARRAY_AGG(tx_id)
FROM (
SELECT tx_id
FROM
tx_out
WHERE
payment_cred = ANY(_payment_cred_bytea)
FROM tx_out
WHERE payment_cred = ANY(_payment_cred_bytea)
AND tx_id >= _tx_id_min
--
UNION
--
SELECT tx_in_id AS tx_id
FROM
tx_out
LEFT JOIN tx_in ON tx_out.tx_id = tx_in.tx_out_id
AND tx_out.index = tx_in.tx_out_index
WHERE
tx_in.tx_in_id IS NOT NULL
FROM tx_out
LEFT JOIN tx_in ON tx_out.tx_id = tx_in.tx_out_id
AND tx_out.index = tx_in.tx_out_index
WHERE tx_in.tx_in_id IS NOT NULL
AND tx_out.payment_cred = ANY(_payment_cred_bytea)
AND tx_in.tx_in_id >= _tx_id_min
) AS tmp;

RETURN QUERY
SELECT
DISTINCT(ENCODE(tx.hash, 'hex')) AS tx_hash,
block.epoch_no,
block.block_no,
EXTRACT(EPOCH FROM block.time)::integer
FROM
public.tx
INNER JOIN public.block ON block.id = tx.block_id
WHERE
tx.id = ANY(_tx_id_list)
b.epoch_no,
b.block_no AS block_height,
EXTRACT(EPOCH FROM b.time)::integer AS block_time
FROM public.tx
INNER JOIN public.block AS b ON b.id = tx.block_id
WHERE tx.id = ANY(_tx_id_list)
AND block.block_no >= _after_block_height
ORDER BY
block.block_no DESC;
ORDER BY block.block_no DESC;
END;
$$;

COMMENT ON FUNCTION grest.address_txs IS 'Get the transaction hash list of a payment credentials array, optionally filtering after specified block height (inclusive).'; --noqa: LT01
COMMENT ON FUNCTION grest.credential_txs IS 'Get the transaction hash list of a payment credentials array, optionally filtering after specified block height (inclusive).'; --noqa: LT01
Loading

0 comments on commit 024a75d

Please sign in to comment.