diff --git a/packages/cacti-ledger-browser/README.md b/packages/cacti-ledger-browser/README.md index ee09071e1c..be6eba915a 100644 --- a/packages/cacti-ledger-browser/README.md +++ b/packages/cacti-ledger-browser/README.md @@ -50,16 +50,6 @@ npm install - Execute `yarn run start` or `npm start` in this package directory. - The running application address: http://localhost:3001/ (can be changed in [Vite configuration](./vite.config.ts)) -#### Sample Data - -- To preview the GUI without running the persistence plugins you can use historic sample data located at `packages/cacti-ledger-browser/src/test/sql/sample-data.sql`. -- Use `psql` tool to import it to your supabase postgres DB instance. -- example: - -```bash -psql "postgres://postgres.DB_NAME:DB_PASS@aws-0-eu-central-1.pooler.supabase.com:5432/postgres" -f src/test/sql/sample-data.sql -``` - ## Contributing We welcome contributions to Hyperledger Cacti in many forms, and there’s always plenty to do! diff --git a/packages/cacti-ledger-browser/src/main/typescript/apps/eth/queries.ts b/packages/cacti-ledger-browser/src/main/typescript/apps/eth/queries.ts index 57ae400c30..0d2903c275 100644 --- a/packages/cacti-ledger-browser/src/main/typescript/apps/eth/queries.ts +++ b/packages/cacti-ledger-browser/src/main/typescript/apps/eth/queries.ts @@ -3,8 +3,8 @@ * @todo Move to separate directory if this file becomes too complex. */ +import { createClient } from "@supabase/supabase-js"; import { queryOptions } from "@tanstack/react-query"; -import { supabase, supabaseQueryKey } from "../../common/supabase-client"; import { Transaction, Block, @@ -13,6 +13,16 @@ import { TokenERC20, } from "../../common/supabase-types"; +// TODO - Configure for an app +const supabaseQueryKey = "supabase:ethereum"; +const supabaseUrl = "http://localhost:8000"; +const supabaseKey = + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE"; + +export const supabase = createClient(supabaseUrl, supabaseKey, { + schema: "ethereum", +}); + function createQueryKey( tableName: string, pagination: { page: number; pageSize: number }, diff --git a/packages/cacti-ledger-browser/src/main/typescript/common/hook/use-persistence-app-status.ts b/packages/cacti-ledger-browser/src/main/typescript/common/hook/use-persistence-app-status.ts index e2dd346b5a..e6a9aa0187 100644 --- a/packages/cacti-ledger-browser/src/main/typescript/common/hook/use-persistence-app-status.ts +++ b/packages/cacti-ledger-browser/src/main/typescript/common/hook/use-persistence-app-status.ts @@ -1,7 +1,6 @@ import React from "react"; import { useQuery } from "@tanstack/react-query"; import { GetStatusResponse } from "../types/app"; -import { useNotification } from "../context/NotificationContext"; import { persistencePluginStatus } from "../queries"; /** @@ -13,11 +12,9 @@ export function usePersistenceAppStatus(pluginName: string): GetStatusResponse { const { isError, isPending, data, error } = useQuery( persistencePluginStatus(pluginName), ); - const { showNotification } = useNotification(); React.useEffect(() => { - isError && - showNotification(`Could get ${pluginName} status: ${error}`, "error"); + isError && console.error(`Could get ${pluginName} status: ${error}`); }, [isError]); return { diff --git a/packages/cacti-ledger-browser/src/main/typescript/components/PersistencePluginStatus/PersistencePluginStatus.tsx b/packages/cacti-ledger-browser/src/main/typescript/components/PersistencePluginStatus/PersistencePluginStatus.tsx index 520dc81d5c..d1c2b28360 100644 --- a/packages/cacti-ledger-browser/src/main/typescript/components/PersistencePluginStatus/PersistencePluginStatus.tsx +++ b/packages/cacti-ledger-browser/src/main/typescript/components/PersistencePluginStatus/PersistencePluginStatus.tsx @@ -6,7 +6,6 @@ import CircularProgress from "@mui/material/CircularProgress"; import StackedRowItems from "../ui/StackedRowItems"; import { persistencePluginStatus } from "../../common/queries"; -import { useNotification } from "../../common/context/NotificationContext"; type DateTimeStringProps = { dateString: string | undefined; @@ -31,11 +30,9 @@ export default function PersistencePluginStatus({ const { isError, isPending, data, error } = useQuery( persistencePluginStatus(pluginName), ); - const { showNotification } = useNotification(); React.useEffect(() => { - isError && - showNotification(`Could get ${pluginName} status: ${error}`, "error"); + isError && console.error(`Could get ${pluginName} status: ${error}`); }, [isError]); return ( diff --git a/packages/cacti-ledger-browser/src/test/sql/sample-data.sql b/packages/cacti-ledger-browser/src/test/sql/sample-data.sql deleted file mode 100644 index 0d3777df78..0000000000 --- a/packages/cacti-ledger-browser/src/test/sql/sample-data.sql +++ /dev/null @@ -1,1176 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 14.5 (Debian 14.5-2.pgdg110+2) --- Dumped by pg_dump version 15.1 (Ubuntu 15.1-1.pgdg20.04+1) - --- Started on 2023-01-03 11:30:11 UTC - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SELECT pg_catalog.set_config('search_path', '', false); -SET check_function_bodies = false; -SET xmloption = content; -SET client_min_messages = warning; -SET row_security = off; - --- --- TOC entry 14 (class 2615 OID 18076) --- Name: public; Type: SCHEMA; Schema: -; Owner: postgres --- - -CREATE SCHEMA public; - - -ALTER SCHEMA public OWNER TO postgres; - --- --- TOC entry 3936 (class 0 OID 0) --- Dependencies: 14 --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- TOC entry 607 (class 1255 OID 18078) --- Name: get_missing_blocks_in_range(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres --- - -CREATE FUNCTION public.get_missing_blocks_in_range(start_number integer, end_number integer) RETURNS TABLE(block_number integer) - LANGUAGE plpgsql - AS $$ -BEGIN - RETURN query - SELECT series AS block_number - FROM generate_series(start_number, end_number, 1) series - LEFT JOIN public.block ON series = block.number - WHERE block.number IS NULL; -END; -$$; - - -ALTER FUNCTION public.get_missing_blocks_in_range(start_number integer, end_number integer) OWNER TO postgres; - --- --- TOC entry 608 (class 1255 OID 18079) --- Name: update_issued_erc721_tokens(numeric); Type: PROCEDURE; Schema: public; Owner: postgres --- - -CREATE PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) - LANGUAGE plpgsql - AS $$ -DECLARE - current_token_entry token_erc721%ROWTYPE; - token_transfer record; - block_created_at timestamp; -BEGIN - SELECT created_at - FROM block - WHERE number = from_block_number - INTO block_created_at; - - IF NOT found THEN - raise exception 'invalid block provided: %', from_block_number - USING hint = 'ensure that given block was synchronized correctly'; - END IF; - - FOR token_transfer IN SELECT - DISTINCT ON (token_address, token_id) * - FROM erc721_token_history_view - WHERE created_at >= block_created_at - ORDER BY token_address, token_id, created_at DESC - LOOP - SELECT * FROM token_erc721 - WHERE token_id = token_transfer.token_id AND token_address = token_transfer.token_address - INTO current_token_entry; - - IF NOT found THEN - raise notice 'create entry for new token ID % on contract %', token_transfer.token_id, token_transfer.token_address; - INSERT INTO - token_erc721 - VALUES - ( - uuid_generate_v4(), - token_transfer.recipient, - token_transfer.token_address, - '', - token_transfer.token_id, - token_transfer.created_at - ); - ELSE - IF current_token_entry.last_owner_change < token_transfer.created_at THEN - raise notice 'update owner on token ID % on contract %', token_transfer.token_id, token_transfer.token_address; - - UPDATE token_erc721 - SET account_address = token_transfer.recipient, - last_owner_change = token_transfer.created_at - WHERE id = current_token_entry.id; - ELSE - raise notice 'current entry is more recent - ignore token ID % on contract %', token_transfer.token_id, token_transfer.token_address; - END IF; - END IF; - END LOOP; -END -$$; - - -ALTER PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) OWNER TO postgres; - -SET default_tablespace = ''; - -SET default_table_access_method = heap; - --- --- TOC entry 274 (class 1259 OID 18080) --- Name: block; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.block ( - number numeric NOT NULL, - created_at timestamp without time zone NOT NULL, - hash text NOT NULL, - number_of_tx numeric NOT NULL, - sync_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.block OWNER TO postgres; - --- --- TOC entry 275 (class 1259 OID 18086) --- Name: token_metadata_erc20; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.token_metadata_erc20 ( - address text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - name text NOT NULL, - symbol text NOT NULL, - total_supply numeric NOT NULL -); - - -ALTER TABLE public.token_metadata_erc20 OWNER TO postgres; - --- --- TOC entry 276 (class 1259 OID 18092) --- Name: token_transfer; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.token_transfer ( - id uuid DEFAULT extensions.uuid_generate_v4() NOT NULL, - transaction_id uuid NOT NULL, - sender text NOT NULL, - recipient text NOT NULL, - value numeric NOT NULL -); - - -ALTER TABLE public.token_transfer OWNER TO postgres; - --- --- TOC entry 3942 (class 0 OID 0) --- Dependencies: 276 --- Name: COLUMN token_transfer.value; Type: COMMENT; Schema: public; Owner: postgres --- - -COMMENT ON COLUMN public.token_transfer.value IS 'ERC20 - token quantity, ERC721 - token ID'; - - --- --- TOC entry 277 (class 1259 OID 18098) --- Name: transaction; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.transaction ( - id uuid DEFAULT extensions.uuid_generate_v4() NOT NULL, - index numeric NOT NULL, - hash text NOT NULL, - block_number numeric NOT NULL, - "from" text NOT NULL, - "to" text NOT NULL, - eth_value numeric NOT NULL, - method_signature text NOT NULL, - method_name text NOT NULL -); - - -ALTER TABLE public.transaction OWNER TO postgres; - --- --- TOC entry 278 (class 1259 OID 18104) --- Name: erc20_token_history_view; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW public.erc20_token_history_view AS - SELECT tx.hash AS transaction_hash, - tx."to" AS token_address, - b.created_at, - tt.sender, - tt.recipient, - tt.value - FROM (((public.transaction tx - JOIN public.block b ON ((tx.block_number = b.number))) - JOIN public.token_transfer tt ON ((tx.id = tt.transaction_id))) - JOIN public.token_metadata_erc20 tkn ON ((tx."to" = tkn.address))) - ORDER BY b.created_at, tt.recipient; - - -ALTER TABLE public.erc20_token_history_view OWNER TO postgres; - --- --- TOC entry 279 (class 1259 OID 18109) --- Name: token_metadata_erc721; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.token_metadata_erc721 ( - address text NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - name text NOT NULL, - symbol text NOT NULL -); - - -ALTER TABLE public.token_metadata_erc721 OWNER TO postgres; - --- --- TOC entry 280 (class 1259 OID 18115) --- Name: erc721_token_history_view; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW public.erc721_token_history_view AS - SELECT tx.hash AS transaction_hash, - tx."to" AS token_address, - b.created_at, - tt.sender, - tt.recipient, - tt.value AS token_id - FROM (((public.transaction tx - JOIN public.block b ON ((tx.block_number = b.number))) - JOIN public.token_transfer tt ON ((tx.id = tt.transaction_id))) - JOIN public.token_metadata_erc721 tkn ON ((tx."to" = tkn.address))) - ORDER BY b.created_at, tt.recipient; - - -ALTER TABLE public.erc721_token_history_view OWNER TO postgres; - --- --- TOC entry 283 (class 1259 OID 18134) --- Name: token_erc721; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.token_erc721 ( - id uuid DEFAULT extensions.uuid_generate_v4() NOT NULL, - account_address text NOT NULL, - token_address text NOT NULL, - uri text NOT NULL, - token_id numeric NOT NULL, - last_owner_change timestamp without time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.token_erc721 OWNER TO postgres; - --- --- TOC entry 284 (class 1259 OID 18198) --- Name: erc721_txn_meta_view; Type: VIEW; Schema: public; Owner: postgres --- - -CREATE VIEW public.erc721_txn_meta_view AS - SELECT token_erc721.account_address, - token_erc721.token_address, - token_erc721.uri, - token_metadata_erc721.symbol - FROM (public.token_erc721 - LEFT JOIN public.token_metadata_erc721 ON ((token_erc721.token_address = token_metadata_erc721.address))); - - -ALTER TABLE public.erc721_txn_meta_view OWNER TO postgres; - --- --- TOC entry 281 (class 1259 OID 18120) --- Name: plugin_status; Type: TABLE; Schema: public; Owner: postgres --- - -CREATE TABLE public.plugin_status ( - name text NOT NULL, - last_instance_id text NOT NULL, - is_schema_initialized boolean NOT NULL, - created_at timestamp with time zone DEFAULT now() NOT NULL, - last_connected_at timestamp with time zone DEFAULT now() NOT NULL -); - - -ALTER TABLE public.plugin_status OWNER TO postgres; - --- --- TOC entry 282 (class 1259 OID 18127) --- Name: token_erc20; Type: MATERIALIZED VIEW; Schema: public; Owner: postgres --- - -CREATE MATERIALIZED VIEW public.token_erc20 AS - SELECT balances.account_address, - balances.token_address, - sum(balances.balance) AS balance - FROM ( SELECT erc20_token_history_view.recipient AS account_address, - erc20_token_history_view.token_address, - sum(erc20_token_history_view.value) AS balance - FROM public.erc20_token_history_view - GROUP BY erc20_token_history_view.token_address, erc20_token_history_view.recipient - UNION - SELECT erc20_token_history_view.sender AS account_address, - erc20_token_history_view.token_address, - (- sum(erc20_token_history_view.value)) AS balance - FROM public.erc20_token_history_view - GROUP BY erc20_token_history_view.token_address, erc20_token_history_view.sender) balances - GROUP BY balances.token_address, balances.account_address - HAVING (sum(balances.balance) >= (0)::numeric) - WITH NO DATA; - - -ALTER TABLE public.token_erc20 OWNER TO postgres; - --- --- TOC entry 3923 (class 0 OID 18080) --- Dependencies: 274 --- Data for Name: block; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.block (number, created_at, hash, number_of_tx, sync_at) FROM stdin; -1 2023-01-02 17:00:57 0x5323194ab60df62c6de2ea6d496463924accaf39e3da336313aa34c4ffd7386d 0 2023-01-02 18:00:32.139115+00 -2 2023-01-02 17:23:11 0x9801754c8ac30566b7e24e65ed63298ffb4ba4ed8669240dc56ee23fa6bd787f 0 2023-01-02 18:00:32.297235+00 -3 2023-01-02 17:23:13 0x0564872490325ff3359556d0c6d513b1177f67d3406c95eaf2b72fd4845a1121 0 2023-01-02 18:00:32.347004+00 -4 2023-01-02 17:23:14 0xa4e83af4a08589bf272b6a9e237597c0268be319d7b48a581ca1a40943ecc925 0 2023-01-02 18:00:32.436578+00 -5 2023-01-02 17:23:18 0xebcbaa796dd85d93c4cbe325f7a9941209b22d239f159e05b1a097ce6b889ee0 0 2023-01-02 18:00:32.547509+00 -6 2023-01-02 17:23:23 0xcdac6d7dfb745dac841bc1d8474f6fa16d16cc58574c9f40cadc476630993227 0 2023-01-02 18:00:32.639068+00 -7 2023-01-02 17:23:34 0xf0ad8d8e74e2867610f43fabb76933d16eea8853260ddd747624980016a1affb 0 2023-01-02 18:00:32.755696+00 -8 2023-01-02 17:23:35 0x37490e1cd493409b29a6d395da0156669c2e4dad70cfdbdcbca5a687c1b9e860 0 2023-01-02 18:00:32.854354+00 -9 2023-01-02 17:23:37 0x5882d3fc20eb699d2dca4cf5c36605c71778dd285c696433d8834db206b9f7f6 0 2023-01-02 18:00:32.990385+00 -10 2023-01-02 17:23:40 0x841758903ea827c2df59f9d18e3d22dd1a4f449bbb61d70b2b9095d0ae4555bf 0 2023-01-02 18:00:33.101808+00 -11 2023-01-02 17:23:42 0x358bf9bd4bf5cfbaa744da670141aad529f0eca40f2c77a35e1b95657e0503f7 0 2023-01-02 18:00:33.210793+00 -12 2023-01-02 17:23:44 0x8de4fcaa0c67052927b43da7036a77223b12229ed0543ff1967ec8539fe410b4 0 2023-01-02 18:00:33.317169+00 -13 2023-01-02 17:23:56 0x89cf04d03f83b06b51eb1b67fd71270b7f8c30a43451aa14c3147f1e5af81455 0 2023-01-02 18:00:33.389728+00 -14 2023-01-02 17:23:58 0x24ecc972423f975eb164821f4c2562d465f329427ba3ec7b722aadbd1b40cf5f 0 2023-01-02 18:00:33.469336+00 -15 2023-01-02 17:23:59 0x9fbebb652ecef621d7d8656868feef6bcacf44e943959f9e775f5cc89735b17f 0 2023-01-02 18:00:33.620887+00 -16 2023-01-02 17:24:00 0x1686b36e4be7dd557e1805cecebe4b73d4595f35916ed25d95f6d4bcbb3b2f2b 0 2023-01-02 18:00:33.690413+00 -17 2023-01-02 17:24:01 0x9c667b351d6f3407a58258c58398843befcf7119a91fb22502de27a3263b3c20 0 2023-01-02 18:00:33.781898+00 -18 2023-01-02 17:24:02 0x98519c4eac859423f6622a0ea5a0f9aa8aff4977aeb0bc936c8623f46ba847d7 0 2023-01-02 18:00:33.917048+00 -19 2023-01-02 17:24:08 0xe7a3ae3967ea5fcca34e6a6b4297d4fd189a40c138c1d40d80df0216fcf6a10e 0 2023-01-02 18:00:34.074177+00 -20 2023-01-02 17:24:09 0xda57d3220227f7c9cc9af1cc6222b2c229c80ac83d3c60a21e77d198aef85be6 0 2023-01-02 18:00:34.464986+00 -21 2023-01-02 17:24:17 0x9426753d26c53d0cae7e22e97d8dcb30712985de513505cde6f59c2b7ea0ef49 0 2023-01-02 18:00:35.459851+00 -22 2023-01-02 17:24:22 0x376a3d308e60b3a72bb38238dc3676bf3bb5c9a7646be198661e72504217df14 0 2023-01-02 18:00:35.583877+00 -23 2023-01-02 17:24:23 0xe3f23d001bfcc4f3eb5106d1dc6f5be110dd061724157983e0a32a60c5bc4db0 0 2023-01-02 18:00:35.773663+00 -24 2023-01-02 17:24:33 0xec9874c4c083c61a7c36b46ff3920059f6f2fe2e991d6585b51041eb8d345f71 0 2023-01-02 18:00:35.909641+00 -25 2023-01-02 17:24:36 0x7ddfcd8de3bd740d3b29c76388c12c5fad7c16bacdce5f1b9e03195dcb442dbc 0 2023-01-02 18:00:36.060426+00 -26 2023-01-02 17:24:39 0x9d2a4799a6fe90ac426dc203e137ccaec8921ba8e861f30d663a675ef919aea5 0 2023-01-02 18:00:36.150777+00 -27 2023-01-02 17:24:40 0x36939335713391a104896fbb881b1791f55c23c05bbe4d3b146942051ca6795d 0 2023-01-02 18:00:36.259787+00 -28 2023-01-02 17:24:43 0xd7eaca2f0b03114a39097df3417fbf1ca9a67ee97a48753bf01277470149cc15 0 2023-01-02 18:00:36.334233+00 -29 2023-01-02 17:24:47 0xc6aab7ae0b5c8e2e09a31dd23f15c3b032aa97686aa7369d172276564e39c78c 0 2023-01-02 18:00:36.38528+00 -30 2023-01-02 17:24:48 0xfc0e1fb9021d93f58ec9b07a4db3183a0502b877e37cf69b60954f837db967fe 0 2023-01-02 18:00:36.522982+00 -31 2023-01-02 17:24:49 0x3033d6d99d4d3d94489218a56e1bd8d589e697c3acec2c3dc5159d65dba79641 0 2023-01-02 18:00:36.594163+00 -32 2023-01-02 17:24:50 0xbc0d4479603875a72f6998eaa3885fe7210d308b4bf0eb2e63871752c5440e89 0 2023-01-02 18:00:36.66836+00 -33 2023-01-02 17:24:51 0x925659cf777c012aa8d3971c293faca1bde2d73079a7f8225886f8f1faf81d9d 0 2023-01-02 18:00:36.743784+00 -34 2023-01-02 17:24:53 0xa2b6bb5cbe9a6ca8f2c5b015d016a481eb981b397156265bb94c398600725f6e 0 2023-01-02 18:00:36.851248+00 -35 2023-01-02 17:24:55 0xe83831376959157a7bb4822fa8a7bff434320f7524c493b5e48c40641ef3832b 0 2023-01-02 18:00:36.979469+00 -36 2023-01-02 17:25:00 0xafb004e79706670dde99524f5a919a2edabc7157ccf73d597b56383265fafaad 0 2023-01-02 18:00:37.14747+00 -37 2023-01-02 17:25:08 0x12dd7cce9861187f487ee6569285b9a952ea5ccf818eaa6d1253c82ec027163a 0 2023-01-02 18:00:37.281766+00 -38 2023-01-02 17:25:12 0x6fd9a44de032641ce9a7729d3d79977a4caf7d7cbacde112da7629377d8a21a5 0 2023-01-02 18:00:37.365233+00 -39 2023-01-02 17:25:16 0x5411f8b9a3b70b8d0a4e1fd972a887ae69999544b3045da100a0a2d2e1b76bb3 0 2023-01-02 18:00:37.416246+00 -40 2023-01-02 17:25:38 0x7ffd6fcba3f68ee56de3e0c4ec6706c3faa4e05da31e3d53a0d8f14703a0e8f2 0 2023-01-02 18:00:37.48539+00 -41 2023-01-02 17:25:39 0x8d24de91281b35c0df16daffb16add14d88cd33f7e7a0d66d62786c5a0e2bfaa 0 2023-01-02 18:00:37.567629+00 -42 2023-01-02 17:25:56 0xe0e414cb66a70c9dd1bb0ad6e39a70b5f434f450f3b5eae9ea990f452180e31b 0 2023-01-02 18:00:37.616221+00 -43 2023-01-02 17:26:10 0x0859b5ae7292457fc86da6ddf2cca79a40a978d7f629ab66627b490079dee016 0 2023-01-02 18:00:37.675836+00 -44 2023-01-02 17:26:12 0x8416c350f2b87be6ef1f3c9e691f0ff2ef29d46b42e530da1ec608e6d92d268c 0 2023-01-02 18:00:37.773911+00 -45 2023-01-02 17:26:16 0x47d65eed9bbfa9d7ee4b058ee4122dd517bb96185204a51397cc22fd89b4b600 0 2023-01-02 18:00:37.900818+00 -46 2023-01-02 17:26:20 0x01ebdc6245356b632b482a8eb3c6cf9354d11c20b6f8581013f92bdf75f8c1d4 0 2023-01-02 18:00:37.958138+00 -47 2023-01-02 17:26:31 0x87dc6d9b308cb27f246cd400a42025100ca8664697a365b8cce2d028d3a6af2c 0 2023-01-02 18:00:37.999352+00 -48 2023-01-02 17:26:32 0x4509e7fdbac7038aa677a9ca5276397e1db295e7e6ed326719949d230f4f54b4 0 2023-01-02 18:00:38.130753+00 -49 2023-01-02 17:26:39 0x6c8458e2ef8af308b75fc27c3022ae5b20c451b6c04cd1de5b523af5a3a81e79 0 2023-01-02 18:00:38.219231+00 -50 2023-01-02 17:26:53 0xc454848e8e05ea0e4b9485985bd117fdb14d7987c0c4ceff561b1380a84c4059 0 2023-01-02 18:00:38.268831+00 -51 2023-01-02 17:26:57 0x3b73ed152ca7339805059f1798019c235d244b2666d9fce007a4c6adbecc379c 0 2023-01-02 18:00:38.32083+00 -52 2023-01-02 17:27:05 0xbb1b9dadddf119b4be38cf910ee530f1712d5bd812ed7426d18c8ac0388caec2 0 2023-01-02 18:00:38.381226+00 -53 2023-01-02 17:27:08 0x3541639c8b133924c0fa8f9ec1d80c8a76a64c83563827c15e7b3f26f95dd84d 0 2023-01-02 18:00:38.603688+00 -54 2023-01-02 17:27:11 0x7376c19c0ba99c0385218c874c1b807717140c07352bb51c43e7ea055d31b989 0 2023-01-02 18:00:38.665982+00 -55 2023-01-02 17:27:15 0x4452457b7f410c859e3e140439963bc9af8aa55b2a2f206de5de50e1d2505cdb 0 2023-01-02 18:00:38.737735+00 -56 2023-01-02 17:27:18 0xc79031007b9f8376e2755973874583738b58ca39a13f9844c7045e694f6c2be4 0 2023-01-02 18:00:38.90321+00 -57 2023-01-02 17:27:32 0xef3765a61ded17cf6738724cb795e8319bd53e3352875863681790481f7128ab 0 2023-01-02 18:00:38.953993+00 -58 2023-01-02 17:27:35 0x23daea0667e9f0a321f48bf18250dcc8f58a68c872b059594beccd4c2ed5001e 0 2023-01-02 18:00:39.008884+00 -59 2023-01-02 17:27:38 0xb977262d52e88cb238cb2f6be5561a865fd803aee304cf45ba706d811aa04fab 0 2023-01-02 18:00:39.117037+00 -60 2023-01-02 17:27:43 0x5eb4a66f8a22db2fd5b0fee99c98342af562ad64295252380b06c5d7fd9125a5 0 2023-01-02 18:00:39.218232+00 -61 2023-01-02 17:27:44 0x37e8d5caab84658bb025ce14e07157cd613bb9e04edcbcaef0f1621bf9048425 0 2023-01-02 18:00:39.302708+00 -62 2023-01-02 17:27:47 0x1f41d9b9b0724c262b0d304f32810ea83304a69b0d5c185283eaf428c2a69e74 0 2023-01-02 18:00:39.398807+00 -63 2023-01-02 17:27:48 0xaf1ab6c5bd95185dade343dd62cecd8cc40c248965d4b8ec5451fe7fe42255da 0 2023-01-02 18:00:39.518866+00 -64 2023-01-02 17:28:13 0x4e07b373c81219cda4174b2b2ae4a548051292d554a51ff9b36dc6078d75ea47 0 2023-01-02 18:00:39.570179+00 -65 2023-01-02 17:28:24 0x0f0f8a3df34ea2455bd14fde92aa19118f856cb1ff993b7aa7eabf801dc0269e 0 2023-01-02 18:00:39.620023+00 -66 2023-01-02 17:28:29 0x3522eb8f2760b93f8fa62e8c167960ac59a42ef9711f1471065f3ac4caefaae5 0 2023-01-02 18:00:39.670382+00 -67 2023-01-02 17:28:33 0x6595853a54f337aad283567d9bb4ab794c63ef6d5a4e86b29a2db9ba450b33ab 0 2023-01-02 18:00:39.831346+00 -68 2023-01-02 17:28:34 0xe0e6244c5cdd25e1d265cd5c161afe0a01eb114590e87f1c2a9a2815f4318b3d 0 2023-01-02 18:00:39.882762+00 -69 2023-01-02 17:28:49 0x6abd73d5e60813057d4d4dc5ab55443e52540374ed1ebf82b30e91ff1024ba45 0 2023-01-02 18:00:39.97495+00 -70 2023-01-02 17:28:50 0x758c7d8cf0b2560f29a1cd6ff4828ab5e239625a25fbfd4b6d539cdd72a9cd95 0 2023-01-02 18:00:40.099142+00 -71 2023-01-02 17:28:52 0x9871d81c6ef0c0e74632104070677e3061cd0c6b6bde00d4af742f70d9c1a13a 0 2023-01-02 18:00:40.292417+00 -72 2023-01-02 17:29:08 0xae33c483e2d34b32ddeeae0ac317a941d8ea4d2b2fd2d9870e168d50e4b2c3b4 0 2023-01-02 18:00:40.388508+00 -73 2023-01-02 17:29:09 0x9ea60d9ec38ed25d149017031675e98e5b5fac269cbb728a5fcf57122ec2c809 0 2023-01-02 18:00:40.448083+00 -74 2023-01-02 17:29:16 0x85f1e7bec8b05a0721b910b92ea791a97354e4ff5e82adbd27dfad23a2e1947b 0 2023-01-02 18:00:40.50961+00 -75 2023-01-02 17:29:19 0x9a69913cc4698a3bec2a63725071a17b0dce0d6bcb83342e1349204b933280bf 0 2023-01-02 18:00:40.606344+00 -76 2023-01-02 17:29:34 0x9b74506a4bbae7602666301105a06592130cc95b83ca104598fcd74d423f96a3 0 2023-01-02 18:00:40.676795+00 -77 2023-01-02 17:29:36 0x0ba42eaec7cdab9edc225bf699d65d242f5c963fc3188cfbc881e0226d657350 0 2023-01-02 18:00:40.740097+00 -78 2023-01-02 17:30:05 0x0593ffe9530e2cd72584faf8772db5333492485787380fde24044d778cab9af3 0 2023-01-02 18:00:40.790384+00 -79 2023-01-02 17:30:07 0xaa5404aca97d85cfbc2e2ce0068a1ee47355401f6cdba17894c134806a9561e9 0 2023-01-02 18:00:40.946382+00 -80 2023-01-02 17:30:08 0xef2adea07381430985cccc621cba68b36cfd2b2a7146a55ba626a533afd79461 0 2023-01-02 18:00:41.009606+00 -81 2023-01-02 17:30:16 0x3148e773cee209b0cace908e4e061702c2b3172d7b96785b3a84e3d5464c8cdf 0 2023-01-02 18:00:41.087313+00 -82 2023-01-02 17:30:24 0xff307fe945e3669581c609493efd6acb6cf3e49ed19b4acc7937c2f4aa308cdf 0 2023-01-02 18:00:41.174339+00 -83 2023-01-02 17:30:25 0x62342c3bf8a643a7bb4628e93b4d9a89a5c724d351805fce022a855295045ead 0 2023-01-02 18:00:41.24681+00 -84 2023-01-02 17:30:26 0x80961ebf86c5b50736295b4732d4eaad2b0675b690989a88fa92570a5d0bef29 0 2023-01-02 18:00:41.329976+00 -85 2023-01-02 17:30:36 0x68e574b6d780234ee35541f20a4b68e01d21c3f27b9c0a46ea25f4f6da30b0ad 0 2023-01-02 18:00:41.500567+00 -86 2023-01-02 17:30:42 0x152886491e5662b0285bf95b78a1a2dba560c0d5f4df3c759e97ef60f87ee628 0 2023-01-02 18:00:41.628264+00 -87 2023-01-02 17:30:51 0x457bd11b0701900a9d4f50279746e52c0681639bac661c85b3dcb5ffe43b044a 0 2023-01-02 18:00:41.744466+00 -88 2023-01-02 17:31:00 0x87fe7d30a8b23b2541247ea33e0ac4ee589d9a6e110f3b5076352a25199faa8a 0 2023-01-02 18:00:41.860781+00 -89 2023-01-02 17:31:09 0x71f7f0d3ddde810a249e49dc6572e67a5c48d986f8412c1ebcb5013cc7c7076f 0 2023-01-02 18:00:41.954397+00 -90 2023-01-02 17:31:23 0x487bc428f20d6609292f2ebe24478626acb75f7196a9615f1b5db5efa7b30ffa 0 2023-01-02 18:00:42.015825+00 -91 2023-01-02 17:31:25 0xab5602294e8165f609b9f9e3f2545c257ec16061e37aaf2be95be0a09ff98fe6 0 2023-01-02 18:00:42.151758+00 -92 2023-01-02 17:31:28 0xec8e02479b2547c9d3b58168778954c420ddfcb1acbeb8492f921675b515d195 0 2023-01-02 18:00:42.258932+00 -93 2023-01-02 17:31:30 0x67b89c837536aa20e01505e6ad1691ae98bd7648932cc4a59529bffef87b19fa 0 2023-01-02 18:00:42.34544+00 -94 2023-01-02 17:31:34 0xa2ad73a239cbe21626df8429d89ddfb41ff0b0193145ccb0be96bdd2d41ebef3 0 2023-01-02 18:00:42.417855+00 -95 2023-01-02 17:31:39 0x010e497841c6e979ca0d1f4ed26a2ba9d795e7f69fef800812bbccab1cbb6e6f 0 2023-01-02 18:00:42.516996+00 -96 2023-01-02 17:31:41 0x9b1acf813092844a1cb72682133b97ffcbe7f42151fdba7bc74698d31ce77f08 0 2023-01-02 18:00:42.600947+00 -97 2023-01-02 17:32:09 0x6c2c218251150ec5dc119e9f476920f195706e4c7b8781f9512253734aedb5bf 0 2023-01-02 18:00:42.647942+00 -98 2023-01-02 17:32:22 0x6db1d830db09dc3f91264b4c7dad9c1db17733248978966a9413e11e8cf78fff 0 2023-01-02 18:00:42.716058+00 -99 2023-01-02 17:32:23 0x525eca55e54b5ed75821c6c39249a68f8d2436cdee94a5ec4789ea988d5c5fc2 0 2023-01-02 18:00:42.815433+00 -100 2023-01-02 17:32:24 0xb2a0666dac2acebea0a03640ca56b934ed38a6f2d96e8f30ab45fd04872a4258 0 2023-01-02 18:00:42.911604+00 -101 2023-01-02 17:32:28 0x8f36e00696e18525b6037c63ee0d7dfb61a3efc75c0d61143ef73195bdc2cda5 0 2023-01-02 18:00:43.251737+00 -102 2023-01-02 17:32:30 0xdf64c76c05678734d32c8067f7d5b3fe104287a0f2427bc58a4f817ead5320e7 0 2023-01-02 18:00:44.182148+00 -103 2023-01-02 17:32:41 0x8219d072706b65658fdbfc696729327efed1831a221de6bded079ba8e2cb5099 0 2023-01-02 18:00:44.310215+00 -104 2023-01-02 17:32:44 0x711eeb7400d49880f49246f42be6224cf202fbe3d9cbcb2e3f77c82142751394 0 2023-01-02 18:00:44.408616+00 -105 2023-01-02 17:32:46 0xd4ce89fbadbcdf405e190a0d0a0bef69728ef2e8c3f7b6afaef2152662d105f0 0 2023-01-02 18:00:44.508403+00 -106 2023-01-02 17:32:48 0xca145a6aa7cf720e16ea399deeb39a3c0c3994b3875b2d03cbf2b9d41048bdcc 0 2023-01-02 18:00:44.605357+00 -107 2023-01-02 17:32:49 0xafa9205b16a00cecae4f7c3462894700d2005ff4742ebac7d1c1597ef4cd9f62 0 2023-01-02 18:00:44.687121+00 -108 2023-01-02 17:32:56 0x741e1469622cfd77263b771a1329a3239df4e7018c60513234381ba578c337ff 0 2023-01-02 18:00:44.749164+00 -109 2023-01-02 17:33:10 0x2ee8694b30e3a983ce44e4436e057eb2e6c61576193ed91298dbb09353005113 0 2023-01-02 18:00:44.896853+00 -110 2023-01-02 17:33:11 0x5f921ddb9fb8b645f42141b54d9ccc028ae74ccaeec20f2022aa62284a6e37f0 0 2023-01-02 18:00:44.976747+00 -111 2023-01-02 17:33:13 0x623692f636be1eb61dfbbf62559a1a22221f742556e5fe20a9e9c5fe8ba25a15 0 2023-01-02 18:00:45.100308+00 -112 2023-01-02 17:33:14 0xdc8b896c74e58cd70d483f1758d65ffd75bed2281eaed721853b3f7dbc3c553e 0 2023-01-02 18:00:45.218025+00 -113 2023-01-02 17:33:15 0x0bf06b581d4e7df044e8e6459704f04316645f81d48e080497cffee2c9e39aee 0 2023-01-02 18:00:45.348705+00 -114 2023-01-02 17:33:16 0x6d4e60c2287920bf18999f15457e49169957ae0ea6df28d9ea659a1cd0104bb2 0 2023-01-02 18:00:45.499733+00 -115 2023-01-02 17:33:29 0xe596afc6be4e49d7ff00906eec7e4a304fbe34408f56c7dc99e569e7da290f75 0 2023-01-02 18:00:45.60157+00 -116 2023-01-02 17:33:50 0xf27eaeeefcf0909ed5c923c26ff6ff60991b24b3dba6c2d68b9c6a074eb74082 0 2023-01-02 18:00:45.652528+00 -117 2023-01-02 17:33:58 0x2c1e3aab4ad895328c700cf54f715ca6cf5d912ceb2a48927969f29fd844d990 0 2023-01-02 18:00:45.73291+00 -118 2023-01-02 17:34:12 0xd85b31a9c1a678c947ec70eac655ea76164d118afea22304d8613f3425ce4281 0 2023-01-02 18:00:45.844959+00 -119 2023-01-02 17:34:13 0xce3e00f3cfa56211e0fea3e5f91be8299dd53cb6796ec90f310d7a821294c77f 0 2023-01-02 18:00:45.895719+00 -120 2023-01-02 17:34:22 0x3f2fdd60ea1af153abd73a626fdcae8af2a5e63f5802f5f95165f9429887ee73 0 2023-01-02 18:00:45.95742+00 -121 2023-01-02 17:34:26 0x320b3e9c78a97ba43648aa452a4b5c8efe5531c81685b6a486afb8b0e86cb2c2 0 2023-01-02 18:00:46.058555+00 -122 2023-01-02 17:34:31 0x97d3ac648fe06f9710cd0305c57a90718adf91eb47539ca6b552a58eced91c3f 0 2023-01-02 18:00:46.191777+00 -123 2023-01-02 17:34:35 0xa80d0712a316e3f80f9ee995179d77ad4c542be37f91dd2d993a417d6052ac79 0 2023-01-02 18:00:46.286392+00 -124 2023-01-02 17:35:26 0x2543da93c3480cd5ab183ac1eaee68dcf843d02d840eefff619589eaafd9e04c 0 2023-01-02 18:00:46.358585+00 -125 2023-01-02 17:35:31 0x0edbb9e66552c758add3cc8f77ec9e0a55a1de87970454779a23e520c2768f0f 0 2023-01-02 18:00:46.464204+00 -126 2023-01-02 17:35:38 0x3721941ab26b9ee9a144545042245027f1018ab52898acd800dd2f4fd87661da 0 2023-01-02 18:00:46.647768+00 -127 2023-01-02 17:35:41 0xc99943f39ba005ef164b56cfdde91c80b3ab6b289fd8a2639cb653de4b5bd5fb 0 2023-01-02 18:00:46.700972+00 -128 2023-01-02 17:35:48 0xe4e7509673b4141b001b779d19e77c91fd7709a1313931b0fb57d7c70eea1784 0 2023-01-02 18:00:46.789776+00 -129 2023-01-02 17:35:52 0x207034cf6a0f8451ed6ac71e27e91f5c4a743d843ae0bcc4d3dba239f7082fd8 0 2023-01-02 18:00:46.900778+00 -130 2023-01-02 17:35:55 0x346bc0266c76fc90064e4016223fe1f5f6fcca55cea09850eb9c2da097790916 0 2023-01-02 18:00:46.963181+00 -131 2023-01-02 17:35:57 0x557f90dda5d8410fd729f3a6e038f30f22e85e40dbd1a40a93544522f8d7011c 0 2023-01-02 18:00:47.002452+00 -132 2023-01-02 17:35:58 0xcc16a52491f2226b83a1478b723ce8f15f3759bad669510a6cc7c3a75049cf66 0 2023-01-02 18:00:47.131728+00 -133 2023-01-02 17:35:59 0xf6227fbd87d5ca41a01a36c67d2ac4d18f023268e03e0a25221ad4aa8a986387 0 2023-01-02 18:00:47.273992+00 -134 2023-01-02 17:36:00 0x73e00ea7e17379f5d8dd8050c22639bccee658f4647b493d3167b55156454f4f 0 2023-01-02 18:00:47.329359+00 -135 2023-01-02 17:36:01 0x301da75e9e93e89f1762cce5a4581dcb13c292070d7ba274e33012470fc07367 0 2023-01-02 18:00:47.460797+00 -136 2023-01-02 17:36:18 0x523cd31013590d400760c7f4c3c3b88492bcfb2bf96a9cf57ce04c118ca87479 0 2023-01-02 18:00:47.613551+00 -137 2023-01-02 17:36:22 0xca13e3eabfb64affc7de5b964451fdd51b21f9138ea54755cf004126ab9a4086 0 2023-01-02 18:00:47.693647+00 -138 2023-01-02 17:36:37 0xaa8d503647c4fcf0303fcd1ce7edcbfbf2a4ecdca1cb06380daa2b30614908d2 0 2023-01-02 18:00:47.762972+00 -139 2023-01-02 17:36:45 0x8c87377723bd26974e9fb0881072d68a6394b94e9dac04f72c0fdfc3c23970d7 0 2023-01-02 18:00:47.830209+00 -140 2023-01-02 17:36:47 0x78146f7fc697b927df9dd33dd93132bfb1fed2292768d9ea3b3e1f06e03550bc 0 2023-01-02 18:00:47.950638+00 -141 2023-01-02 17:36:59 0x6455250e73cfb4e6171e6c00dfd19a3549ad65e0592d567211c4f13cfebf371a 0 2023-01-02 18:00:48.062443+00 -142 2023-01-02 17:37:25 0x99d3793ad7a49dda70826f8f520ee2e4544b6e418cbbfe091db187f73b676bf7 0 2023-01-02 18:00:48.167295+00 -143 2023-01-02 17:37:41 0x63f6382a0f5a1906ef9846ceac0e4bc37e1ae6978b7edefc415f257efabcc1c9 0 2023-01-02 18:00:48.269015+00 -144 2023-01-02 17:37:42 0x9937a271ba7ebe7dcfa7f11876fe95dda211d739d1eb341da77dad51d9494e59 0 2023-01-02 18:00:48.396986+00 -145 2023-01-02 17:37:46 0x6b86494f31f1c291cf7c0e118634979154ddb3a7091451a6d66e3849e31d82c2 0 2023-01-02 18:00:48.517952+00 -146 2023-01-02 17:37:57 0xaf11447716b23428136ea4fe6b4f08d45921c385341293275cb507c6d47b8c3b 0 2023-01-02 18:00:48.631473+00 -147 2023-01-02 17:37:59 0xe7202e6a9a8d448f681cfd9a19f46d13a8c4ee2f2676d10a8f5cde4f27cd5104 0 2023-01-02 18:00:48.732829+00 -148 2023-01-02 17:38:05 0x5cc79f8bf0e677e150c8b20df7d6e12a56da8ebf472ba8058fb50011ab84de65 0 2023-01-02 18:00:48.845153+00 -149 2023-01-02 17:38:08 0xb3e3c2d0fd31a2253c2d08d6117bb4bfc5311df122e369e4a488f43c16d7ff79 0 2023-01-02 18:00:48.962048+00 -150 2023-01-02 17:38:10 0xa64abb73a6f624d3e3e321b350b474f7bc36fe35e108d99f13563bb1440284ac 0 2023-01-02 18:00:49.022586+00 -151 2023-01-02 17:38:16 0x09b96d9e0e908fa7b6618b3d75fa41e8c5ba4469b9e532c30104fab5d42789c1 0 2023-01-02 18:00:49.088822+00 -152 2023-01-02 17:38:17 0x247ab7ad0b9cbb8c0634d1053ed56879c53a7b37a0d6dc96c62c8e5822697938 0 2023-01-02 18:00:49.247876+00 -153 2023-01-02 17:38:21 0x0d3876ea92bed36f757f0acc3edef3d0d5732893264c74a55cc1003b4354cfe6 0 2023-01-02 18:00:49.313938+00 -154 2023-01-02 17:38:40 0x8261f363f14ba1e8ab8a6a605ddceb5a7a1c0bdb9de9c78dfe2a8a2dfaed0766 0 2023-01-02 18:00:49.374683+00 -155 2023-01-02 17:38:44 0x5f18cb550175dd23aff0b02745bee09dbd95ef5b764087a4347d24bdc26f1741 0 2023-01-02 18:00:49.49081+00 -156 2023-01-02 17:39:01 0xdcb2bc5234152d18cc1fcd938162722b1e86343acc3f7d6ebe0ecf9051f92969 0 2023-01-02 18:00:49.61293+00 -157 2023-01-02 17:39:05 0xd6e1a40420036b65249c917411f3a954474b40684985aad03a4204aa1104e662 0 2023-01-02 18:00:49.664511+00 -158 2023-01-02 17:39:13 0x979bbeb0c897409e0522bc398393636985127938637bd6ff2a1f2ef9445902e8 0 2023-01-02 18:00:49.737272+00 -159 2023-01-02 17:39:14 0x571cd4638cfff288809abb8113f264eca02648b99a5a10b6201ee4c004c239ce 0 2023-01-02 18:00:49.817967+00 -160 2023-01-02 17:39:21 0xf4ba2a5660414e0a959b932865c03a7a742e3a5aaf814a34248c7cdd162f51cc 0 2023-01-02 18:00:49.932124+00 -161 2023-01-02 17:39:24 0x9ae6ac85ef6f018f3da4d7d574eb141ab1d2689a0e0d49774bc5e5e3fd61bd02 0 2023-01-02 18:00:50.014261+00 -162 2023-01-02 17:39:25 0x9a4107d2bd827a08769f79a998624795788011f12f261c130a6ae9d3b9027d8b 0 2023-01-02 18:00:50.089461+00 -163 2023-01-02 17:39:26 0x5f99047616887839e0af82586636b0c71b70942be56373b16c86517dc447d78b 0 2023-01-02 18:00:50.182078+00 -164 2023-01-02 17:39:38 0x09349266bb6458c349f3ddce179b1100151722877c3e852776b6592ae29a9932 0 2023-01-02 18:00:50.257366+00 -165 2023-01-02 17:39:41 0x917d68b13f4fecb3ad4b8c70ddcb0978e71802a8a59eafe62573fd1b55fa82a8 0 2023-01-02 18:00:50.321522+00 -166 2023-01-02 17:39:46 0x946594d686c70449fbc2de225fbd1fc225ebac3cdf943e8be722a6b910c70614 0 2023-01-02 18:00:50.405646+00 -167 2023-01-02 17:39:54 0x136d14e79a9318bbcf9afcaee99e3c746b3174cd69405eafd7d8a70789353700 0 2023-01-02 18:00:50.682025+00 -168 2023-01-02 17:39:58 0x6dab18e63e26777ad27581efd14c2ce429d0a58df1ea330ecdc0b94e067b5139 0 2023-01-02 18:00:50.821047+00 -169 2023-01-02 17:39:59 0xc5e8b18f305fb416178f24033da0d30e27ed90996bc31df8f33968a63f5833fe 0 2023-01-02 18:00:51.419215+00 -170 2023-01-02 17:40:00 0xa0c62ee3796c17b5404e9ea637b7807c313e3ec21e9f272e850fc67a3a978f6c 0 2023-01-02 18:00:52.105055+00 -171 2023-01-02 17:40:12 0x7d5545a75ca8e15b0e217bfc27a2b5d1badf15b6467b9535f08a3a0f8cb75d1d 0 2023-01-02 18:00:52.256567+00 -172 2023-01-02 17:40:13 0xfe67d5303be7eeee25b00759661b408efb80d5d72a53ef4d0dc5cc1faac8073e 0 2023-01-02 18:00:52.369029+00 -173 2023-01-02 17:40:16 0xb1f7aaee22848d71e4f3052f7b9de651dc87c16a00a6817c97033b8526da26f9 0 2023-01-02 18:00:52.431499+00 -174 2023-01-02 17:40:32 0xbf849b6c6d6289aa92dc5f18ef62fdd61ae759dc8782815e17bdbdf5e37e7ad9 0 2023-01-02 18:00:52.505813+00 -175 2023-01-02 17:40:40 0xd61f62709c6512dbc470b3e2aacbb5b128a9da2367e7ace6d6ee3608c5fa3bc5 0 2023-01-02 18:00:52.586362+00 -176 2023-01-02 17:40:46 0x8ee88242c3cc3191c26a67f91c6f9385aef0661b367f9f9e3a2c677577af7fcd 0 2023-01-02 18:00:52.681913+00 -177 2023-01-02 17:40:53 0xa0b4aecfdc424f5e0f4b2acc3de38150fb60a244a3a2f75cecf977da2370b091 0 2023-01-02 18:00:52.757606+00 -178 2023-01-02 17:40:54 0x26275b9827c4596b29c199ce2aef5f82d4de84eeaa8e523784afd71c23b44dc4 0 2023-01-02 18:00:52.899674+00 -179 2023-01-02 17:41:01 0x91ab17fa2fa8eaf240f92de3b9ee70699408cd4290b3b10db344fb5f7fa2cf17 0 2023-01-02 18:00:53.070427+00 -180 2023-01-02 17:41:06 0x103a3312c43cf6f197a72e8b4b32e6dc8fb2d3957b5a9c3500192532f7d44369 0 2023-01-02 18:00:53.213413+00 -181 2023-01-02 17:41:07 0x86ea753bdf000d13ff7fd5fe0942cf3841d37b1eb189225e3478a33a79ecf4b3 0 2023-01-02 18:00:53.327786+00 -182 2023-01-02 17:41:11 0xa744767e71d2f1ddf0d56361a40d41a41866cf4113210137f39f4b087a091aaa 0 2023-01-02 18:00:53.411341+00 -183 2023-01-02 17:41:43 0xfb1afef518ac7fdc0bd27ab2b7edd5a9666f836df72a5066a69555015a415ea8 0 2023-01-02 18:00:53.519416+00 -184 2023-01-02 17:42:03 0x3ea8c8498d9837ef0bcdba29d7bccefd6c77621a1694634a2d2c78476a9737ee 0 2023-01-02 18:00:53.566284+00 -185 2023-01-02 17:42:09 0x160ddfa9b46391cd9ec5ba00f11ada81ba050641a04b7961f6a16e088c924bee 0 2023-01-02 18:00:53.630733+00 -186 2023-01-02 17:42:24 0x36da5045cd285e434e98ef9e73c1f6d6faf54e42346449800a0f390025809949 0 2023-01-02 18:00:53.722077+00 -187 2023-01-02 17:42:32 0x8710ba91571d4513e44c2dd0d2de7ce4bc02c102675c85c1866488d6bbcd3ef3 0 2023-01-02 18:00:53.82462+00 -188 2023-01-02 17:42:36 0x15d1fbd1b63a62731a79ca54d7826baa56dc8f394327bb08c2ff8b25bd97864a 0 2023-01-02 18:00:53.896128+00 -189 2023-01-02 17:42:41 0x1fa6084365e6d0998604b63dedba901dc6364887bb85f47206676539726855e6 0 2023-01-02 18:00:54.082408+00 -190 2023-01-02 17:42:45 0x56c68bf1716aaadba2226658aa92a893cd5219d28e6d62e5f54d02b6139b6a37 0 2023-01-02 18:00:54.171028+00 -191 2023-01-02 17:42:52 0xfc71d24d389bfc2db1d7548f5b43aee50a06112746b576dd4eccfe9d866937a3 0 2023-01-02 18:00:54.269942+00 -192 2023-01-02 17:43:10 0x53bedb49b62303fb0e86617ea97ca61883d8d879bd4b8f8cf0a0126a5042fccd 0 2023-01-02 18:00:54.322634+00 -193 2023-01-02 17:43:18 0x6d7e132a54716db1c92f62f8419478dbfb3d9f81a898e5f629e0f7896e096a15 0 2023-01-02 18:00:54.373507+00 -194 2023-01-02 17:43:27 0x4f45806a38cb19a162b1d79c7787cb89374c4229911fd08fcd72a92b6439399c 0 2023-01-02 18:00:54.444534+00 -195 2023-01-02 17:43:30 0xf05b61302e83acd1e14174e32dc09e9ac8102c6d5d7c51f3087e10b7b645b065 0 2023-01-02 18:00:54.575119+00 -196 2023-01-02 17:43:38 0x6735ca7d7b3eb5114817855b94de3dc28451efb1e8b5dd9e00830c22622764e3 0 2023-01-02 18:00:54.624656+00 -197 2023-01-02 17:43:41 0xa8a09335516cdfd4a67dc0ecd89c86395e1643bebf95daf097433350f2559481 0 2023-01-02 18:00:54.706888+00 -198 2023-01-02 17:43:45 0x70110b49870778ffca04447040212da6bc1fb8d0c2ff4e2881eaecf8eaf29c8e 0 2023-01-02 18:00:54.782219+00 -199 2023-01-02 17:43:48 0xc3243b1926cf1fe790df8402fabc0a840ca26e6930f2738250fca0882291edef 0 2023-01-02 18:00:54.863082+00 -200 2023-01-02 17:43:54 0xdd04c9c737e1eb8e9269ba4984799f2a59987245b40023aa08a80dcb042e118c 0 2023-01-02 18:00:54.917127+00 -201 2023-01-02 17:44:02 0xac1b294e0b70d8a8b5fa3b68d1549f2b4727bec956f2eca65c8b80ae9690d8fb 0 2023-01-02 18:00:54.993801+00 -202 2023-01-02 17:44:13 0x39a74c1f049b19c5a324a7a47877fd6dc6139528f16daaa5fa5cb616af507f5a 0 2023-01-02 18:00:55.070711+00 -203 2023-01-02 17:44:16 0x6e42e4a5102516927f21987172fa0c772653b22a1254cdde6cbb05e7a29cef21 0 2023-01-02 18:00:55.165143+00 -204 2023-01-02 17:44:27 0xe1ec2ab68032891767c19ba74097ab5515934c154a4ac4a6eb3b601682a0e78f 0 2023-01-02 18:00:55.259388+00 -205 2023-01-02 17:44:57 0x3e8e3b714455bd9faadad192e72b6c276e2540fa9c6a7c5b887503417f24895c 0 2023-01-02 18:00:55.327668+00 -206 2023-01-02 17:45:00 0xf7c611f1d23654f2d0a2068ef721162056eebdd98d3adbb29232808e8efc54aa 0 2023-01-02 18:00:55.535664+00 -207 2023-01-02 17:45:07 0xa460a5360a91b7c2c254ffd6a38ca74527363d912fb63f03a2589b764e504bbf 0 2023-01-02 18:00:55.610873+00 -208 2023-01-02 17:45:09 0x9fb7c52d5f4fa2f627387bdfd593a964ff4c9bdecd636cd83647eadc56af408b 0 2023-01-02 18:00:55.725924+00 -209 2023-01-02 17:45:10 0xa5b476c2878e46760f961db23263ce221c07391dfc897a113e4c0eb0bb06a0a8 0 2023-01-02 18:00:55.921357+00 -210 2023-01-02 17:45:13 0x48667a094174840ae626744f037bb7831dab2ce36a7dfea77981733bedce4495 0 2023-01-02 18:00:56.081177+00 -211 2023-01-02 17:45:19 0xe09db033d2618e6af69a97813d0722010c8b506c9d1425dfd2ae3a3aa8384eaf 0 2023-01-02 18:00:56.213993+00 -212 2023-01-02 17:45:25 0x4fbf8d976b8a7b640e81b3d8a326bab0e3b4a7de3f3ae215dd9393da8025c5f8 0 2023-01-02 18:00:56.333755+00 -213 2023-01-02 17:45:32 0x41be34bdab39c36555c920c6e4f5a7fa680e1fee6b245f91d2c810ecfc3f08cc 0 2023-01-02 18:00:56.432353+00 -214 2023-01-02 17:45:33 0x4245f2bc7acca87a9af03d84ff024efbbdc4e81e33a685db9c9afb85c44e1470 0 2023-01-02 18:00:56.742415+00 -215 2023-01-02 17:45:35 0xd67ffef1343652956ed5b6ee7f94668bbcb1fce697ff7007b3189ed00171b02a 0 2023-01-02 18:00:56.802677+00 -216 2023-01-02 17:45:38 0x0a4957e874454a81e38e57b85d68a57729fe6a87a7ff30c74234709691d2a793 0 2023-01-02 18:00:56.907922+00 -217 2023-01-02 17:45:50 0xb8681c68c5bbf4d9ae2c76f5b57ca376cd1eb92e60a2056277f60c87ad90160a 0 2023-01-02 18:00:56.97938+00 -218 2023-01-02 17:45:52 0xefd1fa7f401c604143acdb7993a2664ec6194f48c191b8dd03f3b6f2059ab170 0 2023-01-02 18:00:57.053366+00 -219 2023-01-02 17:46:03 0x7fe49313b74f19b919fb0ce9c7bb8bcdac29bf6d4b28f01b44234f2c9f72952f 0 2023-01-02 18:00:57.127085+00 -220 2023-01-02 17:46:09 0x02c8886de5721d4cc11bc63a9cb3fa4078cafa01add86c03c37d82c355358d00 0 2023-01-02 18:00:57.296852+00 -221 2023-01-02 17:46:17 0x5e21d0dadaea58346a1c558123c3790a767ef5ee20e1025e424f6dd3c483a62e 0 2023-01-02 18:00:57.41663+00 -222 2023-01-02 17:46:18 0x8d834e2cca05a13e97883332234614b8710bcc33d947ba820e3d869ae19f8e88 0 2023-01-02 18:00:57.508865+00 -223 2023-01-02 17:46:19 0xe7da84fa0aa35db693bfe69a38ed5b602eec831654d477fb84e9f593c755cb01 0 2023-01-02 18:00:57.62491+00 -224 2023-01-02 17:46:20 0xab683d0fca0f6ffc9cd50e0517c68f4fcd6ccf36f4f7319a2704f2f90a91b023 0 2023-01-02 18:00:57.700369+00 -225 2023-01-02 17:46:23 0xe0d77eae5df5cf3ca9f80110907119403820c18a26b44a2a0b94d8ddcc6e8826 0 2023-01-02 18:00:57.881158+00 -226 2023-01-02 17:46:30 0x27d0f0707c2f8c895cc8cc98ffbf145a2a5eb40508dab1a253bc24785e7bd26b 0 2023-01-02 18:00:57.99735+00 -227 2023-01-02 17:46:39 0x0c95930ea900d5f663e62f04db4726e22941c6a6f047db52639719a0ed98f0d9 0 2023-01-02 18:00:58.162066+00 -228 2023-01-02 17:46:42 0x0ec264c5a5387950ca3ae206c43705504223314c249ba8d2ba9e3de90b8bd5fc 0 2023-01-02 18:00:58.270097+00 -229 2023-01-02 17:46:45 0x146aabb85822e3b1d52c082f6f6bd0bae212ca1979f936d8b7d9d6d18dbcc4ac 0 2023-01-02 18:00:58.397648+00 -230 2023-01-02 17:46:48 0xf5e42788862f15245513135fcf464e16195eb7f36119be8605d0edbe095e5a3b 0 2023-01-02 18:00:58.521468+00 -231 2023-01-02 17:47:00 0xcafe368bbb72f2177f4022282c6d429cd61f1ee7f8e3d3bf751f347475a57a68 0 2023-01-02 18:00:58.702718+00 -232 2023-01-02 17:47:03 0x810c9efb5d74b4a633567d35001f12c5892bef68b453042fd986547e46f59fad 0 2023-01-02 18:00:58.795768+00 -233 2023-01-02 17:47:04 0x42b65f0d95e3a9afc1af654373d5654137e0f3f7d66353a62eb5f7598a0dc9a4 0 2023-01-02 18:00:58.945452+00 -234 2023-01-02 17:47:05 0x98b34a6b9a0dae38d6e18085b6cd3e125ac3c0d4cb902cec60a34c788b10ad44 0 2023-01-02 18:00:59.084444+00 -235 2023-01-02 17:47:17 0xce2fd9d1a667b82f1a3da7846f29a9d45a3ed130ba05df92c2c13760bcdec70f 0 2023-01-02 18:00:59.206806+00 -236 2023-01-02 17:47:20 0x59879c9905868e5650d7c148007bf0c980fc573a8a52b1e94fe2e6c162325101 0 2023-01-02 18:00:59.312223+00 -237 2023-01-02 17:47:39 0xb2469ee785a7bfd86ec60add892e6cf4b63c3dc443d4a8202e618b472e213bf4 0 2023-01-02 18:00:59.454303+00 -238 2023-01-02 17:47:54 0x75f6c83ecb2beeae7d77706a67409c1971803e7855ed5b9ae440ddde8fce4e8b 0 2023-01-02 18:00:59.557319+00 -239 2023-01-02 17:48:17 0xa00ed96208ed1613c348048cb38737c3c7ddb8632962d4b7f23c73dd1e809445 0 2023-01-02 18:00:59.67498+00 -240 2023-01-02 17:48:20 0xa587930e897a6f3f29691001c8517cb051bafedc463e6557b765276a3fc4136b 0 2023-01-02 18:00:59.795529+00 -241 2023-01-02 17:48:21 0x021b20d30a20e3a3c9765603beb5029ee75530f94d8fa2812e9a93fb09cf316c 0 2023-01-02 18:00:59.916603+00 -242 2023-01-02 17:48:27 0x2763cb7109e570e6e85d586f950bfda54e020e93dfdd08a9b17ee1b174fdcc3e 0 2023-01-02 18:01:00.018328+00 -243 2023-01-02 17:48:28 0xb7b96c3dc24dafee05fd9329aad70c4cb9928049aac088082ff6f7a8b60fde03 0 2023-01-02 18:01:00.185159+00 -244 2023-01-02 17:48:29 0xc88d44051ad618438ae323695d335a38d7107637c1d0bc1379f5a788a33c3a7d 0 2023-01-02 18:01:00.559526+00 -245 2023-01-02 17:48:31 0x64b79645c92178bab4166eae8ee16c515d6f7ec12f1fc86f4c122679c8ecaedf 0 2023-01-02 18:01:00.891698+00 -246 2023-01-02 17:48:38 0x76117b4dc8e78653459bf7a99c29d08b29aed07c2399253e69178b87c3ea2ea0 0 2023-01-02 18:01:01.109715+00 -247 2023-01-02 17:48:51 0x1fbe01d5ef4036843255db9f3304b5a1f0e9af7a1c826d7331d1edcbd250f661 0 2023-01-02 18:01:01.759968+00 -248 2023-01-02 17:48:55 0xc46f0034fee06a86be0bdfbf3b48ca82f58d0d85114a97bf7053705d35713689 0 2023-01-02 18:01:01.842093+00 -249 2023-01-02 17:49:00 0x2ae0b4833879de0a211fca90ce0b6f7a70516f2bdf175a4a670fb2032fff156e 0 2023-01-02 18:01:01.904667+00 -250 2023-01-02 17:49:01 0x9b62b56b13c515ac7a3cc0364e04218b2090042161ae1d6d43ddf6176153be32 0 2023-01-02 18:01:01.975829+00 -251 2023-01-02 17:49:09 0x1046c760176e787a91869ddfe6009c4e059ecdd08ce92f521c8c601b80196fe7 0 2023-01-02 18:01:02.072438+00 -252 2023-01-02 17:49:20 0x32cc250327dff657b58c215bd9682b69aa81790f754d3ccff9d5e21d4cb7ee7d 0 2023-01-02 18:01:02.13242+00 -253 2023-01-02 17:49:34 0xd0a4d1421a3df46b6bb4e05e41664b23db392101f973dc5258e2480f6f3e8422 0 2023-01-02 18:01:02.193739+00 -254 2023-01-02 17:49:44 0xe697ad5c3bfbf3fa643d56a2c227b44ed3e6027f72346374fbe9ab08e45034a8 0 2023-01-02 18:01:02.278727+00 -255 2023-01-02 17:49:49 0xf821082b25461fe39e110ebeb0ad53034fc4d99d1671a08ef64641e53ddb2a18 0 2023-01-02 18:01:02.371522+00 -256 2023-01-02 17:49:54 0x79dc895102bb446f174dd3d107846aa68bc06cfe45b6abadea15ec17a5f98084 0 2023-01-02 18:01:02.431253+00 -257 2023-01-02 17:49:55 0x2ef8532c4e21a35ecd0e1a58881642c1af06736ea8d64c68960dae4369f82aa3 0 2023-01-02 18:01:02.486229+00 -258 2023-01-02 17:49:58 0xa4edab637dd34785f4b22bf129b789d155bbfea7ba5131cbf5e9bfde5c1f94d6 0 2023-01-02 18:01:02.567463+00 -259 2023-01-02 17:50:12 0x76bb5d855c8f17f5e7d175ff375eea1241335512ff2337c044005d1cee769fe5 0 2023-01-02 18:01:02.663536+00 -260 2023-01-02 17:50:35 0xf2c0469a100149f248b90d18b115ed6446d2897d115b4fe64a6e0af89a6446c8 0 2023-01-02 18:01:02.713304+00 -261 2023-01-02 17:50:43 0xd7d9843bfa576a24c726e3c8a9ceed5d0b1f20d43f2942ce158c18fda90aa78f 0 2023-01-02 18:01:02.774331+00 -262 2023-01-02 17:50:44 0x22b26b835b692e51aa297a914c9ab5f3cd6d1744f10eca951f913f4286731513 0 2023-01-02 18:01:03.020037+00 -263 2023-01-02 17:50:46 0xf84e901cfca0c412bc22bdff97f07cf50287e93e3ed2b74c1fcc0ed6fca954b0 0 2023-01-02 18:01:03.070467+00 -264 2023-01-02 17:50:48 0xd4b7784e9edff78f368ccce3c5980152f4e0b6ffacfb6eba374b7570f765f021 0 2023-01-02 18:01:03.121904+00 -265 2023-01-02 17:50:54 0xb6b61335428e979347a18dd62734869023e6398f1668d424347e320ed8cf349c 0 2023-01-02 18:01:03.162269+00 -266 2023-01-02 17:50:56 0xc2601e2570e376e0a4c1837a23d082ea5942bce3db7c21abb7b6b6edabf8289b 0 2023-01-02 18:01:03.24577+00 -267 2023-01-02 17:51:22 0xf5a7f7b0be3c3e79dabf3c5aee96d0b6757365eec71f903e41e0fe0a5663faf3 0 2023-01-02 18:01:03.359646+00 -268 2023-01-02 17:51:23 0x75f73e805c8d818521167b86d5963a2598df474c554d146d5534d868efc2cd8b 0 2023-01-02 18:01:03.433701+00 -269 2023-01-02 17:51:27 0xbda98c5f6a0b7d3b65ce765eaed1a62d1f0d2cd03f3ab87414faf60e460129bb 0 2023-01-02 18:01:03.529049+00 -270 2023-01-02 17:51:30 0x579a151c74f8ad5e1e711cc92a87feaf5f0a4e92fc2bca5d26727b9659f37a85 0 2023-01-02 18:01:03.641061+00 -271 2023-01-02 17:51:34 0x70be2d6803e105dd65230168636e6cbd17d645ac005133f6be0821a4d9b99f47 0 2023-01-02 18:01:03.734954+00 -272 2023-01-02 17:51:39 0x451f8735d379ea63a69fb4455554cbd4450c6d386a5b3a0937423c69470b0fbf 0 2023-01-02 18:01:03.831926+00 -273 2023-01-02 17:51:42 0x54581c497aea4aa59475eba18cdc05f501a0bef4b01d56da793ccb905a79c1d9 0 2023-01-02 18:01:03.933568+00 -274 2023-01-02 17:52:18 0x8edc06989afc0b9d84e4cbab98a13ef2afc368a4cb8a412c20f831ddc237f60f 0 2023-01-02 18:01:04.021928+00 -275 2023-01-02 17:52:30 0x249e479e0c9fc6e553cc32bae4c8bb5116616de3697048a6cefade9dc027d337 0 2023-01-02 18:01:04.122747+00 -276 2023-01-02 17:52:49 0xe34bc2d98d4cbf2f5098ac2ce00c1663ec16fcb621c1ef686f531f99d0edf12f 0 2023-01-02 18:01:04.31909+00 -277 2023-01-02 17:52:51 0xd31ab1f2e0632ac74728d5b9d06c8f8b132a7b0e901168ebe200feb368265048 0 2023-01-02 18:01:04.471569+00 -278 2023-01-02 17:53:15 0x70c255f3f0e3ddc51bb3cf2b54e012da92b5f32932628c5aa8060845e1a13315 0 2023-01-02 18:01:04.646839+00 -279 2023-01-02 17:53:23 0xd780b2151ac70052d8537825715ce1bbd8f1b12608895b4d68e86ad4b3fcd81d 0 2023-01-02 18:01:04.736804+00 -280 2023-01-02 17:53:24 0xe0de3a39afb19acd52b914559affff9e43f7b9a11803a103b06a1c3ec577bae3 0 2023-01-02 18:01:04.892597+00 -281 2023-01-02 17:53:38 0x8db51a168c4a9c7dc9daaea1f6df113bd5992e79673b0f59ca757ee2b22b6aec 0 2023-01-02 18:01:05.001541+00 -282 2023-01-02 17:53:44 0xbabe71766e006cf0802e4fc6f041d845bb034f9ced15e0b63b6b849c0af5338d 0 2023-01-02 18:01:05.122385+00 -283 2023-01-02 17:53:54 0x54129589d044340edbcbcdc408d7ba180b7a10d50cd142c5d79a06bcaf326d58 0 2023-01-02 18:01:05.182718+00 -284 2023-01-02 17:54:01 0xfb6ede0ba24e0adc24f5db857df60f4a850def71131843915ba95c5ed7b77a5b 0 2023-01-02 18:01:05.273807+00 -285 2023-01-02 17:54:03 0x2c73bd3bf1258a494617d59d98cb7a7bdaaaced062aea943e3f644995d4bc761 0 2023-01-02 18:01:05.37378+00 -286 2023-01-02 17:54:06 0x6ec1b7d71ce11e8ccef66c6a0639b38e959abd67e61a6aa3fc83e40976d7607a 0 2023-01-02 18:01:05.469133+00 -287 2023-01-02 17:54:07 0x99176ff824e5e264732eb2ddeeea5745b2a76aeab2961eea100da712ee64d3c5 0 2023-01-02 18:01:05.598301+00 -288 2023-01-02 17:54:22 0xaaafa82c9e4eb17ef7ca64295ab4200017f54c59e37f76058276179c56d19a25 0 2023-01-02 18:01:05.700389+00 -289 2023-01-02 17:54:23 0xf25cbee4d5194a9e2d9b8fd9dff5230836642a4a5fb31164ef40dc003e47c14f 0 2023-01-02 18:01:05.80074+00 -290 2023-01-02 17:54:25 0x3dcc2cec679782343a087da37385f63b1477ca31dff2ea5618160ef0ce4e71b3 0 2023-01-02 18:01:05.876716+00 -291 2023-01-02 17:54:36 0xb95d0661f783ef29bf7787f8d98a214d28d9534c63dd773509f668fe9ab3bbcb 0 2023-01-02 18:01:05.963411+00 -292 2023-01-02 17:54:58 0x42beaf89da38258367ba092bd7a9f50bc13a6a44af2000cb6b1c6b689595c853 0 2023-01-02 18:01:06.052879+00 -293 2023-01-02 17:54:59 0x7d6b0db7ffe78b37f09d77733acf91eedc336c971dd6b2022b93756031149fbd 0 2023-01-02 18:01:06.141756+00 -294 2023-01-02 17:55:00 0x6a464042c2c044ed04fcfd6735bb28c2ac656b40945a9ed160a56e9be5c6b8fa 1 2023-01-02 18:01:06.534827+00 -295 2023-01-02 17:55:26 0xa9aa7049dca4410a76fd0a0e4e815db09f82c1246d89861ba60d892bbf9475a1 1 2023-01-02 18:01:08.056139+00 -296 2023-01-02 17:55:32 0xe71b8a2dd2bb33a03d93af15fbf4b67dcaba8698b5edc062011dbe10db3bc953 0 2023-01-02 18:01:08.21502+00 -297 2023-01-02 17:55:34 0x7cb1b51f524f18c5a3a3f548743fb1a5ab13a1dcc09ef43fe136b499d4ef5d9e 1 2023-01-02 18:01:08.371825+00 -298 2023-01-02 17:55:40 0x5eb0b6ff28f0dda9528d5dc4f6e1ae996c7181f52eb1b458b6d30b68c10d6d5e 0 2023-01-02 18:01:08.516974+00 -299 2023-01-02 17:55:41 0xd6939682b9c36ed3196cf1c75abd720647e4f653fe5506d480c4af463030fcb8 1 2023-01-02 18:01:08.647344+00 -300 2023-01-02 17:55:49 0xc2b6542a4ce29330e07e4d557123c22a4fa3aecd04094693da3ec7526a40c826 0 2023-01-02 18:01:08.758557+00 -301 2023-01-02 17:56:08 0x644b3110c235790042ee1cd1df1ae14f49e3e5cfb91851409811ec1eea0ae521 0 2023-01-02 18:01:08.817262+00 -302 2023-01-02 17:56:37 0x914b15b46444e9273e2a84e661e5664dc4a336dfd84818b01549659ec2bb2f34 0 2023-01-02 18:01:08.869022+00 -303 2023-01-02 17:56:44 0xf0de1c42759b53d1d8068f0cac0d43602a15a11269629f44b5607cab89976a80 0 2023-01-02 18:01:08.957006+00 -304 2023-01-02 17:57:00 0x9da4490279bddb0adc20389b83a766c5f43ad33ef6b3dfa420b812feb77ffb73 0 2023-01-02 18:01:09.245152+00 -305 2023-01-02 17:57:02 0x2561f7fe66b0e8cd14fc20f0b5e659993153b7998819cc1fe51f351dbe2823c0 0 2023-01-02 18:01:10.04271+00 -306 2023-01-02 17:57:11 0x0e59f816635781deda9e5219d97f6760688da4a1adb93a1849410d278098b3c1 0 2023-01-02 18:01:10.203846+00 -307 2023-01-02 17:57:17 0xa84979e793a65049def1c86769ed271b193fc946b8769e19c3aa7756c3333b21 0 2023-01-02 18:01:10.327623+00 -308 2023-01-02 17:57:20 0x5637490f9e873d023fb611fa6298e6f8171cdf0140d6c5d394f35efbb2fe2487 0 2023-01-02 18:01:10.437895+00 -309 2023-01-02 17:57:22 0x7a21e4084a2a2655d35f600d8bf2fc948834469809c0d6180a6725542f7d3b79 0 2023-01-02 18:01:10.567921+00 -310 2023-01-02 17:57:28 0x05a62428dd297ede0861d1f2daa420c52cfdb00cb499622e2a30ab5239741e72 1 2023-01-02 18:01:10.706538+00 -311 2023-01-02 17:57:44 0x8c66185f0e17cb04dfac77b5d57f5deb1422877981a29a9efb2b4a775c00464f 1 2023-01-02 18:01:10.845166+00 -312 2023-01-02 17:57:52 0xf9bff06221cb20e4289a9581c78853813684847c586e470dbac475fa6a3d46a1 1 2023-01-02 18:01:10.990766+00 -313 2023-01-02 17:57:56 0x1e72db2c2d347b32b243cd64454e520766433590332ec01ec6df0292800e9cb6 1 2023-01-02 18:01:11.070583+00 -314 2023-01-02 17:58:04 0x7e67a09a1a730c2797024892dfbefa61878681073f1f1890aeffa099d15264f0 0 2023-01-02 18:01:11.18525+00 -315 2023-01-02 17:58:09 0x3293a94315859f03c1d666240a29cf1bc0324675bb38fb3800cc6c416268047e 0 2023-01-02 18:01:11.46889+00 -316 2023-01-02 17:58:17 0x37390c4fef0eb06348243aaaf27bff43ab0bb68a748035d7ee588d79ae4c1039 0 2023-01-02 18:01:11.592739+00 -317 2023-01-02 17:58:19 0x4cd3ad281485360d1a65e3a2f594cf4653b28cbfa1b407fc9c2831fc1b0d2bcb 0 2023-01-02 18:01:11.81188+00 -318 2023-01-02 17:58:31 0x8f9b3cb79b6a6944b38f3a437da789d46074a017102be5e08d2aec144f3ab094 0 2023-01-02 18:01:11.980374+00 -319 2023-01-02 17:58:39 0x0cd68d88830ce54387196bdf919bdf0b2d51889c4465eb550f703df86ba1a49a 0 2023-01-02 18:01:12.137372+00 -320 2023-01-02 17:58:41 0xa6cd677f8e8fec8834255b0aafd6f560b1727a7f94eeaacba1b850ced38cf79f 0 2023-01-02 18:01:12.293556+00 -321 2023-01-02 17:58:43 0x6aa97e642bf433822fc24c081003f983ad96ec8bcc4c07e75a1c08e1389957a8 0 2023-01-02 18:01:12.439552+00 -322 2023-01-02 17:58:47 0x535461ea3d295866842be912ddf9ab024533bcced0933d38194f6852fd486f13 0 2023-01-02 18:01:12.55756+00 -323 2023-01-02 17:59:18 0x116c2b7e5cfb16ea8e6d8dca03c4d28abdc5c4165dc9383f07c60a9dec602772 0 2023-01-02 18:01:12.660479+00 -324 2023-01-02 17:59:33 0x41cb3b585638fc266d5f633676143fe29fb073576654d6f03e2709a6a3c6a2d7 0 2023-01-02 18:01:12.703293+00 -325 2023-01-02 17:59:34 0x39e3d57d416540cf2bfdbe8c754c58e504f4f14245108143938759faa4bdf3d2 0 2023-01-02 18:01:12.751686+00 -326 2023-01-02 17:59:45 0x66445834fb2f8c53590a1cc96ba91d8d24560a48dbbdd5af90e896eda6fd0f66 0 2023-01-02 18:01:12.811245+00 -327 2023-01-02 17:59:59 0x647e3332a50207858734ceae3ae7a36ac291e10c55372ea445a8aa44c868c0de 0 2023-01-02 18:01:12.882518+00 -328 2023-01-02 18:00:04 0x77a6b2dd9890f15727562965e0dee05d557fa91e3c004e9b0ece50523593430d 0 2023-01-02 18:01:12.969616+00 -329 2023-01-02 18:00:12 0x543a87ab0178a263e542458c0e06dd1b766c8d2aafcae96b8dfce453e4cabb8b 0 2023-01-02 18:01:13.038236+00 -330 2023-01-02 18:00:18 0xbb9f0b7f5a9a6415e5ce9d9c8fdfed7344990b9195ea0211b55b1319a39b1724 0 2023-01-02 18:01:13.123405+00 -331 2023-01-02 18:00:19 0x09a66776c8293059cf1dd849fe0a963f837621a9a6f3891df25e52f5904a06fc 1 2023-01-02 18:10:01.553829+00 -332 2023-01-02 18:10:01 0x89c9925c61a14d57e9b1c6f896da4a2c27440ce406e350fdf8729cf55b375db9 0 2023-01-02 18:10:13.21347+00 -333 2023-01-02 18:10:13 0x00263efdfde97d248027a5b67e6b5987850a6ccb9138709ab923c2d8616019f3 0 2023-01-02 18:10:30.52388+00 -334 2023-01-02 18:10:30 0x610204ddb0f2ac5ca4d9d9e44a3384b91f841c8034d46fd8d0c2bbaa4607635a 0 2023-01-02 18:10:37.331881+00 -335 2023-01-02 18:10:37 0x4471600e63c221c01a7dfee9b9da18fbad75dab9ab977380dff100d7f690820a 1 2023-01-02 18:11:22.981431+00 -336 2023-01-02 18:11:22 0xf56cfe018ab8c1c1c7d7fea3fbab7000e48e21ad57b87b47e7397ec286a54999 0 2023-01-02 18:11:44.217552+00 -337 2023-01-02 18:11:40 0x958d6d8d8300ad50f7e1d3694c5a57d5beca700f46ada4a4064bb7b541ef7d11 1 2023-01-02 18:12:05.343275+00 -338 2023-01-02 18:11:53 0x961879be289a8878f579abc8968e6c9b4632066a86c9d16a0062a723f76befaf 1 2023-01-02 18:12:12.186872+00 -339 2023-01-02 18:12:12 0x72d3e8810886d998ce87f9908125b91e26b65c750b83ef646e4ad4f7814f4bd1 0 2023-01-02 18:12:14.343067+00 -340 2023-01-02 18:12:14 0xa7e19b096ad1eca3da69345b304d58586ba9d76ce7f7342da23d43ba9e5ce159 0 2023-01-02 18:12:15.139055+00 -341 2023-01-02 18:12:15 0x1f331a0ca68acd17576435a5a781699075c126172d58f1fe3f65a4c95b748e6e 0 2023-01-02 18:12:30.195891+00 -342 2023-01-02 18:12:19 0x13b29547d13e993264af67589d83ede7bab55d781189f985fe731ee953a01044 0 2023-01-02 18:12:31.150463+00 -343 2023-01-02 18:12:31 0xd655a778cb5566f05c98a5eef6a8f8b10ae0ab530f6d055e6b120df9ca5ac64d 1 2023-01-02 18:13:30.004582+00 -344 2023-01-02 18:12:37 0xc6eb964de942309aef5c494f77f5bac25ea233f504302ca025cda96eadab30cb 0 2023-01-02 18:13:30.599765+00 -345 2023-01-02 18:12:38 0xaeec9eebf4f797512b8d329f9b13e0f9f4ea19975e01d1e566879fe4188fcc0b 0 2023-01-02 18:13:30.684824+00 -346 2023-01-02 18:12:41 0x0501716c9985e98fdc5da16af0fed1a97a4ff4ba6e259aeb19fc93ed6a6f6b26 0 2023-01-02 18:13:30.764478+00 -347 2023-01-02 18:12:42 0xa1c261cc4dabaeb594e91ff23de1cc8f967b8ecfa91fc574321bccf1e30a0441 0 2023-01-02 18:13:30.843885+00 -348 2023-01-02 18:12:43 0x3b01eb91a06bbc855ddcb3f011e5b034201856ef151cfc8692b9ee4df84b97ec 0 2023-01-02 18:13:30.91858+00 -349 2023-01-02 18:13:01 0x76c955fafdcbe3ab511e2a869a14934a53e3e2e95188367ae09c97d467a6a7e1 0 2023-01-02 18:13:30.973788+00 -350 2023-01-02 18:13:02 0xfbc1f540d0edaa6296bab98883cb7d972a166d9107f7504deb12cc73ae2b5197 0 2023-01-02 18:13:31.074337+00 -351 2023-01-02 18:13:03 0x8038f994e17813904ff97fcd6c411981a4fb4f3d988790bc28c070bd6d2a7461 0 2023-01-02 18:13:31.176327+00 -352 2023-01-02 18:13:10 0xffd0276b1aa893f030c0efd8af8a7d1ea07f2da28099223674ae80902c1fdcc6 0 2023-01-02 18:13:31.240133+00 -353 2023-01-02 18:13:12 0xba295ccacf4061f9bc14c6af3c1e00184388faaf8cb86394eacdd7694fd28c9b 0 2023-01-02 18:13:31.333894+00 -355 2023-01-02 18:13:30 0x9313d0306b41bc76fb53d0ce06fe1203c7c1d27560b1cd6f650d2f4998c5dcaa 0 2023-01-02 18:13:32.973835+00 -354 2023-01-02 18:13:28 0x89bb66c1b374658b80413ffeec7852573911f9cfb8af8ad1614630064fbd40bc 0 2023-01-02 18:13:33.026699+00 -356 2023-01-02 18:13:32 0xcd3a63ca4015a4c7b418182f8dcb126894401ccfd4a037cd23e0bc7361acfff1 0 2023-01-02 18:13:45.939364+00 -357 2023-01-02 18:13:45 0x894b317a013f2875eedda6d7a4b60c6decc9102638628fd55248f1a5234f1dc8 0 2023-01-02 18:13:47.467106+00 -358 2023-01-02 18:13:47 0x3799ec41b7856c1faf09062da65828e84b8f21a5b03e4eda63ef081afe84498f 0 2023-01-02 18:13:55.478799+00 -359 2023-01-02 18:13:55 0xbd7c5134442580eb36455124fa3e64010189075c607f342877b9865c8c11c8f1 0 2023-01-02 18:14:05.916993+00 -360 2023-01-02 18:14:05 0x2453441a6db5b495d968c03b533960bd755ed7a414246fe260e2b410ccc795dd 0 2023-01-02 18:14:16.456461+00 -361 2023-01-02 18:14:16 0x338ac4cb50e41ccf70445f663cf7d19341b68b624fb9a355d1473938bbd580c4 0 2023-01-02 18:14:18.570209+00 -362 2023-01-02 18:14:18 0x5c619174ee3bf781ca951572ce5c11cb2a1f35c8609b858d3e05d5bb0ce16084 0 2023-01-02 18:14:22.356436+00 -363 2023-01-02 18:14:22 0x89609d30975fa8bb6dc95a00aa8007ba812221882da4441d9f77774ffd715316 0 2023-01-02 18:14:23.679417+00 -364 2023-01-02 18:14:23 0xa92ab696febd1bc3c92b9d2e6ec2f0cfbc0c9997ebdacefe7cbabd2509012d01 0 2023-01-02 18:14:25.574915+00 -365 2023-01-02 18:14:25 0xd4d8a36e823aa3755ad411a6e3800100422a3b7bd81b0dd237b32aa6a1d4205b 0 2023-01-02 18:14:28.132484+00 -366 2023-01-02 18:14:28 0x16781f80abf836d08a7638f24e09f28c8c63a6fd080fef795a4729a06f8f6a67 0 2023-01-02 18:14:31.297971+00 -367 2023-01-02 18:14:31 0xa02315794cc4a147daec3f917f043db46194b3a551ecc8d9ea36397cf9c87820 0 2023-01-02 18:14:32.863116+00 -368 2023-01-02 18:14:32 0xd150da97b132f26e9ddbe2b05e264c0cf593961d62b46f853487df1202188500 0 2023-01-02 18:14:35.286471+00 -369 2023-01-02 18:14:35 0x748f1a6cc4b5d226e3af55666dd40bc9e655d08313a307684087b674c3e80412 0 2023-01-02 18:14:50.987961+00 -370 2023-01-02 18:14:50 0x191ba950966a3ad3c1e4c679be9d2825bff3f95c6f36cce9be6c229bdaa774a6 0 2023-01-02 18:14:56.517582+00 -371 2023-01-02 18:14:56 0x05da13864ba1a1d892c88d78ee59c80d5a7964a4789e70448da016c0792a3e8e 0 2023-01-02 18:14:58.019596+00 -372 2023-01-02 18:14:57 0x3c0ef308bf4230f86696d3e9066c2c5bde63a7ac75339962df01632b608e4d89 0 2023-01-02 18:15:25.932364+00 -373 2023-01-02 18:15:25 0x66aee4fb84565737ec055d6d5b8a0a780e6660cdee363c1cc71130a642b8a19e 0 2023-01-02 18:15:48.75572+00 -374 2023-01-02 18:15:48 0xa162d3711311a98446b6e9522699fb01c9d1a9e737c5be4d6aa63f4f41629e80 0 2023-01-02 18:15:53.251163+00 -375 2023-01-02 18:15:53 0xf991d69398e99b900ee9aaf72c0de46913d195000215569754fc49fd98cf6cd1 0 2023-01-02 18:15:59.137341+00 -376 2023-01-02 18:15:59 0xa0baad2219d65d56b803914e291210edf5d3fb9de6312d4a88f2a62c31e5a34e 1 2023-01-02 18:16:22.260843+00 -377 2023-01-02 18:16:22 0xad4be50bca353be371406917ea1c843a474b5efa137b8c287e739bd16454ab59 0 2023-01-02 18:16:27.818618+00 -378 2023-01-02 18:16:27 0x9d428b0c90c60e73b85f713a3e3f6e6a20b3a65f4fc49534c2627186632d3624 1 2023-01-02 18:20:02.218296+00 -379 2023-01-02 18:20:02 0x5b8a481997483f24723c6797b48d9d559da550856dbcac1084916f02eaaf96d0 0 2023-01-02 18:20:13.151134+00 -380 2023-01-02 18:20:13 0xa06d36d6142e0e27c9dcf0314b5685c4e5f78cbe2449b9d462e9dcaaa86ff82f 0 2023-01-02 18:20:17.460367+00 -381 2023-01-02 18:20:17 0xd1a438342f6375d016bcb614c9a62a33211742655db5a06265022f090d0c9481 0 2023-01-02 18:20:19.292739+00 -382 2023-01-02 18:20:19 0xc8b6c23d0156071212c37b3c1c8d50b82abe5bbe2c9a8ec74f9e43f60e0fdf8b 0 2023-01-02 18:20:20.614648+00 -383 2023-01-02 18:20:20 0x67f4729879f7ac92775959e0e78a6593b5736596c8ba8a953e69a97b7661d35e 0 2023-01-02 18:20:35.876539+00 -384 2023-01-02 18:20:28 0x16b709401805bf02a8f3e9dd90a98d3a5dbabf5eb6c2aa7d3889a2d67f3801a2 0 2023-01-02 18:20:36.790761+00 -385 2023-01-02 18:20:36 0xf74daa1a303ec4d616841522cf38a07492993f479df6967947c30735ba77f537 1 2023-01-02 18:20:39.691259+00 -386 2023-01-02 18:20:39 0xd3dc5babbccc3733f64f7c6c5d70b762609322aeb108975b01fa1f6026113998 0 2023-01-02 18:20:40.733907+00 -387 2023-01-02 18:20:40 0x87b496030ad56d0ef04bfd98265c7da880c786b133f2a83017619b8815a99ed8 0 2023-01-02 18:20:42.110411+00 -388 2023-01-02 18:20:42 0x565100f17dd8ae2f5d9dc2cf4ef8157af204d9efedb78dbfe4c5cb4aabefe21b 0 2023-01-02 18:21:04.7392+00 -389 2023-01-02 18:21:03 0x4dbb5dda8ddd6a1fb82a3b0e49fd6aaa9c15725e54c05d0fa599bf03b800ad23 0 2023-01-02 18:21:05.167459+00 -390 2023-01-02 18:21:05 0x0cf84a51cc3b2343d4dd3252b1442a1aac3828253255a38e1335c04f95d14205 2 2023-01-02 18:21:28.218936+00 -391 2023-01-02 18:21:28 0xcb0eb52c0b9753f2191668fd8e286faf0ef2beb8d2bfa5bd8cf20352e8658b10 0 2023-01-02 18:21:41.804129+00 -392 2023-01-02 18:21:30 0xa7db5eee189cd2b1685f3eba86b82f877585fd9154ef89f25eeda16309119d72 0 2023-01-02 18:21:42.01254+00 -393 2023-01-02 18:21:31 0xc321a28f5280623d5f5abbf65f72786ab267794fb454be86b4d856c405432b9b 0 2023-01-02 18:21:42.178007+00 -394 2023-01-02 18:21:35 0x35017e805a53b8870f045b8bcfee582c35c9fae0697974999ed206ff4a276e14 1 2023-01-02 18:22:10.99338+00 -395 2023-01-02 18:21:53 0x6db108103e85df0f605ea7f81d2d51d4890d778496007c9842c2302a4df52467 0 2023-01-02 18:22:11.287681+00 -396 2023-01-02 18:22:02 0x014253deaa2d42254db0905cefcd4c08ea96554db1eace0bddfaec3bf16646e0 1 2023-01-02 18:22:13.369558+00 -397 2023-01-02 18:22:13 0x9984be9e421d72d9b55520e38f758b77adc31667fefcc2cb004ce3b0970b0467 0 2023-01-02 18:22:22.080346+00 -398 2023-01-02 18:22:22 0x2f7d98fb26a8f3762ecb8de321b8965348a83f0e8504b75fe8b0d619137e69e2 0 2023-01-02 18:22:35.027549+00 -399 2023-01-02 18:22:34 0x069b09ded8015517531ba591312cf5b58018931bdfcf3ecb151341976f946e1d 0 2023-01-02 18:22:44.060206+00 -400 2023-01-02 18:22:43 0x9306ab91f47bac7f248cc01902726aeca0722b5f4624aa9b8205f399d6d8d7ab 0 2023-01-02 18:22:47.697522+00 -\. - - --- --- TOC entry 3928 (class 0 OID 18120) --- Dependencies: 281 --- Data for Name: plugin_status; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.plugin_status (name, last_instance_id, is_schema_initialized, created_at, last_connected_at) FROM stdin; -PluginPersistenceEthereum functional-test t 2023-01-02 17:59:20.020092+00 2023-01-02 18:18:10.219048+00 -\. - - --- --- TOC entry 3930 (class 0 OID 18134) --- Dependencies: 283 --- Data for Name: token_erc721; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.token_erc721 (id, account_address, token_address, uri, token_id, last_owner_change) FROM stdin; -9d81efda-14b1-4d94-85d5-dcd1cb3958f8 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 2 2023-01-02 18:16:27 -1fad6be5-b376-45b1-a9ec-2f023168dbd5 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 4 2023-01-02 18:20:36 -def1d2a4-ace1-4cb0-ac23-9d8de58d24ed 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 0x290A8449050FAc54BBe1f23510B46b541C54A369 1 2023-01-02 18:22:02 -\. - - --- --- TOC entry 3924 (class 0 OID 18086) --- Dependencies: 275 --- Data for Name: token_metadata_erc20; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.token_metadata_erc20 (address, created_at, name, symbol, total_supply) FROM stdin; -0x585Aca7D7B733B441238D2f36230e39FE643795D 2023-01-02 17:59:21.046437+00 Test Token TT 10000000000000000000000 -\. - - --- --- TOC entry 3927 (class 0 OID 18109) --- Dependencies: 279 --- Data for Name: token_metadata_erc721; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.token_metadata_erc721 (address, created_at, name, symbol) FROM stdin; -0x290A8449050FAc54BBe1f23510B46b541C54A369 2023-01-02 17:59:21.235818+00 Test NFT TNFT -\. - - --- --- TOC entry 3925 (class 0 OID 18092) --- Dependencies: 276 --- Data for Name: token_transfer; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.token_transfer (id, transaction_id, sender, recipient, value) FROM stdin; -23b20483-6c34-4177-8ed8-a6d9be072dc3 fae6b540-702a-4821-a9e1-4dbcbd444a00 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 10 -cab14ac9-bb02-4054-9b1c-b8fc2f2f8c34 875e6ff1-5239-490e-90f8-562bb54e55f9 0x0000000000000000000000000000000000000000 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 1 -439336ca-f8c4-46b1-a68a-24b17cabdac4 e542d5d4-2ea7-4e30-9484-0a5750bcce38 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x2666A32bF7594ab5395D766DCFBF03d557dAB538 1 -7fd908a8-1734-4893-a265-9d5549ab9ba5 54f6d2a1-0a6b-4dda-bfc3-924e96647092 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 100 -5eb79122-d48d-444d-8165-1074927e88e2 25dabeec-9dae-44c0-8b15-72fe0fc26eed 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 0x2666A32bF7594ab5395D766DCFBF03d557dAB538 10 -841e9c25-fa99-41ab-b451-49b1ef9f43cd ccefbd9a-6a47-4781-911d-7312f7af1b46 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 10 -7d06caae-01b8-4043-8c93-dedab721b18c 13c6e6bc-9d85-4bfc-acde-ab430552b5f2 0x0000000000000000000000000000000000000000 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 2 -9aa4da54-73e0-4f05-a866-528a50ab609f e1135881-1f0d-493a-8543-0a62b70c5779 0x0000000000000000000000000000000000000000 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 4 -d77a06b2-cb18-4821-8e4f-4f0864f38092 4059a62d-e253-4004-af0f-99838eb7ccc5 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 100 -31f3d9a4-8551-40e4-9d58-3898954bef98 69905af0-6115-4d3b-9d30-58879bc093f3 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 0x2666A32bF7594ab5395D766DCFBF03d557dAB538 10 -24028305-4419-4986-abd7-8f83677dde79 c1934b6b-7ccc-4650-a0a1-9309caa8ea9e 0x2666A32bF7594ab5395D766DCFBF03d557dAB538 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 1 -\. - - --- --- TOC entry 3926 (class 0 OID 18098) --- Dependencies: 277 --- Data for Name: transaction; Type: TABLE DATA; Schema: public; Owner: postgres --- - -COPY public.transaction (id, index, hash, block_number, "from", "to", eth_value, method_signature, method_name) FROM stdin; -d9fca773-a706-4d60-a2c3-7f2275bb514d 0 0xd7cbabfdb30930a30146e38f57a9b7bdb86c6f1a3149db25dc323cee5bdd6f0e 294 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0 0x60806040 transfer -e93a519a-013d-48df-ab5e-3d01f782314a 0 0x8a7b155eabb870d8614a83bfb4ad5c5e0034d140b5c0c2ced0bc5112c98b9ddf 295 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x9ebd146c533043628ab4Df558938EE22524952C5 0 0xfdacd576 transfer -acf339e3-bf41-4077-baca-1229f37ea5d3 0 0xd76d113326843ff326a9d4d5ed411d090f95c4be03ff42f2344d67b4bb56f6f4 297 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0 0x60806040 transfer -6463548a-672b-4817-bff2-681b3af191ac 0 0x9ebe3c70b0d3334a8e3a6ca483555d37b05d5ebc08df3ba089036baf79785861 299 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x9ebd146c533043628ab4Df558938EE22524952C5 0 0xfdacd576 transfer -17375186-5380-49a3-b02a-e24777fcf059 0 0xc651f5e517016dad30cc71ed3b21e66839f0163d1c5659c813f65434edc1809f 310 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0 0x60806040 transfer -69c17a2a-2cb1-4847-8e66-3c90c6c7e0da 0 0xf9903089546f292692b1cff9037b92ef8dfc8c7e3a9d975123692c99d5569b9a 311 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x32E14237A9146224772215C639AFc15890fB2bF3 0 0xfdacd576 transfer -1da16038-56bf-4ab9-ba1b-cd49dc819e99 0 0xd2bc8eb60dbdd964672a89275e2d6a6936fab8429b384dd07a257e88c46278eb 312 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0 0x60806040 transfer -05beaadf-f07c-405a-a6ee-288ee11e3702 0 0xa281bd2ad5b5a5d91b4f9ab46793d2a6fdcdb06cc7137fa0a36281b4f601dc5e 313 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x32E14237A9146224772215C639AFc15890fB2bF3 0 0xfdacd576 transfer -fae6b540-702a-4821-a9e1-4dbcbd444a00 0 0x616573e4633b8a0c8ecfeeaba9de75cde12fa97d6d661f7af48288918909d584 331 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -875e6ff1-5239-490e-90f8-562bb54e55f9 0 0x99ae4aaab101c210f72da85870c3e13f4ea5f5a38d6ed66f0a4da5b13cb82268 335 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x829acf68 issueBond -e542d5d4-2ea7-4e30-9484-0a5750bcce38 0 0x455028c4b048717f73bb2a36bff0ecb0d594b18669f76485c3f11118a11a304f 337 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x42842e0e safeTransferFrom -54f6d2a1-0a6b-4dda-bfc3-924e96647092 0 0x31e23a98f08cd4a900779d059e765ffecd0bc347f57f981c4d41a57202654ac0 338 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -25dabeec-9dae-44c0-8b15-72fe0fc26eed 0 0xc6d7ff6ff4b99cea3f3970bf7106a9c88b445c8d31bbaf24cf3fa676b966748e 343 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -ccefbd9a-6a47-4781-911d-7312f7af1b46 0 0x660f706cf14618a7c4a3420c7e5650a9c9014837e04fc53c4e88350a3649ff0f 376 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -13c6e6bc-9d85-4bfc-acde-ab430552b5f2 0 0xba2ee9c39a37959e8d95e321e6f5992b1c087d57f7a20a107b026ef4babb1b89 378 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x829acf68 issueBond -e1135881-1f0d-493a-8543-0a62b70c5779 0 0xe31a12f3d7b9710d192f1bf9bafabbecb531997a8a943b613945409a4688e991 385 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x829acf68 issueBond -42605284-c4a9-469a-85eb-061ae18d1730 0 0x7e290c04b8fa28315a95053b594766a05df859451b5d4ce728de608e718a56d8 390 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x42842e0e safeTransferFrom -4059a62d-e253-4004-af0f-99838eb7ccc5 1 0x1720578e8e53ea9caa6f54e006d1043f2ae164f26afa50a0d32064dcabcc690e 390 0xEC709e1774f0cE4ABA47b52A499F9aBaaa159f71 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -69905af0-6115-4d3b-9d30-58879bc093f3 0 0xc9b3e27f6f04284c975f363a2932ad9361cdc445f4ff8f257ebb6c03a5ee895b 394 0x06fC56347D91C6aD2dAE0c3ba38Eb12AB0D72E97 0x585Aca7D7B733B441238D2f36230e39FE643795D 0 0xa9059cbb transfer -c1934b6b-7ccc-4650-a0a1-9309caa8ea9e 0 0x5acbb54a02a2580d6d4ef46db56457fcd290d38f434aa2f6c5f86be2e8607bc3 396 0x2666A32bF7594ab5395D766DCFBF03d557dAB538 0x290A8449050FAc54BBe1f23510B46b541C54A369 0 0x42842e0e safeTransferFrom -\. - - --- --- TOC entry 3743 (class 2606 OID 18142) --- Name: block block_hash_key; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.block - ADD CONSTRAINT block_hash_key UNIQUE (hash); - - --- --- TOC entry 3745 (class 2606 OID 18144) --- Name: block block_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.block - ADD CONSTRAINT block_pkey PRIMARY KEY (number); - - --- --- TOC entry 3757 (class 2606 OID 18146) --- Name: plugin_status plugin_status_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.plugin_status - ADD CONSTRAINT plugin_status_pkey PRIMARY KEY (name); - - --- --- TOC entry 3747 (class 2606 OID 18148) --- Name: token_metadata_erc20 token_erc20_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_metadata_erc20 - ADD CONSTRAINT token_erc20_pkey PRIMARY KEY (address); - - --- --- TOC entry 3760 (class 2606 OID 18150) --- Name: token_erc721 token_erc721_contract_tokens_unique; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_erc721 - ADD CONSTRAINT token_erc721_contract_tokens_unique UNIQUE (token_address, token_id); - - --- --- TOC entry 3755 (class 2606 OID 18152) --- Name: token_metadata_erc721 token_erc721_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_metadata_erc721 - ADD CONSTRAINT token_erc721_pkey PRIMARY KEY (address); - - --- --- TOC entry 3762 (class 2606 OID 18154) --- Name: token_erc721 token_erc721_pkey1; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_erc721 - ADD CONSTRAINT token_erc721_pkey1 PRIMARY KEY (id); - - --- --- TOC entry 3749 (class 2606 OID 18156) --- Name: token_transfer token_transfer_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_transfer - ADD CONSTRAINT token_transfer_pkey PRIMARY KEY (id); - - --- --- TOC entry 3751 (class 2606 OID 18158) --- Name: transaction transaction_hash_key; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.transaction - ADD CONSTRAINT transaction_hash_key UNIQUE (hash); - - --- --- TOC entry 3753 (class 2606 OID 18160) --- Name: transaction transaction_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.transaction - ADD CONSTRAINT transaction_pkey PRIMARY KEY (id); - - --- --- TOC entry 3758 (class 1259 OID 18161) --- Name: token_erc20_uniq_idx; Type: INDEX; Schema: public; Owner: postgres --- - -CREATE UNIQUE INDEX token_erc20_uniq_idx ON public.token_erc20 USING btree (account_address, token_address); - - --- --- TOC entry 3765 (class 2606 OID 18162) --- Name: token_erc721 token_erc721_token_address_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_erc721 - ADD CONSTRAINT token_erc721_token_address_fkey FOREIGN KEY (token_address) REFERENCES public.token_metadata_erc721(address); - - --- --- TOC entry 3763 (class 2606 OID 18202) --- Name: token_transfer token_transfer_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.token_transfer - ADD CONSTRAINT token_transfer_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transaction(id); - - --- --- TOC entry 3764 (class 2606 OID 18172) --- Name: transaction transaction_block_number_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres --- - -ALTER TABLE ONLY public.transaction - ADD CONSTRAINT transaction_block_number_fkey FOREIGN KEY (block_number) REFERENCES public.block(number); - - --- --- TOC entry 3937 (class 0 OID 0) --- Dependencies: 14 --- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres --- - -REVOKE USAGE ON SCHEMA public FROM PUBLIC; -GRANT ALL ON SCHEMA public TO PUBLIC; -GRANT USAGE ON SCHEMA public TO anon; -GRANT USAGE ON SCHEMA public TO authenticated; -GRANT USAGE ON SCHEMA public TO service_role; - - --- --- TOC entry 3938 (class 0 OID 0) --- Dependencies: 607 --- Name: FUNCTION get_missing_blocks_in_range(start_number integer, end_number integer); Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON FUNCTION public.get_missing_blocks_in_range(start_number integer, end_number integer) TO anon; -GRANT ALL ON FUNCTION public.get_missing_blocks_in_range(start_number integer, end_number integer) TO authenticated; -GRANT ALL ON FUNCTION public.get_missing_blocks_in_range(start_number integer, end_number integer) TO service_role; - - --- --- TOC entry 3939 (class 0 OID 0) --- Dependencies: 608 --- Name: PROCEDURE update_issued_erc721_tokens(IN from_block_number numeric); Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) TO anon; -GRANT ALL ON PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) TO authenticated; -GRANT ALL ON PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) TO service_role; -GRANT ALL ON PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) TO supabase_admin; - - --- --- TOC entry 3940 (class 0 OID 0) --- Dependencies: 274 --- Name: TABLE block; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.block TO anon; -GRANT ALL ON TABLE public.block TO authenticated; -GRANT ALL ON TABLE public.block TO service_role; - - --- --- TOC entry 3941 (class 0 OID 0) --- Dependencies: 275 --- Name: TABLE token_metadata_erc20; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.token_metadata_erc20 TO anon; -GRANT ALL ON TABLE public.token_metadata_erc20 TO authenticated; -GRANT ALL ON TABLE public.token_metadata_erc20 TO service_role; - - --- --- TOC entry 3943 (class 0 OID 0) --- Dependencies: 276 --- Name: TABLE token_transfer; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.token_transfer TO anon; -GRANT ALL ON TABLE public.token_transfer TO authenticated; -GRANT ALL ON TABLE public.token_transfer TO service_role; - - --- --- TOC entry 3944 (class 0 OID 0) --- Dependencies: 277 --- Name: TABLE transaction; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.transaction TO anon; -GRANT ALL ON TABLE public.transaction TO authenticated; -GRANT ALL ON TABLE public.transaction TO service_role; - - --- --- TOC entry 3945 (class 0 OID 0) --- Dependencies: 278 --- Name: TABLE erc20_token_history_view; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.erc20_token_history_view TO anon; -GRANT ALL ON TABLE public.erc20_token_history_view TO authenticated; -GRANT ALL ON TABLE public.erc20_token_history_view TO service_role; -GRANT ALL ON TABLE public.erc20_token_history_view TO supabase_admin; - - --- --- TOC entry 3946 (class 0 OID 0) --- Dependencies: 279 --- Name: TABLE token_metadata_erc721; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.token_metadata_erc721 TO anon; -GRANT ALL ON TABLE public.token_metadata_erc721 TO authenticated; -GRANT ALL ON TABLE public.token_metadata_erc721 TO service_role; - - --- --- TOC entry 3947 (class 0 OID 0) --- Dependencies: 280 --- Name: TABLE erc721_token_history_view; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.erc721_token_history_view TO anon; -GRANT ALL ON TABLE public.erc721_token_history_view TO authenticated; -GRANT ALL ON TABLE public.erc721_token_history_view TO service_role; -GRANT ALL ON TABLE public.erc721_token_history_view TO supabase_admin; - - --- --- TOC entry 3948 (class 0 OID 0) --- Dependencies: 283 --- Name: TABLE token_erc721; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.token_erc721 TO anon; -GRANT ALL ON TABLE public.token_erc721 TO authenticated; -GRANT ALL ON TABLE public.token_erc721 TO service_role; - - --- --- TOC entry 3949 (class 0 OID 0) --- Dependencies: 284 --- Name: TABLE erc721_txn_meta_view; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.erc721_txn_meta_view TO anon; -GRANT ALL ON TABLE public.erc721_txn_meta_view TO authenticated; -GRANT ALL ON TABLE public.erc721_txn_meta_view TO service_role; - - --- --- TOC entry 3950 (class 0 OID 0) --- Dependencies: 281 --- Name: TABLE plugin_status; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.plugin_status TO anon; -GRANT ALL ON TABLE public.plugin_status TO authenticated; -GRANT ALL ON TABLE public.plugin_status TO service_role; - - --- --- TOC entry 3951 (class 0 OID 0) --- Dependencies: 282 --- Name: TABLE token_erc20; Type: ACL; Schema: public; Owner: postgres --- - -GRANT ALL ON TABLE public.token_erc20 TO anon; -GRANT ALL ON TABLE public.token_erc20 TO authenticated; -GRANT ALL ON TABLE public.token_erc20 TO service_role; - - --- --- TOC entry 2579 (class 826 OID 18177) --- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role; - - --- --- TOC entry 2580 (class 826 OID 18178) --- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role; - - --- --- TOC entry 2581 (class 826 OID 18179) --- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres --- - -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO anon; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated; -ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role; - - --- --- TOC entry 3929 (class 0 OID 18127) --- Dependencies: 282 3932 --- Name: token_erc20; Type: MATERIALIZED VIEW DATA; Schema: public; Owner: postgres --- - -REFRESH MATERIALIZED VIEW public.token_erc20; - - --- Completed on 2023-01-03 11:30:12 UTC - --- --- PostgreSQL database dump complete --- \ No newline at end of file diff --git a/packages/cactus-plugin-persistence-ethereum/README.md b/packages/cactus-plugin-persistence-ethereum/README.md index e3db7cec59..c01cca33ad 100644 --- a/packages/cactus-plugin-persistence-ethereum/README.md +++ b/packages/cactus-plugin-persistence-ethereum/README.md @@ -171,6 +171,15 @@ To run all the tests for this persistence plugin to ensure it's working correctl npx jest cactus-plugin-persistence-ethereum ``` +### Manual test + +You can use `sample-persistence-plugin-setup.js` script to perform full end-to-end test of the persistence plugin. + +```sh +SUPABASE_CONNECTION_STRING="" node packages/cactus-plugin-persistence-ethereum/dist/lib/test/typescript/manual/sample-persistence-plugin-setup.js +# Or use ts-node / tsx to run typescript file directly. +``` + ## Contributing We welcome contributions to Hyperledger Cactus in many forms, and there’s always plenty to do! diff --git a/packages/cactus-plugin-persistence-ethereum/package.json b/packages/cactus-plugin-persistence-ethereum/package.json index 87ba2a40c0..d892ef364d 100644 --- a/packages/cactus-plugin-persistence-ethereum/package.json +++ b/packages/cactus-plugin-persistence-ethereum/package.json @@ -67,7 +67,7 @@ "pg": "8.8.0", "run-time-error-cjs": "1.4.0", "uuid": "9.0.1", - "web3-utils": "4.2.1", + "web3-utils": "4.3.0", "web3-validator": "2.0.2" }, "devDependencies": { diff --git a/packages/cactus-plugin-persistence-ethereum/src/main/sql/schema.sql b/packages/cactus-plugin-persistence-ethereum/src/main/sql/schema.sql index f57f7b4ab0..441c614b9d 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/main/sql/schema.sql +++ b/packages/cactus-plugin-persistence-ethereum/src/main/sql/schema.sql @@ -1,8 +1,9 @@ --- Version: 0.3 +--- Clean start: +--- DROP SCHEMA ethereum CASCADE; ----------------------------------------------------------------------------------------------------- --- TABLES ----------------------------------------------------------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS ethereum; + +ALTER SCHEMA ethereum OWNER TO postgres; -- Table: public.plugin_status @@ -25,18 +26,15 @@ ALTER TABLE IF EXISTS public.plugin_status OWNER to postgres; GRANT ALL ON TABLE public.plugin_status TO anon; - GRANT ALL ON TABLE public.plugin_status TO authenticated; - GRANT ALL ON TABLE public.plugin_status TO postgres; - GRANT ALL ON TABLE public.plugin_status TO service_role; --- Table: public.block +-- Table: ethereum.block --- DROP TABLE IF EXISTS public.block; +-- DROP TABLE IF EXISTS ethereum.block; -CREATE TABLE IF NOT EXISTS public.block +CREATE TABLE IF NOT EXISTS ethereum.block ( "number" numeric NOT NULL, created_at timestamp without time zone NOT NULL, @@ -46,26 +44,16 @@ CREATE TABLE IF NOT EXISTS public.block CONSTRAINT block_pkey PRIMARY KEY ("number"), CONSTRAINT block_hash_key UNIQUE (hash), CONSTRAINT block_number_key UNIQUE ("number") -) - -TABLESPACE pg_default; +); -ALTER TABLE IF EXISTS public.block +ALTER TABLE IF EXISTS ethereum.block OWNER to postgres; -GRANT ALL ON TABLE public.block TO anon; - -GRANT ALL ON TABLE public.block TO authenticated; - -GRANT ALL ON TABLE public.block TO postgres; +-- Table: ethereum.token_metadata_erc20 -GRANT ALL ON TABLE public.block TO service_role; +-- DROP TABLE IF EXISTS ethereum."token_metadata_erc20"; --- Table: public.token_metadata_erc20 - --- DROP TABLE IF EXISTS public."token_metadata_erc20"; - -CREATE TABLE IF NOT EXISTS public."token_metadata_erc20" +CREATE TABLE IF NOT EXISTS ethereum."token_metadata_erc20" ( address text COLLATE pg_catalog."default" NOT NULL, created_at timestamp with time zone NOT NULL DEFAULT now(), @@ -74,26 +62,16 @@ CREATE TABLE IF NOT EXISTS public."token_metadata_erc20" total_supply numeric NOT NULL, CONSTRAINT "token_erc20_pkey" PRIMARY KEY (address), CONSTRAINT token_erc20_address_key UNIQUE (address) -) +); -TABLESPACE pg_default; - -ALTER TABLE IF EXISTS public."token_metadata_erc20" +ALTER TABLE IF EXISTS ethereum."token_metadata_erc20" OWNER to postgres; -GRANT ALL ON TABLE public."token_metadata_erc20" TO anon; - -GRANT ALL ON TABLE public."token_metadata_erc20" TO authenticated; +-- Table: ethereum.token_metadata_erc721 -GRANT ALL ON TABLE public."token_metadata_erc20" TO postgres; +-- DROP TABLE IF EXISTS ethereum."token_metadata_erc721"; -GRANT ALL ON TABLE public."token_metadata_erc20" TO service_role; - --- Table: public.token_metadata_erc721 - --- DROP TABLE IF EXISTS public."token_metadata_erc721"; - -CREATE TABLE IF NOT EXISTS public."token_metadata_erc721" +CREATE TABLE IF NOT EXISTS ethereum."token_metadata_erc721" ( address text COLLATE pg_catalog."default" NOT NULL, created_at timestamp with time zone NOT NULL DEFAULT now(), @@ -101,26 +79,16 @@ CREATE TABLE IF NOT EXISTS public."token_metadata_erc721" symbol text COLLATE pg_catalog."default" NOT NULL, CONSTRAINT "token_erc721_pkey" PRIMARY KEY (address), CONSTRAINT token_erc721_address_key UNIQUE (address) -) +); -TABLESPACE pg_default; - -ALTER TABLE IF EXISTS public."token_metadata_erc721" +ALTER TABLE IF EXISTS ethereum."token_metadata_erc721" OWNER to postgres; -GRANT ALL ON TABLE public."token_metadata_erc721" TO anon; - -GRANT ALL ON TABLE public."token_metadata_erc721" TO authenticated; - -GRANT ALL ON TABLE public."token_metadata_erc721" TO postgres; +-- Table: ethereum.token_erc721 -GRANT ALL ON TABLE public."token_metadata_erc721" TO service_role; +-- DROP TABLE IF EXISTS ethereum.token_erc721; --- Table: public.token_erc721 - --- DROP TABLE IF EXISTS public.token_erc721; - -CREATE TABLE IF NOT EXISTS public.token_erc721 +CREATE TABLE IF NOT EXISTS ethereum.token_erc721 ( id uuid NOT NULL DEFAULT uuid_generate_v4(), account_address text COLLATE pg_catalog."default" NOT NULL, @@ -131,29 +99,20 @@ CREATE TABLE IF NOT EXISTS public.token_erc721 CONSTRAINT token_erc721_pkey1 PRIMARY KEY (id), CONSTRAINT token_erc721_contract_tokens_unique UNIQUE (token_address, token_id), CONSTRAINT token_erc721_token_address_fkey FOREIGN KEY (token_address) - REFERENCES public.token_metadata_erc721 (address) MATCH SIMPLE + REFERENCES ethereum.token_metadata_erc721 (address) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION -) +); -TABLESPACE pg_default; -ALTER TABLE IF EXISTS public.token_erc721 +ALTER TABLE IF EXISTS ethereum.token_erc721 OWNER to postgres; -GRANT ALL ON TABLE public.token_erc721 TO anon; - -GRANT ALL ON TABLE public.token_erc721 TO authenticated; - -GRANT ALL ON TABLE public.token_erc721 TO postgres; - -GRANT ALL ON TABLE public.token_erc721 TO service_role; - --- Table: public.transaction +-- Table: ethereum.transaction --- DROP TABLE IF EXISTS public.transaction; +-- DROP TABLE IF EXISTS ethereum.transaction; -CREATE TABLE IF NOT EXISTS public.transaction +CREATE TABLE IF NOT EXISTS ethereum.transaction ( id uuid NOT NULL DEFAULT uuid_generate_v4(), index numeric NOT NULL, @@ -167,29 +126,19 @@ CREATE TABLE IF NOT EXISTS public.transaction CONSTRAINT transaction_pkey PRIMARY KEY (id), CONSTRAINT transaction_hash_key UNIQUE (hash), CONSTRAINT transaction_block_number_fkey FOREIGN KEY (block_number) - REFERENCES public.block ("number") MATCH SIMPLE + REFERENCES ethereum.block ("number") MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION -) - -TABLESPACE pg_default; +); -ALTER TABLE IF EXISTS public.transaction +ALTER TABLE IF EXISTS ethereum.transaction OWNER to postgres; -GRANT ALL ON TABLE public.transaction TO anon; - -GRANT ALL ON TABLE public.transaction TO authenticated; - -GRANT ALL ON TABLE public.transaction TO postgres; +-- Table: ethereum.token_transfer -GRANT ALL ON TABLE public.transaction TO service_role; +-- DROP TABLE IF EXISTS ethereum.token_transfer; --- Table: public.token_transfer - --- DROP TABLE IF EXISTS public.token_transfer; - -CREATE TABLE IF NOT EXISTS public.token_transfer +CREATE TABLE IF NOT EXISTS ethereum.token_transfer ( id uuid NOT NULL DEFAULT uuid_generate_v4(), transaction_id uuid NOT NULL, @@ -198,36 +147,26 @@ CREATE TABLE IF NOT EXISTS public.token_transfer value numeric NOT NULL, CONSTRAINT token_transfer_pkey PRIMARY KEY (id), CONSTRAINT token_transfer_transaction_id_fkey FOREIGN KEY (transaction_id) - REFERENCES public.transaction (id) MATCH SIMPLE + REFERENCES ethereum.transaction (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION -) - -TABLESPACE pg_default; +); -ALTER TABLE IF EXISTS public.token_transfer +ALTER TABLE IF EXISTS ethereum.token_transfer OWNER to postgres; -GRANT ALL ON TABLE public.token_transfer TO anon; - -GRANT ALL ON TABLE public.token_transfer TO authenticated; - -GRANT ALL ON TABLE public.token_transfer TO postgres; - -GRANT ALL ON TABLE public.token_transfer TO service_role; - -COMMENT ON COLUMN public.token_transfer.value +COMMENT ON COLUMN ethereum.token_transfer.value IS 'ERC20 - token quantity, ERC721 - token ID'; ---------------------------------------------------------------------------------------------------- -- VIEWS ---------------------------------------------------------------------------------------------------- --- View: public.erc20_token_history_view +-- View: ethereum.erc20_token_history_view --- DROP VIEW public.erc20_token_history_view; +-- DROP VIEW ethereum.erc20_token_history_view; -CREATE OR REPLACE VIEW public.erc20_token_history_view +CREATE OR REPLACE VIEW ethereum.erc20_token_history_view AS SELECT tx.hash AS transaction_hash, @@ -236,24 +175,20 @@ CREATE OR REPLACE VIEW public.erc20_token_history_view tt.sender, tt.recipient, tt.value - FROM transaction tx - JOIN block b ON tx.block_number = b.number - JOIN token_transfer tt ON tx.id = tt.transaction_id - JOIN token_metadata_erc20 tkn ON tx.to = tkn.address + FROM ethereum.transaction tx + JOIN ethereum.block b ON tx.block_number = b.number + JOIN ethereum.token_transfer tt ON tx.id = tt.transaction_id + JOIN ethereum.token_metadata_erc20 tkn ON tx.to = tkn.address ORDER BY b.created_at, tt.recipient; -ALTER TABLE public.erc20_token_history_view +ALTER TABLE ethereum.erc20_token_history_view OWNER TO postgres; -GRANT ALL ON TABLE public.erc20_token_history_view TO anon; -GRANT ALL ON TABLE public.erc20_token_history_view TO authenticated; -GRANT ALL ON TABLE public.erc20_token_history_view TO postgres; -GRANT ALL ON TABLE public.erc20_token_history_view TO service_role; --- View: public.erc721_token_history_view +-- View: ethereum.erc721_token_history_view --- DROP VIEW public.erc721_token_history_view; +-- DROP VIEW ethereum.erc721_token_history_view; -CREATE OR REPLACE VIEW public.erc721_token_history_view +CREATE OR REPLACE VIEW ethereum.erc721_token_history_view AS SELECT tx.hash AS transaction_hash, tx."to" AS token_address, @@ -261,46 +196,20 @@ CREATE OR REPLACE VIEW public.erc721_token_history_view tt.sender, tt.recipient, tt.value AS token_id - FROM transaction tx - JOIN block b ON tx.block_number = b.number - JOIN token_transfer tt ON tx.id = tt.transaction_id - JOIN token_metadata_erc721 tkn ON tx."to" = tkn.address + FROM ethereum.transaction tx + JOIN ethereum.block b ON tx.block_number = b.number + JOIN ethereum.token_transfer tt ON tx.id = tt.transaction_id + JOIN ethereum.token_metadata_erc721 tkn ON tx."to" = tkn.address ORDER BY b.created_at, tt.recipient; -ALTER TABLE public.erc721_token_history_view +ALTER TABLE ethereum.erc721_token_history_view OWNER TO postgres; -GRANT ALL ON TABLE public.erc721_token_history_view TO anon; -GRANT ALL ON TABLE public.erc721_token_history_view TO authenticated; -GRANT ALL ON TABLE public.erc721_token_history_view TO postgres; -GRANT ALL ON TABLE public.erc721_token_history_view TO service_role; - --- View: public.erc721_txn_meta_view - --- DROP VIEW public.erc721_txn_meta_view; - -CREATE OR REPLACE VIEW public.erc721_txn_meta_view - AS - SELECT token_erc721.account_address, - token_erc721.token_address, - token_erc721.uri, - token_metadata_erc721.symbol - FROM token_erc721 - LEFT JOIN token_metadata_erc721 ON token_erc721.token_address = token_metadata_erc721.address; - -ALTER TABLE public.erc721_txn_meta_view - OWNER TO postgres; - -GRANT ALL ON TABLE public.erc721_txn_meta_view TO anon; -GRANT ALL ON TABLE public.erc721_txn_meta_view TO authenticated; -GRANT ALL ON TABLE public.erc721_txn_meta_view TO postgres; -GRANT ALL ON TABLE public.erc721_txn_meta_view TO service_role; - --- View: public.token_erc20 +-- View: ethereum.token_erc20 --- DROP MATERIALIZED VIEW IF EXISTS public.token_erc20; +-- DROP MATERIALIZED VIEW IF EXISTS ethereum.token_erc20; -CREATE MATERIALIZED VIEW IF NOT EXISTS public.token_erc20 +CREATE MATERIALIZED VIEW IF NOT EXISTS ethereum.token_erc20 TABLESPACE pg_default AS SELECT @@ -317,45 +226,26 @@ FROM FROM ( SELECT erc20_token_history_view.recipient AS account_address, erc20_token_history_view.token_address, sum(erc20_token_history_view.value) AS balance - FROM erc20_token_history_view + FROM ethereum.erc20_token_history_view GROUP BY erc20_token_history_view.token_address, erc20_token_history_view.recipient UNION SELECT erc20_token_history_view.sender AS account_address, erc20_token_history_view.token_address, - sum(erc20_token_history_view.value) AS balance - FROM erc20_token_history_view + FROM ethereum.erc20_token_history_view GROUP BY erc20_token_history_view.token_address, erc20_token_history_view.sender) balances GROUP BY balances.token_address, balances.account_address HAVING sum(balances.balance) >= 0::numeric) AS balances - JOIN token_metadata_erc20 AS metadata ON balances.token_address = metadata.address + JOIN ethereum.token_metadata_erc20 AS metadata ON balances.token_address = metadata.address WITH DATA; --- Refresh public.token_erc20 on new token transfers -CREATE OR REPLACE FUNCTION refresh_token_erc20() -RETURNS TRIGGER AS $$ -BEGIN - REFRESH MATERIALIZED VIEW public.token_erc20; - RETURN NULL; -END; -$$ LANGUAGE plpgsql; - -CREATE TRIGGER refresh_token_erc20_on_token_transfers_trigger -AFTER INSERT OR UPDATE OR DELETE ON public.token_transfer -FOR EACH STATEMENT -EXECUTE FUNCTION refresh_token_erc20(); - -CREATE INDEX token_erc20_account_address_idx ON public.token_erc20(account_address); - -ALTER TABLE IF EXISTS public.token_erc20 +ALTER TABLE IF EXISTS ethereum.token_erc20 OWNER TO postgres; -GRANT ALL ON TABLE public.token_erc20 TO anon; -GRANT ALL ON TABLE public.token_erc20 TO authenticated; -GRANT ALL ON TABLE public.token_erc20 TO postgres; -GRANT ALL ON TABLE public.token_erc20 TO service_role; +CREATE INDEX token_erc20_account_address_idx ON ethereum.token_erc20(account_address); CREATE UNIQUE INDEX token_erc20_uniq_idx - ON public.token_erc20 USING btree + ON ethereum.token_erc20 USING btree (account_address COLLATE pg_catalog."default", token_address COLLATE pg_catalog."default") TABLESPACE pg_default; @@ -363,20 +253,34 @@ CREATE UNIQUE INDEX token_erc20_uniq_idx -- FUNCTIONS AND PROCEDURES ---------------------------------------------------------------------------------------------------- --- PROCEDURE: public.update_issued_erc721_tokens(numeric) +-- Refresh ethereum.token_erc20 on new token transfers +CREATE OR REPLACE FUNCTION refresh_token_erc20() +RETURNS TRIGGER AS $$ +BEGIN + REFRESH MATERIALIZED VIEW ethereum.token_erc20; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER refresh_token_erc20_on_token_transfers_trigger +AFTER INSERT OR UPDATE OR DELETE ON ethereum.token_transfer +FOR EACH STATEMENT +EXECUTE FUNCTION refresh_token_erc20(); --- DROP PROCEDURE IF EXISTS public.update_issued_erc721_tokens(numeric); +-- PROCEDURE: ethereum.update_issued_erc721_tokens(numeric) -CREATE OR REPLACE PROCEDURE public.update_issued_erc721_tokens(IN from_block_number numeric) +-- DROP PROCEDURE IF EXISTS ethereum.update_issued_erc721_tokens(numeric); + +CREATE OR REPLACE PROCEDURE ethereum.update_issued_erc721_tokens(IN from_block_number numeric) LANGUAGE 'plpgsql' AS $BODY$ DECLARE - current_token_entry token_erc721%ROWTYPE; + current_token_entry ethereum.token_erc721%ROWTYPE; token_transfer record; block_created_at timestamp; BEGIN SELECT created_at - FROM block + FROM ethereum.block WHERE number = from_block_number INTO block_created_at; @@ -387,18 +291,18 @@ BEGIN FOR token_transfer IN SELECT DISTINCT ON (token_address, token_id) * - FROM erc721_token_history_view + FROM ethereum.erc721_token_history_view WHERE created_at >= block_created_at ORDER BY token_address, token_id, created_at DESC LOOP - SELECT * FROM token_erc721 + SELECT * FROM ethereum.token_erc721 WHERE token_id = token_transfer.token_id AND token_address = token_transfer.token_address INTO current_token_entry; IF NOT found THEN raise notice 'create entry for new token ID % on contract %', token_transfer.token_id, token_transfer.token_address; INSERT INTO - token_erc721 + ethereum.token_erc721 VALUES ( uuid_generate_v4(), @@ -412,7 +316,7 @@ BEGIN IF current_token_entry.last_owner_change < token_transfer.created_at THEN raise notice 'update owner on token ID % on contract %', token_transfer.token_id, token_transfer.token_address; - UPDATE token_erc721 + UPDATE ethereum.token_erc721 SET account_address = token_transfer.recipient, last_owner_change = token_transfer.created_at WHERE id = current_token_entry.id; @@ -424,26 +328,16 @@ BEGIN END $BODY$; -ALTER PROCEDURE public.update_issued_erc721_tokens(numeric) +ALTER PROCEDURE ethereum.update_issued_erc721_tokens(numeric) OWNER TO postgres; -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO public; - -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO anon; - -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO authenticated; - -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO postgres; - -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO service_role; +GRANT EXECUTE ON PROCEDURE ethereum.update_issued_erc721_tokens(numeric) TO public; -GRANT EXECUTE ON PROCEDURE public.update_issued_erc721_tokens(numeric) TO supabase_admin; +-- FUNCTION: ethereum.get_missing_blocks_in_range(integer, integer) --- FUNCTION: public.get_missing_blocks_in_range(integer, integer) +-- DROP FUNCTION IF EXISTS ethereum.get_missing_blocks_in_range(integer, integer); --- DROP FUNCTION IF EXISTS public.get_missing_blocks_in_range(integer, integer); - -CREATE OR REPLACE FUNCTION public.get_missing_blocks_in_range( +CREATE OR REPLACE FUNCTION ethereum.get_missing_blocks_in_range( start_number integer, end_number integer) RETURNS TABLE(block_number integer) @@ -456,20 +350,12 @@ BEGIN RETURN query SELECT series AS block_number FROM generate_series(start_number, end_number, 1) series - LEFT JOIN public.block ON series = block.number + LEFT JOIN ethereum.block ON series = block.number WHERE block.number IS NULL; END; $BODY$; -ALTER FUNCTION public.get_missing_blocks_in_range(integer, integer) +ALTER FUNCTION ethereum.get_missing_blocks_in_range(integer, integer) OWNER TO postgres; -GRANT EXECUTE ON FUNCTION public.get_missing_blocks_in_range(integer, integer) TO PUBLIC; - -GRANT EXECUTE ON FUNCTION public.get_missing_blocks_in_range(integer, integer) TO anon; - -GRANT EXECUTE ON FUNCTION public.get_missing_blocks_in_range(integer, integer) TO authenticated; - -GRANT EXECUTE ON FUNCTION public.get_missing_blocks_in_range(integer, integer) TO postgres; - -GRANT EXECUTE ON FUNCTION public.get_missing_blocks_in_range(integer, integer) TO service_role; +GRANT EXECUTE ON PROCEDURE ethereum.update_issued_erc721_tokens(numeric) TO public; diff --git a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/database.types.ts b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/database.types.ts index 676eb4a928..61f626d6e5 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/database.types.ts +++ b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/database.types.ts @@ -7,7 +7,7 @@ export type Json = | Json[]; export interface Database { - public: { + ethereum: { Tables: { block: { Row: { diff --git a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/db-client.ts b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/db-client.ts index 0d41f41f06..c7be13df7b 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/db-client.ts +++ b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/db-client/db-client.ts @@ -21,7 +21,7 @@ import { RuntimeError } from "run-time-error-cjs"; // Helper Types ////////////////////////////////// -type SchemaTables = DatabaseSchemaType["public"]["Tables"]; +type SchemaTables = DatabaseSchemaType["ethereum"]["Tables"]; type PluginStatusRowType = SchemaTables["plugin_status"]["Row"]; type BlockRowType = SchemaTables["block"]["Row"]; type BlockInsertType = SchemaTables["block"]["Insert"]; @@ -36,7 +36,7 @@ type TokenMetadataERC721RowType = SchemaTables["token_metadata_erc721"]["Row"]; type TokenMetadataERC721InsertType = SchemaTables["token_metadata_erc721"]["Insert"]; -type SchemaFunctions = DatabaseSchemaType["public"]["Functions"]; +type SchemaFunctions = DatabaseSchemaType["ethereum"]["Functions"]; type GetMissingBlocksInRangeReturnType = SchemaFunctions["get_missing_blocks_in_range"]["Returns"]; @@ -227,7 +227,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.token_metadata_erc20", + "SELECT * FROM ethereum.token_metadata_erc20", ); this.log.debug( `Received ${queryResponse.rowCount} rows from table token_metadata_erc20`, @@ -246,7 +246,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert ERC20 token metadata:", token); const insertResponse = await this.client.query( - `INSERT INTO public.token_metadata_erc20("address", "name", "symbol", "total_supply") VALUES ($1, $2, $3, $4)`, + `INSERT INTO ethereum.token_metadata_erc20("address", "name", "symbol", "total_supply") VALUES ($1, $2, $3, $4)`, [token.address, token.name, token.symbol, token.total_supply], ); this.log.info( @@ -262,7 +262,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.token_metadata_erc721", + "SELECT * FROM ethereum.token_metadata_erc721", ); this.log.debug( `Received ${queryResponse.rowCount} rows from table token_metadata_erc721`, @@ -281,7 +281,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert ERC721 token metadata:", token); const insertResponse = await this.client.query( - `INSERT INTO public.token_metadata_erc721("address", "name", "symbol") VALUES ($1, $2, $3)`, + `INSERT INTO ethereum.token_metadata_erc721("address", "name", "symbol") VALUES ($1, $2, $3)`, [token.address, token.name, token.symbol], ); this.log.info( @@ -298,7 +298,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert ERC721 token if not present yet:", token); const insertResponse = await this.client.query( - `INSERT INTO public.token_erc721("account_address", "token_address", "uri", "token_id") + `INSERT INTO ethereum.token_erc721("account_address", "token_address", "uri", "token_id") VALUES ($1, $2, $3, $4) ON CONFLICT ON CONSTRAINT token_erc721_contract_tokens_unique DO @@ -319,7 +319,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.token_erc20", + "SELECT * FROM ethereum.token_erc20", ); this.log.debug( `Received ${queryResponse.rowCount} rows from table token_erc20`, @@ -335,7 +335,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.token_erc721", + "SELECT * FROM ethereum.token_erc721", ); this.log.debug( `Received ${queryResponse.rowCount} rows from table token_erc721`, @@ -350,9 +350,9 @@ export default class PostgresDatabaseClient { this.assertConnected(); await this.client.query( - "REFRESH MATERIALIZED VIEW CONCURRENTLY public.token_erc20", + "REFRESH MATERIALIZED VIEW CONCURRENTLY ethereum.token_erc20", ); - this.log.debug("Refreshing view public.token_erc20 done"); + this.log.debug("Refreshing view ethereum.token_erc20 done"); } /** @@ -366,7 +366,7 @@ export default class PostgresDatabaseClient { fromBlockNumber, ); - await this.client.query("CALL update_issued_erc721_tokens($1);", [ + await this.client.query("CALL ethereum.update_issued_erc721_tokens($1);", [ fromBlockNumber, ]); this.log.debug("Calling update_issued_erc721_tokens procedure done."); @@ -382,7 +382,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.block WHERE number = $1", + "SELECT * FROM ethereum.block WHERE number = $1", [blockNumber], ); @@ -412,7 +412,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert new block", block); const blockInsertResponse = await this.client.query( - `INSERT INTO public.block("number", "created_at", "hash", "number_of_tx") + `INSERT INTO ethereum.block("number", "created_at", "hash", "number_of_tx") VALUES ($1, $2, $3, $4)`, [block.number, block.created_at, block.hash, block.number_of_tx], ); @@ -424,7 +424,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert new transaction", tx); const txInsertResponse = await this.client.query( `INSERT INTO - public.transaction("index", "hash", "block_number", "from", "to", "eth_value", "method_signature", "method_name") + ethereum.transaction("index", "hash", "block_number", "from", "to", "eth_value", "method_signature", "method_name") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;`, [ @@ -450,7 +450,7 @@ export default class PostgresDatabaseClient { this.log.debug("Insert new token transfer", transfer); const transInsertResponse = await this.client.query( `INSERT INTO - public.token_transfer("transaction_id", "sender", "recipient", "value") + ethereum.token_transfer("transaction_id", "sender", "recipient", "value") VALUES ($1, $2, $3, $4)`, [txId, transfer.sender, transfer.recipient, transfer.value], ); @@ -490,7 +490,7 @@ export default class PostgresDatabaseClient { this.assertConnected(); const queryResponse = await this.client.query( - "SELECT * FROM public.get_missing_blocks_in_range($1, $2) as block_number", + "SELECT * FROM ethereum.get_missing_blocks_in_range($1, $2) as block_number", [startBlockNumber, endBlockNumber], ); this.log.debug( diff --git a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/plugin-persistence-ethereum.ts b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/plugin-persistence-ethereum.ts index 1d4c5893b4..ec70cde3fc 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/plugin-persistence-ethereum.ts +++ b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/plugin-persistence-ethereum.ts @@ -876,7 +876,7 @@ export class PluginPersistenceEthereum try { // Note: Use batching / synchronous loop if there are performance issues for large blocks. const transactions = await Promise.all( - block.transactions.map((tx) => this.parseBlockTransaction(tx)), + (block.transactions ?? []).map((tx) => this.parseBlockTransaction(tx)), ); if (typeof block.timestamp === "string") { diff --git a/packages/cactus-plugin-persistence-ethereum/src/test/sql/insert-test-data.sql b/packages/cactus-plugin-persistence-ethereum/src/test/sql/insert-test-data.sql index 04193d81ae..7b97f6248c 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/test/sql/insert-test-data.sql +++ b/packages/cactus-plugin-persistence-ethereum/src/test/sql/insert-test-data.sql @@ -1,6 +1,6 @@ -- Sample test input for ethereum GUI. Can be used to check the views manually without running the persistence plugin first. INSERT INTO - block + ethereum.block VALUES ( '15690287', @@ -53,7 +53,7 @@ VALUES ); INSERT INTO - token_metadata_erc721 + ethereum.token_metadata_erc721 VALUES ( '0x44D39e215C112c5AEC6a733d691B464aa62b3F85', @@ -81,7 +81,7 @@ VALUES ); INSERT INTO - token_metadata_erc20 + ethereum.token_metadata_erc20 VALUES ( '0x514910771AF9Ca656af840dff83E8264EcF986CA', @@ -113,7 +113,7 @@ VALUES ); INSERT INTO - token_erc721 + ethereum.token_erc721 VALUES ( extensions.uuid_generate_v4(), @@ -145,7 +145,7 @@ VALUES ); INSERT INTO - transaction + ethereum.transaction VALUES ( '4c969755-3ea2-4ea9-983f-419e7d49d36f', @@ -226,7 +226,7 @@ VALUES ); INSERT INTO - token_transfer + ethereum.token_transfer VALUES ( extensions.uuid_generate_v4(), diff --git a/packages/cactus-plugin-persistence-ethereum/src/test/typescript/integration/persistence-ethereum-postgresql-db-client.test.ts b/packages/cactus-plugin-persistence-ethereum/src/test/typescript/integration/persistence-ethereum-postgresql-db-client.test.ts index d5e2e6892c..b011f8a3b9 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/test/typescript/integration/persistence-ethereum-postgresql-db-client.test.ts +++ b/packages/cactus-plugin-persistence-ethereum/src/test/typescript/integration/persistence-ethereum-postgresql-db-client.test.ts @@ -46,29 +46,31 @@ describe("Ethereum persistence PostgreSQL PostgresDatabaseClient tests", () => { * Delete all data from all tables */ async function clearDbSchema() { - await dbClient.client.query("DELETE FROM public.token_transfer"); - await dbClient.client.query("DELETE FROM public.transaction"); - await dbClient.client.query("DELETE FROM public.block"); - await dbClient.client.query("DELETE FROM public.token_erc721"); - await dbClient.client.query("DELETE FROM public.token_metadata_erc20"); - await dbClient.client.query("DELETE FROM public.token_metadata_erc721"); + await dbClient.client.query("DELETE FROM ethereum.token_transfer"); + await dbClient.client.query("DELETE FROM ethereum.transaction"); + await dbClient.client.query("DELETE FROM ethereum.block"); + await dbClient.client.query("DELETE FROM ethereum.token_erc721"); + await dbClient.client.query("DELETE FROM ethereum.token_metadata_erc20"); + await dbClient.client.query("DELETE FROM ethereum.token_metadata_erc721"); } async function getDbBlocks() { - const response = await dbClient.client.query("SELECT * FROM public.block"); + const response = await dbClient.client.query( + "SELECT * FROM ethereum.block", + ); return response.rows; } async function getDbTransactions() { const response = await dbClient.client.query( - "SELECT * FROM public.transaction", + "SELECT * FROM ethereum.transaction", ); return response.rows; } async function getDbTokenTransfers() { const response = await dbClient.client.query( - "SELECT * FROM public.token_transfer", + "SELECT * FROM ethereum.token_transfer", ); return response.rows; } @@ -117,7 +119,7 @@ describe("Ethereum persistence PostgreSQL PostgresDatabaseClient tests", () => { // Assert all tables are created const response = await dbClient.client.query( - "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'", + "SELECT table_name FROM information_schema.tables WHERE table_schema = 'ethereum'", ); const tableNames = response.rows.map((row) => row.table_name); expect(tableNames.sort()).toEqual( @@ -125,13 +127,11 @@ describe("Ethereum persistence PostgreSQL PostgresDatabaseClient tests", () => { "block", "token_metadata_erc20", "token_metadata_erc721", - "plugin_status", "token_erc721", "token_transfer", "transaction", "erc20_token_history_view", "erc721_token_history_view", - "erc721_txn_meta_view", ].sort(), ); @@ -360,7 +360,6 @@ describe("Ethereum persistence PostgreSQL PostgresDatabaseClient tests", () => { expect(dbBlock.number).toEqual(block.number.toString()); expect(dbBlock.hash).toEqual(block.hash); expect(dbBlock.number_of_tx).toEqual(block.number_of_tx.toString()); - expect(new Date(dbBlock.created_at)).toEqual(blockTimestamp); // Assert transaction const txResponse = await getDbTransactions(); diff --git a/packages/cactus-plugin-persistence-ethereum/src/test/typescript/manual/sample-persistence-plugin-setup.ts b/packages/cactus-plugin-persistence-ethereum/src/test/typescript/manual/sample-persistence-plugin-setup.ts new file mode 100644 index 0000000000..234fbf0e71 --- /dev/null +++ b/packages/cactus-plugin-persistence-ethereum/src/test/typescript/manual/sample-persistence-plugin-setup.ts @@ -0,0 +1,276 @@ +/** + * Sample persistence plugin environment setup that can be used to manually test the plugin. + */ + +import { pruneDockerAllIfGithubAction } from "@hyperledger/cactus-test-tooling"; +import { + LoggerProvider, + Logger, + Servers, + LogLevelDesc, +} from "@hyperledger/cactus-common"; +import { PluginRegistry } from "@hyperledger/cactus-core"; +import { Configuration, Constants } from "@hyperledger/cactus-core-api"; +import { + GethTestLedger, + WHALE_ACCOUNT_PRIVATE_KEY, +} from "@hyperledger/cactus-test-geth-ledger"; +import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { + EthereumApiClient, + PluginLedgerConnectorEthereum, +} from "@hyperledger/cactus-plugin-ledger-connector-ethereum"; + +import process, { exit } from "process"; +import http from "http"; +import { AddressInfo } from "net"; +import express from "express"; +import bodyParser from "body-parser"; +import { Server as SocketIoServer } from "socket.io"; +import { v4 as uuidV4 } from "uuid"; +import Web3, { ContractAbi, TransactionReceipt } from "web3"; +import { Web3Account } from "web3-eth-accounts"; + +import TestERC721ContractJson from "../../solidity/TestERC721.json"; +import { PluginPersistenceEthereum } from "../../../main/typescript/plugin-persistence-ethereum"; + +////////////////////////////////// +// Constants +////////////////////////////////// + +const SUPABASE_CONNECTION_STRING = process.env.SUPABASE_CONNECTION_STRING ?? ""; + +if (!SUPABASE_CONNECTION_STRING) { + console.error( + "Please set SUPABASE_CONNECTION_STRING environment variable before running this script", + ); + exit(1); +} + +const testLogLevel: LogLevelDesc = "info"; +const sutLogLevel: LogLevelDesc = "info"; + +// Geth environment +const containerImageName = "ghcr.io/hyperledger/cacti-geth-all-in-one"; +const containerImageVersion = "2023-07-27-2a8c48ed6"; + +// Logger setup +const log: Logger = LoggerProvider.getOrCreate({ + label: "sample-persistence-plugin-setup", + level: testLogLevel, +}); + +let ledger: GethTestLedger; +let web3: Web3; +let constTestAcc: Web3Account; +let defaultAccountAddress: string; +const constTestAccBalance = 2 * 10e18; +let persistence: PluginPersistenceEthereum; + +////////////////////////////////// +// Environment Setup +////////////////////////////////// + +/** + * Replace bigint to print web3js outputs in test. + */ +function stringifyBigIntReplacer( + _key: string, + value: bigint | unknown, +): string | unknown { + if (typeof value === "bigint") { + return value.toString(); + } + return value; +} + +const expressAppConnector = express(); +expressAppConnector.use(bodyParser.json({ limit: "250mb" })); +expressAppConnector.set("json replacer", stringifyBigIntReplacer); +const connectorServer = http.createServer(expressAppConnector); +const connectorWsApi = new SocketIoServer(connectorServer, { + path: Constants.SocketIoConnectionPathV1, +}); +let connector: PluginLedgerConnectorEthereum; + +async function setupEnvironment() { + log.info("Prune Docker..."); + await pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + + // Create test ledger + log.info(`Start Ledger ${containerImageName}:${containerImageVersion}...`); + ledger = new GethTestLedger({ + containerImageName, + containerImageVersion, + }); + await ledger.start(); + const rpcApiHttpHost = await ledger.getRpcApiHttpHost(); + const rpcApiWsHost = await ledger.getRpcApiWebSocketHost(); + log.info(`Ledger started, RPC: ${rpcApiHttpHost} WS: ${rpcApiWsHost}`); + + // Create Test Account + constTestAcc = await ledger.createEthTestAccount(constTestAccBalance); + + // Create Web3 provider for testing + web3 = new Web3(rpcApiHttpHost); + const account = web3.eth.accounts.privateKeyToAccount( + "0x" + WHALE_ACCOUNT_PRIVATE_KEY, + ); + web3.eth.accounts.wallet.add(constTestAcc); + web3.eth.accounts.wallet.add(account); + defaultAccountAddress = account.address; + + const addressInfo = (await Servers.listen({ + hostname: "127.0.0.1", + port: 0, + server: connectorServer, + })) as AddressInfo; + const { address, port } = addressInfo; + const apiHost = `http://${address}:${port}`; + + const keychainPlugin = new PluginKeychainMemory({ + instanceId: uuidV4(), + keychainId: uuidV4(), + backend: new Map([]), + logLevel: testLogLevel, + }); + connector = new PluginLedgerConnectorEthereum({ + instanceId: uuidV4(), + rpcApiHttpHost, + rpcApiWsHost, + logLevel: sutLogLevel, + pluginRegistry: new PluginRegistry({ plugins: [keychainPlugin] }), + }); + await connector.getOrCreateWebServices(); + await connector.registerWebServices(expressAppConnector, connectorWsApi); + + const apiConfig = new Configuration({ basePath: apiHost }); + const apiClient = new EthereumApiClient(apiConfig); + + // Create Ethereum persistence plugin + persistence = new PluginPersistenceEthereum({ + apiClient, + logLevel: sutLogLevel, + instanceId: uuidV4(), + connectionString: SUPABASE_CONNECTION_STRING, + }); +} + +async function cleanupEnvironment() { + log.info("FINISHING THE TESTS"); + + if (persistence) { + log.info("Stop persistence plugin..."); + await persistence.shutdown(); + } + + if (connectorServer) { + log.info("Stop connector http servers..."); + await Servers.shutdown(connectorServer); + } + + if (connector) { + log.info("Stop the connector..."); + await connector.shutdown(); + } + + if (ledger) { + log.info("Stop ethereum ledger..."); + await ledger.stop(); + await ledger.destroy(); + } + + log.info("Prune Docker..."); + await pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); +} + +let erc721ContractCreationReceipt: Required; + +async function deploySmartContract( + abi: ContractAbi, + bytecode: string, + args?: unknown[], +): Promise> { + try { + const txReceipt = await ledger.deployContract(abi, "0x" + bytecode, args); + log.debug("deploySmartContract txReceipt:", txReceipt); + log.debug( + "Deployed test smart contract, TX on block number", + txReceipt.blockNumber, + ); + // Force response without optional fields + return txReceipt as Required; + } catch (error) { + log.error("deploySmartContract ERROR", error); + throw error; + } +} + +async function mintErc721Token( + targetAddress: string, + tokenId: number, +): Promise { + try { + log.info( + `Mint ERC721 token ID ${tokenId} for address ${targetAddress} by ${defaultAccountAddress}`, + ); + + const tokenContract = new web3.eth.Contract( + TestERC721ContractJson.abi, + erc721ContractCreationReceipt.contractAddress, + ); + + const mintResponse = await (tokenContract.methods as any) + .safeMint(targetAddress, tokenId) + .send({ + from: defaultAccountAddress, + gas: 8000000, + }); + log.debug("mintErc721Token mintResponse:", mintResponse); + + return mintResponse; + } catch (error) { + log.error("mintErc721Token ERROR", error); + throw error; + } +} + +async function logic() { + const erc721Bytecode = TestERC721ContractJson.data.bytecode.object; + erc721ContractCreationReceipt = await deploySmartContract( + TestERC721ContractJson.abi, + erc721Bytecode, + ); + log.info( + "ERC721 deployed contract address:", + erc721ContractCreationReceipt.contractAddress, + ); + + await mintErc721Token(constTestAcc.address, 1); + await mintErc721Token(constTestAcc.address, 2); + await mintErc721Token(constTestAcc.address, 3); +} + +async function main() { + await setupEnvironment(); + console.log("Environment is running..."); + + // Put custom logic here + // Or run some tests that will reuse this ledger + await logic(); + + await persistence.onPluginInit(); + await persistence.addTokenERC721( + erc721ContractCreationReceipt.contractAddress, + ); + persistence.startMonitor((err) => { + console.error("Persistence monitor error:", err); + }); + console.log("Persistence monitoring started..."); +} + +process.on("exit", cleanupEnvironment); +process.on("SIGINT", cleanupEnvironment); +process.on("SIGTERM", cleanupEnvironment); + +main(); diff --git a/yarn.lock b/yarn.lock index 4ae2aace9d..b0b62cc5f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9004,7 +9004,7 @@ __metadata: uuid: "npm:9.0.1" web3: "npm:4.0.3" web3-eth-accounts: "npm:4.0.3" - web3-utils: "npm:4.2.1" + web3-utils: "npm:4.3.0" web3-validator: "npm:2.0.2" languageName: unknown linkType: soft @@ -50710,6 +50710,15 @@ __metadata: languageName: node linkType: hard +"web3-errors@npm:^1.2.0": + version: 1.2.0 + resolution: "web3-errors@npm:1.2.0" + dependencies: + web3-types: "npm:^1.6.0" + checksum: 10/99d0ecc4368c2969cc799ed4ef1b35f233dc3e7e0ccde713bcc850be4e75725ce175127342512504057ca48186266d6a053f129634f20ae23c405855a766d13d + languageName: node + linkType: hard + "web3-eth-abi@npm:1.10.0": version: 1.10.0 resolution: "web3-eth-abi@npm:1.10.0" @@ -52141,6 +52150,13 @@ __metadata: languageName: node linkType: hard +"web3-types@npm:^1.6.0": + version: 1.7.0 + resolution: "web3-types@npm:1.7.0" + checksum: 10/fcd5d7a9a94579fcd01fa86dfa70e6afb269f66a7ce60e6786849e64ff6e4a107f1c25cb2784343a48952ac36d4bf3093a73b75de6ebcc971308e6b44abb211f + languageName: node + linkType: hard + "web3-utils@npm:1.10.0, web3-utils@npm:^1.0.0-beta.31": version: 1.10.0 resolution: "web3-utils@npm:1.10.0" @@ -52269,6 +52285,19 @@ __metadata: languageName: node linkType: hard +"web3-utils@npm:4.3.0": + version: 4.3.0 + resolution: "web3-utils@npm:4.3.0" + dependencies: + ethereum-cryptography: "npm:^2.0.0" + eventemitter3: "npm:^5.0.1" + web3-errors: "npm:^1.2.0" + web3-types: "npm:^1.6.0" + web3-validator: "npm:^2.0.6" + checksum: 10/486178b47721b8a3f0f4c56c0f0250e9891656ba79c22c16915152ed811e29901567442fa87bbd5b4ad83280e2d4fc23221bcae7b24efb624d74210c5f2c05bb + languageName: node + linkType: hard + "web3-utils@npm:^4.0.7": version: 4.0.7 resolution: "web3-utils@npm:4.0.7" @@ -52370,6 +52399,19 @@ __metadata: languageName: node linkType: hard +"web3-validator@npm:^2.0.6": + version: 2.0.6 + resolution: "web3-validator@npm:2.0.6" + dependencies: + ethereum-cryptography: "npm:^2.0.0" + util: "npm:^0.12.5" + web3-errors: "npm:^1.2.0" + web3-types: "npm:^1.6.0" + zod: "npm:^3.21.4" + checksum: 10/4df08e5317d55cdb674cbd11d7534a6cb41abfa4912cf3ff976c2b34a98e84500732fa0cade68a848e57b61259b4c9b377773f57de6bb69a5029c2ddef1cd0ab + languageName: node + linkType: hard + "web3@npm:1.10.0": version: 1.10.0 resolution: "web3@npm:1.10.0"