diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 211abc1ef..572008b23 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: max-parallel: 12 matrix: core_test_mod: [ - ## Long-running tests. Put these first to limit the overall runtime of the + ## Long-running tests. Put these first to limit the overall runtime of the ## test suite ar_coordinated_mining_tests, ar_data_sync_tests, @@ -62,6 +62,7 @@ jobs: # ar_p3, # ar_p3_config, # ar_p3_db, + ar_p3_ledger, ar_packing_server, ar_patricia_tree, ar_peers, @@ -99,6 +100,7 @@ jobs: ar_tx_blacklist_tests, ar_tx_replay_pool_tests, ar_vdf_tests, + ar_p3_ledger_tests, ] steps: - uses: actions/checkout@v4 diff --git a/apps/arweave/include/ar_config.hrl b/apps/arweave/include/ar_config.hrl index efdae9db7..e912aba0d 100644 --- a/apps/arweave/include/ar_config.hrl +++ b/apps/arweave/include/ar_config.hrl @@ -114,6 +114,11 @@ %% The default rocksdb WAL sync interval, 1 minute. -define(DEFAULT_ROCKSDB_WAL_SYNC_INTERVAL_S, 60). +%% The default P3 ledger checkpoint interval, 100 records. +-define(DEFAULT_P3_LEDGER_CHECKPOINT_INTERVAL, 100). +%% The default P3 ledger shutdown timeout, 1 minute. +-define(DEFAULT_P3_LEDGER_SHUTDOWN_TIMEOUT, 60). + %% @doc Startup options with default values. -record(config, { init = false, @@ -210,7 +215,9 @@ %% Undocumented/unsupported options chunk_storage_file_size = ?CHUNK_GROUP_SIZE, rocksdb_flush_interval_s = ?DEFAULT_ROCKSDB_FLUSH_INTERVAL_S, - rocksdb_wal_sync_interval_s = ?DEFAULT_ROCKSDB_WAL_SYNC_INTERVAL_S + rocksdb_wal_sync_interval_s = ?DEFAULT_ROCKSDB_WAL_SYNC_INTERVAL_S, + p3_ledger_checkpoint_interval = ?DEFAULT_P3_LEDGER_CHECKPOINT_INTERVAL, + p3_ledger_shutdown_timeout = ?DEFAULT_P3_LEDGER_SHUTDOWN_TIMEOUT }). -endif. diff --git a/apps/arweave/include/ar_p3.hrl b/apps/arweave/include/ar_p3.hrl index 7a2c4f289..0aebb2c27 100644 --- a/apps/arweave/include/ar_p3.hrl +++ b/apps/arweave/include/ar_p3.hrl @@ -35,7 +35,8 @@ -record(p3_config, { payments = #{}, - services = #{} + services = #{}, + ledger = #{} }). -record(p3_account, { diff --git a/apps/arweave/include/ar_p3_ledger.hrl b/apps/arweave/include/ar_p3_ledger.hrl new file mode 100644 index 000000000..73b69c44f --- /dev/null +++ b/apps/arweave/include/ar_p3_ledger.hrl @@ -0,0 +1,26 @@ +-ifndef(AR_P3_LEDGER_HRL). + +-define(AR_P3_LEDGER_HRL, true). + +-define(ar_p3_ledger_record_type_in, debit). +-define(ar_p3_ledger_record_type_out, credit). + +-define(ar_p3_ledger_record_account_tokens, tokens). +-define(ar_p3_ledger_record_account_credits, credits). +-define(ar_p3_ledger_record_account_services, services). + +-record(ar_p3_ledger_record_v1, { + id :: ar_p3_ledger:record_id(), + type :: ar_p3_ledger:record_type(), + counterpart :: ar_p3_ledger:record_account(), + asset :: binary(), + amount :: non_neg_integer(), + meta :: #{binary() := binary()} +}). + +-record(ar_p3_ledger_checkpoint_v1, { + id :: ar_p3_ledger:record_id(), + assets_map :: ar_p3_ledger:assets_map() +}). + +-endif. diff --git a/apps/arweave/src/ar.erl b/apps/arweave/src/ar.erl index 5643d26c8..4ab3af7d6 100644 --- a/apps/arweave/src/ar.erl +++ b/apps/arweave/src/ar.erl @@ -336,7 +336,9 @@ show_help() -> "Useful if you have multiple machines (or replicas) " "and you want to monitor them separately on pool"}, {"rocksdb_flush_interval", "RocksDB flush interval in seconds"}, - {"rocksdb_wal_sync_interval", "RocksDB WAL sync interval in seconds"} + {"rocksdb_wal_sync_interval", "RocksDB WAL sync interval in seconds"}, + {"p3_ledger_checkpoint_interval", "P3 ledger checkpoint interval in records"}, + {"p3_ledger_shutdown_timeout", "P3 ledger individual ledger process shutdown timeout in seconds"} ] ), erlang:halt(). @@ -631,6 +633,10 @@ parse_cli_args(["rocksdb_flush_interval", Seconds | Rest], C) -> parse_cli_args(Rest, C#config{ rocksdb_flush_interval_s = list_to_integer(Seconds) }); parse_cli_args(["rocksdb_wal_sync_interval", Seconds | Rest], C) -> parse_cli_args(Rest, C#config{ rocksdb_wal_sync_interval_s = list_to_integer(Seconds) }); +parse_cli_args(["p3_ledger_checkpoint_interval", Interval | Rest], C) -> + parse_cli_args(Rest, C#config{ p3_ledger_checkpoint_interval = list_to_integer(Interval) }); +parse_cli_args(["p3_ledger_shutdown_timeout", Seconds | Rest], C) -> + parse_cli_args(Rest, C#config{ p3_ledger_shutdown_timeout = list_to_integer(Seconds) }); %% Undocumented/unsupported options parse_cli_args(["chunk_storage_file_size", Num | Rest], C) -> diff --git a/apps/arweave/src/ar_config.erl b/apps/arweave/src/ar_config.erl index 0222c580a..b8df72eca 100644 --- a/apps/arweave/src/ar_config.erl +++ b/apps/arweave/src/ar_config.erl @@ -656,6 +656,13 @@ parse_options([{<<"rocksdb_wal_sync_interval">>, IntervalS} | Rest], Config) parse_options([{<<"rocksdb_wal_sync_interval">>, IntervalS} | _], _) -> {error, {bad_type, rocksdb_wal_sync_interval, number}, IntervalS}; +parse_options([{<<"p3_ledger_checkpoint_interval">>, IntervalRecords} | Rest], Config) + when is_integer(IntervalRecords) andalso IntervalRecords > 0 -> + parse_options(Rest, Config#config{ p3_ledger_checkpoint_interval = IntervalRecords }); +parse_options([{<<"p3_ledger_shutdown_timeout">>, ShutdownTimeoutS} | Rest], Config) + when is_integer(ShutdownTimeoutS) andalso ShutdownTimeoutS > 0 -> + parse_options(Rest, Config#config{ p3_ledger_shutdown_timeout = ShutdownTimeoutS }); + parse_options([Opt | _], _) -> {error, unknown, Opt}; parse_options([], Config) -> @@ -937,4 +944,4 @@ validate_storage_modules(Config) -> io:format("~nThe node cannot mine multiple packing difficulties " "for the same mining address.~n~n"), false - end. \ No newline at end of file + end. diff --git a/apps/arweave/src/ar_p3.erl b/apps/arweave/src/ar_p3.erl index 4762944d1..4f11c5f97 100644 --- a/apps/arweave/src/ar_p3.erl +++ b/apps/arweave/src/ar_p3.erl @@ -3,7 +3,6 @@ -behaviour(gen_server). -include_lib("arweave/include/ar.hrl"). --include_lib("arweave/include/ar_config.hrl"). -include_lib("arweave/include/ar_p3.hrl"). -export([start_link/0, allow_request/1, reverse_charge/1, get_balance/3, get_rates_json/0]). @@ -98,7 +97,7 @@ handle_info({event, node_state, {new_tip, B, _PrevB}}, State) -> handle_info({event, node_state, _}, State) -> {noreply, State}. -terminate(Reason, State) -> +terminate(_Reason, _State) -> ok. %%%=================================================================== @@ -206,7 +205,7 @@ validate_signature(DecodedAddress, Req) -> case ar_util:safe_decode(cowboy_req:header(?P3_SIGNATURE_HEADER, Req)) of {ok, DecodedSignature} -> validate_signature(DecodedAddress, DecodedSignature, Req); - Result -> + _Result -> {error, invalid_signature} end. @@ -221,7 +220,7 @@ validate_signature(DecodedAddress, DecodedSignature, Req) -> false -> {error, invalid_signature} end; - Error -> + _Error -> {error, invalid_signature} end. diff --git a/apps/arweave/src/ar_p3_ledger.erl b/apps/arweave/src/ar_p3_ledger.erl new file mode 100644 index 000000000..650b008a7 --- /dev/null +++ b/apps/arweave/src/ar_p3_ledger.erl @@ -0,0 +1,904 @@ +%%% +%%% @doc P3 Ledger implementation. +%%% +%%% Every peer is represented by a separate copy of ledger. The ledger process +%%% registers itself in gproc. Every read and write to the peer ledger is +%%% serialized via the process mailbox (gen_server:call). +%%% +%%% The ledger is written in such a way that it tracks the value movement from +%%% the node operator perspective; this mean that positive net for an account +%%% represents received value, while negative net represents provided value. +%%% This also means that if one needs to find a value from the peer perspective, +%%% the account total (see below) should be negated. +%%% +%%% The ledger itself contains a rocksdb database with three column families, +%%% one per virtual account: +%%% - tokens (?ar_p3_ledger_record_account_tokens): an account tracking the +%%% token income. Sum of all records in this column family will represent a +%%% total amount of token received from the peer in form of deposits; +%%% - credits (?ar_p3_ledger_record_account_credits): an account tracking the +%%% credited value. Sum of all records in this column family will represent +%%% an amount of liability for the peer (hence the negative value); the +%%% negated value will represent the amount of credits available for the peer; +%%% - services (?ar_p3_ledger_record_account_services): an account tracking the +%%% served value. Sum of all records in this column family will represent an +%%% amount of services that were provided to the peer in the past (hence the +%%% negative value); The negated value will represent the sum of all services +%%% received by the peer. +%%% +%%% Each transfer creates two records in two tables: one "in" and one "out". +%%% The amounts in both records will be the same, which implies that all the +%%% records amounts are non-negative, which allows for tracking the value +%%% transfers for both parties, depending on the record interpretation. The ids +%%% in both records will also (and must) be the same. +%%% When doing the summation for a virtual account (column family), the default +%%% interpretation for the records is to calculate values for the node operator. +%%% The "in" records are considered positive, and the "out" records are +%%% considered negative. +%%% +%%% Record identifier. +%%% +%%% The identifier must be sortable in two ways: +%%% 1. Time. Older records must have bigger identifier. +%%% 2. Transaction vs Checkpoint. If the checkpoint and the transaction record +%%% are created at the same point in time, the checkpoint identifier must be +%%% bigger, to ensure the records ordering. +%%% +%%% Checkpoints and caching. +%%% +%%% Calculating the sum of all records on every database read is not effective. +%%% To mitigate this calculations, a special type of record is inserted in +%%% configured intervals: checkpoints. Each checkpoint contains the asset map, +%%% which contains the sum of all records for a given account, from the node +%%% operator perspective. +%%% +%%% When started, the ledger process will open the database and read all three +%%% column families from the last record upon reaching the checkpoint. At this +%%% point the read stops and the summation result is cached in the process +%%% state. +%%% +%%% Shutdown timer. +%%% +%%% The started ledger process will eventually terminate when not used for some +%%% time. The actual timing is defined with `?shutdown_timeout_ms`. +%%% The way shutdown timer is implemented might seem controversial. Instead of +%%% using the gen_server callbacks timers, it relies on classic `send_after` +%%% timers, because callback timers are reset of every incoming message. In case +%%% of heavily used ledger (for example, the peer is actively draining its +%%% deposit), this might give undesired overhead. Another effect is that every +%%% message will drop the timer, including unhandled calls, casts, etc., while +%%% the classic timer enables us to precisely control which messages have effect +%%% on shutdown time. +%%% The unwanted effect for this solution: the actual shutdown time will always +%%% be in the interval [?shutdown_timeout_ms .. ?shutdown_timeout_ms*2] after +%%% the last significant message. +%%% +-module(ar_p3_ledger). + +-export([ + start_link/3, transfer/6, deposit/4, service/4, total/1, total_tokens/1, + total_credits/1, total_services/1 +]). +-export([init/1, handle_continue/2, handle_call/3, handle_cast/2, handle_info/2, terminate/2]). +-ifdef(TEST). + -export([db_dir/1, via_reg_name/1]). +-endif. + +-include_lib("arweave/include/ar.hrl"). +-include_lib("arweave/include/ar_config.hrl"). +-include_lib("arweave/include/ar_p3_ledger.hrl"). + + + +%%% ================================================================== +%%% Public types. +%%% ================================================================== + + + +-type record_id() :: binary(). + +-type record_type() :: + ?ar_p3_ledger_record_type_in + | ?ar_p3_ledger_record_type_out. + +-type record_account() :: + ?ar_p3_ledger_record_account_tokens + | ?ar_p3_ledger_record_account_credits + | ?ar_p3_ledger_record_account_services. + +-type assets_map() :: #{binary() := integer()}. + +-export_type([record_id/0, record_type/0, record_account/0]). + + + +%%% ================================================================== +%%% Definitions. +%%% ================================================================== + + + +-define(via_reg_name(PeerAddress), {n, l, {?MODULE, PeerAddress}}). +-define(ledger_databases_relative_dir, "p3_ledger"). +-define(db_dir(PeerAddress), binary_to_list(filename:join([get_data_dir(), ?ledger_databases_relative_dir, PeerAddress]))). +-define(log_dir(PeerAddress), binary_to_list(filename:join([get_base_log_dir(), ?ROCKS_DB_DIR, ?ledger_databases_relative_dir, PeerAddress]))). + +-define(record_transaction_constant_suffix, 16#b). +-define(record_countertype(T), case T of + ?ar_p3_ledger_record_type_in -> ?ar_p3_ledger_record_type_out; + ?ar_p3_ledger_record_type_out -> ?ar_p3_ledger_record_type_in +end). +-define(is_valid_account(Account), ( + ?ar_p3_ledger_record_account_tokens == Account orelse + ?ar_p3_ledger_record_account_credits == Account orelse + ?ar_p3_ledger_record_account_services == Account +)). + +-define(ledger_db_options, [ + {create_if_missing, true}, + {create_missing_column_families, true}, + {allow_mmap_reads, false}, + {allow_mmap_writes, false} +]). + +-define(ledger_cf_options, [ + {max_open_files, 100}, + {block_based_table_options, [ + {bloom_filter_policy, 10} + ]} +]). + +-record(account, { + cf_handle :: rocksdb:cf_handle() | undefined, + assets_map = #{} :: assets_map(), + dangling_records = 0 :: non_neg_integer() +}). + +-record(timer, { + armed = false :: boolean(), + timer_ref :: reference() | undefined, + secret_ref :: reference() | undefined +}). + +-record(state, { + peer_address :: binary(), + db_dir :: file:filename_all(), + log_dir :: file:filename_all(), + checkpoint_interval_records :: pos_integer(), + shutdown_time_ms :: pos_integer(), + db_handle :: rocksdb:db_handle() | undefined, + accounts = #{ + ?ar_p3_ledger_record_account_tokens => #account{}, + ?ar_p3_ledger_record_account_credits => #account{}, + ?ar_p3_ledger_record_account_services => #account{} + } :: #{record_account() := #account{}}, + shutdown_timer = #timer{} :: #timer{} +}). + +-define(msg_continue_open_rocksdb, {msg_continue_open_rocksdb}). +-define(msg_continue_load_ledger, {msg_continue_load_current_values}). +-define(msg_continue_start_shutdown_timer, {msg_continue_start_shutdown_timer}). + +-define(msg_call_transfer(InRecord, OutRecord), {msg_call_transfer, InRecord, OutRecord}). +-define(msg_call_total(), {msg_call_total}). + +-define(msg_info_timer_alarm, {msg_info_timer_alarm}). + + + +%%% ================================================================== +%%% Public interface. +%%% ================================================================== + + + +start_link(CheckpointIntervalRecords, ShutdownTimeoutMs, PeerAddress) -> + gen_server:start_link({via, gproc, ?via_reg_name(PeerAddress)}, ?MODULE, [CheckpointIntervalRecords, ShutdownTimeoutMs, PeerAddress], []). + + + +-spec deposit( + PeerAddress :: binary(), + Asset :: binary(), + Amount :: non_neg_integer(), + Meta :: #{binary() := binary()} +) -> + Ret :: {ok, Id :: record_id()} | {error, Reason :: term()}. + +deposit(PeerAddress, Asset, Amount, Meta) -> + transfer(PeerAddress, ?ar_p3_ledger_record_account_tokens, ?ar_p3_ledger_record_account_credits, Asset, Amount, Meta). + + + +-spec service( + PeerAddress :: binary(), + Asset :: binary(), + Amount :: non_neg_integer(), + Meta :: #{binary() := binary()} +) -> + Ret :: {ok, Id :: record_id()} | {error, Reason :: term()}. + +service(PeerAddress, Asset, Amount, Meta) -> + transfer(PeerAddress, ?ar_p3_ledger_record_account_credits, ?ar_p3_ledger_record_account_services, Asset, Amount, Meta). + + + +%%% +%%% @doc Create a new transfer. +%%% +%%% The way to look at the transfer: paying with credited ("out") value for +%%% debited ("in") value, while measuring the values in the same units. +%%% +%%% Examples: +%%% +%%% Note: include the "ar_p3_legder.hrl" file. +%%% +%%% Deposit: The node operator is crediting the peer for deposited tokens. +%%% +%%% transfer( +%%% ?ar_p3_ledger_record_account_tokens, +%%% ?ar_p3_ledger_record_account_credits, +%%% <<"arweave/AR">>, 1000, #{...} +%%% ). +%%% +%%% Service record: The node operator is gaining back its credits providing the +%%% actual services. +%%% +%%% transfer( +%%% ?ar_p3_ledger_record_account_credits, +%%% ?ar_p3_ledger_record_account_services, +%%% <<"arweave/AR">>, 1000, #{...} +%%% ). +%%% + +-spec transfer( + PeerAddress :: binary(), + InAccount :: record_account(), + OutAccount :: record_account(), + Asset :: binary(), + Amount :: non_neg_integer(), + Meta :: #{binary() := binary()} +) -> + Ret :: {ok, Id :: record_id()} | {error, Reason :: term()}. + +transfer(PeerAddress, InAccount, OutAccount, Asset, Amount, Meta) -> + InRecord = new_record(?ar_p3_ledger_record_type_in, OutAccount, Asset, Amount, Meta), + OutRecord = new_counterrecord(InAccount, InRecord), + with_peer_ledger(PeerAddress, fun(Pid) -> + case gen_server:call(Pid, ?msg_call_transfer(InRecord, OutRecord)) of + ok -> {ok, InRecord#ar_p3_ledger_record_v1.id}; + {error, _Reason} = E -> E + end + end). + + + +%%% +%%% @doc Collect the `total` amounts for all three accounts. +%%% + +-spec total(PeerAddress :: binary()) -> + Ret :: {ok, #{record_account() := assets_map()}} + | {error, Reason :: term()}. + +total(PeerAddress) -> + with_existing_peer_ledger(PeerAddress, fun(Pid) -> + gen_server:call(Pid, ?msg_call_total()) + end). + + + +%%% +%%% @doc Collect the `total` amounts for tokens account. +%%% Represents the total amount of token received from the peer as deposits. +%%% + +-spec total_tokens(PeerAddress :: binary()) -> + Ret :: {ok, #{record_account() := assets_map()}} + | {error, Reason :: term()}. + +total_tokens(PeerAddress) -> + case total(PeerAddress) of + {ok, #{?ar_p3_ledger_record_account_tokens := Amount}} -> {ok, Amount}; + E -> E + end. + + + +%%% +%%% @doc Collect the `total` amounts for credits account. +%%% Represents the total amount of services the node operator 'owes' to the +%%% peer (negative). +%%% + +-spec total_credits(PeerAddress :: binary()) -> + Ret :: {ok, #{record_account() := assets_map()}} + | {error, Reason :: term()}. + +total_credits(PeerAddress) -> + case total(PeerAddress) of + {ok, #{?ar_p3_ledger_record_account_credits := Amount}} -> {ok, Amount}; + E -> E + end. + + + +%%% +%%% @doc Collect the `total` amounts for services account. +%%% Represents the total amount of services the node operator already served to +%%% the peer (negative). +%%% + +-spec total_services(PeerAddress :: binary()) -> + Ret :: {ok, #{record_account() := assets_map()}} + | {error, Reason :: term()}. + +total_services(PeerAddress) -> + case total(PeerAddress) of + {ok, #{?ar_p3_ledger_record_account_services := Amount}} -> {ok, Amount}; + E -> E + end. + + + +-ifdef(TEST). + db_dir(PeerAddress) -> ?db_dir(PeerAddress). + via_reg_name(PeerAddress) -> ?via_reg_name(PeerAddress). +-endif. + + + +%%% ================================================================== +%%% gen_server callbacks. +%%% ================================================================== + + + +init([CheckpointIntervalRecords, ShutdownTimeoutMs, PeerAddress]) -> + process_flag(trap_exit, true), + DbDir = ?db_dir(PeerAddress), + LogDir = ?log_dir(PeerAddress), + ok = filelib:ensure_dir(DbDir ++ "/"), + ok = filelib:ensure_dir(LogDir ++ "/"), + {ok, #state{ + peer_address = PeerAddress, + db_dir = DbDir, + log_dir = LogDir, + shutdown_time_ms = ShutdownTimeoutMs, + checkpoint_interval_records = CheckpointIntervalRecords + }, {continue, ?msg_continue_open_rocksdb}}. + + + +handle_continue(?msg_continue_open_rocksdb, #state{ + accounts = #{ + ?ar_p3_ledger_record_account_tokens := EquityAccount, + ?ar_p3_ledger_record_account_credits := LiabilityAccount, + ?ar_p3_ledger_record_account_services := ServiceAccount + } = Accounts0 +} = S0) -> + case rocksdb:open(S0#state.db_dir, ?ledger_db_options, [ + {"default", ?ledger_cf_options}, + {"tokens", ?ledger_cf_options}, + {"credits", ?ledger_cf_options}, + {"service", ?ledger_cf_options} + ]) of + {ok, DbHandle, [_Default, EquityAccountHandle, LiabilityAccountHandle, ServiceAccountHandle]} -> + S1 = S0#state{ + db_handle = DbHandle, + accounts = Accounts0#{ + ?ar_p3_ledger_record_account_tokens := EquityAccount#account{cf_handle = EquityAccountHandle}, + ?ar_p3_ledger_record_account_credits := LiabilityAccount#account{cf_handle = LiabilityAccountHandle}, + ?ar_p3_ledger_record_account_services := ServiceAccount#account{cf_handle = ServiceAccountHandle} + } + }, + {noreply, S1, {continue, ?msg_continue_load_ledger}}; + + {error, OpenError} -> + ?LOG_ERROR([{event, db_operation_failed}, {op, open}, {reason, io_lib:format("~p", [OpenError])}]), + {stop, {failed_to_open_database, OpenError}, S0} + end; + +handle_continue(?msg_continue_load_ledger, #state{ + accounts = #{ + ?ar_p3_ledger_record_account_tokens := EquityAccount, + ?ar_p3_ledger_record_account_credits := LiabilityAccount, + ?ar_p3_ledger_record_account_services := ServiceAccount + } = Accounts0 +} = S0) -> + try + {EquityAccountDanglingRecords, EquityAccountAssets} = load_assets(?ar_p3_ledger_record_account_tokens, S0), + {LiabilityAccountDanglingRecords, LiabilityAccountAssets} = load_assets(?ar_p3_ledger_record_account_credits, S0), + {ServiceAccountDanglingRecords, ServiceAccountAssets} = load_assets(?ar_p3_ledger_record_account_services, S0), + + S1 = S0#state{ + accounts = Accounts0#{ + ?ar_p3_ledger_record_account_tokens := + EquityAccount#account{assets_map = EquityAccountAssets, dangling_records = EquityAccountDanglingRecords}, + ?ar_p3_ledger_record_account_credits := + LiabilityAccount#account{assets_map = LiabilityAccountAssets, dangling_records = LiabilityAccountDanglingRecords}, + ?ar_p3_ledger_record_account_services := + ServiceAccount#account{assets_map = ServiceAccountAssets, dangling_records = ServiceAccountDanglingRecords} + } + }, + + {noreply, S1, {continue, ?msg_continue_start_shutdown_timer}} + catch + _:E -> {stop, E, S0} + end; + +handle_continue(?msg_continue_start_shutdown_timer, #state{shutdown_timer = Timer0} = S0) -> + Timer1 = maybe_cancel_timer(Timer0), + SecretRef = erlang:make_ref(), + TimerRef = erlang:send_after(S0#state.shutdown_time_ms, self(), ?msg_info_timer_alarm), + S1 = S0#state{shutdown_timer = Timer1#timer{ + timer_ref = TimerRef, + secret_ref = SecretRef + }}, + {noreply, S1}; + +handle_continue(Request, S0) -> + ?LOG_WARNING([{event, unhandled_continue}, {continue, Request}]), + {noreply, S0}. + + + +handle_call(?msg_call_transfer( + #ar_p3_ledger_record_v1{id = Id, counterpart = OutAccount, asset = Asset, amount = Amount} = InRecord, + #ar_p3_ledger_record_v1{id = Id, counterpart = InAccount, asset = Asset, amount = Amount} = OutRecord +), _From, S0) +when ?is_valid_account(InAccount) +andalso ?is_valid_account(OutAccount) +andalso InAccount /= OutAccount -> + {ok, S1} = insert_record(InAccount, InRecord, S0), + {ok, S2} = insert_record(OutAccount, OutRecord, S1), + {reply, ok, maybe_disarm_timer(S2)}; + +handle_call(?msg_call_transfer(_InRecord, _OutRecord), _From, S0) -> + {reply, {error, bad_accounts}, maybe_disarm_timer(S0)}; + +handle_call(?msg_call_total(), _From, #state{ + accounts = Accounts +} = S0) -> + Ret = maps:map(fun(_Account, #account{assets_map = AssetsMap}) -> + AssetsMap + end, Accounts), + {reply, {ok, Ret}, maybe_disarm_timer(S0)}; + +handle_call(Request, _From, S0) -> + ?LOG_WARNING([{event, unhandled_call}, {request, Request}]), + {reply, ok, S0}. + + + +handle_cast(Cast, S0) -> + ?LOG_WARNING([{event, unhandled_cast}, {cast, Cast}]), + {noreply, S0}. + + + +handle_info(?msg_info_timer_alarm, #state{shutdown_timer = #timer{armed = false} = Timer0} = S0) -> + ?LOG_DEBUG([{event, shutdown_timer}, {stage, armed}]), + {noreply, S0#state{shutdown_timer = Timer0#timer{armed = true}}, {continue, ?msg_continue_start_shutdown_timer}}; + +handle_info(?msg_info_timer_alarm, #state{shutdown_timer = #timer{armed = true} = _Timer0} = S0) -> + ?LOG_DEBUG([{event, shutdown_timer}, {stage, terminating}]), + {stop, shutdown, S0}; + +handle_info(Message, S0) -> + ?LOG_WARNING([{event, unhandled_info}, {message, Message}]), + {noreply, S0}. + + + +terminate(_Reason, S0) -> + _ = db_flush(S0), + _ = wal_sync(S0), + _ = close(S0), + ok. + + + +%%% ================================================================== +%%% Private functions. +%%% ================================================================== + + + +get_data_dir() -> + {ok, Config} = application:get_env(arweave, config), + Config#config.data_dir. + + + +get_base_log_dir() -> + {ok, Config} = application:get_env(arweave, config), + Config#config.log_dir. + + + +new_record_id() -> + Bin = erl_snowflake:generate_unsafe(bin), + <>. + + + +new_checkpoint_id(<>) -> + <>. + + + +new_record(Type, Counterpart, Asset, Amount, Meta) -> + new_record(new_record_id(), Type, Counterpart, Asset, Amount, Meta). + + + +new_record(Id, Type, Counterpart, Asset, Amount, Meta) -> + #ar_p3_ledger_record_v1{ + id = Id, type = Type, counterpart = Counterpart, + asset = Asset, amount = Amount, meta = Meta + }. + + + +new_counterrecord(Account, Record) -> + Record#ar_p3_ledger_record_v1{ + type = ?record_countertype(Record#ar_p3_ledger_record_v1.type), + counterpart = Account + }. + + + +new_checkpoint(RecordId, Assets) -> + #ar_p3_ledger_checkpoint_v1{ + id = new_checkpoint_id(RecordId), + assets_map = Assets + }. + + + +-spec load_assets(Account :: record_account(), S0 :: #state{}) -> + Ret :: { + DanglingRecords :: non_neg_integer(), + Assets :: assets_map() + }. + +load_assets(AccountName, #state{db_handle = DbHandle, accounts = Accounts0}) -> + Account = maps:get(AccountName, Accounts0), + case rocksdb:iterator(DbHandle, Account#account.cf_handle, []) of + {ok, ItrHandle} -> load_assets_recursive( + Account, ItrHandle, rocksdb:iterator_move(ItrHandle, last), {0, #{}} + ); + {error, Reason} -> throw({error, {Account, Reason}}) + end. + + + +load_assets_recursive(Account, ItrHandle, {ok, _Id, Value}, {Count, AccAssets}) -> + case decode_record(Value) of + #ar_p3_ledger_record_v1{asset = Asset} = R0 -> + load_assets_recursive( + Account, + ItrHandle, + rocksdb:iterator_move(ItrHandle, prev), + {Count + 1, merge_checkpoint_assets(AccAssets, #{Asset => record_signed_value(R0)})} + ); + #ar_p3_ledger_checkpoint_v1{assets_map = Assets} -> + {Count, merge_checkpoint_assets(AccAssets, Assets)} + end; + +load_assets_recursive(_Account, ItrHandle, {error, invalid_iterator}, Acc) -> + ok = rocksdb:iterator_close(ItrHandle), + Acc; + +load_assets_recursive(Account, ItrHandle, {error, iterator_closed}, _Acc) -> + ok = rocksdb:iterator_close(ItrHandle), + throw({error, {Account, iterator_closed}}). + + + +record_signed_value(#ar_p3_ledger_record_v1{type = ?ar_p3_ledger_record_type_in, amount = Amount}) -> Amount; +record_signed_value(#ar_p3_ledger_record_v1{type = ?ar_p3_ledger_record_type_out, amount = Amount}) -> -1 * Amount. + + + +merge_checkpoint_assets(Assets0, Assets1) -> + maps:fold(fun(Asset, Amount, Acc) -> + maps:put(Asset, Amount + maps:get(Asset, Acc, 0), Acc) + end, Assets0, Assets1). + + + +%%% +%%% @doc Inserts the record into proper rocksdb table and ensures to insert +%%% checkpoints in configured intervals. +%%% + +insert_record( + Account, + #ar_p3_ledger_record_v1{id = Id, asset = Asset} = Record, + #state{db_handle = DbHandle, accounts = Accounts0} = S0 +) -> + Account0 = maps:get(Account, Accounts0), + ok = rocksdb:put(DbHandle, Account0#account.cf_handle, Id, encode_record(Record), []), + + SignedAmount = record_signed_value(Record), + Account1 = Account0#account{ + assets_map = maps:update_with( + Asset, fun(Amount0) -> Amount0 + SignedAmount end, SignedAmount, Account0#account.assets_map), + dangling_records = Account0#account.dangling_records + 1 + }, + + Accounts1 = case Account1 of + #account{assets_map = AssetsMap, dangling_records = DanglingRecords} + when DanglingRecords >= S0#state.checkpoint_interval_records -> + Checkpoint = new_checkpoint(Id, AssetsMap), + ok = rocksdb:put(DbHandle, Account1#account.cf_handle, Checkpoint#ar_p3_ledger_checkpoint_v1.id, encode_record(Checkpoint), []), + Accounts0#{Account := Account1#account{dangling_records = 0}}; + _ -> + Accounts0#{Account := Account1} + end, + {ok, S0#state{accounts = Accounts1}}. + + + +%%% +%%% @doc Will call a callback on started ledger process. +%%% + +with_peer_ledger(PeerAddress, Fun) -> + case gproc:where(?via_reg_name(PeerAddress)) of + undefined -> with_peer_ledger_started(PeerAddress, Fun); + Pid -> apply(Fun, [Pid]) + end. + + + +%%% +%%% @doc will call a callback on started ledger process only if the ledger +%%% existed before the call. +%%% + +with_existing_peer_ledger(PeerAddress, Fun) -> + case gproc:where(?via_reg_name(PeerAddress)) of + undefined -> + case filelib:is_dir(?db_dir(PeerAddress)) of + true -> with_peer_ledger_started(PeerAddress, Fun); + false -> {error, no_exist} + end; + Pid -> apply(Fun, [Pid]) + end. + + + +%%% +%%% @doc Will call a callback of freshly started ledger process. +%%% NB: since the function might be called consurrently, it is exposed to the +%%% race condition: several processes might call this function at the same time +%%% and therefore attempt to start a ledger process. +%%% The process start is serialized via the supervisor process (`ar_p3_sup`), so +%%% only the first caller will get the `{ok, Pid}` response; others will get +%%% `{error, {already_started, Pid}}` error and will procees from there. +%%% + +with_peer_ledger_started(PeerAddress, Fun) -> + case ar_p3_sup:start_ledger(PeerAddress) of + {ok, Pid, _Info} -> apply(Fun, [Pid]); + {ok, Pid} -> apply(Fun, [Pid]); + {error, {already_started, Pid}} -> apply(Fun, [Pid]); + {error, Reason} -> {error, Reason} + end. + + + +maybe_cancel_timer(#timer{timer_ref = undefined} = Timer0) -> Timer0; +maybe_cancel_timer(#timer{timer_ref = TimerRef} = Timer0) -> + _ = erlang:cancel_timer(TimerRef), + Timer0#timer{timer_ref = undefined, secret_ref = undefined}. + + + +maybe_disarm_timer(#state{shutdown_timer = Timer0} = S0) -> + S0#state{shutdown_timer = Timer0#timer{armed = false}}. + + + +db_flush(#state{db_handle = undefined}) -> ok; +db_flush(#state{db_handle = DbHandle}) -> + case rocksdb:flush(DbHandle, [{wait, true}, {allow_write_stall, false}]) of + {error, FlushError} -> + ?LOG_ERROR([{event, db_operation_failed}, {op, db_flush}, {reason, io_lib:format("~p", [FlushError])}]), + {error, failed}; + _ -> + ?LOG_DEBUG([{event, db_operation}, {op, db_flush}]), + ok + end. + + + +wal_sync(#state{db_handle = undefined}) -> ok; +wal_sync(#state{db_handle = DbHandle}) -> + case rocksdb:sync_wal(DbHandle) of + {error, SyncError} -> + ?LOG_ERROR([{event, db_operation_failed}, {op, wal_sync}, {reason, io_lib:format("~p", [SyncError])}]), + {error, failed}; + _ -> + ?LOG_DEBUG([{event, db_operation}, {op, wal_sync}]), + ok + end. + + + +close(#state{db_handle = undefined}) -> ok; +close(#state{db_handle = DbHandle}) -> + try + case rocksdb:close(DbHandle) of + ok -> + ?LOG_DEBUG([{event, db_operation}, {op, close}]); + {error, CloseError} -> + ?LOG_ERROR([{event, db_operation_failed}, {op, close}, {error, io_lib:format("~p", [CloseError])}]) + end + catch + Exc -> + ?LOG_ERROR([{event, ar_kv_failed}, {op, close}, {reason, io_lib:format("~p", [Exc])}]) + end. + + + +%%% ================================================================== +%%% Private functions: encode/decode. +%%% ================================================================== + + + +%% +%% One should never change the numbers under these definitions: the stored +%% records will still have older values, which will lead to failed reads from +%% the database. +%% If you want to add a new field into the record record, consider adding the +%% new mapping and append it to the list below. +%% If, for some reason, you want to change the definitions below, or you want to +%% remove a field from the record record, consider creating a new erlang record +%% (#ar_p3_ledger_record_vN{}) and support both older and newer erlang records +%% within this module. +%% The older records support might be dropped once you're sure these do not +%% exist in production nodes. This might be the case if: +%% - The older record records are "compacted" (deleted) from the database, +%% since we only need the records from the latest checkpoint and later in +%% order to be consistent; +%% - There is a way to migrate the rocksdb records from older to newer format. +%% + +-define(ar_p3_ledger_common_field_version, 0). + +-define(ar_p3_ledger_record_field_id, 1). +-define(ar_p3_ledger_record_field_type, 2). +-define(ar_p3_ledger_record_field_counterpart, 3). +-define(ar_p3_ledger_record_field_asset, 4). +-define(ar_p3_ledger_record_field_amount, 5). +-define(ar_p3_ledger_record_field_meta, 6). + +-define(ar_p3_ledger_checkpoint_field_id, 1). +-define(ar_p3_ledger_checkpoint_field_assets_map, 2). + + + +encode_record(#ar_p3_ledger_record_v1{ + id = Id, type = Type, counterpart = Counterpart, + asset = Asset, amount = Amount, meta = Meta +}) -> + Map = #{ + ?ar_p3_ledger_common_field_version => 1, + ?ar_p3_ledger_record_field_id => Id, + ?ar_p3_ledger_record_field_type => encode_type(Type), + ?ar_p3_ledger_record_field_counterpart => encode_account(Counterpart), + ?ar_p3_ledger_record_field_asset => Asset, + ?ar_p3_ledger_record_field_amount => Amount, + ?ar_p3_ledger_record_field_meta => Meta + }, + msgpack:pack(Map); + +encode_record(#ar_p3_ledger_checkpoint_v1{id = Id, assets_map = AssetsMap}) -> + Map = #{ + ?ar_p3_ledger_common_field_version => 1, + ?ar_p3_ledger_checkpoint_field_id => Id, + ?ar_p3_ledger_checkpoint_field_assets_map => AssetsMap + }, + msgpack:pack(Map). + + + +encode_type(?ar_p3_ledger_record_type_in) -> 0; +encode_type(?ar_p3_ledger_record_type_out) -> 1. + + + +encode_account(?ar_p3_ledger_record_account_tokens) -> 0; +encode_account(?ar_p3_ledger_record_account_credits) -> 1; +encode_account(?ar_p3_ledger_record_account_services) -> 2. + + + +decode_record(Bin) -> + case msgpack:unpack(Bin) of + {ok, #{ + ?ar_p3_ledger_common_field_version := 1, + ?ar_p3_ledger_record_field_id := Id, + ?ar_p3_ledger_record_field_type := EncodedType, + ?ar_p3_ledger_record_field_counterpart := EncodedCounterpart, + ?ar_p3_ledger_record_field_asset := Asset, + ?ar_p3_ledger_record_field_amount := Amount, + ?ar_p3_ledger_record_field_meta := Meta + }} -> + #ar_p3_ledger_record_v1{ + id = Id, type = decode_type(EncodedType), counterpart = decode_account(EncodedCounterpart), + asset = Asset, amount = Amount, meta = Meta + }; + {ok, #{ + ?ar_p3_ledger_common_field_version := 1, + ?ar_p3_ledger_checkpoint_field_id := Id, + ?ar_p3_ledger_checkpoint_field_assets_map := AssetsMap + }} -> + #ar_p3_ledger_checkpoint_v1{id = Id, assets_map = AssetsMap}; + {error, _Reason} = E -> + throw(E); + _ -> + throw({error, {unexpected_record, Bin}}) + end. + + + +decode_type(0) -> ?ar_p3_ledger_record_type_in; +decode_type(1) -> ?ar_p3_ledger_record_type_out. + + + +decode_account(0) -> ?ar_p3_ledger_record_account_tokens; +decode_account(1) -> ?ar_p3_ledger_record_account_credits; +decode_account(2) -> ?ar_p3_ledger_record_account_services. + + + +%%% ================================================================== +%%% Unit tests. +%%% ================================================================== + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + + + +create_transaction_v1_records_test() -> + InRecord = new_record(?ar_p3_ledger_record_type_in, ?ar_p3_ledger_record_account_credits, <<"test/TST">>, 1000, #{}), + OutRecord = new_counterrecord(?ar_p3_ledger_record_account_tokens, InRecord), + + ?assertEqual(InRecord#ar_p3_ledger_record_v1.id, OutRecord#ar_p3_ledger_record_v1.id, "record ids are the same"). + + + +transaction_v1_record_encode_decode_test() -> + Record = new_record(?ar_p3_ledger_record_type_in, ?ar_p3_ledger_record_account_credits, <<"test/TST">>, 1000, #{}), + EncodedRecord = encode_record(Record), + + ?assertEqual(Record, decode_record(EncodedRecord), "decoded record is equal to original record"). + + + +create_checkpoint_v1_record_test() -> + Id = new_record_id(), + Checkpoint = new_checkpoint(Id, #{<<"test/TST">> => 1000}), + + ?assert(Checkpoint#ar_p3_ledger_checkpoint_v1.id > Id, "checkpoint id is greater than original id"). + + + +checkpoint_v1_record_encode_decode_test() -> + Checkpoint = new_checkpoint(new_record_id(), #{<<"test/TST">> => 1000}), + EncodedCheckpoint = encode_record(Checkpoint), + + ?assertEqual(Checkpoint, decode_record(EncodedCheckpoint), "decoded checkpoint is equal to original checkpoint"). + + + +-endif. diff --git a/apps/arweave/src/ar_p3_sup.erl b/apps/arweave/src/ar_p3_sup.erl new file mode 100644 index 000000000..ed72bfdf5 --- /dev/null +++ b/apps/arweave/src/ar_p3_sup.erl @@ -0,0 +1,73 @@ +-module(ar_p3_sup). + +-behaviour(supervisor). + +-include_lib("arweave/include/ar_config.hrl"). + +-export([start_link/0, start_ledger/1]). +-export([init/1]). + +-export([get_ledger_config_opts/0]). + + + +%%%=================================================================== +%%% Definitions. +%%%=================================================================== + + + +-define(ar_p3_ledger_shutdown_ms, 20000). %% 20s + + + +%%%=================================================================== +%%% Public interface. +%%%=================================================================== + + + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + + + +start_ledger(PeerAddress) -> + supervisor:start_child(?MODULE, [PeerAddress]). + + + +%% =================================================================== +%% Supervisor callbacks. +%% =================================================================== + + + +init([]) -> + {CheckpointIntervalRecords, ShutdownTimeoutMs} = get_ledger_config_opts(), + SupFlags = #{ + strategy => simple_one_for_one, + intensity => 5, + period => 1 + }, + ChildSpecs = [#{ + id => ar_p3_ledger, + start => {ar_p3_ledger, start_link, [CheckpointIntervalRecords, ShutdownTimeoutMs]}, + shutdown => ?ar_p3_ledger_shutdown_ms + }], + {ok, {SupFlags, ChildSpecs}}. + + + +%%% +%%% +%%% + + + +get_ledger_config_opts() -> + {ok, Config} = application:get_env(arweave, config), + { + Config#config.p3_ledger_checkpoint_interval, + Config#config.p3_ledger_shutdown_timeout * 1000 + }. diff --git a/apps/arweave/src/ar_sup.erl b/apps/arweave/src/ar_sup.erl index cb9279b1c..8a280d0a2 100644 --- a/apps/arweave/src/ar_sup.erl +++ b/apps/arweave/src/ar_sup.erl @@ -65,6 +65,7 @@ init([]) -> ?CHILD(ar_rate_limiter, worker), ?CHILD(ar_disksup, worker), ?CHILD_SUP(ar_events_sup, supervisor), + ?CHILD_SUP(ar_p3_sup, supervisor), ?CHILD_SUP(ar_http_sup, supervisor), ?CHILD_SUP(ar_kv_sup, supervisor), ?CHILD_SUP(ar_storage_sup, supervisor), diff --git a/apps/arweave/src/arweave.app.src b/apps/arweave/src/arweave.app.src index 95685ec47..654812e44 100644 --- a/apps/arweave/src/arweave.app.src +++ b/apps/arweave/src/arweave.app.src @@ -15,7 +15,10 @@ prometheus_cowboy, prometheus_process_collector, prometheus_httpd, - runtime_tools + runtime_tools, + erl_snowflake, + gproc, + msgpack ]}, {extra_applications, [recon]} ]}. diff --git a/apps/arweave/test/ar_p3_ledger_tests.erl b/apps/arweave/test/ar_p3_ledger_tests.erl new file mode 100644 index 000000000..34ecc60e0 --- /dev/null +++ b/apps/arweave/test/ar_p3_ledger_tests.erl @@ -0,0 +1,183 @@ +-module(ar_p3_ledger_tests). + +-include_lib("arweave/include/ar_config.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +-define(with_setup(CheckpointInterval, ShutdownTimeoutS, Test), parametric_setup(CheckpointInterval, ShutdownTimeoutS, Test)). +-define(with_setup(Test), ?with_setup(100, 60, Test)). +-define(timeout(Timeout, TestOrTests), {timeout, Timeout, TestOrTests}). + +-define(peer_address, <<"PEERADDRESS">>). +-define(asset0, <<"test0/T0">>). +-define(asset1, <<"test1/T1">>). + + + +%%% ================================================================== +%%% Utility. +%%% ================================================================== + + + +parametric_setup(CheckpointInterval, ShutdownTimeoutS, Tests) -> + {ok, OriginalConfig} = application:get_env(arweave, config), + AlteredConfig = OriginalConfig#config{ + p3_ledger_checkpoint_interval = CheckpointInterval, + p3_ledger_shutdown_timeout = ShutdownTimeoutS + }, + {setup, fun() -> + ok = application:set_env(arweave, config, AlteredConfig, [{persistent, true}]), + ok = supervisor:terminate_child(ar_sup, ar_p3_sup), + {ok, _Pid} = supervisor:restart_child(ar_sup, ar_p3_sup), + test_setup() + end, fun(_) -> + test_teardown(), + ok = application:set_env(arweave, config, OriginalConfig, [{persistent, true}]) + end, [Tests]}. + + + +test_setup() -> + + ok = maybe_delete_rocksdb_database(?peer_address), + ok. + + + +test_teardown() -> + ok = maybe_terminate_ledger_gracefully(?peer_address), + ok. + + + +maybe_terminate_ledger_gracefully(PeerAddress) -> + MaybeProcessPid = gproc:where(ar_p3_ledger:via_reg_name(PeerAddress)), + case MaybeProcessPid of + undefined -> ok; + Pid -> supervisor:terminate_child(ar_p3_sup, Pid) + end, + ok. + + + +maybe_terminate_ledger_brutally(PeerAddress) -> + MaybeProcessPid = gproc:where(ar_p3_ledger:via_reg_name(PeerAddress)), + case MaybeProcessPid of + undefined -> ok; + Pid -> erlang:exit(Pid, kill) + end, + ok. + + + +maybe_delete_rocksdb_database(PeerAddress) -> + DbDir = ar_p3_ledger:db_dir(PeerAddress), + case file:del_dir_r(DbDir) of + ok -> ok; + {error, enoent} -> ok; + {error, Reason} -> throw({error, {delete_database, Reason}}) + end, + ok. + + + +%%% ================================================================== +%%% Timing tests. +%%% ================================================================== + + + +timing_test_() -> [?timeout(5000, [ + ?with_setup(100, 1, fun shutdown_timeout/0) +])]. + + + +shutdown_timeout() -> + %% start the ledger with a transaction + {ok, _} = ar_p3_ledger:deposit(?peer_address, ?asset0, 1000, #{}), + Pid = gproc:where(ar_p3_ledger:via_reg_name(?peer_address)), + + timer:sleep(1000), + ?assertMatch(true, erlang:is_process_alive(Pid), "ledger process is still alive"), + timer:sleep(1000), + ?assertMatch(false, erlang:is_process_alive(Pid), "ledger process is dead"). + + + +%%% ================================================================== +%%% Functionality tests. +%%% ================================================================== + + + + +ledger_functionality_test_() -> ?timeout(200, [ + ?with_setup(fun basic_deposit/0), + ?with_setup(fun multi_asset_deposit/0), + ?with_setup(fun basic_service/0), + ?with_setup(fun multi_asset_service/0) +]). + + + +basic_deposit() -> + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:deposit(?peer_address, ?asset0, 1000, #{}), + "deposit successful" + ), + ?assertMatch({ok, #{?asset0 := 1000}}, ar_p3_ledger:total_tokens(?peer_address), "tokens balance is correct"), + ?assertMatch({ok, #{?asset0 := -1000}}, ar_p3_ledger:total_credits(?peer_address), "credits balance is correct"), + ?assertMatch({ok, #{}}, ar_p3_ledger:total_services(?peer_address), "services balance is correct"). + + + +multi_asset_deposit() -> + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:deposit(?peer_address, ?asset0, 1000, #{}), + "deposit successful" + ), + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:deposit(?peer_address, ?asset1, 500, #{}), + "deposit successful" + ), + ?assertMatch({ok, #{?asset0 := 1000, ?asset1 := 500}}, ar_p3_ledger:total_tokens(?peer_address), "tokens balance is correct"), + ?assertMatch({ok, #{?asset0 := -1000, ?asset1 := -500}}, ar_p3_ledger:total_credits(?peer_address), "credits balance is correct"), + ?assertMatch({ok, #{}}, ar_p3_ledger:total_services(?peer_address), "services balance is correct"). + + + +basic_service() -> + {ok, _} = ar_p3_ledger:deposit(?peer_address, ?asset0, 1000, #{}), + + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:service(?peer_address, ?asset0, 100, #{}), + "service successful" + ), + ?assertMatch({ok, #{?asset0 := 1000}}, ar_p3_ledger:total_tokens(?peer_address), "tokens balance is correct"), + ?assertMatch({ok, #{?asset0 := -900}}, ar_p3_ledger:total_credits(?peer_address), "credits balance is correct"), + ?assertMatch({ok, #{?asset0 := -100}}, ar_p3_ledger:total_services(?peer_address), "services balance is correct"). + + + +multi_asset_service() -> + {ok, _} = ar_p3_ledger:deposit(?peer_address, ?asset0, 1000, #{}), + {ok, _} = ar_p3_ledger:deposit(?peer_address, ?asset1, 500, #{}), + + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:service(?peer_address, ?asset0, 100, #{}), + "service successful" + ), + ?assertMatch( + {ok, Id} when is_binary(Id), + ar_p3_ledger:service(?peer_address, ?asset1, 100, #{}), + "service successful" + ), + ?assertMatch({ok, #{?asset0 := 1000, ?asset1 := 500}}, ar_p3_ledger:total_tokens(?peer_address), "tokens balance is correct"), + ?assertMatch({ok, #{?asset0 := -900, ?asset1 := -400}}, ar_p3_ledger:total_credits(?peer_address), "credits balance is correct"), + ?assertMatch({ok, #{?asset0 := -100, ?asset1 := -100}}, ar_p3_ledger:total_services(?peer_address), "services balance is correct"). diff --git a/rebar.config b/rebar.config index 8ee4f068b..6992a7112 100644 --- a/rebar.config +++ b/rebar.config @@ -1,500 +1,832 @@ {deps, [ - {b64fast, {git, "https://github.com/ArweaveTeam/b64fast.git", {ref, "58f0502e49bf73b29d95c6d02460d1fb8d2a5273"}}}, - {jiffy, {git, "https://github.com/ArweaveTeam/jiffy.git", {ref, "74c956defa9116c85d76f77c3e9b5bd6de7bd39a"}}}, - {gun, "1.3.3"}, - {cowboy, "2.10.0"}, - {graphql, {git, "https://github.com/shopgun/graphql-erlang.git", {branch, "master"}}}, - {prometheus, "4.11.0"}, - {prometheus_process_collector, - {git, "https://github.com/ArweaveTeam/prometheus_process_collector.git", + {b64fast, + {git, "https://github.com/ArweaveTeam/b64fast.git", + {ref, "58f0502e49bf73b29d95c6d02460d1fb8d2a5273"}}}, + {jiffy, + {git, "https://github.com/ArweaveTeam/jiffy.git", + {ref, "74c956defa9116c85d76f77c3e9b5bd6de7bd39a"}}}, + {gun, "1.3.3"}, + {cowboy, "2.10.0"}, + {graphql, {git, "https://github.com/shopgun/graphql-erlang.git", {branch, "master"}}}, + {prometheus, "4.11.0"}, + {prometheus_process_collector, + {git, "https://github.com/ArweaveTeam/prometheus_process_collector.git", {ref, "1362b608ffa4748cdf5dba92b85c981218fd4fa2"}}}, - {prometheus_cowboy, "0.1.8"}, - {rocksdb, {git, "https://github.com/ArweaveTeam/erlang-rocksdb.git", {ref, "f580865c0bc18b0302a6190d7fa85e68ec0762e0"}}} + {prometheus_cowboy, "0.1.8"}, + {rocksdb, + {git, "https://github.com/ArweaveTeam/erlang-rocksdb.git", + {ref, "f580865c0bc18b0302a6190d7fa85e68ec0762e0"}}}, + {erl_snowflake, "1.1.0"}, + {msgpack, "0.8.1"}, + {gproc, "1.0.0"} ]}. -{overrides, - [{override, b64fast, [ - {plugins, [{pc, {git, "https://github.com/blt/port_compiler.git", {tag, "v1.12.0"}}}]}, - {artifacts, ["priv/b64fast.so"]}, - {provider_hooks, [ - {post, [ - {compile, {pc, compile}}, - {clean, {pc, clean}} - ] - }] - }]} +{overrides, [ + {override, b64fast, [ + {plugins, [{pc, {git, "https://github.com/blt/port_compiler.git", {tag, "v1.12.0"}}}]}, + {artifacts, ["priv/b64fast.so"]}, + {provider_hooks, [ + {post, [ + {compile, {pc, compile}}, + {clean, {pc, clean}} + ]} + ]} + ]} ]}. {relx, [ - {release, {arweave, "2.7.4"}, [ - {arweave, load}, - b64fast, - jiffy, - rocksdb, - prometheus_process_collector - ]}, + {release, {arweave, "2.7.4"}, [ + {arweave, load}, + b64fast, + jiffy, + rocksdb, + erl_snowflake, + msgpack, + gproc, + prometheus_process_collector + ]}, - {sys_config, "./config/sys.config"}, - {vm_args_src, "./config/vm.args.src"}, + {sys_config, "./config/sys.config"}, + {vm_args_src, "./config/vm.args.src"}, - {overlay, [ - {copy, "bin/arweave.env", "bin/arweave.env"}, - {copy, "bin/start", "bin/start"}, - {copy, "bin/stop", "bin/stop"}, - {copy, "bin/create-wallet", "bin/create-wallet"}, - {copy, "bin/benchmark-hash", "bin/benchmark-hash"}, - {copy, "bin/benchmark-packing", "bin/benchmark-packing"}, - {copy, "bin/benchmark-packing-all", "bin/benchmark-packing-all"}, - {copy, "bin/benchmark-vdf", "bin/benchmark-vdf"}, - {copy, "bin/data-doctor", "bin/data-doctor"}, - {copy, "bin/logs", "bin/logs"}, - {copy, "bin/debug-logs", "bin/debug-logs"}, - {copy, "bin/check-nofile", "bin/check-nofile"}, - {copy, "data/not_found.html", "data/not_found.html"}, - {copy, "data/hash_list_1_0", "data/hash_list_1_0"}, - {copy, "data/genesis_wallets.csv", "data/genesis_wallets.csv"}, - {copy, "data/genesis_txs/ZC44Bxrx6AtNJYLwhvpALuINZRBXklme3tpeJbJ2rdw.json", "data/genesis_txs/ZC44Bxrx6AtNJYLwhvpALuINZRBXklme3tpeJbJ2rdw.json"}, - {copy, "data/genesis_txs/6NaT-Mz8QAiQS8atFaOu_ezqZnfu_XaQb-Grng-hvHc.json", "data/genesis_txs/6NaT-Mz8QAiQS8atFaOu_ezqZnfu_XaQb-Grng-hvHc.json"}, - {copy, "data/genesis_txs/1qVeYpf2sY8Qkz0iVomVPVb15NA7QUtF3eFDoMwa8PI.json", "data/genesis_txs/1qVeYpf2sY8Qkz0iVomVPVb15NA7QUtF3eFDoMwa8PI.json"}, - {copy, "data/genesis_txs/6GNIVQ-23jPJTxQkQITbSKE7SYm6J3MF4qbSgH3-AXU.json", "data/genesis_txs/6GNIVQ-23jPJTxQkQITbSKE7SYm6J3MF4qbSgH3-AXU.json"}, - {copy, "data/genesis_txs/3T6mnguMWl8GeiqZWiBZrGXHHtwm12mIWciusoSACkQ.json", "data/genesis_txs/3T6mnguMWl8GeiqZWiBZrGXHHtwm12mIWciusoSACkQ.json"}, - {copy, "data/genesis_txs/EQh5rYFJ5Z5yESi4DIuvl2n6iVZS899tA6V6rf2Xwhk.json", "data/genesis_txs/EQh5rYFJ5Z5yESi4DIuvl2n6iVZS899tA6V6rf2Xwhk.json"}, - {copy, "data/genesis_txs/128KaPgVaZyrl8Vuzt795ZlWidERzih15pNDAJgahI0.json", "data/genesis_txs/128KaPgVaZyrl8Vuzt795ZlWidERzih15pNDAJgahI0.json"}, - {copy, "data/genesis_txs/xiQYsaUMtlIq9DvTyucB4gu0BFC-qnFRIDclLv8wUT8.json", "data/genesis_txs/xiQYsaUMtlIq9DvTyucB4gu0BFC-qnFRIDclLv8wUT8.json"}, - {copy, "data/genesis_txs/I6s8Z6gEPLQABFstkCoLVv_gdQNGb-uuMMut-R7q2hA.json", "data/genesis_txs/I6s8Z6gEPLQABFstkCoLVv_gdQNGb-uuMMut-R7q2hA.json"}, - {copy, "data/genesis_txs/kXu3jTQwgYsphIUFbaVGg9rNiil96fNjw0RBa6oPRtU.json", "data/genesis_txs/kXu3jTQwgYsphIUFbaVGg9rNiil96fNjw0RBa6oPRtU.json"}, - {copy, "data/genesis_txs/CUu1gtu6L5tJxkOAu13tNBGDKECohV8M4qgCOOPNtas.json", "data/genesis_txs/CUu1gtu6L5tJxkOAu13tNBGDKECohV8M4qgCOOPNtas.json"}, - {copy, "data/genesis_txs/g6TUtTIi_rwlAHNuO6ACsQqIChWACugTPmZxaaJltDM.json", "data/genesis_txs/g6TUtTIi_rwlAHNuO6ACsQqIChWACugTPmZxaaJltDM.json"}, - {copy, "data/genesis_txs/L9J9SkTWI_Fx5KhujeWGokIchHTSFlSIC0blr0JIz80.json", "data/genesis_txs/L9J9SkTWI_Fx5KhujeWGokIchHTSFlSIC0blr0JIz80.json"}, - {copy, "data/genesis_txs/AX6ZZxDpFlNhoN5Am5Hi4DER4zOBGVnQm_bse5PfHNw.json", "data/genesis_txs/AX6ZZxDpFlNhoN5Am5Hi4DER4zOBGVnQm_bse5PfHNw.json"}, - {copy, "data/genesis_txs/3MMMUrHDmjbCn_-TOZJJHvjLBp8PffZKUNfm_Ziy0Vk.json", "data/genesis_txs/3MMMUrHDmjbCn_-TOZJJHvjLBp8PffZKUNfm_Ziy0Vk.json"}, - {copy, "data/genesis_txs/2vn7V0FR0JMXrVbj3Ofvc_2nvrFYCCpRoFjc7UYpJcA.json", "data/genesis_txs/2vn7V0FR0JMXrVbj3Ofvc_2nvrFYCCpRoFjc7UYpJcA.json"}, - {copy, "data/genesis_txs/daTnztzTMlA8Ras9XgQ05Fr9ZYwOg4-UDfjW875yQeQ.json", "data/genesis_txs/daTnztzTMlA8Ras9XgQ05Fr9ZYwOg4-UDfjW875yQeQ.json"}, - {copy, "data/genesis_txs/_QEE09XylMYgab9MYPvrrMy7v1jKWh0bGwqFvsBsO8s.json", "data/genesis_txs/_QEE09XylMYgab9MYPvrrMy7v1jKWh0bGwqFvsBsO8s.json"}, - {copy, "data/genesis_txs/5WKzIeQrDGC86IQvl2NhRtgPNKHGRA9oyjRByV1F7p4.json", "data/genesis_txs/5WKzIeQrDGC86IQvl2NhRtgPNKHGRA9oyjRByV1F7p4.json"}, - {copy, "data/genesis_txs/Tnf6b1F67AEV2r9Flj8ktSSHYoV8SeL9dFvHRkavlZo.json", "data/genesis_txs/Tnf6b1F67AEV2r9Flj8ktSSHYoV8SeL9dFvHRkavlZo.json"}, - {copy, "data/genesis_txs/m1Vv28IVJIuYiToBhxFVp3dA47je3L8WkzSjggAWXAo.json", "data/genesis_txs/m1Vv28IVJIuYiToBhxFVp3dA47je3L8WkzSjggAWXAo.json"}, - {copy, "data/genesis_txs/iPb5JLzNajAzUNByVeIGSEPR0rzGOV5iIYjWpi99APQ.json", "data/genesis_txs/iPb5JLzNajAzUNByVeIGSEPR0rzGOV5iIYjWpi99APQ.json"}, - {copy, "data/genesis_txs/KOm2FJzmNXa_yjYC-58DkysCdk7FRFMcRmBx3DF6S9A.json", "data/genesis_txs/KOm2FJzmNXa_yjYC-58DkysCdk7FRFMcRmBx3DF6S9A.json"}, - {copy, "data/genesis_txs/R0Mhun4e-WmLLGxnJq4SDTRqyNvTDTKC-uXuol1s63A.json", "data/genesis_txs/R0Mhun4e-WmLLGxnJq4SDTRqyNvTDTKC-uXuol1s63A.json"}, - {copy, "data/genesis_txs/g8ZQaQTNUbg-jGeE61og18FrGqpFeZxjFDypGuhT7zI.json", "data/genesis_txs/g8ZQaQTNUbg-jGeE61og18FrGqpFeZxjFDypGuhT7zI.json"}, - {copy, "data/genesis_txs/DC6gmByeCki7uyXHJhX_A9x3pkMgmJ8Tv6wDRnh7vGs.json", "data/genesis_txs/DC6gmByeCki7uyXHJhX_A9x3pkMgmJ8Tv6wDRnh7vGs.json"}, - {copy, "data/genesis_txs/y-k4KjdSmwYmIugoObrtx5JWYczlEZBzwBHGMLqNP-0.json", "data/genesis_txs/y-k4KjdSmwYmIugoObrtx5JWYczlEZBzwBHGMLqNP-0.json"}, - {copy, "data/genesis_txs/OIOqGvvuafD_5J9QzfxyPiNlnqzIcL96i6u4PTUeDmA.json", "data/genesis_txs/OIOqGvvuafD_5J9QzfxyPiNlnqzIcL96i6u4PTUeDmA.json"}, - {copy, "data/genesis_txs/mcFln0_6FIuLwE9GtMRzmdQts4QALV3dxQkXdgSdO2s.json", "data/genesis_txs/mcFln0_6FIuLwE9GtMRzmdQts4QALV3dxQkXdgSdO2s.json"}, - {copy, "data/genesis_txs/R2h2i6y-KFxuHukxmHIjSncPZSiS4tpuzH0tD1NAooI.json", "data/genesis_txs/R2h2i6y-KFxuHukxmHIjSncPZSiS4tpuzH0tD1NAooI.json"}, - {copy, "data/genesis_txs/rC7TOXwflo7w9Ky0ljTYlzdbR0A3g2GVRbRJbIIuBfY.json", "data/genesis_txs/rC7TOXwflo7w9Ky0ljTYlzdbR0A3g2GVRbRJbIIuBfY.json"}, - {copy, "data/genesis_txs/UdCfZG1jBYUKgeLc13zjRxmQHO4_13B-NigE57jmJ5A.json", "data/genesis_txs/UdCfZG1jBYUKgeLc13zjRxmQHO4_13B-NigE57jmJ5A.json"}, - {copy, "data/genesis_txs/8gTAwQ3f17PKI9KCX1cjuXCs9F8Hcdz8KyhsecKuCJ0.json", "data/genesis_txs/8gTAwQ3f17PKI9KCX1cjuXCs9F8Hcdz8KyhsecKuCJ0.json"}, - {copy, "data/genesis_txs/HFUR5ZwLihdaonJWHRHBuLay6cw8ZMV0bM870xhE6Qk.json", "data/genesis_txs/HFUR5ZwLihdaonJWHRHBuLay6cw8ZMV0bM870xhE6Qk.json"}, - {copy, "data/genesis_txs/QDbVk-efwdVbHDGL1vZO3mQ3g65ol5RR-1wOvPLUkkE.json", "data/genesis_txs/QDbVk-efwdVbHDGL1vZO3mQ3g65ol5RR-1wOvPLUkkE.json"}, - {copy, "data/genesis_txs/F5R2EA-gM8AtQ9_NymKwtr_Im3_ljMR38ndzCs5c77Y.json", "data/genesis_txs/F5R2EA-gM8AtQ9_NymKwtr_Im3_ljMR38ndzCs5c77Y.json"}, - {copy, "data/genesis_txs/O6qlkPRgr7H3WLHjVov-CTm-q66Q4TuvhP6GC-c5ZjY.json", "data/genesis_txs/O6qlkPRgr7H3WLHjVov-CTm-q66Q4TuvhP6GC-c5ZjY.json"}, - {copy, "data/genesis_txs/0qob-AeHGTS5EDamY6Mtsnxf1MCyUk18l09bqHAYQjU.json", "data/genesis_txs/0qob-AeHGTS5EDamY6Mtsnxf1MCyUk18l09bqHAYQjU.json"}, - {copy, "data/genesis_txs/VuXQZjhUaZ2Hyi6Pl8_VTOu2mUWjoEemYb5TKXPFOS0.json", "data/genesis_txs/VuXQZjhUaZ2Hyi6Pl8_VTOu2mUWjoEemYb5TKXPFOS0.json"}, - {copy, "data/genesis_txs/Osgzf9EDK9j7TMlqSJ_5Y1rzZgOA6qfR7ktiakLPk4A.json", "data/genesis_txs/Osgzf9EDK9j7TMlqSJ_5Y1rzZgOA6qfR7ktiakLPk4A.json"}, - {copy, "data/genesis_txs/1xh_NCIFYbprcgNM4AVvZ47jRxsQmJYvCG-L-oEK4iE.json", "data/genesis_txs/1xh_NCIFYbprcgNM4AVvZ47jRxsQmJYvCG-L-oEK4iE.json"}, - {copy, "data/genesis_txs/DpEoi9F4g952ajGuT4g1HWY-xndyE77dn0VfdNXkrC8.json", "data/genesis_txs/DpEoi9F4g952ajGuT4g1HWY-xndyE77dn0VfdNXkrC8.json"}, - {copy, "data/genesis_txs/Z6IgRWClifhTSnomxJet2WLw8UUaslmqAi2nynj3Ke4.json", "data/genesis_txs/Z6IgRWClifhTSnomxJet2WLw8UUaslmqAi2nynj3Ke4.json"}, - {copy, "data/genesis_txs/Xjz72yVLd_Qzl8_GfSPqZA1MAkxxhjr2Lsf2tGCj_ZQ.json", "data/genesis_txs/Xjz72yVLd_Qzl8_GfSPqZA1MAkxxhjr2Lsf2tGCj_ZQ.json"}, - {copy, "data/genesis_txs/r8Yq7Lvx0FjFYyXBLn29UM5Evv4AtGLZ00LCtE_hC60.json", "data/genesis_txs/r8Yq7Lvx0FjFYyXBLn29UM5Evv4AtGLZ00LCtE_hC60.json"}, - {copy, "data/genesis_txs/7kT0is0QnxdjqkPi0BKamhLW6z6_SK55LMAVKQC6F0M.json", "data/genesis_txs/7kT0is0QnxdjqkPi0BKamhLW6z6_SK55LMAVKQC6F0M.json"}, - {copy, "data/genesis_txs/-wzIQJ19Hq8Zyf1L85Ga3uGTrdWA2W-UNyr8aH4a4iE.json", "data/genesis_txs/-wzIQJ19Hq8Zyf1L85Ga3uGTrdWA2W-UNyr8aH4a4iE.json"}, - {copy, "data/genesis_txs/QDBM2PowqCX0eUCKzgV-DgdzeDz5TXLKYS3HVXLyqoo.json", "data/genesis_txs/QDBM2PowqCX0eUCKzgV-DgdzeDz5TXLKYS3HVXLyqoo.json"}, - {copy, "data/genesis_txs/ZAk05et7CFN69E9NwET2mSRI0ISRigjMEjcy8kbO-Y8.json", "data/genesis_txs/ZAk05et7CFN69E9NwET2mSRI0ISRigjMEjcy8kbO-Y8.json"}, - {copy, "data/genesis_txs/LJ2QSdjHftgyCOSgy9Ub0OkTTN25rxCY7D7mt6u8Uy8.json", "data/genesis_txs/LJ2QSdjHftgyCOSgy9Ub0OkTTN25rxCY7D7mt6u8Uy8.json"}, - {copy, "data/genesis_txs/luyHFFFOvjKPqi6nVrxngcHaQ3RwbMDMqVTLqPagHy0.json", "data/genesis_txs/luyHFFFOvjKPqi6nVrxngcHaQ3RwbMDMqVTLqPagHy0.json"}, - {copy, "data/genesis_txs/eJ2aSQ4nm-i8XAZW2pcRq6GoEjW9K8EBM6w7rLiuSHw.json", "data/genesis_txs/eJ2aSQ4nm-i8XAZW2pcRq6GoEjW9K8EBM6w7rLiuSHw.json"}, - {copy, "data/genesis_txs/SHxtj5_gLdJMI-6CcspsDbFBuU_74df3I4-sAJkAr6w.json", "data/genesis_txs/SHxtj5_gLdJMI-6CcspsDbFBuU_74df3I4-sAJkAr6w.json"}, - {copy, "data/genesis_txs/CZ181FVir4NaSJ7JsVb50-xCaZtd3dmKbDer7jpTSyI.json", "data/genesis_txs/CZ181FVir4NaSJ7JsVb50-xCaZtd3dmKbDer7jpTSyI.json"}, - {copy, "data/genesis_txs/Mk8XJgQPSOIsx_QX_XDPxdEG5NcKgO92q9i37uLZsrs.json", "data/genesis_txs/Mk8XJgQPSOIsx_QX_XDPxdEG5NcKgO92q9i37uLZsrs.json"}, - {copy, "data/genesis_txs/Y0PLaTBQ73JXn_jHvldOKC3jdbqDbqTMkcW0x65_Jek.json", "data/genesis_txs/Y0PLaTBQ73JXn_jHvldOKC3jdbqDbqTMkcW0x65_Jek.json"}, - {copy, "data/genesis_txs/G5FyMvm8E0_07vFgz-XISJN3VEviSrbtih9_Wptef9w.json", "data/genesis_txs/G5FyMvm8E0_07vFgz-XISJN3VEviSrbtih9_Wptef9w.json"}, - {copy, "data/genesis_txs/fx1EmDF4yioha3ms_VbddDQjl4bt6pBLpFCESuEIT6E.json", "data/genesis_txs/fx1EmDF4yioha3ms_VbddDQjl4bt6pBLpFCESuEIT6E.json"}, - {copy, "data/genesis_txs/EUMtkWCJU0L23RnhXKfQ1wtD3Jh2O-vpFnLcQXynoAQ.json", "data/genesis_txs/EUMtkWCJU0L23RnhXKfQ1wtD3Jh2O-vpFnLcQXynoAQ.json"}, - {copy, "data/genesis_txs/BYJCPwCLpd9a5K1HFy5F6ZvnemPiPFtV4hz5wMHr1NI.json", "data/genesis_txs/BYJCPwCLpd9a5K1HFy5F6ZvnemPiPFtV4hz5wMHr1NI.json"}, - {copy, "data/genesis_txs/5dsjbEwH2r-EWCkfOznV4JkCOLSK9vNY-0iqPr4RZUM.json", "data/genesis_txs/5dsjbEwH2r-EWCkfOznV4JkCOLSK9vNY-0iqPr4RZUM.json"}, - {copy, "data/genesis_txs/71M1E7A4e0PFW_6C0gly77iCg7ykX17647i00eEiA-s.json", "data/genesis_txs/71M1E7A4e0PFW_6C0gly77iCg7ykX17647i00eEiA-s.json"}, - {copy, "data/genesis_txs/98kadyXY0OPfEZKeeZcCyQ7z5mRToZklK-D6f1a-Lxw.json", "data/genesis_txs/98kadyXY0OPfEZKeeZcCyQ7z5mRToZklK-D6f1a-Lxw.json"}, - {copy, "data/genesis_txs/EvKHSfokNyuiTarFKOuQ_-SaBwtllGpQGc7IFkRfBfc.json", "data/genesis_txs/EvKHSfokNyuiTarFKOuQ_-SaBwtllGpQGc7IFkRfBfc.json"}, - {copy, "data/genesis_txs/hRTkBAH0k74HlmlWXTWmetXcIFXvM_Zrz3i1JXULZSM.json", "data/genesis_txs/hRTkBAH0k74HlmlWXTWmetXcIFXvM_Zrz3i1JXULZSM.json"}, - {copy, "data/genesis_txs/p9PJG5GkKZAxLyPJyDYw4_1CmhodHGGGqB785duwVwM.json", "data/genesis_txs/p9PJG5GkKZAxLyPJyDYw4_1CmhodHGGGqB785duwVwM.json"}, - {copy, "data/genesis_txs/rTY6dpq4KEhZtB-5moP1mWN1CtrTKurv7QSY8wAN758.json", "data/genesis_txs/rTY6dpq4KEhZtB-5moP1mWN1CtrTKurv7QSY8wAN758.json"}, - {copy, "data/genesis_txs/K_ae8Bfvql0dGhIfRH-R7W-zWoeB95kYGJNi3HjFyrs.json", "data/genesis_txs/K_ae8Bfvql0dGhIfRH-R7W-zWoeB95kYGJNi3HjFyrs.json"}, - {copy, "data/genesis_txs/z7Xvravldr4BhTI4KPOEWtG325_1ORaLQ4aUPOAe_us.json", "data/genesis_txs/z7Xvravldr4BhTI4KPOEWtG325_1ORaLQ4aUPOAe_us.json"}, - {copy, "data/genesis_txs/SCN8yn0cQASui1DeV4mMYeQrRn8eXKr7Cp9ll7L3UfI.json", "data/genesis_txs/SCN8yn0cQASui1DeV4mMYeQrRn8eXKr7Cp9ll7L3UfI.json"}, - {copy, "data/genesis_txs/piTZgtn2oBsWKt09CV8LqH3I3JaVdRjFwjOAJmC-Xp4.json", "data/genesis_txs/piTZgtn2oBsWKt09CV8LqH3I3JaVdRjFwjOAJmC-Xp4.json"}, - {copy, "data/genesis_txs/gbYMogbLVx3rOmm7K-o3nfGPKauLMLkGMSXcKkXW13Q.json", "data/genesis_txs/gbYMogbLVx3rOmm7K-o3nfGPKauLMLkGMSXcKkXW13Q.json"}, - {copy, "data/genesis_txs/3BSgxVi4vtVtgMBtDE8xPMqU0PmkiKtKX6P_Iw0kMsM.json", "data/genesis_txs/3BSgxVi4vtVtgMBtDE8xPMqU0PmkiKtKX6P_Iw0kMsM.json"}, - {copy, "data/genesis_txs/M_wQsQbFGtGiEaH0uW2swBubAnFab3ZcCN8IYWZvVzo.json", "data/genesis_txs/M_wQsQbFGtGiEaH0uW2swBubAnFab3ZcCN8IYWZvVzo.json"}, - {copy, "data/genesis_txs/un3O49lggBX9raJKb6yuql_QTgZYWakWw5ydwUgUuXY.json", "data/genesis_txs/un3O49lggBX9raJKb6yuql_QTgZYWakWw5ydwUgUuXY.json"}, - {copy, "data/genesis_txs/wFjsB5Y9GV61NqjCeyPCdkfXKUJOYccq8Bl9aljvwGc.json", "data/genesis_txs/wFjsB5Y9GV61NqjCeyPCdkfXKUJOYccq8Bl9aljvwGc.json"}, - {copy, "data/genesis_txs/kcb41aN752OE__qEKDQAsbpzCUXMdlzI3clCBuxdVts.json", "data/genesis_txs/kcb41aN752OE__qEKDQAsbpzCUXMdlzI3clCBuxdVts.json"}, - {copy, "data/genesis_txs/gE-2fjp2ncJ0ZRg12UBfqnCBb75OtAOksEX3wGZguqw.json", "data/genesis_txs/gE-2fjp2ncJ0ZRg12UBfqnCBb75OtAOksEX3wGZguqw.json"}, - {copy, "data/genesis_txs/SJXMM0tlXown7l3ffjhsiKf311FDTRa7QkKX8tgyEZ8.json", "data/genesis_txs/SJXMM0tlXown7l3ffjhsiKf311FDTRa7QkKX8tgyEZ8.json"}, - {copy, "data/genesis_txs/EPZ0hBh1wp-7T4JED4v6DOItd-9MNWkRfbLyizDLBsE.json", "data/genesis_txs/EPZ0hBh1wp-7T4JED4v6DOItd-9MNWkRfbLyizDLBsE.json"}, - {copy, "data/genesis_txs/IACLRsWq-T6aesGEAjfFTZJd2sy7sFvWL7O6FI9A39U.json", "data/genesis_txs/IACLRsWq-T6aesGEAjfFTZJd2sy7sFvWL7O6FI9A39U.json"}, - {copy, "data/genesis_txs/Dxrsx0xuPVY7oz9yHbL6wOFxo6ws7ycVe778C2bc9J8.json", "data/genesis_txs/Dxrsx0xuPVY7oz9yHbL6wOFxo6ws7ycVe778C2bc9J8.json"}, - {copy, "data/genesis_txs/_01J_SIBJ164H0EedSfQ8h0dMfqet66WKHwcOFQEsMc.json", "data/genesis_txs/_01J_SIBJ164H0EedSfQ8h0dMfqet66WKHwcOFQEsMc.json"}, - {copy, "data/genesis_txs/OILhne7UcvACtB4peA4osAjRMthaZZSW9OWhe3NpLBw.json", "data/genesis_txs/OILhne7UcvACtB4peA4osAjRMthaZZSW9OWhe3NpLBw.json"}, - {copy, "data/genesis_txs/06dr4mrXcKlfPbK8t9vWOBCDJznyG-AsKxED-Jr0U88.json", "data/genesis_txs/06dr4mrXcKlfPbK8t9vWOBCDJznyG-AsKxED-Jr0U88.json"}, - {copy, "data/genesis_txs/SBhaeMSTQm3rS6puYacdT-4wzlnkBlZ1agn6IW6Oyg8.json", "data/genesis_txs/SBhaeMSTQm3rS6puYacdT-4wzlnkBlZ1agn6IW6Oyg8.json"}, - {copy, "data/genesis_txs/efqI0eDfp0OcYB-Ms5ELukIUr8-qtlX7Ica-ikhVZLU.json", "data/genesis_txs/efqI0eDfp0OcYB-Ms5ELukIUr8-qtlX7Ica-ikhVZLU.json"}, - {copy, "data/genesis_txs/j2IiBCd5Vf2Q8ciTVxeHbN6JgrXUFiv0xtoMTA_VtqQ.json", "data/genesis_txs/j2IiBCd5Vf2Q8ciTVxeHbN6JgrXUFiv0xtoMTA_VtqQ.json"}, - {copy, "data/genesis_txs/lFqBd1sEhgw1e_adedkee2hXP9beiNYbF625KV0vObU.json", "data/genesis_txs/lFqBd1sEhgw1e_adedkee2hXP9beiNYbF625KV0vObU.json"}, - {copy, "data/genesis_txs/rRoy9jsUZ-Y10NIBksSD3P4HcVDfZheloItTTnc8_ZQ.json", "data/genesis_txs/rRoy9jsUZ-Y10NIBksSD3P4HcVDfZheloItTTnc8_ZQ.json"}, - {copy, "data/genesis_txs/k6UueT0FWSSUbAAH4Uc1Oz6BivunVR0nSMTEILnB_dQ.json", "data/genesis_txs/k6UueT0FWSSUbAAH4Uc1Oz6BivunVR0nSMTEILnB_dQ.json"}, - {copy, "data/genesis_txs/dYBZuFcCEgGVcfXgS9tmeJsue_qwaCRO3Mg2OHCZh_A.json", "data/genesis_txs/dYBZuFcCEgGVcfXgS9tmeJsue_qwaCRO3Mg2OHCZh_A.json"}, - {copy, "data/genesis_txs/sfAY_3fQ41LahxW45rXfndEzeHD1eeWJgI9ZaM3slFU.json", "data/genesis_txs/sfAY_3fQ41LahxW45rXfndEzeHD1eeWJgI9ZaM3slFU.json"}, - {copy, "data/genesis_txs/h0MlFXsvtNQlFwgTh6y7-gjXEj0CbGECgz77EwQsca0.json", "data/genesis_txs/h0MlFXsvtNQlFwgTh6y7-gjXEj0CbGECgz77EwQsca0.json"}, - {copy, "data/genesis_txs/IwSIt1P5I_mM-gAeAvXiyxRVb73hqkQAMfxLIHbbZYk.json", "data/genesis_txs/IwSIt1P5I_mM-gAeAvXiyxRVb73hqkQAMfxLIHbbZYk.json"}, - {copy, "data/genesis_txs/bqhG__MMablNhNpiSp8nopeKDCzXy97jLuSBlsKk_u8.json", "data/genesis_txs/bqhG__MMablNhNpiSp8nopeKDCzXy97jLuSBlsKk_u8.json"}, - {copy, "data/genesis_txs/N6-1fOVDkoeDwKyoNdLxCVoyy-c0EF178A_oQeEchs8.json", "data/genesis_txs/N6-1fOVDkoeDwKyoNdLxCVoyy-c0EF178A_oQeEchs8.json"}, - {copy, "data/genesis_txs/ez-ItWkyBvBZ6J7_Mobrpqc9RTp6I2JBmkPDV_xCQVY.json", "data/genesis_txs/ez-ItWkyBvBZ6J7_Mobrpqc9RTp6I2JBmkPDV_xCQVY.json"}, - {copy, "data/genesis_txs/Z5e9G5QMZ_scJQ62qoqUs2XSuhknTuuAIhhGmfg3Ye8.json", "data/genesis_txs/Z5e9G5QMZ_scJQ62qoqUs2XSuhknTuuAIhhGmfg3Ye8.json"}, - {copy, "data/genesis_txs/Ah6I8y8q0jb15KXjn0PyNfe7FR3v2xobg09Lfj7n1Mo.json", "data/genesis_txs/Ah6I8y8q0jb15KXjn0PyNfe7FR3v2xobg09Lfj7n1Mo.json"}, - {copy, "data/genesis_txs/VUfaTp1eAzjnbxLR6xx_qQGVn_WOTna3rTolM8wY5BA.json", "data/genesis_txs/VUfaTp1eAzjnbxLR6xx_qQGVn_WOTna3rTolM8wY5BA.json"}, - {copy, "data/genesis_txs/0FJrLrxrFkVTBwRrzCCh88Gm2tG1xPxg8s_IuRZDVzw.json", "data/genesis_txs/0FJrLrxrFkVTBwRrzCCh88Gm2tG1xPxg8s_IuRZDVzw.json"}, - {copy, "data/genesis_txs/qU2Gu35-s9wMH1N4g_zMYKCqIStYzBZmRx0XlcIpjyk.json", "data/genesis_txs/qU2Gu35-s9wMH1N4g_zMYKCqIStYzBZmRx0XlcIpjyk.json"}, - {copy, "data/genesis_txs/PySb_0NIjROmsIgwz4kMwC9MVmeY1MwuKdil0WeUzxw.json", "data/genesis_txs/PySb_0NIjROmsIgwz4kMwC9MVmeY1MwuKdil0WeUzxw.json"}, - {copy, "data/genesis_txs/DJf1SRoKaPo1h3F-7oKIMu4A-r9dXXMjE57WQilPdTk.json", "data/genesis_txs/DJf1SRoKaPo1h3F-7oKIMu4A-r9dXXMjE57WQilPdTk.json"}, - {copy, "data/genesis_txs/zCOtSnXKGGhXgrWld31Ak9qQA_SjpOqB6n-9sF74rhk.json", "data/genesis_txs/zCOtSnXKGGhXgrWld31Ak9qQA_SjpOqB6n-9sF74rhk.json"}, - {copy, "data/genesis_txs/DDrS8BD0XTUVJt5E8kwisVTBX4PBWp0lCnSkSD3PJto.json", "data/genesis_txs/DDrS8BD0XTUVJt5E8kwisVTBX4PBWp0lCnSkSD3PJto.json"}, - {copy, "data/genesis_txs/Yzj2WZ-3q5vKkBJtrmGlVjZND7iqtzvMRafS0TnQiLE.json", "data/genesis_txs/Yzj2WZ-3q5vKkBJtrmGlVjZND7iqtzvMRafS0TnQiLE.json"}, - {copy, "data/genesis_txs/H_0S6x36tsFH-x1h77jV_zzGGp97V8UjmgC0RZYwbtM.json", "data/genesis_txs/H_0S6x36tsFH-x1h77jV_zzGGp97V8UjmgC0RZYwbtM.json"}, - {copy, "data/genesis_txs/mvGgGlFTDJ0ukM6Bssd8G8B5PrEppr4Sg1_NTvzzV1U.json", "data/genesis_txs/mvGgGlFTDJ0ukM6Bssd8G8B5PrEppr4Sg1_NTvzzV1U.json"}, - {copy, "data/genesis_txs/AN48OPO2-1mh4PKtpyoNm7SWJK2j8dF0-TFLU7Z1C9g.json", "data/genesis_txs/AN48OPO2-1mh4PKtpyoNm7SWJK2j8dF0-TFLU7Z1C9g.json"}, - {copy, "data/genesis_txs/3Q5gJrbqc-PeOvD4QQ4WCNp-f5cYzTyHyg6P9b-WvwM.json", "data/genesis_txs/3Q5gJrbqc-PeOvD4QQ4WCNp-f5cYzTyHyg6P9b-WvwM.json"}, - {copy, "data/genesis_txs/MOoLwb8S881q3-gM4GK7DuCEoh5CZnF1tMIZG300X58.json", "data/genesis_txs/MOoLwb8S881q3-gM4GK7DuCEoh5CZnF1tMIZG300X58.json"}, - {copy, "data/genesis_txs/KPNGfBMOznCXZwOVvCXHRR6sVJx1akVkmXTV98lCMKY.json", "data/genesis_txs/KPNGfBMOznCXZwOVvCXHRR6sVJx1akVkmXTV98lCMKY.json"}, - {copy, "data/genesis_txs/1nu07yo-0eB5GLxIJzzlxZW6nFTFiZ3XCDobJUcNyP4.json", "data/genesis_txs/1nu07yo-0eB5GLxIJzzlxZW6nFTFiZ3XCDobJUcNyP4.json"}, - {copy, "data/genesis_txs/utAoO_xht393CbJ_7P_ektVYeEpkySWLM-066yJ5HyI.json", "data/genesis_txs/utAoO_xht393CbJ_7P_ektVYeEpkySWLM-066yJ5HyI.json"}, - {copy, "data/genesis_txs/4UEhkNbsGdJUjx1lJQgX9KorwSf_RRZG8VMW6jMmf8Y.json", "data/genesis_txs/4UEhkNbsGdJUjx1lJQgX9KorwSf_RRZG8VMW6jMmf8Y.json"}, - {copy, "data/genesis_txs/21Kfm2Apa8QWeqdMqyQAcxg9HbiluZXfQFu4-6xe-AY.json", "data/genesis_txs/21Kfm2Apa8QWeqdMqyQAcxg9HbiluZXfQFu4-6xe-AY.json"}, - {copy, "data/genesis_txs/chdl-kIl4zG7VcJbKk0Q_5TeGwuH8Xp2YFPLRJJKTWw.json", "data/genesis_txs/chdl-kIl4zG7VcJbKk0Q_5TeGwuH8Xp2YFPLRJJKTWw.json"}, - {copy, "data/genesis_txs/aGqWG70qjD5P8spXLMtyXnYxS9k7Net-u932EyIFl28.json", "data/genesis_txs/aGqWG70qjD5P8spXLMtyXnYxS9k7Net-u932EyIFl28.json"}, - {copy, "data/genesis_txs/dn3p_BqD1gIcZQqdA8r6TucwycKGave22IqNjzKSHqI.json", "data/genesis_txs/dn3p_BqD1gIcZQqdA8r6TucwycKGave22IqNjzKSHqI.json"}, - {copy, "data/genesis_txs/WE5eBi6hEq90HQvDjtJr-EmZATWJthgxh3HPPuQ7410.json", "data/genesis_txs/WE5eBi6hEq90HQvDjtJr-EmZATWJthgxh3HPPuQ7410.json"}, - {copy, "data/genesis_txs/BRD5ARo8tiY64RqIoxYZ6jwbE-LQT_7jA513nHwWyRE.json", "data/genesis_txs/BRD5ARo8tiY64RqIoxYZ6jwbE-LQT_7jA513nHwWyRE.json"}, - {copy, "data/genesis_txs/nXGMduBKL3mpsnFNPctfjEa9Z9zlMpdxcRrdkK95D80.json", "data/genesis_txs/nXGMduBKL3mpsnFNPctfjEa9Z9zlMpdxcRrdkK95D80.json"}, - {copy, "data/genesis_txs/fkbFeVpiaAOtvt_-M9_U4HzbA8Elh5sa8xJXObrItYM.json", "data/genesis_txs/fkbFeVpiaAOtvt_-M9_U4HzbA8Elh5sa8xJXObrItYM.json"}, - {copy, "data/genesis_txs/duSw-WaGKAabAztyg2zkj6hjgaVaRGBrJuvZ5Gd2Pzk.json", "data/genesis_txs/duSw-WaGKAabAztyg2zkj6hjgaVaRGBrJuvZ5Gd2Pzk.json"}, - {copy, "data/genesis_txs/HSlgnBu2Yxros7zyehPgiu2u7h80dJfCCqrA88UnkB4.json", "data/genesis_txs/HSlgnBu2Yxros7zyehPgiu2u7h80dJfCCqrA88UnkB4.json"}, - {copy, "data/genesis_txs/DTGNdsYZDXoU1nE82yEjG5ZEssxwUmkFTkM3_i6oSx8.json", "data/genesis_txs/DTGNdsYZDXoU1nE82yEjG5ZEssxwUmkFTkM3_i6oSx8.json"}, - {copy, "data/genesis_txs/b96k6w6qUyLSSWZlmupyBmav6XYMsdt0xTc2yIUZtOA.json", "data/genesis_txs/b96k6w6qUyLSSWZlmupyBmav6XYMsdt0xTc2yIUZtOA.json"}, - {copy, "data/genesis_txs/S5Uv2W6erubrzYjzm9QHKij51XE-j-GFdYwcV2uPIAA.json", "data/genesis_txs/S5Uv2W6erubrzYjzm9QHKij51XE-j-GFdYwcV2uPIAA.json"}, - {copy, "data/genesis_txs/5ynd-L6Z1vrR7Vlyr-rkrga_Jw2ibALkIgldNmsVRcQ.json", "data/genesis_txs/5ynd-L6Z1vrR7Vlyr-rkrga_Jw2ibALkIgldNmsVRcQ.json"}, - {copy, "data/genesis_txs/ocUISm-0ItAS-N3Ydwe1swo4JmoVpRzWzngFt-pDwfo.json", "data/genesis_txs/ocUISm-0ItAS-N3Ydwe1swo4JmoVpRzWzngFt-pDwfo.json"}, - {copy, "data/genesis_txs/ByvrfeR4UNmWJwF2fU41mBo6ThFl49u24rEGpbeSI0Q.json", "data/genesis_txs/ByvrfeR4UNmWJwF2fU41mBo6ThFl49u24rEGpbeSI0Q.json"}, - {copy, "data/genesis_txs/FTYnf3Z3QqEpNzTigfAlGTkgpgCWtFA7R8i-I1ik_Vo.json", "data/genesis_txs/FTYnf3Z3QqEpNzTigfAlGTkgpgCWtFA7R8i-I1ik_Vo.json"}, - {copy, "data/genesis_txs/1Lwuom2q3FFI2pZz5EYgOzJRymgVWE3F9ZIl4vi3-kU.json", "data/genesis_txs/1Lwuom2q3FFI2pZz5EYgOzJRymgVWE3F9ZIl4vi3-kU.json"}, - {copy, "data/genesis_txs/QR75we1zHW-qO7dsI932kXX0YrAIyuC2XIDRhfmK-fE.json", "data/genesis_txs/QR75we1zHW-qO7dsI932kXX0YrAIyuC2XIDRhfmK-fE.json"}, - {copy, "data/genesis_txs/PjeEg7GpKT8twlBkp8GHAsEqfMvmNd3RaAx-l0R_i2w.json", "data/genesis_txs/PjeEg7GpKT8twlBkp8GHAsEqfMvmNd3RaAx-l0R_i2w.json"}, - {copy, "data/genesis_txs/Kl1zrMIDIC9yW8yLMnSKQYDoV0PY41ymzJQw91qaZvY.json", "data/genesis_txs/Kl1zrMIDIC9yW8yLMnSKQYDoV0PY41ymzJQw91qaZvY.json"}, - {copy, "data/genesis_txs/ijroBK9n_uKCS97V7iege_5Av2E-tm6ujquAazT_sBI.json", "data/genesis_txs/ijroBK9n_uKCS97V7iege_5Av2E-tm6ujquAazT_sBI.json"}, - {copy, "data/genesis_txs/Kgr-XWwHYos5Y95ZJ9mAUwjYjj_rP0I-GnWctQDNlp8.json", "data/genesis_txs/Kgr-XWwHYos5Y95ZJ9mAUwjYjj_rP0I-GnWctQDNlp8.json"}, - {copy, "data/genesis_txs/snWRgSI3vlTOy3RRkuNckM-ws-5lpFiPMpYlLx_zPyk.json", "data/genesis_txs/snWRgSI3vlTOy3RRkuNckM-ws-5lpFiPMpYlLx_zPyk.json"}, - {copy, "data/genesis_txs/5qRekKepIlFbUhGMq_nNy89bzx_K44e4GmUKYAe9MRU.json", "data/genesis_txs/5qRekKepIlFbUhGMq_nNy89bzx_K44e4GmUKYAe9MRU.json"}, - {copy, "data/genesis_txs/gyG1bGFt7qkMyUCrKiEfMzMzc3_3PooewqNeJpy-3Xk.json", "data/genesis_txs/gyG1bGFt7qkMyUCrKiEfMzMzc3_3PooewqNeJpy-3Xk.json"}, - {copy, "data/genesis_txs/Z7gfizrPOypT4Pagg3oli5g8wA8pbKB0ZJnrw-FVyys.json", "data/genesis_txs/Z7gfizrPOypT4Pagg3oli5g8wA8pbKB0ZJnrw-FVyys.json"}, - {copy, "data/genesis_txs/lsuH-ITPI--6KSzhIFclsEAWOSoRQu-8tlnOSxj_Er0.json", "data/genesis_txs/lsuH-ITPI--6KSzhIFclsEAWOSoRQu-8tlnOSxj_Er0.json"}, - {copy, "data/genesis_txs/xavUY4L0L0nLNVvHiYfBqGL5iqUvdwQ-iY_nLLMB6J4.json", "data/genesis_txs/xavUY4L0L0nLNVvHiYfBqGL5iqUvdwQ-iY_nLLMB6J4.json"}, - {copy, "data/genesis_txs/3khTH_o8WZHSCzP-AThkmt7zZL-d_lcqUKC8nz7c8lk.json", "data/genesis_txs/3khTH_o8WZHSCzP-AThkmt7zZL-d_lcqUKC8nz7c8lk.json"}, - {copy, "data/genesis_txs/5FL2C4l-5cTl9wg4CblgIxzko8hGsB5URVA_yTAd4Nk.json", "data/genesis_txs/5FL2C4l-5cTl9wg4CblgIxzko8hGsB5URVA_yTAd4Nk.json"}, - {copy, "data/genesis_txs/NBxewjnZAfekK0hKmwL_OpF1521JTeIpLk2a2TLDnTk.json", "data/genesis_txs/NBxewjnZAfekK0hKmwL_OpF1521JTeIpLk2a2TLDnTk.json"}, - {copy, "data/genesis_txs/xC7ski_qpcrRwRkxxHwPZd2lOX6Q---2qdQ4Rr-wxAM.json", "data/genesis_txs/xC7ski_qpcrRwRkxxHwPZd2lOX6Q---2qdQ4Rr-wxAM.json"}, - {copy, "data/genesis_txs/h7qIFbn0LoexuVwBcjKW7v5A65iQDQFYZUQjuowfIbk.json", "data/genesis_txs/h7qIFbn0LoexuVwBcjKW7v5A65iQDQFYZUQjuowfIbk.json"}, - {copy, "data/genesis_txs/DQ6WaBfLEMEFhKoMoutuPyO_zFg1hWTDXT13CD8n1nw.json", "data/genesis_txs/DQ6WaBfLEMEFhKoMoutuPyO_zFg1hWTDXT13CD8n1nw.json"}, - {copy, "data/genesis_txs/8y-ghHqMT2lEHQn86jRXkQ8I5cLWWtKW1CQROp8mzIs.json", "data/genesis_txs/8y-ghHqMT2lEHQn86jRXkQ8I5cLWWtKW1CQROp8mzIs.json"}, - {copy, "data/genesis_txs/zUFRBcWpPAUyMlojffeTnPgsLo6YgU6JaJgOR0mpBuM.json", "data/genesis_txs/zUFRBcWpPAUyMlojffeTnPgsLo6YgU6JaJgOR0mpBuM.json"}, - {copy, "data/genesis_txs/0mFNtCi-u34uwOj3BimQTPOT9PgLGE8uqCbtXhnwoKI.json", "data/genesis_txs/0mFNtCi-u34uwOj3BimQTPOT9PgLGE8uqCbtXhnwoKI.json"}, - {copy, "data/genesis_txs/luQlV_58e9qjm7EZpoO6f5Y1j349Q34UwTW1Lx9J_vE.json", "data/genesis_txs/luQlV_58e9qjm7EZpoO6f5Y1j349Q34UwTW1Lx9J_vE.json"}, - {copy, "data/genesis_txs/TFX7m_Kf56rV6LNuyQ31NeVoDHJ3x0YqhIv4-IBQ-3s.json", "data/genesis_txs/TFX7m_Kf56rV6LNuyQ31NeVoDHJ3x0YqhIv4-IBQ-3s.json"}, - {copy, "data/genesis_txs/LFQ5iV6E5wyBbJmJoFJdH39ZxfW-y7mZFKou2H-ONvg.json", "data/genesis_txs/LFQ5iV6E5wyBbJmJoFJdH39ZxfW-y7mZFKou2H-ONvg.json"}, - {copy, "data/genesis_txs/ud3zGJZA5tPRoitGG1c6HWm9W7iRS4ZF3u6PbZ-blns.json", "data/genesis_txs/ud3zGJZA5tPRoitGG1c6HWm9W7iRS4ZF3u6PbZ-blns.json"}, - {copy, "data/genesis_txs/dv28G4IsYul7liWrycsx4UKSYHA4sWUY6xFQzRPi4p4.json", "data/genesis_txs/dv28G4IsYul7liWrycsx4UKSYHA4sWUY6xFQzRPi4p4.json"}, - {copy, "data/genesis_txs/Ykh5TAI6koBN4UTQZ3GNIDr_uHNjlpHH9HsvtEkoWLA.json", "data/genesis_txs/Ykh5TAI6koBN4UTQZ3GNIDr_uHNjlpHH9HsvtEkoWLA.json"}, - {copy, "data/genesis_txs/BQ2RVL6XY99AIkPKDBCfUfRmJGejkZ8YKgKZc2LewhU.json", "data/genesis_txs/BQ2RVL6XY99AIkPKDBCfUfRmJGejkZ8YKgKZc2LewhU.json"}, - {copy, "data/genesis_txs/_fLFu_BOzTEPdX35rqUruuyNxi7f_La8T1_JG7pIPd0.json", "data/genesis_txs/_fLFu_BOzTEPdX35rqUruuyNxi7f_La8T1_JG7pIPd0.json"}, - {copy, "data/genesis_txs/N3lqe8CUwPfChinYVV4OZZQNjtXc26JkOJyqgoKhq7E.json", "data/genesis_txs/N3lqe8CUwPfChinYVV4OZZQNjtXc26JkOJyqgoKhq7E.json"}, - {copy, "data/genesis_txs/i9xaFWy0avtyCCxQdmWfGNDgh-PaJgIHkNK1pcJzmV8.json", "data/genesis_txs/i9xaFWy0avtyCCxQdmWfGNDgh-PaJgIHkNK1pcJzmV8.json"}, - {copy, "data/genesis_txs/6J1sN2nhGpqe9iJwgdfnxxCK4af88__HoEG8MLeqtyM.json", "data/genesis_txs/6J1sN2nhGpqe9iJwgdfnxxCK4af88__HoEG8MLeqtyM.json"}, - {copy, "data/genesis_txs/Juzb8MlmGd2qomIUwgfGzIFO7c7ZcY87kJPmqpSkt18.json", "data/genesis_txs/Juzb8MlmGd2qomIUwgfGzIFO7c7ZcY87kJPmqpSkt18.json"}, - {copy, "data/genesis_txs/y0PrXtX7PonEbIG3uEdu-k-McGeLLAjzUriUTCMTGcw.json", "data/genesis_txs/y0PrXtX7PonEbIG3uEdu-k-McGeLLAjzUriUTCMTGcw.json"}, - {copy, "data/genesis_txs/1yvqJKdnb9SRRKoBg1m0kWAsSh9S0R5r9T9TE0YHfRQ.json", "data/genesis_txs/1yvqJKdnb9SRRKoBg1m0kWAsSh9S0R5r9T9TE0YHfRQ.json"}, - {copy, "data/genesis_txs/oRvFwVpHVeo0iysSg2jFOAZKE-hKwbm6mGeZ6VUZmxk.json", "data/genesis_txs/oRvFwVpHVeo0iysSg2jFOAZKE-hKwbm6mGeZ6VUZmxk.json"}, - {copy, "data/genesis_txs/wnOghJX4aZlbm7SDDb4UUX8_6GZYpYYx3GireamHwAc.json", "data/genesis_txs/wnOghJX4aZlbm7SDDb4UUX8_6GZYpYYx3GireamHwAc.json"}, - {copy, "data/genesis_txs/4gLPD5njSRtiaJwjcjmNOyI5Vw8sFBQQWOefmy4SPmQ.json", "data/genesis_txs/4gLPD5njSRtiaJwjcjmNOyI5Vw8sFBQQWOefmy4SPmQ.json"}, - {copy, "data/genesis_txs/bnT7410oaZtnCdurp5jNgLKju9d_RRxhgggnxa5frMQ.json", "data/genesis_txs/bnT7410oaZtnCdurp5jNgLKju9d_RRxhgggnxa5frMQ.json"}, - {copy, "data/genesis_txs/cgU_TlXi5gJ7hShSBYsS4UVi-sLTtfFv1y1sy2nNhos.json", "data/genesis_txs/cgU_TlXi5gJ7hShSBYsS4UVi-sLTtfFv1y1sy2nNhos.json"}, - {copy, "data/genesis_txs/cIXdvNTNHJSmA6Rt5UgSNfMcGfvxDnYTa3a1ulS1SiY.json", "data/genesis_txs/cIXdvNTNHJSmA6Rt5UgSNfMcGfvxDnYTa3a1ulS1SiY.json"}, - {copy, "data/genesis_txs/LixFbPqM1ZZ-5JWo339FMfPCpD_6M85rVK8IVmmt8m8.json", "data/genesis_txs/LixFbPqM1ZZ-5JWo339FMfPCpD_6M85rVK8IVmmt8m8.json"}, - {copy, "data/genesis_txs/DkBAprUInkCbFa6A_WJJNL1z_PnhEavvyZtF09lmyvw.json", "data/genesis_txs/DkBAprUInkCbFa6A_WJJNL1z_PnhEavvyZtF09lmyvw.json"}, - {copy, "data/genesis_txs/puLpw8OIIYCOatImKjpV5s0JWyKFq6bXFMz_qSf6mUA.json", "data/genesis_txs/puLpw8OIIYCOatImKjpV5s0JWyKFq6bXFMz_qSf6mUA.json"}, - {copy, "data/genesis_txs/0biLy8DoOhucpeYzOj5jnopxxwe0XDRfCOMjyz_a74U.json", "data/genesis_txs/0biLy8DoOhucpeYzOj5jnopxxwe0XDRfCOMjyz_a74U.json"}, - {copy, "data/genesis_txs/hX6nohfkKZ_9ajziHJ6g5V5cIe1EX9H9rg7eScK988s.json", "data/genesis_txs/hX6nohfkKZ_9ajziHJ6g5V5cIe1EX9H9rg7eScK988s.json"}, - {copy, "data/genesis_txs/GlWMQUuiL80knS07G7NpoYat3w18VMuyLEuC_Pmijng.json", "data/genesis_txs/GlWMQUuiL80knS07G7NpoYat3w18VMuyLEuC_Pmijng.json"}, - {copy, "data/genesis_txs/f3jE7NK419FZzwkx9VjTkrcX5FEgl2Ky3KSK0vH-wj0.json", "data/genesis_txs/f3jE7NK419FZzwkx9VjTkrcX5FEgl2Ky3KSK0vH-wj0.json"}, - {copy, "data/genesis_txs/UMk64563QZfxgZr_vKOTDrcp5XJNENF82Pji4a078YY.json", "data/genesis_txs/UMk64563QZfxgZr_vKOTDrcp5XJNENF82Pji4a078YY.json"}, - {copy, "data/genesis_txs/0EzNUQy_5b7CwNNLVAi7CnameMgnxVh-XyahT2kn74Y.json", "data/genesis_txs/0EzNUQy_5b7CwNNLVAi7CnameMgnxVh-XyahT2kn74Y.json"}, - {copy, "data/genesis_txs/3ku6XelnvBsaRjoNxDWb_kT_PRlQ88U0pbWURziCj7s.json", "data/genesis_txs/3ku6XelnvBsaRjoNxDWb_kT_PRlQ88U0pbWURziCj7s.json"}, - {copy, "data/genesis_txs/RU5mkM_3UrjRMffwgj7ovDMYxxjhfXvliozhpIqw0sA.json", "data/genesis_txs/RU5mkM_3UrjRMffwgj7ovDMYxxjhfXvliozhpIqw0sA.json"}, - {copy, "data/genesis_txs/oMP40Kgd9MxLfksmW_HAlGe8Rn1Px8tpF-NOHBfe9oo.json", "data/genesis_txs/oMP40Kgd9MxLfksmW_HAlGe8Rn1Px8tpF-NOHBfe9oo.json"}, - {copy, "data/genesis_txs/UYoJMT0QxMtB6ctUB-9iQlcx6fF8R3s8ahM4_iF4wiQ.json", "data/genesis_txs/UYoJMT0QxMtB6ctUB-9iQlcx6fF8R3s8ahM4_iF4wiQ.json"}, - {copy, "data/genesis_txs/96Ijx5TWSxZmZaDH1pteGHFjIYY0aHmGWNHiMYeSYIM.json", "data/genesis_txs/96Ijx5TWSxZmZaDH1pteGHFjIYY0aHmGWNHiMYeSYIM.json"}, - {copy, "data/genesis_txs/n6TKbsqmGl2m3yH15RAe405vYZQ7DStlvYsHCHp1D0U.json", "data/genesis_txs/n6TKbsqmGl2m3yH15RAe405vYZQ7DStlvYsHCHp1D0U.json"}, - {copy, "data/genesis_txs/XtDRu-1SyoRL21gpKcxWtxyksVwTF9kvW26hvQ_bPzE.json", "data/genesis_txs/XtDRu-1SyoRL21gpKcxWtxyksVwTF9kvW26hvQ_bPzE.json"}, - {copy, "data/genesis_txs/YIEEyYfNIRSjzm_gzv6l5CelyL4AOzKX9M4XPXRk2Yo.json", "data/genesis_txs/YIEEyYfNIRSjzm_gzv6l5CelyL4AOzKX9M4XPXRk2Yo.json"}, - {copy, "data/genesis_txs/NptjIrqZrQMSdLbXAGyQCr8audCzArV3EofsjRCqrQw.json", "data/genesis_txs/NptjIrqZrQMSdLbXAGyQCr8audCzArV3EofsjRCqrQw.json"}, - {copy, "data/genesis_txs/vWeY4yJSJF9LXogRZb3Qr6QyLtEIL_8IY4bzJ2e7O5I.json", "data/genesis_txs/vWeY4yJSJF9LXogRZb3Qr6QyLtEIL_8IY4bzJ2e7O5I.json"}, - {copy, "data/genesis_txs/fBVa04p7MEL8BsPpyD_Pwv3uqBnBMVzG9YpXsCwZLtc.json", "data/genesis_txs/fBVa04p7MEL8BsPpyD_Pwv3uqBnBMVzG9YpXsCwZLtc.json"}, - {copy, "data/genesis_txs/opfZTSNdqaxXZUmaKROD2sd4QkyNDnZE3u1A95eSw4E.json", "data/genesis_txs/opfZTSNdqaxXZUmaKROD2sd4QkyNDnZE3u1A95eSw4E.json"}, - {copy, "data/genesis_txs/-M5_EBM4MayX8ZpuLFoANHO00c4pdrSmAQbPYv7fq4U.json", "data/genesis_txs/-M5_EBM4MayX8ZpuLFoANHO00c4pdrSmAQbPYv7fq4U.json"}, - {copy, "data/genesis_txs/8rKBfpmkPlxnnYr6t0xIpUDubdidK0Fpnois7-xQJtc.json", "data/genesis_txs/8rKBfpmkPlxnnYr6t0xIpUDubdidK0Fpnois7-xQJtc.json"}, - {copy, "data/genesis_txs/rvbM0iB1HJ1YadedIDWjJ95J2XBHWwPAJD4VfpdQpxQ.json", "data/genesis_txs/rvbM0iB1HJ1YadedIDWjJ95J2XBHWwPAJD4VfpdQpxQ.json"}, - {copy, "data/genesis_txs/_Hf1lw_E6Lyd-0PGkCRQaN10cdEx4M-hl9y-zWiDo8k.json", "data/genesis_txs/_Hf1lw_E6Lyd-0PGkCRQaN10cdEx4M-hl9y-zWiDo8k.json"}, - {copy, "data/genesis_txs/tOIFTqEef5fQYPzhlkC2Um7rddT6MyrHPzUWXDv_mJc.json", "data/genesis_txs/tOIFTqEef5fQYPzhlkC2Um7rddT6MyrHPzUWXDv_mJc.json"}, - {copy, "data/genesis_txs/4LwZwAVcaBXhXsP5b4mnE11tUXefuRUTtTibtvoozDQ.json", "data/genesis_txs/4LwZwAVcaBXhXsP5b4mnE11tUXefuRUTtTibtvoozDQ.json"}, - {copy, "data/genesis_txs/XxgirNr3QGaJTKxPWqK9byYLj7SdbfZudKd9rbynWyM.json", "data/genesis_txs/XxgirNr3QGaJTKxPWqK9byYLj7SdbfZudKd9rbynWyM.json"}, - {copy, "data/genesis_txs/IvyUOghXQ31LnYE3bYEkS82gTAvpIa1rGGQKmiJuuMk.json", "data/genesis_txs/IvyUOghXQ31LnYE3bYEkS82gTAvpIa1rGGQKmiJuuMk.json"}, - {copy, "data/genesis_txs/X9biR_ZA-rnpzk4gfLi0-pBSsjjT2l9Rk0VfYwf1WMo.json", "data/genesis_txs/X9biR_ZA-rnpzk4gfLi0-pBSsjjT2l9Rk0VfYwf1WMo.json"}, - {copy, "data/genesis_txs/8b-7D96aRFJgDm8z5Tg47vBbdjseW0rRi17TYDcaQ5Q.json", "data/genesis_txs/8b-7D96aRFJgDm8z5Tg47vBbdjseW0rRi17TYDcaQ5Q.json"}, - {copy, "data/genesis_txs/0O-UnzBvSFYoMQrbcsKHRH_YqNNylC1n9KWXmm-rr90.json", "data/genesis_txs/0O-UnzBvSFYoMQrbcsKHRH_YqNNylC1n9KWXmm-rr90.json"}, - {copy, "data/genesis_txs/TUIdVI5yQH50laHvkxgAnTV6uuE2LXXH3pxIe6Q2S7I.json", "data/genesis_txs/TUIdVI5yQH50laHvkxgAnTV6uuE2LXXH3pxIe6Q2S7I.json"}, - {copy, "data/genesis_txs/0Mxvgz6_wL0FBOxJmHcRcNwiaV8B90whDxG4Vh_GFic.json", "data/genesis_txs/0Mxvgz6_wL0FBOxJmHcRcNwiaV8B90whDxG4Vh_GFic.json"}, - {copy, "data/genesis_txs/qyMWe-VUOzHXkQviMhNS0wJI_27nvCgDY9iiKANk-lI.json", "data/genesis_txs/qyMWe-VUOzHXkQviMhNS0wJI_27nvCgDY9iiKANk-lI.json"}, - {copy, "data/genesis_txs/LC-_5GDhs09OvN7r8GPmjMa6A9xSeVtsAmDgYCgspvc.json", "data/genesis_txs/LC-_5GDhs09OvN7r8GPmjMa6A9xSeVtsAmDgYCgspvc.json"}, - {copy, "data/genesis_txs/sB51Zz1HRjpwrWFhW6ZE2E-n5hl3joqxPQgnMCLX4ZM.json", "data/genesis_txs/sB51Zz1HRjpwrWFhW6ZE2E-n5hl3joqxPQgnMCLX4ZM.json"}, - {copy, "data/genesis_txs/NEXnMz8Yuw-xfIPprKT2iwx5A1UjWwRHCH7XCpeXIPg.json", "data/genesis_txs/NEXnMz8Yuw-xfIPprKT2iwx5A1UjWwRHCH7XCpeXIPg.json"}, - {copy, "data/genesis_txs/5OdjYWAipCjWzpqfNoNhyJ673d4pRMNva8la_SFfu_c.json", "data/genesis_txs/5OdjYWAipCjWzpqfNoNhyJ673d4pRMNva8la_SFfu_c.json"}, - {copy, "data/genesis_txs/drYsyF85HcvC7LM1hkzPPgTj3_zp3amcNVNobBmOxvc.json", "data/genesis_txs/drYsyF85HcvC7LM1hkzPPgTj3_zp3amcNVNobBmOxvc.json"}, - {copy, "data/genesis_txs/vQ4zTq--De8FHdVnE7sYCemwiaqoZDS4emR_y6o6ZFA.json", "data/genesis_txs/vQ4zTq--De8FHdVnE7sYCemwiaqoZDS4emR_y6o6ZFA.json"}, - {copy, "data/genesis_txs/zwl046ia6I5VWLRYPJzBI70ypBQN2VlvLH9a_ndNKxA.json", "data/genesis_txs/zwl046ia6I5VWLRYPJzBI70ypBQN2VlvLH9a_ndNKxA.json"}, - {copy, "data/genesis_txs/xYpSRRpO8ejUGeohlRutNt9qUMgvuZJGkPGCyu1kSas.json", "data/genesis_txs/xYpSRRpO8ejUGeohlRutNt9qUMgvuZJGkPGCyu1kSas.json"}, - {copy, "data/genesis_txs/wmZTwziFc_VlvYJz_4nyxYd3WxznBmsn5QQyRKDcWXU.json", "data/genesis_txs/wmZTwziFc_VlvYJz_4nyxYd3WxznBmsn5QQyRKDcWXU.json"}, - {copy, "data/genesis_txs/SWNkfm9ZZPCiYKFg6oIW_IgqJp5Ypbp-Fs9S7YgPm0c.json", "data/genesis_txs/SWNkfm9ZZPCiYKFg6oIW_IgqJp5Ypbp-Fs9S7YgPm0c.json"}, - {copy, "data/genesis_txs/y6WPKL6MHzZp2ktvb1cETmNMBJyCEPlxdisKlroEBtc.json", "data/genesis_txs/y6WPKL6MHzZp2ktvb1cETmNMBJyCEPlxdisKlroEBtc.json"}, - {copy, "data/genesis_txs/0ogs8DTdSrNxfE2LzrScPvnyf7CQ7jMdFaS_l0-K-GU.json", "data/genesis_txs/0ogs8DTdSrNxfE2LzrScPvnyf7CQ7jMdFaS_l0-K-GU.json"}, - {copy, "data/genesis_txs/328-6fOVCfCid4QTxHjkAMkQLMHZgDg-hZo5PnVfp2Q.json", "data/genesis_txs/328-6fOVCfCid4QTxHjkAMkQLMHZgDg-hZo5PnVfp2Q.json"}, - {copy, "data/genesis_txs/iRF6OnneKHJLhLMdCXpo6LsxVyWIGyklFEpu1bN3cyE.json", "data/genesis_txs/iRF6OnneKHJLhLMdCXpo6LsxVyWIGyklFEpu1bN3cyE.json"}, - {copy, "data/genesis_txs/g19-Tkf4xuM9golcjx0mA1RkJUYocQJ3uYnH8MU1ePs.json", "data/genesis_txs/g19-Tkf4xuM9golcjx0mA1RkJUYocQJ3uYnH8MU1ePs.json"}, - {copy, "data/genesis_txs/aPxbCROotxwkdovWbQEhw18UNAzVy-AmjYwjo9lb5u4.json", "data/genesis_txs/aPxbCROotxwkdovWbQEhw18UNAzVy-AmjYwjo9lb5u4.json"}, - {copy, "data/genesis_txs/COXhhpbcLSEe2iP2kp4SDj5NjjBAC8CucsAgOHRF_lc.json", "data/genesis_txs/COXhhpbcLSEe2iP2kp4SDj5NjjBAC8CucsAgOHRF_lc.json"}, - {copy, "data/genesis_txs/TGdhJ01pPw49A0ZIaCCcYBnL-RPK_3KZH3cA6E9dVqc.json", "data/genesis_txs/TGdhJ01pPw49A0ZIaCCcYBnL-RPK_3KZH3cA6E9dVqc.json"}, - {copy, "data/genesis_txs/v2UplxDprWwaIwbB6z3KNEj3GjloqM8SinvVahZ1Wpk.json", "data/genesis_txs/v2UplxDprWwaIwbB6z3KNEj3GjloqM8SinvVahZ1Wpk.json"}, - {copy, "data/genesis_txs/P_pvvzlCIX7Yaiuv6zt1voLcn69gb9jAHPRhHaHjLng.json", "data/genesis_txs/P_pvvzlCIX7Yaiuv6zt1voLcn69gb9jAHPRhHaHjLng.json"}, - {copy, "data/genesis_txs/WsYJKhqhppBF6_eGbd0OACdu3LU6-CUuMcLeG3ST2qc.json", "data/genesis_txs/WsYJKhqhppBF6_eGbd0OACdu3LU6-CUuMcLeG3ST2qc.json"}, - {copy, "data/genesis_txs/weff0Y0_3-H7Vy1HrbpIzUmbTM1rZ8Lw0wgDGYmlsrM.json", "data/genesis_txs/weff0Y0_3-H7Vy1HrbpIzUmbTM1rZ8Lw0wgDGYmlsrM.json"}, - {copy, "data/genesis_txs/oWWJcAiBCxhtWkIqwir4-vTvD3JFpHgZRNIpS-Xjzp4.json", "data/genesis_txs/oWWJcAiBCxhtWkIqwir4-vTvD3JFpHgZRNIpS-Xjzp4.json"}, - {copy, "data/genesis_txs/Mv-TFhA3639O4JbKzoO3wo8LNPcFwA_vaaOLHfWRfSo.json", "data/genesis_txs/Mv-TFhA3639O4JbKzoO3wo8LNPcFwA_vaaOLHfWRfSo.json"}, - {copy, "data/genesis_txs/iuTLZ3xxGpaBCggV5xfUkJ6hMdUQKHw6f_vEn6sbmPo.json", "data/genesis_txs/iuTLZ3xxGpaBCggV5xfUkJ6hMdUQKHw6f_vEn6sbmPo.json"}, - {copy, "data/genesis_txs/tVLYd_62zbU-VPzQPOMHUo9TJR1dvSZ_pAHrC5Ubs8Q.json", "data/genesis_txs/tVLYd_62zbU-VPzQPOMHUo9TJR1dvSZ_pAHrC5Ubs8Q.json"}, - {copy, "data/genesis_txs/KhQeu3CG_X1zoHbyy99GUlC9gVFFexf6vVPOlLgCj9I.json", "data/genesis_txs/KhQeu3CG_X1zoHbyy99GUlC9gVFFexf6vVPOlLgCj9I.json"}, - {copy, "data/genesis_txs/o0nw6fU4gPL7Ae45x1BEQr5GkXSzZUrWnZrdIWqgx6w.json", "data/genesis_txs/o0nw6fU4gPL7Ae45x1BEQr5GkXSzZUrWnZrdIWqgx6w.json"}, - {copy, "data/genesis_txs/K47jh6Jr6TmZeZ_TadmyLLy1V6ZvLNpvV5FWcICohnk.json", "data/genesis_txs/K47jh6Jr6TmZeZ_TadmyLLy1V6ZvLNpvV5FWcICohnk.json"}, - {copy, "data/genesis_txs/7SfLhJLtevo0zu-1bo8q6zX98WbGgpDNuY6PXbzS_j0.json", "data/genesis_txs/7SfLhJLtevo0zu-1bo8q6zX98WbGgpDNuY6PXbzS_j0.json"}, - {copy, "data/genesis_txs/C3auX8HXhc2dChmvSBUfgGyYynuAr6P3g0p7420GG78.json", "data/genesis_txs/C3auX8HXhc2dChmvSBUfgGyYynuAr6P3g0p7420GG78.json"}, - {copy, "data/genesis_txs/m5zFPHB-2VjCgTLStD9TLZwD1CHfLELPKkVXFJGIptM.json", "data/genesis_txs/m5zFPHB-2VjCgTLStD9TLZwD1CHfLELPKkVXFJGIptM.json"}, - {copy, "data/genesis_txs/MPP4fxmSkvM2BVq8rumeT5yvDNu3QAT_kqpOlAq5s2E.json", "data/genesis_txs/MPP4fxmSkvM2BVq8rumeT5yvDNu3QAT_kqpOlAq5s2E.json"}, - {copy, "data/genesis_txs/6YbxtptbO-sidrnYdgn0G_CiNBh-az5ZzWrSCP9DYKA.json", "data/genesis_txs/6YbxtptbO-sidrnYdgn0G_CiNBh-az5ZzWrSCP9DYKA.json"}, - {copy, "data/genesis_txs/mGAMsTqBzau-MjTkMS5Z3g2_nUD-qQWeLtq6qlzkVl0.json", "data/genesis_txs/mGAMsTqBzau-MjTkMS5Z3g2_nUD-qQWeLtq6qlzkVl0.json"}, - {copy, "data/genesis_txs/CSkFcCmNgvnp7jp7aK0tEGsLWiZVMF-QBkEFaJrAG48.json", "data/genesis_txs/CSkFcCmNgvnp7jp7aK0tEGsLWiZVMF-QBkEFaJrAG48.json"}, - {copy, "data/genesis_txs/FkZzg_-5eSdFlbq9XnHe3wRhYidHJPXwUQ6YLuJijS0.json", "data/genesis_txs/FkZzg_-5eSdFlbq9XnHe3wRhYidHJPXwUQ6YLuJijS0.json"}, - {copy, "data/genesis_txs/9JWfraRekKtgXiIjssn0tVSzhaCaN682jECsrKtR0_E.json", "data/genesis_txs/9JWfraRekKtgXiIjssn0tVSzhaCaN682jECsrKtR0_E.json"}, - {copy, "data/genesis_txs/Ms9gCRdVwT9u8-ewYd6c-T0bet-n24n_q_Hn0-BlMow.json", "data/genesis_txs/Ms9gCRdVwT9u8-ewYd6c-T0bet-n24n_q_Hn0-BlMow.json"}, - {copy, "data/genesis_txs/CbV_CDXgVNjV6fyoBDkYmbAcaC5VsLDYXgEIwj2Ewyo.json", "data/genesis_txs/CbV_CDXgVNjV6fyoBDkYmbAcaC5VsLDYXgEIwj2Ewyo.json"}, - {copy, "data/genesis_txs/4pNPqxodBesN6jQl51nH17GA1fWYfHVm8cIEfusnPLY.json", "data/genesis_txs/4pNPqxodBesN6jQl51nH17GA1fWYfHVm8cIEfusnPLY.json"}, - {copy, "data/genesis_txs/0_GKZOdtRH-nc094U5kFBlvQSjPz_oX0tcIroqLFD3U.json", "data/genesis_txs/0_GKZOdtRH-nc094U5kFBlvQSjPz_oX0tcIroqLFD3U.json"}, - {copy, "data/genesis_txs/G1GqspPmLkJTiT35QUTWBT4def7j5ORSfHCtrYzrrng.json", "data/genesis_txs/G1GqspPmLkJTiT35QUTWBT4def7j5ORSfHCtrYzrrng.json"}, - {copy, "data/genesis_txs/4ewYAvsgaT-6Oy23qPqK29O_AgfvNbhLvol13yN1PdQ.json", "data/genesis_txs/4ewYAvsgaT-6Oy23qPqK29O_AgfvNbhLvol13yN1PdQ.json"}, - {copy, "data/genesis_txs/LBTipZADoYfO-9UecE07Z83ijiLl0f2wAGXyRFQqKCY.json", "data/genesis_txs/LBTipZADoYfO-9UecE07Z83ijiLl0f2wAGXyRFQqKCY.json"}, - {copy, "data/genesis_txs/OaumRLT8oE6J8gqrQ9DrY_grMuSfWtai95VnqrX24hs.json", "data/genesis_txs/OaumRLT8oE6J8gqrQ9DrY_grMuSfWtai95VnqrX24hs.json"}, - {copy, "data/genesis_txs/DMtXbcR_qHwdYXvkuCGOQARs_QtN9iWPw4x6TTaWOcw.json", "data/genesis_txs/DMtXbcR_qHwdYXvkuCGOQARs_QtN9iWPw4x6TTaWOcw.json"}, - {copy, "data/genesis_txs/Eeo6rANLMAXonDFLDG2nu7n99O3Ymfk01wYXJBbEixY.json", "data/genesis_txs/Eeo6rANLMAXonDFLDG2nu7n99O3Ymfk01wYXJBbEixY.json"}, - {copy, "data/genesis_txs/ZEB62vqKvkPK2s_RmxgQ2IhafMxJ_TXCGswrrKLhYiQ.json", "data/genesis_txs/ZEB62vqKvkPK2s_RmxgQ2IhafMxJ_TXCGswrrKLhYiQ.json"}, - {copy, "data/genesis_txs/TkN4QLdC4tu-_Po50RYwF33shyHcanHSe_BKpryK0JA.json", "data/genesis_txs/TkN4QLdC4tu-_Po50RYwF33shyHcanHSe_BKpryK0JA.json"}, - {copy, "data/genesis_txs/YfHEyNUGsOUiuqCgHV127cg2Z5Yap9tcQB1LH7tq9ZA.json", "data/genesis_txs/YfHEyNUGsOUiuqCgHV127cg2Z5Yap9tcQB1LH7tq9ZA.json"}, - {copy, "data/genesis_txs/NvGRQrdis2HV22enpSpPqsb0M8s-pN_nl7eJtalZyC4.json", "data/genesis_txs/NvGRQrdis2HV22enpSpPqsb0M8s-pN_nl7eJtalZyC4.json"}, - {copy, "data/genesis_txs/L8tkBBP7fyYfK4txqP-fGk_ODOU4UfIgFV79O-qd5vY.json", "data/genesis_txs/L8tkBBP7fyYfK4txqP-fGk_ODOU4UfIgFV79O-qd5vY.json"}, - {copy, "data/genesis_txs/ISiC3yaTW9KnZmgs39osghIg0HP8ISh77bzH7u2m55Q.json", "data/genesis_txs/ISiC3yaTW9KnZmgs39osghIg0HP8ISh77bzH7u2m55Q.json"}, - {copy, "data/genesis_txs/IQgiEwMLp1bb6muuB_G7Q3sRaaZ3OZHUSjgshUq5YMU.json", "data/genesis_txs/IQgiEwMLp1bb6muuB_G7Q3sRaaZ3OZHUSjgshUq5YMU.json"}, - {copy, "data/genesis_txs/07u3F6WH-ohqBclh6UanAQ9Tau089eLJrIYM-8qkAbw.json", "data/genesis_txs/07u3F6WH-ohqBclh6UanAQ9Tau089eLJrIYM-8qkAbw.json"}, - {copy, "data/genesis_txs/nh2sbgjxu6MmU8yGV00w7X4q4XCJETeYE3zVtcj2ldk.json", "data/genesis_txs/nh2sbgjxu6MmU8yGV00w7X4q4XCJETeYE3zVtcj2ldk.json"}, - {copy, "data/genesis_txs/ydvI6weQPIRj2hcNg4RPqzDpFOhqiTc9iDqQ-fUUl4I.json", "data/genesis_txs/ydvI6weQPIRj2hcNg4RPqzDpFOhqiTc9iDqQ-fUUl4I.json"}, - {copy, "data/genesis_txs/5Hatfzkj7ivvIsUIDjdOSp-4CdkClH6B7S_SNX0B2-o.json", "data/genesis_txs/5Hatfzkj7ivvIsUIDjdOSp-4CdkClH6B7S_SNX0B2-o.json"}, - {copy, "data/genesis_txs/1Q2plP5JFTLwdTC27VfIgDJ-ri5h3mVsKxZploTrRmQ.json", "data/genesis_txs/1Q2plP5JFTLwdTC27VfIgDJ-ri5h3mVsKxZploTrRmQ.json"}, - {copy, "data/genesis_txs/YlalzFjBD8CgZxDlI6eNWE3PIIflHGzXyY9VzPPeCFo.json", "data/genesis_txs/YlalzFjBD8CgZxDlI6eNWE3PIIflHGzXyY9VzPPeCFo.json"}, - {copy, "data/genesis_txs/vaJOh_TzVSoEgbgDyKz6ABzd_wt2-ouBTe0gA1F3oMY.json", "data/genesis_txs/vaJOh_TzVSoEgbgDyKz6ABzd_wt2-ouBTe0gA1F3oMY.json"}, - {copy, "data/genesis_txs/f6MY8LMCwGbKZqXd4dkCROQK0qFMjS5OJAbZq-UhMGA.json", "data/genesis_txs/f6MY8LMCwGbKZqXd4dkCROQK0qFMjS5OJAbZq-UhMGA.json"}, - {copy, "data/genesis_txs/_u44CiJCcYiOrGffgZoQSmUrJe8CfYD7Nw0MdPX0tUw.json", "data/genesis_txs/_u44CiJCcYiOrGffgZoQSmUrJe8CfYD7Nw0MdPX0tUw.json"}, - {copy, "data/genesis_txs/5mt79Uz6p83vdLtYRiByyWLqLI2GZBeSTutDRmzw7tM.json", "data/genesis_txs/5mt79Uz6p83vdLtYRiByyWLqLI2GZBeSTutDRmzw7tM.json"}, - {copy, "data/genesis_txs/CEXuGv3KvVtkf5gkV0ip3g1FF-i12WIDo6IOigORIZA.json", "data/genesis_txs/CEXuGv3KvVtkf5gkV0ip3g1FF-i12WIDo6IOigORIZA.json"}, - {copy, "data/genesis_txs/NPLj86idALmTczSq2vrZdTs0bjI-e-KI0j3EOWWpu54.json", "data/genesis_txs/NPLj86idALmTczSq2vrZdTs0bjI-e-KI0j3EOWWpu54.json"}, - {copy, "data/genesis_txs/IpwG_74praZjsu9L91_KWYHrVTpEDwyHZrsHgum4Z8o.json", "data/genesis_txs/IpwG_74praZjsu9L91_KWYHrVTpEDwyHZrsHgum4Z8o.json"}, - {copy, "data/genesis_txs/qX9u_AprdhyXAPGfh3C94x9AbxwWx9nJSs7g8FSwITM.json", "data/genesis_txs/qX9u_AprdhyXAPGfh3C94x9AbxwWx9nJSs7g8FSwITM.json"}, - {copy, "data/genesis_txs/87ieWrloTFUdW7YjJqJcINd1M_PBWCzA1dIRFzF4RKM.json", "data/genesis_txs/87ieWrloTFUdW7YjJqJcINd1M_PBWCzA1dIRFzF4RKM.json"}, - {copy, "data/genesis_txs/xSkMzFablxREj8H_RwoMseAFk-TCwaLVIZMHqXh5DHY.json", "data/genesis_txs/xSkMzFablxREj8H_RwoMseAFk-TCwaLVIZMHqXh5DHY.json"}, - {copy, "data/genesis_txs/NE7AIvW60iQL_6aagNTSiaMpmLfAfRwbxau5FZLA10g.json", "data/genesis_txs/NE7AIvW60iQL_6aagNTSiaMpmLfAfRwbxau5FZLA10g.json"}, - {copy, "data/genesis_txs/wUhEm861foyWdxy0SI7CvXRcWuohItlX6Ydqo2NvtY8.json", "data/genesis_txs/wUhEm861foyWdxy0SI7CvXRcWuohItlX6Ydqo2NvtY8.json"}, - {copy, "data/genesis_txs/1QoMjs6Q3XKklJ9LfovRmGbe4bAy9xY247JfDZqN3Eo.json", "data/genesis_txs/1QoMjs6Q3XKklJ9LfovRmGbe4bAy9xY247JfDZqN3Eo.json"}, - {copy, "data/genesis_txs/24VRr4yT-_fOndcFYtK2oSO-p9Pm6lNtzQv8E-U43Bc.json", "data/genesis_txs/24VRr4yT-_fOndcFYtK2oSO-p9Pm6lNtzQv8E-U43Bc.json"}, - {copy, "data/genesis_txs/pVZkxPK8F9VFM5lDp0oTBThaw1RvmwG64wIHFChYJKA.json", "data/genesis_txs/pVZkxPK8F9VFM5lDp0oTBThaw1RvmwG64wIHFChYJKA.json"}, - {copy, "data/genesis_txs/EnPMt9yzTsxLPR5mD9zUvndxicdYBUNzOlcCPvQlOK8.json", "data/genesis_txs/EnPMt9yzTsxLPR5mD9zUvndxicdYBUNzOlcCPvQlOK8.json"}, - {copy, "data/genesis_txs/0ooE635sVsd6vdhX3Pb8Ufvuqd7XRjfUbG2eXde_CmI.json", "data/genesis_txs/0ooE635sVsd6vdhX3Pb8Ufvuqd7XRjfUbG2eXde_CmI.json"}, - {copy, "data/genesis_txs/mJUxc7XyUp1HV_VRoi_54geidr26I9PUaiNL4msSNxk.json", "data/genesis_txs/mJUxc7XyUp1HV_VRoi_54geidr26I9PUaiNL4msSNxk.json"}, - {copy, "data/genesis_txs/4bPVo0hCI3E-ry2mBjvOZsBpNwPM108NT0vnJCxCeJw.json", "data/genesis_txs/4bPVo0hCI3E-ry2mBjvOZsBpNwPM108NT0vnJCxCeJw.json"}, - {copy, "data/genesis_txs/lq4SrnweWCHnEhw_AV69gMLyBrPxYOmOdVdRIXkHwOg.json", "data/genesis_txs/lq4SrnweWCHnEhw_AV69gMLyBrPxYOmOdVdRIXkHwOg.json"}, - {copy, "data/genesis_txs/B4e9FBfqZGBszHAhZqTq-TNjb-oG7rYdlMWrQa4CPZU.json", "data/genesis_txs/B4e9FBfqZGBszHAhZqTq-TNjb-oG7rYdlMWrQa4CPZU.json"}, - {copy, "data/genesis_txs/576xa7WLVidNoEcYPhAm7OlyYgbrp7Z1RBIfqLbVFzw.json", "data/genesis_txs/576xa7WLVidNoEcYPhAm7OlyYgbrp7Z1RBIfqLbVFzw.json"}, - {copy, "data/genesis_txs/IJsiiIbd-Qs39TAJ67hiRJFsBye_rgQdU9GBid_PnZw.json", "data/genesis_txs/IJsiiIbd-Qs39TAJ67hiRJFsBye_rgQdU9GBid_PnZw.json"}, - {copy, "data/genesis_txs/CMr-rV5FdlQcRBo4loZzj66EFqwHBmA36tWiRMKGigQ.json", "data/genesis_txs/CMr-rV5FdlQcRBo4loZzj66EFqwHBmA36tWiRMKGigQ.json"}, - {copy, "data/genesis_txs/gXd75eQL5Yzcn1ba51nORAvb6f_surSnz3xcNlLAxEQ.json", "data/genesis_txs/gXd75eQL5Yzcn1ba51nORAvb6f_surSnz3xcNlLAxEQ.json"}, - {copy, "data/genesis_txs/eGhF0za2qN5WuadlVZ1iak1S5LxXswHRzIa3j_P-sUM.json", "data/genesis_txs/eGhF0za2qN5WuadlVZ1iak1S5LxXswHRzIa3j_P-sUM.json"}, - {copy, "data/genesis_txs/00nFXThK86Aog_HfLJc9j0nnXzXSlU6VdGC8qZc5ekI.json", "data/genesis_txs/00nFXThK86Aog_HfLJc9j0nnXzXSlU6VdGC8qZc5ekI.json"}, - {copy, "data/genesis_txs/Znw-6H_ayGJBReeQm9z9WKulBH1ZzrOovdMsNPcIe_Y.json", "data/genesis_txs/Znw-6H_ayGJBReeQm9z9WKulBH1ZzrOovdMsNPcIe_Y.json"}, - {copy, "data/genesis_txs/AoSTMf_ZxlcY12bK6_sWj02kssD00K4E-vkHx2vRxG4.json", "data/genesis_txs/AoSTMf_ZxlcY12bK6_sWj02kssD00K4E-vkHx2vRxG4.json"}, - {copy, "data/genesis_txs/Achd6pqJVZ-1vNMLC977Lu8f20eBmgAv4dIddXql51s.json", "data/genesis_txs/Achd6pqJVZ-1vNMLC977Lu8f20eBmgAv4dIddXql51s.json"}, - {copy, "data/genesis_txs/HTt6lPYQfcIgUxKPjUt3aQrpwE5e3UA4UT2EI9RxSbw.json", "data/genesis_txs/HTt6lPYQfcIgUxKPjUt3aQrpwE5e3UA4UT2EI9RxSbw.json"}, - {copy, "data/genesis_txs/QJlE99-614f6XzZ-7VctQjX9DYe5wnO21aHSgg1RhnA.json", "data/genesis_txs/QJlE99-614f6XzZ-7VctQjX9DYe5wnO21aHSgg1RhnA.json"}, - {copy, "data/genesis_txs/h37LQjpChpTPMquvaxpfFeKt_7oAB5ElDzsdbCQ61n0.json", "data/genesis_txs/h37LQjpChpTPMquvaxpfFeKt_7oAB5ElDzsdbCQ61n0.json"}, - {copy, "data/genesis_txs/LUdFh6g9auj1LRtk8IUwLoY3e91jIkcSyPKuQQekPY4.json", "data/genesis_txs/LUdFh6g9auj1LRtk8IUwLoY3e91jIkcSyPKuQQekPY4.json"}, - {copy, "data/genesis_txs/YukfPvGxtYmXFF6wJjDiZcvqmH5YItxwsoLbMxWCVFg.json", "data/genesis_txs/YukfPvGxtYmXFF6wJjDiZcvqmH5YItxwsoLbMxWCVFg.json"}, - {copy, "data/genesis_txs/FmfkuPmh0vkdv_qbjXBUX1sQ-DmwBFbjuC4punobGy0.json", "data/genesis_txs/FmfkuPmh0vkdv_qbjXBUX1sQ-DmwBFbjuC4punobGy0.json"}, - {copy, "data/genesis_txs/j3l4tvphmVOyVyFkNdS7ulmexBqPqEvsSJrBsjAFJXc.json", "data/genesis_txs/j3l4tvphmVOyVyFkNdS7ulmexBqPqEvsSJrBsjAFJXc.json"}, - {copy, "data/genesis_txs/GypgExivgblZSA-1n7KjdI0SJOyXwFJkuzzPWS4NID8.json", "data/genesis_txs/GypgExivgblZSA-1n7KjdI0SJOyXwFJkuzzPWS4NID8.json"}, - {copy, "data/genesis_txs/h0sgGEeQQcmSxg8uyiCOigWtI_r2ex-58nk1xso004c.json", "data/genesis_txs/h0sgGEeQQcmSxg8uyiCOigWtI_r2ex-58nk1xso004c.json"}, - {copy, "data/genesis_txs/M7oOLbk7TPBanLCS0pzkJSbV1CYoJabbsSDe_pCjhEo.json", "data/genesis_txs/M7oOLbk7TPBanLCS0pzkJSbV1CYoJabbsSDe_pCjhEo.json"}, - {copy, "data/genesis_txs/LiitFWnODMUA7esa_f49IiMEdN7cTKoKw1cgG2J_eNE.json", "data/genesis_txs/LiitFWnODMUA7esa_f49IiMEdN7cTKoKw1cgG2J_eNE.json"}, - {copy, "data/genesis_txs/x8KM69OVm6lzslK6ccAE-3EX5sW6CUHBZB-1hbc-J0A.json", "data/genesis_txs/x8KM69OVm6lzslK6ccAE-3EX5sW6CUHBZB-1hbc-J0A.json"}, - {copy, "data/genesis_txs/TGp-18LYjSWQQ36gs5prU-vDgteOL79aywxXoDS-w0c.json", "data/genesis_txs/TGp-18LYjSWQQ36gs5prU-vDgteOL79aywxXoDS-w0c.json"} - ]}, + {overlay, [ + {copy, "bin/arweave.env", "bin/arweave.env"}, + {copy, "bin/start", "bin/start"}, + {copy, "bin/stop", "bin/stop"}, + {copy, "bin/create-wallet", "bin/create-wallet"}, + {copy, "bin/benchmark-hash", "bin/benchmark-hash"}, + {copy, "bin/benchmark-packing", "bin/benchmark-packing"}, + {copy, "bin/benchmark-packing-all", "bin/benchmark-packing-all"}, + {copy, "bin/benchmark-vdf", "bin/benchmark-vdf"}, + {copy, "bin/data-doctor", "bin/data-doctor"}, + {copy, "bin/logs", "bin/logs"}, + {copy, "bin/debug-logs", "bin/debug-logs"}, + {copy, "bin/check-nofile", "bin/check-nofile"}, + {copy, "data/not_found.html", "data/not_found.html"}, + {copy, "data/hash_list_1_0", "data/hash_list_1_0"}, + {copy, "data/genesis_wallets.csv", "data/genesis_wallets.csv"}, + {copy, "data/genesis_txs/ZC44Bxrx6AtNJYLwhvpALuINZRBXklme3tpeJbJ2rdw.json", + "data/genesis_txs/ZC44Bxrx6AtNJYLwhvpALuINZRBXklme3tpeJbJ2rdw.json"}, + {copy, "data/genesis_txs/6NaT-Mz8QAiQS8atFaOu_ezqZnfu_XaQb-Grng-hvHc.json", + "data/genesis_txs/6NaT-Mz8QAiQS8atFaOu_ezqZnfu_XaQb-Grng-hvHc.json"}, + {copy, "data/genesis_txs/1qVeYpf2sY8Qkz0iVomVPVb15NA7QUtF3eFDoMwa8PI.json", + "data/genesis_txs/1qVeYpf2sY8Qkz0iVomVPVb15NA7QUtF3eFDoMwa8PI.json"}, + {copy, "data/genesis_txs/6GNIVQ-23jPJTxQkQITbSKE7SYm6J3MF4qbSgH3-AXU.json", + "data/genesis_txs/6GNIVQ-23jPJTxQkQITbSKE7SYm6J3MF4qbSgH3-AXU.json"}, + {copy, "data/genesis_txs/3T6mnguMWl8GeiqZWiBZrGXHHtwm12mIWciusoSACkQ.json", + "data/genesis_txs/3T6mnguMWl8GeiqZWiBZrGXHHtwm12mIWciusoSACkQ.json"}, + {copy, "data/genesis_txs/EQh5rYFJ5Z5yESi4DIuvl2n6iVZS899tA6V6rf2Xwhk.json", + "data/genesis_txs/EQh5rYFJ5Z5yESi4DIuvl2n6iVZS899tA6V6rf2Xwhk.json"}, + {copy, "data/genesis_txs/128KaPgVaZyrl8Vuzt795ZlWidERzih15pNDAJgahI0.json", + "data/genesis_txs/128KaPgVaZyrl8Vuzt795ZlWidERzih15pNDAJgahI0.json"}, + {copy, "data/genesis_txs/xiQYsaUMtlIq9DvTyucB4gu0BFC-qnFRIDclLv8wUT8.json", + "data/genesis_txs/xiQYsaUMtlIq9DvTyucB4gu0BFC-qnFRIDclLv8wUT8.json"}, + {copy, "data/genesis_txs/I6s8Z6gEPLQABFstkCoLVv_gdQNGb-uuMMut-R7q2hA.json", + "data/genesis_txs/I6s8Z6gEPLQABFstkCoLVv_gdQNGb-uuMMut-R7q2hA.json"}, + {copy, "data/genesis_txs/kXu3jTQwgYsphIUFbaVGg9rNiil96fNjw0RBa6oPRtU.json", + "data/genesis_txs/kXu3jTQwgYsphIUFbaVGg9rNiil96fNjw0RBa6oPRtU.json"}, + {copy, "data/genesis_txs/CUu1gtu6L5tJxkOAu13tNBGDKECohV8M4qgCOOPNtas.json", + "data/genesis_txs/CUu1gtu6L5tJxkOAu13tNBGDKECohV8M4qgCOOPNtas.json"}, + {copy, "data/genesis_txs/g6TUtTIi_rwlAHNuO6ACsQqIChWACugTPmZxaaJltDM.json", + "data/genesis_txs/g6TUtTIi_rwlAHNuO6ACsQqIChWACugTPmZxaaJltDM.json"}, + {copy, "data/genesis_txs/L9J9SkTWI_Fx5KhujeWGokIchHTSFlSIC0blr0JIz80.json", + "data/genesis_txs/L9J9SkTWI_Fx5KhujeWGokIchHTSFlSIC0blr0JIz80.json"}, + {copy, "data/genesis_txs/AX6ZZxDpFlNhoN5Am5Hi4DER4zOBGVnQm_bse5PfHNw.json", + "data/genesis_txs/AX6ZZxDpFlNhoN5Am5Hi4DER4zOBGVnQm_bse5PfHNw.json"}, + {copy, "data/genesis_txs/3MMMUrHDmjbCn_-TOZJJHvjLBp8PffZKUNfm_Ziy0Vk.json", + "data/genesis_txs/3MMMUrHDmjbCn_-TOZJJHvjLBp8PffZKUNfm_Ziy0Vk.json"}, + {copy, "data/genesis_txs/2vn7V0FR0JMXrVbj3Ofvc_2nvrFYCCpRoFjc7UYpJcA.json", + "data/genesis_txs/2vn7V0FR0JMXrVbj3Ofvc_2nvrFYCCpRoFjc7UYpJcA.json"}, + {copy, "data/genesis_txs/daTnztzTMlA8Ras9XgQ05Fr9ZYwOg4-UDfjW875yQeQ.json", + "data/genesis_txs/daTnztzTMlA8Ras9XgQ05Fr9ZYwOg4-UDfjW875yQeQ.json"}, + {copy, "data/genesis_txs/_QEE09XylMYgab9MYPvrrMy7v1jKWh0bGwqFvsBsO8s.json", + "data/genesis_txs/_QEE09XylMYgab9MYPvrrMy7v1jKWh0bGwqFvsBsO8s.json"}, + {copy, "data/genesis_txs/5WKzIeQrDGC86IQvl2NhRtgPNKHGRA9oyjRByV1F7p4.json", + "data/genesis_txs/5WKzIeQrDGC86IQvl2NhRtgPNKHGRA9oyjRByV1F7p4.json"}, + {copy, "data/genesis_txs/Tnf6b1F67AEV2r9Flj8ktSSHYoV8SeL9dFvHRkavlZo.json", + "data/genesis_txs/Tnf6b1F67AEV2r9Flj8ktSSHYoV8SeL9dFvHRkavlZo.json"}, + {copy, "data/genesis_txs/m1Vv28IVJIuYiToBhxFVp3dA47je3L8WkzSjggAWXAo.json", + "data/genesis_txs/m1Vv28IVJIuYiToBhxFVp3dA47je3L8WkzSjggAWXAo.json"}, + {copy, "data/genesis_txs/iPb5JLzNajAzUNByVeIGSEPR0rzGOV5iIYjWpi99APQ.json", + "data/genesis_txs/iPb5JLzNajAzUNByVeIGSEPR0rzGOV5iIYjWpi99APQ.json"}, + {copy, "data/genesis_txs/KOm2FJzmNXa_yjYC-58DkysCdk7FRFMcRmBx3DF6S9A.json", + "data/genesis_txs/KOm2FJzmNXa_yjYC-58DkysCdk7FRFMcRmBx3DF6S9A.json"}, + {copy, "data/genesis_txs/R0Mhun4e-WmLLGxnJq4SDTRqyNvTDTKC-uXuol1s63A.json", + "data/genesis_txs/R0Mhun4e-WmLLGxnJq4SDTRqyNvTDTKC-uXuol1s63A.json"}, + {copy, "data/genesis_txs/g8ZQaQTNUbg-jGeE61og18FrGqpFeZxjFDypGuhT7zI.json", + "data/genesis_txs/g8ZQaQTNUbg-jGeE61og18FrGqpFeZxjFDypGuhT7zI.json"}, + {copy, "data/genesis_txs/DC6gmByeCki7uyXHJhX_A9x3pkMgmJ8Tv6wDRnh7vGs.json", + "data/genesis_txs/DC6gmByeCki7uyXHJhX_A9x3pkMgmJ8Tv6wDRnh7vGs.json"}, + {copy, "data/genesis_txs/y-k4KjdSmwYmIugoObrtx5JWYczlEZBzwBHGMLqNP-0.json", + "data/genesis_txs/y-k4KjdSmwYmIugoObrtx5JWYczlEZBzwBHGMLqNP-0.json"}, + {copy, "data/genesis_txs/OIOqGvvuafD_5J9QzfxyPiNlnqzIcL96i6u4PTUeDmA.json", + "data/genesis_txs/OIOqGvvuafD_5J9QzfxyPiNlnqzIcL96i6u4PTUeDmA.json"}, + {copy, "data/genesis_txs/mcFln0_6FIuLwE9GtMRzmdQts4QALV3dxQkXdgSdO2s.json", + "data/genesis_txs/mcFln0_6FIuLwE9GtMRzmdQts4QALV3dxQkXdgSdO2s.json"}, + {copy, "data/genesis_txs/R2h2i6y-KFxuHukxmHIjSncPZSiS4tpuzH0tD1NAooI.json", + "data/genesis_txs/R2h2i6y-KFxuHukxmHIjSncPZSiS4tpuzH0tD1NAooI.json"}, + {copy, "data/genesis_txs/rC7TOXwflo7w9Ky0ljTYlzdbR0A3g2GVRbRJbIIuBfY.json", + "data/genesis_txs/rC7TOXwflo7w9Ky0ljTYlzdbR0A3g2GVRbRJbIIuBfY.json"}, + {copy, "data/genesis_txs/UdCfZG1jBYUKgeLc13zjRxmQHO4_13B-NigE57jmJ5A.json", + "data/genesis_txs/UdCfZG1jBYUKgeLc13zjRxmQHO4_13B-NigE57jmJ5A.json"}, + {copy, "data/genesis_txs/8gTAwQ3f17PKI9KCX1cjuXCs9F8Hcdz8KyhsecKuCJ0.json", + "data/genesis_txs/8gTAwQ3f17PKI9KCX1cjuXCs9F8Hcdz8KyhsecKuCJ0.json"}, + {copy, "data/genesis_txs/HFUR5ZwLihdaonJWHRHBuLay6cw8ZMV0bM870xhE6Qk.json", + "data/genesis_txs/HFUR5ZwLihdaonJWHRHBuLay6cw8ZMV0bM870xhE6Qk.json"}, + {copy, "data/genesis_txs/QDbVk-efwdVbHDGL1vZO3mQ3g65ol5RR-1wOvPLUkkE.json", + "data/genesis_txs/QDbVk-efwdVbHDGL1vZO3mQ3g65ol5RR-1wOvPLUkkE.json"}, + {copy, "data/genesis_txs/F5R2EA-gM8AtQ9_NymKwtr_Im3_ljMR38ndzCs5c77Y.json", + "data/genesis_txs/F5R2EA-gM8AtQ9_NymKwtr_Im3_ljMR38ndzCs5c77Y.json"}, + {copy, "data/genesis_txs/O6qlkPRgr7H3WLHjVov-CTm-q66Q4TuvhP6GC-c5ZjY.json", + "data/genesis_txs/O6qlkPRgr7H3WLHjVov-CTm-q66Q4TuvhP6GC-c5ZjY.json"}, + {copy, "data/genesis_txs/0qob-AeHGTS5EDamY6Mtsnxf1MCyUk18l09bqHAYQjU.json", + "data/genesis_txs/0qob-AeHGTS5EDamY6Mtsnxf1MCyUk18l09bqHAYQjU.json"}, + {copy, "data/genesis_txs/VuXQZjhUaZ2Hyi6Pl8_VTOu2mUWjoEemYb5TKXPFOS0.json", + "data/genesis_txs/VuXQZjhUaZ2Hyi6Pl8_VTOu2mUWjoEemYb5TKXPFOS0.json"}, + {copy, "data/genesis_txs/Osgzf9EDK9j7TMlqSJ_5Y1rzZgOA6qfR7ktiakLPk4A.json", + "data/genesis_txs/Osgzf9EDK9j7TMlqSJ_5Y1rzZgOA6qfR7ktiakLPk4A.json"}, + {copy, "data/genesis_txs/1xh_NCIFYbprcgNM4AVvZ47jRxsQmJYvCG-L-oEK4iE.json", + "data/genesis_txs/1xh_NCIFYbprcgNM4AVvZ47jRxsQmJYvCG-L-oEK4iE.json"}, + {copy, "data/genesis_txs/DpEoi9F4g952ajGuT4g1HWY-xndyE77dn0VfdNXkrC8.json", + "data/genesis_txs/DpEoi9F4g952ajGuT4g1HWY-xndyE77dn0VfdNXkrC8.json"}, + {copy, "data/genesis_txs/Z6IgRWClifhTSnomxJet2WLw8UUaslmqAi2nynj3Ke4.json", + "data/genesis_txs/Z6IgRWClifhTSnomxJet2WLw8UUaslmqAi2nynj3Ke4.json"}, + {copy, "data/genesis_txs/Xjz72yVLd_Qzl8_GfSPqZA1MAkxxhjr2Lsf2tGCj_ZQ.json", + "data/genesis_txs/Xjz72yVLd_Qzl8_GfSPqZA1MAkxxhjr2Lsf2tGCj_ZQ.json"}, + {copy, "data/genesis_txs/r8Yq7Lvx0FjFYyXBLn29UM5Evv4AtGLZ00LCtE_hC60.json", + "data/genesis_txs/r8Yq7Lvx0FjFYyXBLn29UM5Evv4AtGLZ00LCtE_hC60.json"}, + {copy, "data/genesis_txs/7kT0is0QnxdjqkPi0BKamhLW6z6_SK55LMAVKQC6F0M.json", + "data/genesis_txs/7kT0is0QnxdjqkPi0BKamhLW6z6_SK55LMAVKQC6F0M.json"}, + {copy, "data/genesis_txs/-wzIQJ19Hq8Zyf1L85Ga3uGTrdWA2W-UNyr8aH4a4iE.json", + "data/genesis_txs/-wzIQJ19Hq8Zyf1L85Ga3uGTrdWA2W-UNyr8aH4a4iE.json"}, + {copy, "data/genesis_txs/QDBM2PowqCX0eUCKzgV-DgdzeDz5TXLKYS3HVXLyqoo.json", + "data/genesis_txs/QDBM2PowqCX0eUCKzgV-DgdzeDz5TXLKYS3HVXLyqoo.json"}, + {copy, "data/genesis_txs/ZAk05et7CFN69E9NwET2mSRI0ISRigjMEjcy8kbO-Y8.json", + "data/genesis_txs/ZAk05et7CFN69E9NwET2mSRI0ISRigjMEjcy8kbO-Y8.json"}, + {copy, "data/genesis_txs/LJ2QSdjHftgyCOSgy9Ub0OkTTN25rxCY7D7mt6u8Uy8.json", + "data/genesis_txs/LJ2QSdjHftgyCOSgy9Ub0OkTTN25rxCY7D7mt6u8Uy8.json"}, + {copy, "data/genesis_txs/luyHFFFOvjKPqi6nVrxngcHaQ3RwbMDMqVTLqPagHy0.json", + "data/genesis_txs/luyHFFFOvjKPqi6nVrxngcHaQ3RwbMDMqVTLqPagHy0.json"}, + {copy, "data/genesis_txs/eJ2aSQ4nm-i8XAZW2pcRq6GoEjW9K8EBM6w7rLiuSHw.json", + "data/genesis_txs/eJ2aSQ4nm-i8XAZW2pcRq6GoEjW9K8EBM6w7rLiuSHw.json"}, + {copy, "data/genesis_txs/SHxtj5_gLdJMI-6CcspsDbFBuU_74df3I4-sAJkAr6w.json", + "data/genesis_txs/SHxtj5_gLdJMI-6CcspsDbFBuU_74df3I4-sAJkAr6w.json"}, + {copy, "data/genesis_txs/CZ181FVir4NaSJ7JsVb50-xCaZtd3dmKbDer7jpTSyI.json", + "data/genesis_txs/CZ181FVir4NaSJ7JsVb50-xCaZtd3dmKbDer7jpTSyI.json"}, + {copy, "data/genesis_txs/Mk8XJgQPSOIsx_QX_XDPxdEG5NcKgO92q9i37uLZsrs.json", + "data/genesis_txs/Mk8XJgQPSOIsx_QX_XDPxdEG5NcKgO92q9i37uLZsrs.json"}, + {copy, "data/genesis_txs/Y0PLaTBQ73JXn_jHvldOKC3jdbqDbqTMkcW0x65_Jek.json", + "data/genesis_txs/Y0PLaTBQ73JXn_jHvldOKC3jdbqDbqTMkcW0x65_Jek.json"}, + {copy, "data/genesis_txs/G5FyMvm8E0_07vFgz-XISJN3VEviSrbtih9_Wptef9w.json", + "data/genesis_txs/G5FyMvm8E0_07vFgz-XISJN3VEviSrbtih9_Wptef9w.json"}, + {copy, "data/genesis_txs/fx1EmDF4yioha3ms_VbddDQjl4bt6pBLpFCESuEIT6E.json", + "data/genesis_txs/fx1EmDF4yioha3ms_VbddDQjl4bt6pBLpFCESuEIT6E.json"}, + {copy, "data/genesis_txs/EUMtkWCJU0L23RnhXKfQ1wtD3Jh2O-vpFnLcQXynoAQ.json", + "data/genesis_txs/EUMtkWCJU0L23RnhXKfQ1wtD3Jh2O-vpFnLcQXynoAQ.json"}, + {copy, "data/genesis_txs/BYJCPwCLpd9a5K1HFy5F6ZvnemPiPFtV4hz5wMHr1NI.json", + "data/genesis_txs/BYJCPwCLpd9a5K1HFy5F6ZvnemPiPFtV4hz5wMHr1NI.json"}, + {copy, "data/genesis_txs/5dsjbEwH2r-EWCkfOznV4JkCOLSK9vNY-0iqPr4RZUM.json", + "data/genesis_txs/5dsjbEwH2r-EWCkfOznV4JkCOLSK9vNY-0iqPr4RZUM.json"}, + {copy, "data/genesis_txs/71M1E7A4e0PFW_6C0gly77iCg7ykX17647i00eEiA-s.json", + "data/genesis_txs/71M1E7A4e0PFW_6C0gly77iCg7ykX17647i00eEiA-s.json"}, + {copy, "data/genesis_txs/98kadyXY0OPfEZKeeZcCyQ7z5mRToZklK-D6f1a-Lxw.json", + "data/genesis_txs/98kadyXY0OPfEZKeeZcCyQ7z5mRToZklK-D6f1a-Lxw.json"}, + {copy, "data/genesis_txs/EvKHSfokNyuiTarFKOuQ_-SaBwtllGpQGc7IFkRfBfc.json", + "data/genesis_txs/EvKHSfokNyuiTarFKOuQ_-SaBwtllGpQGc7IFkRfBfc.json"}, + {copy, "data/genesis_txs/hRTkBAH0k74HlmlWXTWmetXcIFXvM_Zrz3i1JXULZSM.json", + "data/genesis_txs/hRTkBAH0k74HlmlWXTWmetXcIFXvM_Zrz3i1JXULZSM.json"}, + {copy, "data/genesis_txs/p9PJG5GkKZAxLyPJyDYw4_1CmhodHGGGqB785duwVwM.json", + "data/genesis_txs/p9PJG5GkKZAxLyPJyDYw4_1CmhodHGGGqB785duwVwM.json"}, + {copy, "data/genesis_txs/rTY6dpq4KEhZtB-5moP1mWN1CtrTKurv7QSY8wAN758.json", + "data/genesis_txs/rTY6dpq4KEhZtB-5moP1mWN1CtrTKurv7QSY8wAN758.json"}, + {copy, "data/genesis_txs/K_ae8Bfvql0dGhIfRH-R7W-zWoeB95kYGJNi3HjFyrs.json", + "data/genesis_txs/K_ae8Bfvql0dGhIfRH-R7W-zWoeB95kYGJNi3HjFyrs.json"}, + {copy, "data/genesis_txs/z7Xvravldr4BhTI4KPOEWtG325_1ORaLQ4aUPOAe_us.json", + "data/genesis_txs/z7Xvravldr4BhTI4KPOEWtG325_1ORaLQ4aUPOAe_us.json"}, + {copy, "data/genesis_txs/SCN8yn0cQASui1DeV4mMYeQrRn8eXKr7Cp9ll7L3UfI.json", + "data/genesis_txs/SCN8yn0cQASui1DeV4mMYeQrRn8eXKr7Cp9ll7L3UfI.json"}, + {copy, "data/genesis_txs/piTZgtn2oBsWKt09CV8LqH3I3JaVdRjFwjOAJmC-Xp4.json", + "data/genesis_txs/piTZgtn2oBsWKt09CV8LqH3I3JaVdRjFwjOAJmC-Xp4.json"}, + {copy, "data/genesis_txs/gbYMogbLVx3rOmm7K-o3nfGPKauLMLkGMSXcKkXW13Q.json", + "data/genesis_txs/gbYMogbLVx3rOmm7K-o3nfGPKauLMLkGMSXcKkXW13Q.json"}, + {copy, "data/genesis_txs/3BSgxVi4vtVtgMBtDE8xPMqU0PmkiKtKX6P_Iw0kMsM.json", + "data/genesis_txs/3BSgxVi4vtVtgMBtDE8xPMqU0PmkiKtKX6P_Iw0kMsM.json"}, + {copy, "data/genesis_txs/M_wQsQbFGtGiEaH0uW2swBubAnFab3ZcCN8IYWZvVzo.json", + "data/genesis_txs/M_wQsQbFGtGiEaH0uW2swBubAnFab3ZcCN8IYWZvVzo.json"}, + {copy, "data/genesis_txs/un3O49lggBX9raJKb6yuql_QTgZYWakWw5ydwUgUuXY.json", + "data/genesis_txs/un3O49lggBX9raJKb6yuql_QTgZYWakWw5ydwUgUuXY.json"}, + {copy, "data/genesis_txs/wFjsB5Y9GV61NqjCeyPCdkfXKUJOYccq8Bl9aljvwGc.json", + "data/genesis_txs/wFjsB5Y9GV61NqjCeyPCdkfXKUJOYccq8Bl9aljvwGc.json"}, + {copy, "data/genesis_txs/kcb41aN752OE__qEKDQAsbpzCUXMdlzI3clCBuxdVts.json", + "data/genesis_txs/kcb41aN752OE__qEKDQAsbpzCUXMdlzI3clCBuxdVts.json"}, + {copy, "data/genesis_txs/gE-2fjp2ncJ0ZRg12UBfqnCBb75OtAOksEX3wGZguqw.json", + "data/genesis_txs/gE-2fjp2ncJ0ZRg12UBfqnCBb75OtAOksEX3wGZguqw.json"}, + {copy, "data/genesis_txs/SJXMM0tlXown7l3ffjhsiKf311FDTRa7QkKX8tgyEZ8.json", + "data/genesis_txs/SJXMM0tlXown7l3ffjhsiKf311FDTRa7QkKX8tgyEZ8.json"}, + {copy, "data/genesis_txs/EPZ0hBh1wp-7T4JED4v6DOItd-9MNWkRfbLyizDLBsE.json", + "data/genesis_txs/EPZ0hBh1wp-7T4JED4v6DOItd-9MNWkRfbLyizDLBsE.json"}, + {copy, "data/genesis_txs/IACLRsWq-T6aesGEAjfFTZJd2sy7sFvWL7O6FI9A39U.json", + "data/genesis_txs/IACLRsWq-T6aesGEAjfFTZJd2sy7sFvWL7O6FI9A39U.json"}, + {copy, "data/genesis_txs/Dxrsx0xuPVY7oz9yHbL6wOFxo6ws7ycVe778C2bc9J8.json", + "data/genesis_txs/Dxrsx0xuPVY7oz9yHbL6wOFxo6ws7ycVe778C2bc9J8.json"}, + {copy, "data/genesis_txs/_01J_SIBJ164H0EedSfQ8h0dMfqet66WKHwcOFQEsMc.json", + "data/genesis_txs/_01J_SIBJ164H0EedSfQ8h0dMfqet66WKHwcOFQEsMc.json"}, + {copy, "data/genesis_txs/OILhne7UcvACtB4peA4osAjRMthaZZSW9OWhe3NpLBw.json", + "data/genesis_txs/OILhne7UcvACtB4peA4osAjRMthaZZSW9OWhe3NpLBw.json"}, + {copy, "data/genesis_txs/06dr4mrXcKlfPbK8t9vWOBCDJznyG-AsKxED-Jr0U88.json", + "data/genesis_txs/06dr4mrXcKlfPbK8t9vWOBCDJznyG-AsKxED-Jr0U88.json"}, + {copy, "data/genesis_txs/SBhaeMSTQm3rS6puYacdT-4wzlnkBlZ1agn6IW6Oyg8.json", + "data/genesis_txs/SBhaeMSTQm3rS6puYacdT-4wzlnkBlZ1agn6IW6Oyg8.json"}, + {copy, "data/genesis_txs/efqI0eDfp0OcYB-Ms5ELukIUr8-qtlX7Ica-ikhVZLU.json", + "data/genesis_txs/efqI0eDfp0OcYB-Ms5ELukIUr8-qtlX7Ica-ikhVZLU.json"}, + {copy, "data/genesis_txs/j2IiBCd5Vf2Q8ciTVxeHbN6JgrXUFiv0xtoMTA_VtqQ.json", + "data/genesis_txs/j2IiBCd5Vf2Q8ciTVxeHbN6JgrXUFiv0xtoMTA_VtqQ.json"}, + {copy, "data/genesis_txs/lFqBd1sEhgw1e_adedkee2hXP9beiNYbF625KV0vObU.json", + "data/genesis_txs/lFqBd1sEhgw1e_adedkee2hXP9beiNYbF625KV0vObU.json"}, + {copy, "data/genesis_txs/rRoy9jsUZ-Y10NIBksSD3P4HcVDfZheloItTTnc8_ZQ.json", + "data/genesis_txs/rRoy9jsUZ-Y10NIBksSD3P4HcVDfZheloItTTnc8_ZQ.json"}, + {copy, "data/genesis_txs/k6UueT0FWSSUbAAH4Uc1Oz6BivunVR0nSMTEILnB_dQ.json", + "data/genesis_txs/k6UueT0FWSSUbAAH4Uc1Oz6BivunVR0nSMTEILnB_dQ.json"}, + {copy, "data/genesis_txs/dYBZuFcCEgGVcfXgS9tmeJsue_qwaCRO3Mg2OHCZh_A.json", + "data/genesis_txs/dYBZuFcCEgGVcfXgS9tmeJsue_qwaCRO3Mg2OHCZh_A.json"}, + {copy, "data/genesis_txs/sfAY_3fQ41LahxW45rXfndEzeHD1eeWJgI9ZaM3slFU.json", + "data/genesis_txs/sfAY_3fQ41LahxW45rXfndEzeHD1eeWJgI9ZaM3slFU.json"}, + {copy, "data/genesis_txs/h0MlFXsvtNQlFwgTh6y7-gjXEj0CbGECgz77EwQsca0.json", + "data/genesis_txs/h0MlFXsvtNQlFwgTh6y7-gjXEj0CbGECgz77EwQsca0.json"}, + {copy, "data/genesis_txs/IwSIt1P5I_mM-gAeAvXiyxRVb73hqkQAMfxLIHbbZYk.json", + "data/genesis_txs/IwSIt1P5I_mM-gAeAvXiyxRVb73hqkQAMfxLIHbbZYk.json"}, + {copy, "data/genesis_txs/bqhG__MMablNhNpiSp8nopeKDCzXy97jLuSBlsKk_u8.json", + "data/genesis_txs/bqhG__MMablNhNpiSp8nopeKDCzXy97jLuSBlsKk_u8.json"}, + {copy, "data/genesis_txs/N6-1fOVDkoeDwKyoNdLxCVoyy-c0EF178A_oQeEchs8.json", + "data/genesis_txs/N6-1fOVDkoeDwKyoNdLxCVoyy-c0EF178A_oQeEchs8.json"}, + {copy, "data/genesis_txs/ez-ItWkyBvBZ6J7_Mobrpqc9RTp6I2JBmkPDV_xCQVY.json", + "data/genesis_txs/ez-ItWkyBvBZ6J7_Mobrpqc9RTp6I2JBmkPDV_xCQVY.json"}, + {copy, "data/genesis_txs/Z5e9G5QMZ_scJQ62qoqUs2XSuhknTuuAIhhGmfg3Ye8.json", + "data/genesis_txs/Z5e9G5QMZ_scJQ62qoqUs2XSuhknTuuAIhhGmfg3Ye8.json"}, + {copy, "data/genesis_txs/Ah6I8y8q0jb15KXjn0PyNfe7FR3v2xobg09Lfj7n1Mo.json", + "data/genesis_txs/Ah6I8y8q0jb15KXjn0PyNfe7FR3v2xobg09Lfj7n1Mo.json"}, + {copy, "data/genesis_txs/VUfaTp1eAzjnbxLR6xx_qQGVn_WOTna3rTolM8wY5BA.json", + "data/genesis_txs/VUfaTp1eAzjnbxLR6xx_qQGVn_WOTna3rTolM8wY5BA.json"}, + {copy, "data/genesis_txs/0FJrLrxrFkVTBwRrzCCh88Gm2tG1xPxg8s_IuRZDVzw.json", + "data/genesis_txs/0FJrLrxrFkVTBwRrzCCh88Gm2tG1xPxg8s_IuRZDVzw.json"}, + {copy, "data/genesis_txs/qU2Gu35-s9wMH1N4g_zMYKCqIStYzBZmRx0XlcIpjyk.json", + "data/genesis_txs/qU2Gu35-s9wMH1N4g_zMYKCqIStYzBZmRx0XlcIpjyk.json"}, + {copy, "data/genesis_txs/PySb_0NIjROmsIgwz4kMwC9MVmeY1MwuKdil0WeUzxw.json", + "data/genesis_txs/PySb_0NIjROmsIgwz4kMwC9MVmeY1MwuKdil0WeUzxw.json"}, + {copy, "data/genesis_txs/DJf1SRoKaPo1h3F-7oKIMu4A-r9dXXMjE57WQilPdTk.json", + "data/genesis_txs/DJf1SRoKaPo1h3F-7oKIMu4A-r9dXXMjE57WQilPdTk.json"}, + {copy, "data/genesis_txs/zCOtSnXKGGhXgrWld31Ak9qQA_SjpOqB6n-9sF74rhk.json", + "data/genesis_txs/zCOtSnXKGGhXgrWld31Ak9qQA_SjpOqB6n-9sF74rhk.json"}, + {copy, "data/genesis_txs/DDrS8BD0XTUVJt5E8kwisVTBX4PBWp0lCnSkSD3PJto.json", + "data/genesis_txs/DDrS8BD0XTUVJt5E8kwisVTBX4PBWp0lCnSkSD3PJto.json"}, + {copy, "data/genesis_txs/Yzj2WZ-3q5vKkBJtrmGlVjZND7iqtzvMRafS0TnQiLE.json", + "data/genesis_txs/Yzj2WZ-3q5vKkBJtrmGlVjZND7iqtzvMRafS0TnQiLE.json"}, + {copy, "data/genesis_txs/H_0S6x36tsFH-x1h77jV_zzGGp97V8UjmgC0RZYwbtM.json", + "data/genesis_txs/H_0S6x36tsFH-x1h77jV_zzGGp97V8UjmgC0RZYwbtM.json"}, + {copy, "data/genesis_txs/mvGgGlFTDJ0ukM6Bssd8G8B5PrEppr4Sg1_NTvzzV1U.json", + "data/genesis_txs/mvGgGlFTDJ0ukM6Bssd8G8B5PrEppr4Sg1_NTvzzV1U.json"}, + {copy, "data/genesis_txs/AN48OPO2-1mh4PKtpyoNm7SWJK2j8dF0-TFLU7Z1C9g.json", + "data/genesis_txs/AN48OPO2-1mh4PKtpyoNm7SWJK2j8dF0-TFLU7Z1C9g.json"}, + {copy, "data/genesis_txs/3Q5gJrbqc-PeOvD4QQ4WCNp-f5cYzTyHyg6P9b-WvwM.json", + "data/genesis_txs/3Q5gJrbqc-PeOvD4QQ4WCNp-f5cYzTyHyg6P9b-WvwM.json"}, + {copy, "data/genesis_txs/MOoLwb8S881q3-gM4GK7DuCEoh5CZnF1tMIZG300X58.json", + "data/genesis_txs/MOoLwb8S881q3-gM4GK7DuCEoh5CZnF1tMIZG300X58.json"}, + {copy, "data/genesis_txs/KPNGfBMOznCXZwOVvCXHRR6sVJx1akVkmXTV98lCMKY.json", + "data/genesis_txs/KPNGfBMOznCXZwOVvCXHRR6sVJx1akVkmXTV98lCMKY.json"}, + {copy, "data/genesis_txs/1nu07yo-0eB5GLxIJzzlxZW6nFTFiZ3XCDobJUcNyP4.json", + "data/genesis_txs/1nu07yo-0eB5GLxIJzzlxZW6nFTFiZ3XCDobJUcNyP4.json"}, + {copy, "data/genesis_txs/utAoO_xht393CbJ_7P_ektVYeEpkySWLM-066yJ5HyI.json", + "data/genesis_txs/utAoO_xht393CbJ_7P_ektVYeEpkySWLM-066yJ5HyI.json"}, + {copy, "data/genesis_txs/4UEhkNbsGdJUjx1lJQgX9KorwSf_RRZG8VMW6jMmf8Y.json", + "data/genesis_txs/4UEhkNbsGdJUjx1lJQgX9KorwSf_RRZG8VMW6jMmf8Y.json"}, + {copy, "data/genesis_txs/21Kfm2Apa8QWeqdMqyQAcxg9HbiluZXfQFu4-6xe-AY.json", + "data/genesis_txs/21Kfm2Apa8QWeqdMqyQAcxg9HbiluZXfQFu4-6xe-AY.json"}, + {copy, "data/genesis_txs/chdl-kIl4zG7VcJbKk0Q_5TeGwuH8Xp2YFPLRJJKTWw.json", + "data/genesis_txs/chdl-kIl4zG7VcJbKk0Q_5TeGwuH8Xp2YFPLRJJKTWw.json"}, + {copy, "data/genesis_txs/aGqWG70qjD5P8spXLMtyXnYxS9k7Net-u932EyIFl28.json", + "data/genesis_txs/aGqWG70qjD5P8spXLMtyXnYxS9k7Net-u932EyIFl28.json"}, + {copy, "data/genesis_txs/dn3p_BqD1gIcZQqdA8r6TucwycKGave22IqNjzKSHqI.json", + "data/genesis_txs/dn3p_BqD1gIcZQqdA8r6TucwycKGave22IqNjzKSHqI.json"}, + {copy, "data/genesis_txs/WE5eBi6hEq90HQvDjtJr-EmZATWJthgxh3HPPuQ7410.json", + "data/genesis_txs/WE5eBi6hEq90HQvDjtJr-EmZATWJthgxh3HPPuQ7410.json"}, + {copy, "data/genesis_txs/BRD5ARo8tiY64RqIoxYZ6jwbE-LQT_7jA513nHwWyRE.json", + "data/genesis_txs/BRD5ARo8tiY64RqIoxYZ6jwbE-LQT_7jA513nHwWyRE.json"}, + {copy, "data/genesis_txs/nXGMduBKL3mpsnFNPctfjEa9Z9zlMpdxcRrdkK95D80.json", + "data/genesis_txs/nXGMduBKL3mpsnFNPctfjEa9Z9zlMpdxcRrdkK95D80.json"}, + {copy, "data/genesis_txs/fkbFeVpiaAOtvt_-M9_U4HzbA8Elh5sa8xJXObrItYM.json", + "data/genesis_txs/fkbFeVpiaAOtvt_-M9_U4HzbA8Elh5sa8xJXObrItYM.json"}, + {copy, "data/genesis_txs/duSw-WaGKAabAztyg2zkj6hjgaVaRGBrJuvZ5Gd2Pzk.json", + "data/genesis_txs/duSw-WaGKAabAztyg2zkj6hjgaVaRGBrJuvZ5Gd2Pzk.json"}, + {copy, "data/genesis_txs/HSlgnBu2Yxros7zyehPgiu2u7h80dJfCCqrA88UnkB4.json", + "data/genesis_txs/HSlgnBu2Yxros7zyehPgiu2u7h80dJfCCqrA88UnkB4.json"}, + {copy, "data/genesis_txs/DTGNdsYZDXoU1nE82yEjG5ZEssxwUmkFTkM3_i6oSx8.json", + "data/genesis_txs/DTGNdsYZDXoU1nE82yEjG5ZEssxwUmkFTkM3_i6oSx8.json"}, + {copy, "data/genesis_txs/b96k6w6qUyLSSWZlmupyBmav6XYMsdt0xTc2yIUZtOA.json", + "data/genesis_txs/b96k6w6qUyLSSWZlmupyBmav6XYMsdt0xTc2yIUZtOA.json"}, + {copy, "data/genesis_txs/S5Uv2W6erubrzYjzm9QHKij51XE-j-GFdYwcV2uPIAA.json", + "data/genesis_txs/S5Uv2W6erubrzYjzm9QHKij51XE-j-GFdYwcV2uPIAA.json"}, + {copy, "data/genesis_txs/5ynd-L6Z1vrR7Vlyr-rkrga_Jw2ibALkIgldNmsVRcQ.json", + "data/genesis_txs/5ynd-L6Z1vrR7Vlyr-rkrga_Jw2ibALkIgldNmsVRcQ.json"}, + {copy, "data/genesis_txs/ocUISm-0ItAS-N3Ydwe1swo4JmoVpRzWzngFt-pDwfo.json", + "data/genesis_txs/ocUISm-0ItAS-N3Ydwe1swo4JmoVpRzWzngFt-pDwfo.json"}, + {copy, "data/genesis_txs/ByvrfeR4UNmWJwF2fU41mBo6ThFl49u24rEGpbeSI0Q.json", + "data/genesis_txs/ByvrfeR4UNmWJwF2fU41mBo6ThFl49u24rEGpbeSI0Q.json"}, + {copy, "data/genesis_txs/FTYnf3Z3QqEpNzTigfAlGTkgpgCWtFA7R8i-I1ik_Vo.json", + "data/genesis_txs/FTYnf3Z3QqEpNzTigfAlGTkgpgCWtFA7R8i-I1ik_Vo.json"}, + {copy, "data/genesis_txs/1Lwuom2q3FFI2pZz5EYgOzJRymgVWE3F9ZIl4vi3-kU.json", + "data/genesis_txs/1Lwuom2q3FFI2pZz5EYgOzJRymgVWE3F9ZIl4vi3-kU.json"}, + {copy, "data/genesis_txs/QR75we1zHW-qO7dsI932kXX0YrAIyuC2XIDRhfmK-fE.json", + "data/genesis_txs/QR75we1zHW-qO7dsI932kXX0YrAIyuC2XIDRhfmK-fE.json"}, + {copy, "data/genesis_txs/PjeEg7GpKT8twlBkp8GHAsEqfMvmNd3RaAx-l0R_i2w.json", + "data/genesis_txs/PjeEg7GpKT8twlBkp8GHAsEqfMvmNd3RaAx-l0R_i2w.json"}, + {copy, "data/genesis_txs/Kl1zrMIDIC9yW8yLMnSKQYDoV0PY41ymzJQw91qaZvY.json", + "data/genesis_txs/Kl1zrMIDIC9yW8yLMnSKQYDoV0PY41ymzJQw91qaZvY.json"}, + {copy, "data/genesis_txs/ijroBK9n_uKCS97V7iege_5Av2E-tm6ujquAazT_sBI.json", + "data/genesis_txs/ijroBK9n_uKCS97V7iege_5Av2E-tm6ujquAazT_sBI.json"}, + {copy, "data/genesis_txs/Kgr-XWwHYos5Y95ZJ9mAUwjYjj_rP0I-GnWctQDNlp8.json", + "data/genesis_txs/Kgr-XWwHYos5Y95ZJ9mAUwjYjj_rP0I-GnWctQDNlp8.json"}, + {copy, "data/genesis_txs/snWRgSI3vlTOy3RRkuNckM-ws-5lpFiPMpYlLx_zPyk.json", + "data/genesis_txs/snWRgSI3vlTOy3RRkuNckM-ws-5lpFiPMpYlLx_zPyk.json"}, + {copy, "data/genesis_txs/5qRekKepIlFbUhGMq_nNy89bzx_K44e4GmUKYAe9MRU.json", + "data/genesis_txs/5qRekKepIlFbUhGMq_nNy89bzx_K44e4GmUKYAe9MRU.json"}, + {copy, "data/genesis_txs/gyG1bGFt7qkMyUCrKiEfMzMzc3_3PooewqNeJpy-3Xk.json", + "data/genesis_txs/gyG1bGFt7qkMyUCrKiEfMzMzc3_3PooewqNeJpy-3Xk.json"}, + {copy, "data/genesis_txs/Z7gfizrPOypT4Pagg3oli5g8wA8pbKB0ZJnrw-FVyys.json", + "data/genesis_txs/Z7gfizrPOypT4Pagg3oli5g8wA8pbKB0ZJnrw-FVyys.json"}, + {copy, "data/genesis_txs/lsuH-ITPI--6KSzhIFclsEAWOSoRQu-8tlnOSxj_Er0.json", + "data/genesis_txs/lsuH-ITPI--6KSzhIFclsEAWOSoRQu-8tlnOSxj_Er0.json"}, + {copy, "data/genesis_txs/xavUY4L0L0nLNVvHiYfBqGL5iqUvdwQ-iY_nLLMB6J4.json", + "data/genesis_txs/xavUY4L0L0nLNVvHiYfBqGL5iqUvdwQ-iY_nLLMB6J4.json"}, + {copy, "data/genesis_txs/3khTH_o8WZHSCzP-AThkmt7zZL-d_lcqUKC8nz7c8lk.json", + "data/genesis_txs/3khTH_o8WZHSCzP-AThkmt7zZL-d_lcqUKC8nz7c8lk.json"}, + {copy, "data/genesis_txs/5FL2C4l-5cTl9wg4CblgIxzko8hGsB5URVA_yTAd4Nk.json", + "data/genesis_txs/5FL2C4l-5cTl9wg4CblgIxzko8hGsB5URVA_yTAd4Nk.json"}, + {copy, "data/genesis_txs/NBxewjnZAfekK0hKmwL_OpF1521JTeIpLk2a2TLDnTk.json", + "data/genesis_txs/NBxewjnZAfekK0hKmwL_OpF1521JTeIpLk2a2TLDnTk.json"}, + {copy, "data/genesis_txs/xC7ski_qpcrRwRkxxHwPZd2lOX6Q---2qdQ4Rr-wxAM.json", + "data/genesis_txs/xC7ski_qpcrRwRkxxHwPZd2lOX6Q---2qdQ4Rr-wxAM.json"}, + {copy, "data/genesis_txs/h7qIFbn0LoexuVwBcjKW7v5A65iQDQFYZUQjuowfIbk.json", + "data/genesis_txs/h7qIFbn0LoexuVwBcjKW7v5A65iQDQFYZUQjuowfIbk.json"}, + {copy, "data/genesis_txs/DQ6WaBfLEMEFhKoMoutuPyO_zFg1hWTDXT13CD8n1nw.json", + "data/genesis_txs/DQ6WaBfLEMEFhKoMoutuPyO_zFg1hWTDXT13CD8n1nw.json"}, + {copy, "data/genesis_txs/8y-ghHqMT2lEHQn86jRXkQ8I5cLWWtKW1CQROp8mzIs.json", + "data/genesis_txs/8y-ghHqMT2lEHQn86jRXkQ8I5cLWWtKW1CQROp8mzIs.json"}, + {copy, "data/genesis_txs/zUFRBcWpPAUyMlojffeTnPgsLo6YgU6JaJgOR0mpBuM.json", + "data/genesis_txs/zUFRBcWpPAUyMlojffeTnPgsLo6YgU6JaJgOR0mpBuM.json"}, + {copy, "data/genesis_txs/0mFNtCi-u34uwOj3BimQTPOT9PgLGE8uqCbtXhnwoKI.json", + "data/genesis_txs/0mFNtCi-u34uwOj3BimQTPOT9PgLGE8uqCbtXhnwoKI.json"}, + {copy, "data/genesis_txs/luQlV_58e9qjm7EZpoO6f5Y1j349Q34UwTW1Lx9J_vE.json", + "data/genesis_txs/luQlV_58e9qjm7EZpoO6f5Y1j349Q34UwTW1Lx9J_vE.json"}, + {copy, "data/genesis_txs/TFX7m_Kf56rV6LNuyQ31NeVoDHJ3x0YqhIv4-IBQ-3s.json", + "data/genesis_txs/TFX7m_Kf56rV6LNuyQ31NeVoDHJ3x0YqhIv4-IBQ-3s.json"}, + {copy, "data/genesis_txs/LFQ5iV6E5wyBbJmJoFJdH39ZxfW-y7mZFKou2H-ONvg.json", + "data/genesis_txs/LFQ5iV6E5wyBbJmJoFJdH39ZxfW-y7mZFKou2H-ONvg.json"}, + {copy, "data/genesis_txs/ud3zGJZA5tPRoitGG1c6HWm9W7iRS4ZF3u6PbZ-blns.json", + "data/genesis_txs/ud3zGJZA5tPRoitGG1c6HWm9W7iRS4ZF3u6PbZ-blns.json"}, + {copy, "data/genesis_txs/dv28G4IsYul7liWrycsx4UKSYHA4sWUY6xFQzRPi4p4.json", + "data/genesis_txs/dv28G4IsYul7liWrycsx4UKSYHA4sWUY6xFQzRPi4p4.json"}, + {copy, "data/genesis_txs/Ykh5TAI6koBN4UTQZ3GNIDr_uHNjlpHH9HsvtEkoWLA.json", + "data/genesis_txs/Ykh5TAI6koBN4UTQZ3GNIDr_uHNjlpHH9HsvtEkoWLA.json"}, + {copy, "data/genesis_txs/BQ2RVL6XY99AIkPKDBCfUfRmJGejkZ8YKgKZc2LewhU.json", + "data/genesis_txs/BQ2RVL6XY99AIkPKDBCfUfRmJGejkZ8YKgKZc2LewhU.json"}, + {copy, "data/genesis_txs/_fLFu_BOzTEPdX35rqUruuyNxi7f_La8T1_JG7pIPd0.json", + "data/genesis_txs/_fLFu_BOzTEPdX35rqUruuyNxi7f_La8T1_JG7pIPd0.json"}, + {copy, "data/genesis_txs/N3lqe8CUwPfChinYVV4OZZQNjtXc26JkOJyqgoKhq7E.json", + "data/genesis_txs/N3lqe8CUwPfChinYVV4OZZQNjtXc26JkOJyqgoKhq7E.json"}, + {copy, "data/genesis_txs/i9xaFWy0avtyCCxQdmWfGNDgh-PaJgIHkNK1pcJzmV8.json", + "data/genesis_txs/i9xaFWy0avtyCCxQdmWfGNDgh-PaJgIHkNK1pcJzmV8.json"}, + {copy, "data/genesis_txs/6J1sN2nhGpqe9iJwgdfnxxCK4af88__HoEG8MLeqtyM.json", + "data/genesis_txs/6J1sN2nhGpqe9iJwgdfnxxCK4af88__HoEG8MLeqtyM.json"}, + {copy, "data/genesis_txs/Juzb8MlmGd2qomIUwgfGzIFO7c7ZcY87kJPmqpSkt18.json", + "data/genesis_txs/Juzb8MlmGd2qomIUwgfGzIFO7c7ZcY87kJPmqpSkt18.json"}, + {copy, "data/genesis_txs/y0PrXtX7PonEbIG3uEdu-k-McGeLLAjzUriUTCMTGcw.json", + "data/genesis_txs/y0PrXtX7PonEbIG3uEdu-k-McGeLLAjzUriUTCMTGcw.json"}, + {copy, "data/genesis_txs/1yvqJKdnb9SRRKoBg1m0kWAsSh9S0R5r9T9TE0YHfRQ.json", + "data/genesis_txs/1yvqJKdnb9SRRKoBg1m0kWAsSh9S0R5r9T9TE0YHfRQ.json"}, + {copy, "data/genesis_txs/oRvFwVpHVeo0iysSg2jFOAZKE-hKwbm6mGeZ6VUZmxk.json", + "data/genesis_txs/oRvFwVpHVeo0iysSg2jFOAZKE-hKwbm6mGeZ6VUZmxk.json"}, + {copy, "data/genesis_txs/wnOghJX4aZlbm7SDDb4UUX8_6GZYpYYx3GireamHwAc.json", + "data/genesis_txs/wnOghJX4aZlbm7SDDb4UUX8_6GZYpYYx3GireamHwAc.json"}, + {copy, "data/genesis_txs/4gLPD5njSRtiaJwjcjmNOyI5Vw8sFBQQWOefmy4SPmQ.json", + "data/genesis_txs/4gLPD5njSRtiaJwjcjmNOyI5Vw8sFBQQWOefmy4SPmQ.json"}, + {copy, "data/genesis_txs/bnT7410oaZtnCdurp5jNgLKju9d_RRxhgggnxa5frMQ.json", + "data/genesis_txs/bnT7410oaZtnCdurp5jNgLKju9d_RRxhgggnxa5frMQ.json"}, + {copy, "data/genesis_txs/cgU_TlXi5gJ7hShSBYsS4UVi-sLTtfFv1y1sy2nNhos.json", + "data/genesis_txs/cgU_TlXi5gJ7hShSBYsS4UVi-sLTtfFv1y1sy2nNhos.json"}, + {copy, "data/genesis_txs/cIXdvNTNHJSmA6Rt5UgSNfMcGfvxDnYTa3a1ulS1SiY.json", + "data/genesis_txs/cIXdvNTNHJSmA6Rt5UgSNfMcGfvxDnYTa3a1ulS1SiY.json"}, + {copy, "data/genesis_txs/LixFbPqM1ZZ-5JWo339FMfPCpD_6M85rVK8IVmmt8m8.json", + "data/genesis_txs/LixFbPqM1ZZ-5JWo339FMfPCpD_6M85rVK8IVmmt8m8.json"}, + {copy, "data/genesis_txs/DkBAprUInkCbFa6A_WJJNL1z_PnhEavvyZtF09lmyvw.json", + "data/genesis_txs/DkBAprUInkCbFa6A_WJJNL1z_PnhEavvyZtF09lmyvw.json"}, + {copy, "data/genesis_txs/puLpw8OIIYCOatImKjpV5s0JWyKFq6bXFMz_qSf6mUA.json", + "data/genesis_txs/puLpw8OIIYCOatImKjpV5s0JWyKFq6bXFMz_qSf6mUA.json"}, + {copy, "data/genesis_txs/0biLy8DoOhucpeYzOj5jnopxxwe0XDRfCOMjyz_a74U.json", + "data/genesis_txs/0biLy8DoOhucpeYzOj5jnopxxwe0XDRfCOMjyz_a74U.json"}, + {copy, "data/genesis_txs/hX6nohfkKZ_9ajziHJ6g5V5cIe1EX9H9rg7eScK988s.json", + "data/genesis_txs/hX6nohfkKZ_9ajziHJ6g5V5cIe1EX9H9rg7eScK988s.json"}, + {copy, "data/genesis_txs/GlWMQUuiL80knS07G7NpoYat3w18VMuyLEuC_Pmijng.json", + "data/genesis_txs/GlWMQUuiL80knS07G7NpoYat3w18VMuyLEuC_Pmijng.json"}, + {copy, "data/genesis_txs/f3jE7NK419FZzwkx9VjTkrcX5FEgl2Ky3KSK0vH-wj0.json", + "data/genesis_txs/f3jE7NK419FZzwkx9VjTkrcX5FEgl2Ky3KSK0vH-wj0.json"}, + {copy, "data/genesis_txs/UMk64563QZfxgZr_vKOTDrcp5XJNENF82Pji4a078YY.json", + "data/genesis_txs/UMk64563QZfxgZr_vKOTDrcp5XJNENF82Pji4a078YY.json"}, + {copy, "data/genesis_txs/0EzNUQy_5b7CwNNLVAi7CnameMgnxVh-XyahT2kn74Y.json", + "data/genesis_txs/0EzNUQy_5b7CwNNLVAi7CnameMgnxVh-XyahT2kn74Y.json"}, + {copy, "data/genesis_txs/3ku6XelnvBsaRjoNxDWb_kT_PRlQ88U0pbWURziCj7s.json", + "data/genesis_txs/3ku6XelnvBsaRjoNxDWb_kT_PRlQ88U0pbWURziCj7s.json"}, + {copy, "data/genesis_txs/RU5mkM_3UrjRMffwgj7ovDMYxxjhfXvliozhpIqw0sA.json", + "data/genesis_txs/RU5mkM_3UrjRMffwgj7ovDMYxxjhfXvliozhpIqw0sA.json"}, + {copy, "data/genesis_txs/oMP40Kgd9MxLfksmW_HAlGe8Rn1Px8tpF-NOHBfe9oo.json", + "data/genesis_txs/oMP40Kgd9MxLfksmW_HAlGe8Rn1Px8tpF-NOHBfe9oo.json"}, + {copy, "data/genesis_txs/UYoJMT0QxMtB6ctUB-9iQlcx6fF8R3s8ahM4_iF4wiQ.json", + "data/genesis_txs/UYoJMT0QxMtB6ctUB-9iQlcx6fF8R3s8ahM4_iF4wiQ.json"}, + {copy, "data/genesis_txs/96Ijx5TWSxZmZaDH1pteGHFjIYY0aHmGWNHiMYeSYIM.json", + "data/genesis_txs/96Ijx5TWSxZmZaDH1pteGHFjIYY0aHmGWNHiMYeSYIM.json"}, + {copy, "data/genesis_txs/n6TKbsqmGl2m3yH15RAe405vYZQ7DStlvYsHCHp1D0U.json", + "data/genesis_txs/n6TKbsqmGl2m3yH15RAe405vYZQ7DStlvYsHCHp1D0U.json"}, + {copy, "data/genesis_txs/XtDRu-1SyoRL21gpKcxWtxyksVwTF9kvW26hvQ_bPzE.json", + "data/genesis_txs/XtDRu-1SyoRL21gpKcxWtxyksVwTF9kvW26hvQ_bPzE.json"}, + {copy, "data/genesis_txs/YIEEyYfNIRSjzm_gzv6l5CelyL4AOzKX9M4XPXRk2Yo.json", + "data/genesis_txs/YIEEyYfNIRSjzm_gzv6l5CelyL4AOzKX9M4XPXRk2Yo.json"}, + {copy, "data/genesis_txs/NptjIrqZrQMSdLbXAGyQCr8audCzArV3EofsjRCqrQw.json", + "data/genesis_txs/NptjIrqZrQMSdLbXAGyQCr8audCzArV3EofsjRCqrQw.json"}, + {copy, "data/genesis_txs/vWeY4yJSJF9LXogRZb3Qr6QyLtEIL_8IY4bzJ2e7O5I.json", + "data/genesis_txs/vWeY4yJSJF9LXogRZb3Qr6QyLtEIL_8IY4bzJ2e7O5I.json"}, + {copy, "data/genesis_txs/fBVa04p7MEL8BsPpyD_Pwv3uqBnBMVzG9YpXsCwZLtc.json", + "data/genesis_txs/fBVa04p7MEL8BsPpyD_Pwv3uqBnBMVzG9YpXsCwZLtc.json"}, + {copy, "data/genesis_txs/opfZTSNdqaxXZUmaKROD2sd4QkyNDnZE3u1A95eSw4E.json", + "data/genesis_txs/opfZTSNdqaxXZUmaKROD2sd4QkyNDnZE3u1A95eSw4E.json"}, + {copy, "data/genesis_txs/-M5_EBM4MayX8ZpuLFoANHO00c4pdrSmAQbPYv7fq4U.json", + "data/genesis_txs/-M5_EBM4MayX8ZpuLFoANHO00c4pdrSmAQbPYv7fq4U.json"}, + {copy, "data/genesis_txs/8rKBfpmkPlxnnYr6t0xIpUDubdidK0Fpnois7-xQJtc.json", + "data/genesis_txs/8rKBfpmkPlxnnYr6t0xIpUDubdidK0Fpnois7-xQJtc.json"}, + {copy, "data/genesis_txs/rvbM0iB1HJ1YadedIDWjJ95J2XBHWwPAJD4VfpdQpxQ.json", + "data/genesis_txs/rvbM0iB1HJ1YadedIDWjJ95J2XBHWwPAJD4VfpdQpxQ.json"}, + {copy, "data/genesis_txs/_Hf1lw_E6Lyd-0PGkCRQaN10cdEx4M-hl9y-zWiDo8k.json", + "data/genesis_txs/_Hf1lw_E6Lyd-0PGkCRQaN10cdEx4M-hl9y-zWiDo8k.json"}, + {copy, "data/genesis_txs/tOIFTqEef5fQYPzhlkC2Um7rddT6MyrHPzUWXDv_mJc.json", + "data/genesis_txs/tOIFTqEef5fQYPzhlkC2Um7rddT6MyrHPzUWXDv_mJc.json"}, + {copy, "data/genesis_txs/4LwZwAVcaBXhXsP5b4mnE11tUXefuRUTtTibtvoozDQ.json", + "data/genesis_txs/4LwZwAVcaBXhXsP5b4mnE11tUXefuRUTtTibtvoozDQ.json"}, + {copy, "data/genesis_txs/XxgirNr3QGaJTKxPWqK9byYLj7SdbfZudKd9rbynWyM.json", + "data/genesis_txs/XxgirNr3QGaJTKxPWqK9byYLj7SdbfZudKd9rbynWyM.json"}, + {copy, "data/genesis_txs/IvyUOghXQ31LnYE3bYEkS82gTAvpIa1rGGQKmiJuuMk.json", + "data/genesis_txs/IvyUOghXQ31LnYE3bYEkS82gTAvpIa1rGGQKmiJuuMk.json"}, + {copy, "data/genesis_txs/X9biR_ZA-rnpzk4gfLi0-pBSsjjT2l9Rk0VfYwf1WMo.json", + "data/genesis_txs/X9biR_ZA-rnpzk4gfLi0-pBSsjjT2l9Rk0VfYwf1WMo.json"}, + {copy, "data/genesis_txs/8b-7D96aRFJgDm8z5Tg47vBbdjseW0rRi17TYDcaQ5Q.json", + "data/genesis_txs/8b-7D96aRFJgDm8z5Tg47vBbdjseW0rRi17TYDcaQ5Q.json"}, + {copy, "data/genesis_txs/0O-UnzBvSFYoMQrbcsKHRH_YqNNylC1n9KWXmm-rr90.json", + "data/genesis_txs/0O-UnzBvSFYoMQrbcsKHRH_YqNNylC1n9KWXmm-rr90.json"}, + {copy, "data/genesis_txs/TUIdVI5yQH50laHvkxgAnTV6uuE2LXXH3pxIe6Q2S7I.json", + "data/genesis_txs/TUIdVI5yQH50laHvkxgAnTV6uuE2LXXH3pxIe6Q2S7I.json"}, + {copy, "data/genesis_txs/0Mxvgz6_wL0FBOxJmHcRcNwiaV8B90whDxG4Vh_GFic.json", + "data/genesis_txs/0Mxvgz6_wL0FBOxJmHcRcNwiaV8B90whDxG4Vh_GFic.json"}, + {copy, "data/genesis_txs/qyMWe-VUOzHXkQviMhNS0wJI_27nvCgDY9iiKANk-lI.json", + "data/genesis_txs/qyMWe-VUOzHXkQviMhNS0wJI_27nvCgDY9iiKANk-lI.json"}, + {copy, "data/genesis_txs/LC-_5GDhs09OvN7r8GPmjMa6A9xSeVtsAmDgYCgspvc.json", + "data/genesis_txs/LC-_5GDhs09OvN7r8GPmjMa6A9xSeVtsAmDgYCgspvc.json"}, + {copy, "data/genesis_txs/sB51Zz1HRjpwrWFhW6ZE2E-n5hl3joqxPQgnMCLX4ZM.json", + "data/genesis_txs/sB51Zz1HRjpwrWFhW6ZE2E-n5hl3joqxPQgnMCLX4ZM.json"}, + {copy, "data/genesis_txs/NEXnMz8Yuw-xfIPprKT2iwx5A1UjWwRHCH7XCpeXIPg.json", + "data/genesis_txs/NEXnMz8Yuw-xfIPprKT2iwx5A1UjWwRHCH7XCpeXIPg.json"}, + {copy, "data/genesis_txs/5OdjYWAipCjWzpqfNoNhyJ673d4pRMNva8la_SFfu_c.json", + "data/genesis_txs/5OdjYWAipCjWzpqfNoNhyJ673d4pRMNva8la_SFfu_c.json"}, + {copy, "data/genesis_txs/drYsyF85HcvC7LM1hkzPPgTj3_zp3amcNVNobBmOxvc.json", + "data/genesis_txs/drYsyF85HcvC7LM1hkzPPgTj3_zp3amcNVNobBmOxvc.json"}, + {copy, "data/genesis_txs/vQ4zTq--De8FHdVnE7sYCemwiaqoZDS4emR_y6o6ZFA.json", + "data/genesis_txs/vQ4zTq--De8FHdVnE7sYCemwiaqoZDS4emR_y6o6ZFA.json"}, + {copy, "data/genesis_txs/zwl046ia6I5VWLRYPJzBI70ypBQN2VlvLH9a_ndNKxA.json", + "data/genesis_txs/zwl046ia6I5VWLRYPJzBI70ypBQN2VlvLH9a_ndNKxA.json"}, + {copy, "data/genesis_txs/xYpSRRpO8ejUGeohlRutNt9qUMgvuZJGkPGCyu1kSas.json", + "data/genesis_txs/xYpSRRpO8ejUGeohlRutNt9qUMgvuZJGkPGCyu1kSas.json"}, + {copy, "data/genesis_txs/wmZTwziFc_VlvYJz_4nyxYd3WxznBmsn5QQyRKDcWXU.json", + "data/genesis_txs/wmZTwziFc_VlvYJz_4nyxYd3WxznBmsn5QQyRKDcWXU.json"}, + {copy, "data/genesis_txs/SWNkfm9ZZPCiYKFg6oIW_IgqJp5Ypbp-Fs9S7YgPm0c.json", + "data/genesis_txs/SWNkfm9ZZPCiYKFg6oIW_IgqJp5Ypbp-Fs9S7YgPm0c.json"}, + {copy, "data/genesis_txs/y6WPKL6MHzZp2ktvb1cETmNMBJyCEPlxdisKlroEBtc.json", + "data/genesis_txs/y6WPKL6MHzZp2ktvb1cETmNMBJyCEPlxdisKlroEBtc.json"}, + {copy, "data/genesis_txs/0ogs8DTdSrNxfE2LzrScPvnyf7CQ7jMdFaS_l0-K-GU.json", + "data/genesis_txs/0ogs8DTdSrNxfE2LzrScPvnyf7CQ7jMdFaS_l0-K-GU.json"}, + {copy, "data/genesis_txs/328-6fOVCfCid4QTxHjkAMkQLMHZgDg-hZo5PnVfp2Q.json", + "data/genesis_txs/328-6fOVCfCid4QTxHjkAMkQLMHZgDg-hZo5PnVfp2Q.json"}, + {copy, "data/genesis_txs/iRF6OnneKHJLhLMdCXpo6LsxVyWIGyklFEpu1bN3cyE.json", + "data/genesis_txs/iRF6OnneKHJLhLMdCXpo6LsxVyWIGyklFEpu1bN3cyE.json"}, + {copy, "data/genesis_txs/g19-Tkf4xuM9golcjx0mA1RkJUYocQJ3uYnH8MU1ePs.json", + "data/genesis_txs/g19-Tkf4xuM9golcjx0mA1RkJUYocQJ3uYnH8MU1ePs.json"}, + {copy, "data/genesis_txs/aPxbCROotxwkdovWbQEhw18UNAzVy-AmjYwjo9lb5u4.json", + "data/genesis_txs/aPxbCROotxwkdovWbQEhw18UNAzVy-AmjYwjo9lb5u4.json"}, + {copy, "data/genesis_txs/COXhhpbcLSEe2iP2kp4SDj5NjjBAC8CucsAgOHRF_lc.json", + "data/genesis_txs/COXhhpbcLSEe2iP2kp4SDj5NjjBAC8CucsAgOHRF_lc.json"}, + {copy, "data/genesis_txs/TGdhJ01pPw49A0ZIaCCcYBnL-RPK_3KZH3cA6E9dVqc.json", + "data/genesis_txs/TGdhJ01pPw49A0ZIaCCcYBnL-RPK_3KZH3cA6E9dVqc.json"}, + {copy, "data/genesis_txs/v2UplxDprWwaIwbB6z3KNEj3GjloqM8SinvVahZ1Wpk.json", + "data/genesis_txs/v2UplxDprWwaIwbB6z3KNEj3GjloqM8SinvVahZ1Wpk.json"}, + {copy, "data/genesis_txs/P_pvvzlCIX7Yaiuv6zt1voLcn69gb9jAHPRhHaHjLng.json", + "data/genesis_txs/P_pvvzlCIX7Yaiuv6zt1voLcn69gb9jAHPRhHaHjLng.json"}, + {copy, "data/genesis_txs/WsYJKhqhppBF6_eGbd0OACdu3LU6-CUuMcLeG3ST2qc.json", + "data/genesis_txs/WsYJKhqhppBF6_eGbd0OACdu3LU6-CUuMcLeG3ST2qc.json"}, + {copy, "data/genesis_txs/weff0Y0_3-H7Vy1HrbpIzUmbTM1rZ8Lw0wgDGYmlsrM.json", + "data/genesis_txs/weff0Y0_3-H7Vy1HrbpIzUmbTM1rZ8Lw0wgDGYmlsrM.json"}, + {copy, "data/genesis_txs/oWWJcAiBCxhtWkIqwir4-vTvD3JFpHgZRNIpS-Xjzp4.json", + "data/genesis_txs/oWWJcAiBCxhtWkIqwir4-vTvD3JFpHgZRNIpS-Xjzp4.json"}, + {copy, "data/genesis_txs/Mv-TFhA3639O4JbKzoO3wo8LNPcFwA_vaaOLHfWRfSo.json", + "data/genesis_txs/Mv-TFhA3639O4JbKzoO3wo8LNPcFwA_vaaOLHfWRfSo.json"}, + {copy, "data/genesis_txs/iuTLZ3xxGpaBCggV5xfUkJ6hMdUQKHw6f_vEn6sbmPo.json", + "data/genesis_txs/iuTLZ3xxGpaBCggV5xfUkJ6hMdUQKHw6f_vEn6sbmPo.json"}, + {copy, "data/genesis_txs/tVLYd_62zbU-VPzQPOMHUo9TJR1dvSZ_pAHrC5Ubs8Q.json", + "data/genesis_txs/tVLYd_62zbU-VPzQPOMHUo9TJR1dvSZ_pAHrC5Ubs8Q.json"}, + {copy, "data/genesis_txs/KhQeu3CG_X1zoHbyy99GUlC9gVFFexf6vVPOlLgCj9I.json", + "data/genesis_txs/KhQeu3CG_X1zoHbyy99GUlC9gVFFexf6vVPOlLgCj9I.json"}, + {copy, "data/genesis_txs/o0nw6fU4gPL7Ae45x1BEQr5GkXSzZUrWnZrdIWqgx6w.json", + "data/genesis_txs/o0nw6fU4gPL7Ae45x1BEQr5GkXSzZUrWnZrdIWqgx6w.json"}, + {copy, "data/genesis_txs/K47jh6Jr6TmZeZ_TadmyLLy1V6ZvLNpvV5FWcICohnk.json", + "data/genesis_txs/K47jh6Jr6TmZeZ_TadmyLLy1V6ZvLNpvV5FWcICohnk.json"}, + {copy, "data/genesis_txs/7SfLhJLtevo0zu-1bo8q6zX98WbGgpDNuY6PXbzS_j0.json", + "data/genesis_txs/7SfLhJLtevo0zu-1bo8q6zX98WbGgpDNuY6PXbzS_j0.json"}, + {copy, "data/genesis_txs/C3auX8HXhc2dChmvSBUfgGyYynuAr6P3g0p7420GG78.json", + "data/genesis_txs/C3auX8HXhc2dChmvSBUfgGyYynuAr6P3g0p7420GG78.json"}, + {copy, "data/genesis_txs/m5zFPHB-2VjCgTLStD9TLZwD1CHfLELPKkVXFJGIptM.json", + "data/genesis_txs/m5zFPHB-2VjCgTLStD9TLZwD1CHfLELPKkVXFJGIptM.json"}, + {copy, "data/genesis_txs/MPP4fxmSkvM2BVq8rumeT5yvDNu3QAT_kqpOlAq5s2E.json", + "data/genesis_txs/MPP4fxmSkvM2BVq8rumeT5yvDNu3QAT_kqpOlAq5s2E.json"}, + {copy, "data/genesis_txs/6YbxtptbO-sidrnYdgn0G_CiNBh-az5ZzWrSCP9DYKA.json", + "data/genesis_txs/6YbxtptbO-sidrnYdgn0G_CiNBh-az5ZzWrSCP9DYKA.json"}, + {copy, "data/genesis_txs/mGAMsTqBzau-MjTkMS5Z3g2_nUD-qQWeLtq6qlzkVl0.json", + "data/genesis_txs/mGAMsTqBzau-MjTkMS5Z3g2_nUD-qQWeLtq6qlzkVl0.json"}, + {copy, "data/genesis_txs/CSkFcCmNgvnp7jp7aK0tEGsLWiZVMF-QBkEFaJrAG48.json", + "data/genesis_txs/CSkFcCmNgvnp7jp7aK0tEGsLWiZVMF-QBkEFaJrAG48.json"}, + {copy, "data/genesis_txs/FkZzg_-5eSdFlbq9XnHe3wRhYidHJPXwUQ6YLuJijS0.json", + "data/genesis_txs/FkZzg_-5eSdFlbq9XnHe3wRhYidHJPXwUQ6YLuJijS0.json"}, + {copy, "data/genesis_txs/9JWfraRekKtgXiIjssn0tVSzhaCaN682jECsrKtR0_E.json", + "data/genesis_txs/9JWfraRekKtgXiIjssn0tVSzhaCaN682jECsrKtR0_E.json"}, + {copy, "data/genesis_txs/Ms9gCRdVwT9u8-ewYd6c-T0bet-n24n_q_Hn0-BlMow.json", + "data/genesis_txs/Ms9gCRdVwT9u8-ewYd6c-T0bet-n24n_q_Hn0-BlMow.json"}, + {copy, "data/genesis_txs/CbV_CDXgVNjV6fyoBDkYmbAcaC5VsLDYXgEIwj2Ewyo.json", + "data/genesis_txs/CbV_CDXgVNjV6fyoBDkYmbAcaC5VsLDYXgEIwj2Ewyo.json"}, + {copy, "data/genesis_txs/4pNPqxodBesN6jQl51nH17GA1fWYfHVm8cIEfusnPLY.json", + "data/genesis_txs/4pNPqxodBesN6jQl51nH17GA1fWYfHVm8cIEfusnPLY.json"}, + {copy, "data/genesis_txs/0_GKZOdtRH-nc094U5kFBlvQSjPz_oX0tcIroqLFD3U.json", + "data/genesis_txs/0_GKZOdtRH-nc094U5kFBlvQSjPz_oX0tcIroqLFD3U.json"}, + {copy, "data/genesis_txs/G1GqspPmLkJTiT35QUTWBT4def7j5ORSfHCtrYzrrng.json", + "data/genesis_txs/G1GqspPmLkJTiT35QUTWBT4def7j5ORSfHCtrYzrrng.json"}, + {copy, "data/genesis_txs/4ewYAvsgaT-6Oy23qPqK29O_AgfvNbhLvol13yN1PdQ.json", + "data/genesis_txs/4ewYAvsgaT-6Oy23qPqK29O_AgfvNbhLvol13yN1PdQ.json"}, + {copy, "data/genesis_txs/LBTipZADoYfO-9UecE07Z83ijiLl0f2wAGXyRFQqKCY.json", + "data/genesis_txs/LBTipZADoYfO-9UecE07Z83ijiLl0f2wAGXyRFQqKCY.json"}, + {copy, "data/genesis_txs/OaumRLT8oE6J8gqrQ9DrY_grMuSfWtai95VnqrX24hs.json", + "data/genesis_txs/OaumRLT8oE6J8gqrQ9DrY_grMuSfWtai95VnqrX24hs.json"}, + {copy, "data/genesis_txs/DMtXbcR_qHwdYXvkuCGOQARs_QtN9iWPw4x6TTaWOcw.json", + "data/genesis_txs/DMtXbcR_qHwdYXvkuCGOQARs_QtN9iWPw4x6TTaWOcw.json"}, + {copy, "data/genesis_txs/Eeo6rANLMAXonDFLDG2nu7n99O3Ymfk01wYXJBbEixY.json", + "data/genesis_txs/Eeo6rANLMAXonDFLDG2nu7n99O3Ymfk01wYXJBbEixY.json"}, + {copy, "data/genesis_txs/ZEB62vqKvkPK2s_RmxgQ2IhafMxJ_TXCGswrrKLhYiQ.json", + "data/genesis_txs/ZEB62vqKvkPK2s_RmxgQ2IhafMxJ_TXCGswrrKLhYiQ.json"}, + {copy, "data/genesis_txs/TkN4QLdC4tu-_Po50RYwF33shyHcanHSe_BKpryK0JA.json", + "data/genesis_txs/TkN4QLdC4tu-_Po50RYwF33shyHcanHSe_BKpryK0JA.json"}, + {copy, "data/genesis_txs/YfHEyNUGsOUiuqCgHV127cg2Z5Yap9tcQB1LH7tq9ZA.json", + "data/genesis_txs/YfHEyNUGsOUiuqCgHV127cg2Z5Yap9tcQB1LH7tq9ZA.json"}, + {copy, "data/genesis_txs/NvGRQrdis2HV22enpSpPqsb0M8s-pN_nl7eJtalZyC4.json", + "data/genesis_txs/NvGRQrdis2HV22enpSpPqsb0M8s-pN_nl7eJtalZyC4.json"}, + {copy, "data/genesis_txs/L8tkBBP7fyYfK4txqP-fGk_ODOU4UfIgFV79O-qd5vY.json", + "data/genesis_txs/L8tkBBP7fyYfK4txqP-fGk_ODOU4UfIgFV79O-qd5vY.json"}, + {copy, "data/genesis_txs/ISiC3yaTW9KnZmgs39osghIg0HP8ISh77bzH7u2m55Q.json", + "data/genesis_txs/ISiC3yaTW9KnZmgs39osghIg0HP8ISh77bzH7u2m55Q.json"}, + {copy, "data/genesis_txs/IQgiEwMLp1bb6muuB_G7Q3sRaaZ3OZHUSjgshUq5YMU.json", + "data/genesis_txs/IQgiEwMLp1bb6muuB_G7Q3sRaaZ3OZHUSjgshUq5YMU.json"}, + {copy, "data/genesis_txs/07u3F6WH-ohqBclh6UanAQ9Tau089eLJrIYM-8qkAbw.json", + "data/genesis_txs/07u3F6WH-ohqBclh6UanAQ9Tau089eLJrIYM-8qkAbw.json"}, + {copy, "data/genesis_txs/nh2sbgjxu6MmU8yGV00w7X4q4XCJETeYE3zVtcj2ldk.json", + "data/genesis_txs/nh2sbgjxu6MmU8yGV00w7X4q4XCJETeYE3zVtcj2ldk.json"}, + {copy, "data/genesis_txs/ydvI6weQPIRj2hcNg4RPqzDpFOhqiTc9iDqQ-fUUl4I.json", + "data/genesis_txs/ydvI6weQPIRj2hcNg4RPqzDpFOhqiTc9iDqQ-fUUl4I.json"}, + {copy, "data/genesis_txs/5Hatfzkj7ivvIsUIDjdOSp-4CdkClH6B7S_SNX0B2-o.json", + "data/genesis_txs/5Hatfzkj7ivvIsUIDjdOSp-4CdkClH6B7S_SNX0B2-o.json"}, + {copy, "data/genesis_txs/1Q2plP5JFTLwdTC27VfIgDJ-ri5h3mVsKxZploTrRmQ.json", + "data/genesis_txs/1Q2plP5JFTLwdTC27VfIgDJ-ri5h3mVsKxZploTrRmQ.json"}, + {copy, "data/genesis_txs/YlalzFjBD8CgZxDlI6eNWE3PIIflHGzXyY9VzPPeCFo.json", + "data/genesis_txs/YlalzFjBD8CgZxDlI6eNWE3PIIflHGzXyY9VzPPeCFo.json"}, + {copy, "data/genesis_txs/vaJOh_TzVSoEgbgDyKz6ABzd_wt2-ouBTe0gA1F3oMY.json", + "data/genesis_txs/vaJOh_TzVSoEgbgDyKz6ABzd_wt2-ouBTe0gA1F3oMY.json"}, + {copy, "data/genesis_txs/f6MY8LMCwGbKZqXd4dkCROQK0qFMjS5OJAbZq-UhMGA.json", + "data/genesis_txs/f6MY8LMCwGbKZqXd4dkCROQK0qFMjS5OJAbZq-UhMGA.json"}, + {copy, "data/genesis_txs/_u44CiJCcYiOrGffgZoQSmUrJe8CfYD7Nw0MdPX0tUw.json", + "data/genesis_txs/_u44CiJCcYiOrGffgZoQSmUrJe8CfYD7Nw0MdPX0tUw.json"}, + {copy, "data/genesis_txs/5mt79Uz6p83vdLtYRiByyWLqLI2GZBeSTutDRmzw7tM.json", + "data/genesis_txs/5mt79Uz6p83vdLtYRiByyWLqLI2GZBeSTutDRmzw7tM.json"}, + {copy, "data/genesis_txs/CEXuGv3KvVtkf5gkV0ip3g1FF-i12WIDo6IOigORIZA.json", + "data/genesis_txs/CEXuGv3KvVtkf5gkV0ip3g1FF-i12WIDo6IOigORIZA.json"}, + {copy, "data/genesis_txs/NPLj86idALmTczSq2vrZdTs0bjI-e-KI0j3EOWWpu54.json", + "data/genesis_txs/NPLj86idALmTczSq2vrZdTs0bjI-e-KI0j3EOWWpu54.json"}, + {copy, "data/genesis_txs/IpwG_74praZjsu9L91_KWYHrVTpEDwyHZrsHgum4Z8o.json", + "data/genesis_txs/IpwG_74praZjsu9L91_KWYHrVTpEDwyHZrsHgum4Z8o.json"}, + {copy, "data/genesis_txs/qX9u_AprdhyXAPGfh3C94x9AbxwWx9nJSs7g8FSwITM.json", + "data/genesis_txs/qX9u_AprdhyXAPGfh3C94x9AbxwWx9nJSs7g8FSwITM.json"}, + {copy, "data/genesis_txs/87ieWrloTFUdW7YjJqJcINd1M_PBWCzA1dIRFzF4RKM.json", + "data/genesis_txs/87ieWrloTFUdW7YjJqJcINd1M_PBWCzA1dIRFzF4RKM.json"}, + {copy, "data/genesis_txs/xSkMzFablxREj8H_RwoMseAFk-TCwaLVIZMHqXh5DHY.json", + "data/genesis_txs/xSkMzFablxREj8H_RwoMseAFk-TCwaLVIZMHqXh5DHY.json"}, + {copy, "data/genesis_txs/NE7AIvW60iQL_6aagNTSiaMpmLfAfRwbxau5FZLA10g.json", + "data/genesis_txs/NE7AIvW60iQL_6aagNTSiaMpmLfAfRwbxau5FZLA10g.json"}, + {copy, "data/genesis_txs/wUhEm861foyWdxy0SI7CvXRcWuohItlX6Ydqo2NvtY8.json", + "data/genesis_txs/wUhEm861foyWdxy0SI7CvXRcWuohItlX6Ydqo2NvtY8.json"}, + {copy, "data/genesis_txs/1QoMjs6Q3XKklJ9LfovRmGbe4bAy9xY247JfDZqN3Eo.json", + "data/genesis_txs/1QoMjs6Q3XKklJ9LfovRmGbe4bAy9xY247JfDZqN3Eo.json"}, + {copy, "data/genesis_txs/24VRr4yT-_fOndcFYtK2oSO-p9Pm6lNtzQv8E-U43Bc.json", + "data/genesis_txs/24VRr4yT-_fOndcFYtK2oSO-p9Pm6lNtzQv8E-U43Bc.json"}, + {copy, "data/genesis_txs/pVZkxPK8F9VFM5lDp0oTBThaw1RvmwG64wIHFChYJKA.json", + "data/genesis_txs/pVZkxPK8F9VFM5lDp0oTBThaw1RvmwG64wIHFChYJKA.json"}, + {copy, "data/genesis_txs/EnPMt9yzTsxLPR5mD9zUvndxicdYBUNzOlcCPvQlOK8.json", + "data/genesis_txs/EnPMt9yzTsxLPR5mD9zUvndxicdYBUNzOlcCPvQlOK8.json"}, + {copy, "data/genesis_txs/0ooE635sVsd6vdhX3Pb8Ufvuqd7XRjfUbG2eXde_CmI.json", + "data/genesis_txs/0ooE635sVsd6vdhX3Pb8Ufvuqd7XRjfUbG2eXde_CmI.json"}, + {copy, "data/genesis_txs/mJUxc7XyUp1HV_VRoi_54geidr26I9PUaiNL4msSNxk.json", + "data/genesis_txs/mJUxc7XyUp1HV_VRoi_54geidr26I9PUaiNL4msSNxk.json"}, + {copy, "data/genesis_txs/4bPVo0hCI3E-ry2mBjvOZsBpNwPM108NT0vnJCxCeJw.json", + "data/genesis_txs/4bPVo0hCI3E-ry2mBjvOZsBpNwPM108NT0vnJCxCeJw.json"}, + {copy, "data/genesis_txs/lq4SrnweWCHnEhw_AV69gMLyBrPxYOmOdVdRIXkHwOg.json", + "data/genesis_txs/lq4SrnweWCHnEhw_AV69gMLyBrPxYOmOdVdRIXkHwOg.json"}, + {copy, "data/genesis_txs/B4e9FBfqZGBszHAhZqTq-TNjb-oG7rYdlMWrQa4CPZU.json", + "data/genesis_txs/B4e9FBfqZGBszHAhZqTq-TNjb-oG7rYdlMWrQa4CPZU.json"}, + {copy, "data/genesis_txs/576xa7WLVidNoEcYPhAm7OlyYgbrp7Z1RBIfqLbVFzw.json", + "data/genesis_txs/576xa7WLVidNoEcYPhAm7OlyYgbrp7Z1RBIfqLbVFzw.json"}, + {copy, "data/genesis_txs/IJsiiIbd-Qs39TAJ67hiRJFsBye_rgQdU9GBid_PnZw.json", + "data/genesis_txs/IJsiiIbd-Qs39TAJ67hiRJFsBye_rgQdU9GBid_PnZw.json"}, + {copy, "data/genesis_txs/CMr-rV5FdlQcRBo4loZzj66EFqwHBmA36tWiRMKGigQ.json", + "data/genesis_txs/CMr-rV5FdlQcRBo4loZzj66EFqwHBmA36tWiRMKGigQ.json"}, + {copy, "data/genesis_txs/gXd75eQL5Yzcn1ba51nORAvb6f_surSnz3xcNlLAxEQ.json", + "data/genesis_txs/gXd75eQL5Yzcn1ba51nORAvb6f_surSnz3xcNlLAxEQ.json"}, + {copy, "data/genesis_txs/eGhF0za2qN5WuadlVZ1iak1S5LxXswHRzIa3j_P-sUM.json", + "data/genesis_txs/eGhF0za2qN5WuadlVZ1iak1S5LxXswHRzIa3j_P-sUM.json"}, + {copy, "data/genesis_txs/00nFXThK86Aog_HfLJc9j0nnXzXSlU6VdGC8qZc5ekI.json", + "data/genesis_txs/00nFXThK86Aog_HfLJc9j0nnXzXSlU6VdGC8qZc5ekI.json"}, + {copy, "data/genesis_txs/Znw-6H_ayGJBReeQm9z9WKulBH1ZzrOovdMsNPcIe_Y.json", + "data/genesis_txs/Znw-6H_ayGJBReeQm9z9WKulBH1ZzrOovdMsNPcIe_Y.json"}, + {copy, "data/genesis_txs/AoSTMf_ZxlcY12bK6_sWj02kssD00K4E-vkHx2vRxG4.json", + "data/genesis_txs/AoSTMf_ZxlcY12bK6_sWj02kssD00K4E-vkHx2vRxG4.json"}, + {copy, "data/genesis_txs/Achd6pqJVZ-1vNMLC977Lu8f20eBmgAv4dIddXql51s.json", + "data/genesis_txs/Achd6pqJVZ-1vNMLC977Lu8f20eBmgAv4dIddXql51s.json"}, + {copy, "data/genesis_txs/HTt6lPYQfcIgUxKPjUt3aQrpwE5e3UA4UT2EI9RxSbw.json", + "data/genesis_txs/HTt6lPYQfcIgUxKPjUt3aQrpwE5e3UA4UT2EI9RxSbw.json"}, + {copy, "data/genesis_txs/QJlE99-614f6XzZ-7VctQjX9DYe5wnO21aHSgg1RhnA.json", + "data/genesis_txs/QJlE99-614f6XzZ-7VctQjX9DYe5wnO21aHSgg1RhnA.json"}, + {copy, "data/genesis_txs/h37LQjpChpTPMquvaxpfFeKt_7oAB5ElDzsdbCQ61n0.json", + "data/genesis_txs/h37LQjpChpTPMquvaxpfFeKt_7oAB5ElDzsdbCQ61n0.json"}, + {copy, "data/genesis_txs/LUdFh6g9auj1LRtk8IUwLoY3e91jIkcSyPKuQQekPY4.json", + "data/genesis_txs/LUdFh6g9auj1LRtk8IUwLoY3e91jIkcSyPKuQQekPY4.json"}, + {copy, "data/genesis_txs/YukfPvGxtYmXFF6wJjDiZcvqmH5YItxwsoLbMxWCVFg.json", + "data/genesis_txs/YukfPvGxtYmXFF6wJjDiZcvqmH5YItxwsoLbMxWCVFg.json"}, + {copy, "data/genesis_txs/FmfkuPmh0vkdv_qbjXBUX1sQ-DmwBFbjuC4punobGy0.json", + "data/genesis_txs/FmfkuPmh0vkdv_qbjXBUX1sQ-DmwBFbjuC4punobGy0.json"}, + {copy, "data/genesis_txs/j3l4tvphmVOyVyFkNdS7ulmexBqPqEvsSJrBsjAFJXc.json", + "data/genesis_txs/j3l4tvphmVOyVyFkNdS7ulmexBqPqEvsSJrBsjAFJXc.json"}, + {copy, "data/genesis_txs/GypgExivgblZSA-1n7KjdI0SJOyXwFJkuzzPWS4NID8.json", + "data/genesis_txs/GypgExivgblZSA-1n7KjdI0SJOyXwFJkuzzPWS4NID8.json"}, + {copy, "data/genesis_txs/h0sgGEeQQcmSxg8uyiCOigWtI_r2ex-58nk1xso004c.json", + "data/genesis_txs/h0sgGEeQQcmSxg8uyiCOigWtI_r2ex-58nk1xso004c.json"}, + {copy, "data/genesis_txs/M7oOLbk7TPBanLCS0pzkJSbV1CYoJabbsSDe_pCjhEo.json", + "data/genesis_txs/M7oOLbk7TPBanLCS0pzkJSbV1CYoJabbsSDe_pCjhEo.json"}, + {copy, "data/genesis_txs/LiitFWnODMUA7esa_f49IiMEdN7cTKoKw1cgG2J_eNE.json", + "data/genesis_txs/LiitFWnODMUA7esa_f49IiMEdN7cTKoKw1cgG2J_eNE.json"}, + {copy, "data/genesis_txs/x8KM69OVm6lzslK6ccAE-3EX5sW6CUHBZB-1hbc-J0A.json", + "data/genesis_txs/x8KM69OVm6lzslK6ccAE-3EX5sW6CUHBZB-1hbc-J0A.json"}, + {copy, "data/genesis_txs/TGp-18LYjSWQQ36gs5prU-vDgteOL79aywxXoDS-w0c.json", + "data/genesis_txs/TGp-18LYjSWQQ36gs5prU-vDgteOL79aywxXoDS-w0c.json"} + ]}, - {dev_mode, true}, - {include_erts, false}, + {dev_mode, true}, + {include_erts, false}, - {extended_start_script, true} + {extended_start_script, true} ]}. {pre_hooks, [ - % Build for randomx512 configuration - {"(darwin|linux|freebsd|netbsd|openbsd)", compile, - "bash -c \"mkdir -p apps/arweave/lib/RandomX/build512 && cd apps/arweave/lib/RandomX/build512 && cmake -DUSE_HIDDEN_VISIBILITY=ON -DRANDOMX_ARGON_MEMORY=262144 -DRANDOMX_DATASET_BASE_SIZE=536870912 .. > /dev/null\""}, - {"(darwin)", compile, "make randomx -C apps/arweave/lib/RandomX/build512"}, - {"(linux)", compile, "make -C apps/arweave/lib/RandomX/build512"}, - {"(freebsd|netbsd|openbsd)", compile, "gmake -C apps/arweave/lib/RandomX/build512"}, - {"(darwin|linux|freebsd|netbsd|openbsd)", compile, "bash -c \"cd apps/arweave/lib/RandomX/build512 && mv librandomx.a librandomx512.a\""}, - % Build for randomx4096 configuration - {"(darwin|linux|freebsd|netbsd|openbsd)", compile, - "bash -c \"mkdir -p apps/arweave/lib/RandomX/build4096 && cd apps/arweave/lib/RandomX/build4096 && cmake -DUSE_HIDDEN_VISIBILITY=ON -DRANDOMX_ARGON_MEMORY=524288 -DRANDOMX_DATASET_BASE_SIZE=4294967296 .. > /dev/null\""}, - {"(darwin)", compile, "make randomx -C apps/arweave/lib/RandomX/build4096"}, - {"(linux)", compile, "make -C apps/arweave/lib/RandomX/build4096"}, - {"(freebsd|netbsd|openbsd)", compile, "gmake -C apps/arweave/lib/RandomX/build4096"}, - {"(darwin|linux|freebsd|netbsd|openbsd)", compile, "bash -c \"cd apps/arweave/lib/RandomX/build4096 && mv librandomx.a librandomx4096.a\""}, - % Compile NIFs - {"(linux)", compile, "env AR=gcc-ar make all -C apps/arweave/c_src"}, - {"(darwin)", compile, "make all -C apps/arweave/c_src"}, - {"(freebsd|netbsd|openbsd)", compile, "gmake all -C apps/arweave/c_src"} + % Build for randomx512 configuration + {"(darwin|linux|freebsd|netbsd|openbsd)", compile, + "bash -c \"mkdir -p apps/arweave/lib/RandomX/build512 && cd apps/arweave/lib/RandomX/build512 && cmake -DUSE_HIDDEN_VISIBILITY=ON -DRANDOMX_ARGON_MEMORY=262144 -DRANDOMX_DATASET_BASE_SIZE=536870912 .. > /dev/null\""}, + {"(darwin)", compile, "make randomx -C apps/arweave/lib/RandomX/build512"}, + {"(linux)", compile, "make -C apps/arweave/lib/RandomX/build512"}, + {"(freebsd|netbsd|openbsd)", compile, "gmake -C apps/arweave/lib/RandomX/build512"}, + {"(darwin|linux|freebsd|netbsd|openbsd)", compile, + "bash -c \"cd apps/arweave/lib/RandomX/build512 && mv librandomx.a librandomx512.a\""}, + % Build for randomx4096 configuration + {"(darwin|linux|freebsd|netbsd|openbsd)", compile, + "bash -c \"mkdir -p apps/arweave/lib/RandomX/build4096 && cd apps/arweave/lib/RandomX/build4096 && cmake -DUSE_HIDDEN_VISIBILITY=ON -DRANDOMX_ARGON_MEMORY=524288 -DRANDOMX_DATASET_BASE_SIZE=4294967296 .. > /dev/null\""}, + {"(darwin)", compile, "make randomx -C apps/arweave/lib/RandomX/build4096"}, + {"(linux)", compile, "make -C apps/arweave/lib/RandomX/build4096"}, + {"(freebsd|netbsd|openbsd)", compile, "gmake -C apps/arweave/lib/RandomX/build4096"}, + {"(darwin|linux|freebsd|netbsd|openbsd)", compile, + "bash -c \"cd apps/arweave/lib/RandomX/build4096 && mv librandomx.a librandomx4096.a\""}, + % Compile NIFs + {"(linux)", compile, "env AR=gcc-ar make all -C apps/arweave/c_src"}, + {"(darwin)", compile, "make all -C apps/arweave/c_src"}, + {"(freebsd|netbsd|openbsd)", compile, "gmake all -C apps/arweave/c_src"} ]}. {post_hooks, [ - % Clean randomx512 - {"(linux|darwin)", clean, "bash -c \"if [ -d apps/arweave/lib/RandomX/build512 ]; then make -C apps/arweave/lib/RandomX/build512 clean; fi\""}, - {"(freebsd|netbsd|openbsd)", clean, "bash -c \"if [ -d apps/arweave/lib/RandomX/build512 ]; then gmake -C apps/arweave/lib/RandomX/build512 clean; fi\""}, - % Clean randomx4096 - {"(linux|darwin)", clean, "bash -c \"if [ -d apps/arweave/lib/RandomX/build4096 ]; then make -C apps/arweave/lib/RandomX/build4096 clean; fi\""}, - {"(freebsd|netbsd|openbsd)", clean, "bash -c \"if [ -d apps/arweave/lib/RandomX/build4096 ]; then gmake -C apps/arweave/lib/RandomX/build4096 clean; fi\""}, - % Clan NIFs - {"(linux|darwin)", clean, "make -C apps/arweave/c_src clean"}, - {"(freebsd|netbsd|openbsd)", clean, "gmake -C apps/arweave/c_src clean"} + % Clean randomx512 + {"(linux|darwin)", clean, + "bash -c \"if [ -d apps/arweave/lib/RandomX/build512 ]; then make -C apps/arweave/lib/RandomX/build512 clean; fi\""}, + {"(freebsd|netbsd|openbsd)", clean, + "bash -c \"if [ -d apps/arweave/lib/RandomX/build512 ]; then gmake -C apps/arweave/lib/RandomX/build512 clean; fi\""}, + % Clean randomx4096 + {"(linux|darwin)", clean, + "bash -c \"if [ -d apps/arweave/lib/RandomX/build4096 ]; then make -C apps/arweave/lib/RandomX/build4096 clean; fi\""}, + {"(freebsd|netbsd|openbsd)", clean, + "bash -c \"if [ -d apps/arweave/lib/RandomX/build4096 ]; then gmake -C apps/arweave/lib/RandomX/build4096 clean; fi\""}, + % Clan NIFs + {"(linux|darwin)", clean, "make -C apps/arweave/c_src clean"}, + {"(freebsd|netbsd|openbsd)", clean, "gmake -C apps/arweave/c_src clean"} ]}. {erl_opts, [ - {i, "apps"} + {i, "apps"} ]}. {profiles, [ - {prod, [ - {relx, [ - {dev_mode, false}, - {include_erts, true} - ]} - ]}, - {test, [ - {deps, [{meck, "0.8.13"}]}, - {erl_opts, [ - {d, 'DEBUG', debug}, - {d, 'FORKS_RESET', true}, - {d, 'NETWORK_NAME', "arweave.localtest"}, - {d, 'TEST', true} - ]} - ]}, - {localnet, [ - {erl_opts, [ - %% FORKS_RESET tells localent to apply the current network consensus rules. You - %% probably don't want to change this. - {d, 'FORKS_RESET', true}, + {prod, [ + {relx, [ + {dev_mode, false}, + {include_erts, true} + ]} + ]}, + {test, [ + {deps, [{meck, "0.8.13"}]}, + {erl_opts, [ + {d, 'DEBUG', debug}, + {d, 'FORKS_RESET', true}, + {d, 'NETWORK_NAME', "arweave.localtest"}, + {d, 'TEST', true} + ]} + ]}, + {localnet, [ + {erl_opts, [ + %% FORKS_RESET tells localent to apply the current network consensus rules. You + %% probably don't want to change this. + {d, 'FORKS_RESET', true}, - %% All peers in your localnet must specify the same NETWORK_NAME, and all requests - %% to nodes in your network must specify NETWORK_NAME in their X-Network header. - %% If you clear this value, the mainnet will be assumed. - {d, 'NETWORK_NAME', "arweave.localnet"}, + %% All peers in your localnet must specify the same NETWORK_NAME, and all requests + %% to nodes in your network must specify NETWORK_NAME in their X-Network header. + %% If you clear this value, the mainnet will be assumed. + {d, 'NETWORK_NAME', "arweave.localnet"}, - %% When a request is received without specifing the X-Network header, this network - %% name is assumed. Rather than change this, it's better to make sure your clients - %% specify the X-Network name as this will avoid potential issues (e.g. - %% accidentally transferring mainnet AR tokens when you only intended to transfer - %% localnet tokens). This variable is provided for situations where you can't - %% control the client headers, need for them to be able to make requests to your - %% localnet, and can manage the risk of an accidental mainnet request getting - %% processed. - %% {d, 'DEFAULT_NETWORK_NAME', "arweave.localnet"}, + %% When a request is received without specifing the X-Network header, this network + %% name is assumed. Rather than change this, it's better to make sure your clients + %% specify the X-Network name as this will avoid potential issues (e.g. + %% accidentally transferring mainnet AR tokens when you only intended to transfer + %% localnet tokens). This variable is provided for situations where you can't + %% control the client headers, need for them to be able to make requests to your + %% localnet, and can manage the risk of an accidental mainnet request getting + %% processed. + %% {d, 'DEFAULT_NETWORK_NAME', "arweave.localnet"}, - %% The block time that the network targets - difficulty adjusts up if the average - %% block time is lower than TARGET_BLOCK_TIME seconds, and difficulty adjusts down - %% if the average block time is higher than TARGET_BLOCK_TIME seconds. Leave - %% undefined to use the default value of 120 seconds. - %% {d, 'TARGET_BLOCK_TIME', 120}, + %% The block time that the network targets - difficulty adjusts up if the average + %% block time is lower than TARGET_BLOCK_TIME seconds, and difficulty adjusts down + %% if the average block time is higher than TARGET_BLOCK_TIME seconds. Leave + %% undefined to use the default value of 120 seconds. + %% {d, 'TARGET_BLOCK_TIME', 120}, - %% The protocol will adjust the difficulty every RETARGET_BLOCKS block by taking - %% the average observed block time and adjusting network difficulty to move towards - %% the TARGET_BLOCK_TIME. - %% {d, 'RETARGET_BLOCKS', 10_000}, + %% The protocol will adjust the difficulty every RETARGET_BLOCKS block by taking + %% the average observed block time and adjusting network difficulty to move towards + %% the TARGET_BLOCK_TIME. + %% {d, 'RETARGET_BLOCKS', 10_000}, - %% Your mining address will be initialized with this amount of AR when you - %% launch your localnet. - %% {d, 'LOCALNET_BALANCE', 1_000_000_000_000} - export_all, - no_inline - ]}, - {overrides, [ - {override, arweave, [ - {deps, [ - {recon, {git, "https://github.com/ferd/recon.git", {tag, "2.5.6"}}} - ]} - ]} - ]}, - {relx, [ - {release, {arweave, "2.7.4"}, [ - {arweave, load}, - {recon, load}, - b64fast, - jiffy, - rocksdb, - prometheus_process_collector - ]}, - {dev_mode, false}, - {include_erts, true} - ]} - ]}, - {testnet, [ - {deps, [{meck, "0.8.13"}]}, - {erl_opts, [ - %% ------------------------------------------------------------------------------------- - %% Required configuration for testnet - %% All values below must be set for the testnet to function properly - %% ------------------------------------------------------------------------------------- - {d, 'TESTNET', true}, - {d, 'NETWORK_NAME', "arweave.fast.testnet"}, - {d, 'TEST_WALLET_ADDRESS', "MXeFJwxb4y3vL4In3oJu60tQGXGCzFzWLwBUxnbutdQ"}, - {d, 'TOP_UP_TEST_WALLET_AR', 1000000}, + %% Your mining address will be initialized with this amount of AR when you + %% launch your localnet. + %% {d, 'LOCALNET_BALANCE', 1_000_000_000_000} + export_all, + no_inline + ]}, + {overrides, [ + {override, arweave, [ + {deps, [ + {recon, {git, "https://github.com/ferd/recon.git", {tag, "2.5.6"}}} + ]} + ]} + ]}, + {relx, [ + {release, {arweave, "2.7.4"}, [ + {arweave, load}, + {recon, load}, + b64fast, + jiffy, + rocksdb, + prometheus_process_collector + ]}, + {dev_mode, false}, + {include_erts, true} + ]} + ]}, + {testnet, [ + {deps, [{meck, "0.8.13"}]}, + {erl_opts, [ + %% ------------------------------------------------------------------------------------- + %% Required configuration for testnet + %% All values below must be set for the testnet to function properly + %% ------------------------------------------------------------------------------------- + {d, 'TESTNET', true}, + {d, 'NETWORK_NAME', "arweave.fast.testnet"}, + {d, 'TEST_WALLET_ADDRESS', "MXeFJwxb4y3vL4In3oJu60tQGXGCzFzWLwBUxnbutdQ"}, + {d, 'TOP_UP_TEST_WALLET_AR', 1000000}, %% The following values all assume the testnet is restarted from height 1514109 using %% the flag: diff --git a/rebar.lock b/rebar.lock index 497451675..367c3ead6 100644 --- a/rebar.lock +++ b/rebar.lock @@ -6,6 +6,8 @@ 0}, {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.10.0">>},0}, {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.12.1">>},1}, + {<<"erl_snowflake">>,{pkg,<<"erl_snowflake">>,<<"1.1.0">>},0}, + {<<"gproc">>,{pkg,<<"gproc">>,<<"1.0.0">>},0}, {<<"graphql">>, {git,"https://github.com/shopgun/graphql-erlang.git", {ref,"4fd356294c2acea42a024366bc5a64661e4862d7"}}, @@ -15,6 +17,7 @@ {git,"https://github.com/ArweaveTeam/jiffy.git", {ref,"74c956defa9116c85d76f77c3e9b5bd6de7bd39a"}}, 0}, + {<<"msgpack">>,{pkg,<<"msgpack">>,<<"0.8.1">>},0}, {<<"prometheus">>,{pkg,<<"prometheus">>,<<"4.11.0">>},0}, {<<"prometheus_cowboy">>,{pkg,<<"prometheus_cowboy">>,<<"0.1.8">>},0}, {<<"prometheus_httpd">>,{pkg,<<"prometheus_httpd">>,<<"2.1.11">>},1}, @@ -33,7 +36,10 @@ {<<"accept">>, <<"B33B127ABCA7CC948BBE6CAA4C263369ABF1347CFA9D8E699C6D214660F10CD1">>}, {<<"cowboy">>, <<"FF9FFEFF91DAE4AE270DD975642997AFE2A1179D94B1887863E43F681A203E26">>}, {<<"cowlib">>, <<"A9FA9A625F1D2025FE6B462CB865881329B5CAFF8F1854D1CBC9F9533F00E1E1">>}, + {<<"erl_snowflake">>, <<"BEB3238547B354448300D0EF0A57E2C435E749CC109FE428D530C3CF768AA70D">>}, + {<<"gproc">>, <<"AA9EC57F6C9FF065B16D96924168D7C7157CD1FD457680EFE4B1274F456FA500">>}, {<<"gun">>, <<"CF8B51BEB36C22B9C8DF1921E3F2BC4D2B1F68B49AD4FBC64E91875AA14E16B4">>}, + {<<"msgpack">>, <<"DEB35C13291EAFE56AD9870374C2EAA92323DC5503D50432EBCAF47052E6D343">>}, {<<"prometheus">>, <<"B95F8DE8530F541BD95951E18E355A840003672E5EDA4788C5FA6183406BA29A">>}, {<<"prometheus_cowboy">>, <<"CFCE0BC7B668C5096639084FCD873826E6220EA714BF60A716F5BD080EF2A99C">>}, {<<"prometheus_httpd">>, <<"F616ED9B85B536B195D94104063025A91F904A4CFC20255363F49A197D96C896">>}, @@ -43,7 +49,10 @@ {<<"accept">>, <<"11B18C220BCC2EAB63B5470C038EF10EB6783BCB1FCDB11AA4137DEFA5AC1BB8">>}, {<<"cowboy">>, <<"3AFDCCB7183CC6F143CB14D3CF51FA00E53DB9EC80CDCD525482F5E99BC41D6B">>}, {<<"cowlib">>, <<"163B73F6367A7341B33C794C4E88E7DBFE6498AC42DCD69EF44C5BC5507C8DB0">>}, + {<<"erl_snowflake">>, <<"28B2398790A1D802082CC7B5AA816D0D140D816F1FDFADF0B6A73930B6831FBC">>}, + {<<"gproc">>, <<"109F253C2787DE8A371A51179D4973230CBEC6239EE673FA12216A5CE7E4F902">>}, {<<"gun">>, <<"3106CE167F9C9723F849E4FB54EA4A4D814E3996AE243A1C828B256E749041E0">>}, + {<<"msgpack">>, <<"04D9A75BC6F4BED8627EE1E7AA9DF37601F510FDC786A84FE932BB21D765565F">>}, {<<"prometheus">>, <<"719862351AABF4DF7079B05DC085D2BBCBE3AC0AC3009E956671B1D5AB88247D">>}, {<<"prometheus_cowboy">>, <<"BA286BECA9302618418892D37BCD5DC669A6CC001F4EB6D6AF85FF81F3F4F34C">>}, {<<"prometheus_httpd">>, <<"0BBE831452CFDF9588538EB2F570B26F30C348ADAE5E95A7D87F35A5910BCF92">>},